2. Если появилась новая точка пересечения МЕ5 и МЕ20 закрыть ордер. Возможность отключения этого параметра
double FindLastLot()
{
int i, k=OrdersTotal ();
for (i=k-1; i>=0; i--) {
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) {
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && (OrderType()==OP_BUY || OrderType()==OP_SELL)) {
return (OrderLots());
}
}
}
return(Lots);
}
Step_StopOrder = 100; // Шаг stop ордеров
StepPrice = 200; // Шаг подтягивания ордеров к цене
//+------------------------------------------------------------------+
//| Beton_Exp1.mq4 |
//| Oxy |
//| http://oxy.opentraders.ru/bio/ |
//+------------------------------------------------------------------+
#property copyright "Oxy"
#property link "http://oxy.opentraders.ru/bio/"
#property version "1.00"
#property strict
//------- Внешние параметры советника -----------------------------------------+
extern double Lot = 0.1; // Лот
extern double ClosePosition = 200; // Через сколько пунктов закрываем позицию и открываем новую, 0 - не будет закрытия
extern double Drawdown = 100; // Просадка в пунктах, 0 - без просадки
extern int SellOrBuy = 1; // SELL=1, BUY=0
extern int Profit = 10; // Процент прибыли
extern int WhichLotsRise = 0; // Увеличивает ордера: 0 - в просадке, 1 - по тейкпрофиту
extern int Slippage = 30; // Проскальзывание цены
extern int MagicNumber= 567582; // Идентификатор ордера
//------- Глобальные переменные советника -------------------------------------+
string Symb;
double pricePoint = -1;
double newLot=Lot;
double plusLot=Lot;
double balance;
bool stopBuySell = false;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if (!IsTradeAllowed()) { Print("Необходимо разрешить советнику торговать"); return(INIT_FAILED);}
Symb = Symbol();
balance = AccountEquity();
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) { }
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
if(stopBuySell) return;
// есть ордера
if(OrdersTotal ()>0) {
int i, k=OrdersTotal ();
for (i=k-1; i>=0; i--) {
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==Symb && OrderMagicNumber()==MagicNumber) {
if(OrderType()==SellOrBuy) {
managerOrder ();
}
}
}
}
}
// откат и начало
if(SellOrBuy==0 && Ask<=pricePoint-Drawdown*Point && Drawdown>0) {
if(pricePoint==-1) newLot=Lot;
else {
if(WhichLotsRise==0) newLot=Lot+newLot;
if(WhichLotsRise==1) newLot=Lot;
}
BuyPos(newLot);
}
if(SellOrBuy==1 && Bid>=pricePoint+Drawdown*Point && Drawdown>0) {
if(pricePoint==-1) newLot=Lot;
else {
if(WhichLotsRise==0) newLot=Lot+newLot;
if(WhichLotsRise==1) newLot=Lot;
}
SellPos(newLot);
}
// ордеров, выставленных, нет
if(OrdersTotal ()==0) {
if(SellOrBuy==0) {
if(WhichLotsRise==0) newLot=Lot;
if(WhichLotsRise==1) { newLot=Lot+plusLot; plusLot=newLot;}
balance = AccountEquity(); BuyPos(newLot);
}
if(SellOrBuy==1) {
if(WhichLotsRise==0) newLot=Lot;
if(WhichLotsRise==1) { newLot=Lot+plusLot; plusLot=newLot;}
balance = AccountEquity(); SellPos(newLot);
}
}
if(AccountEquity()>=balance*Profit/100+balance) { deleteAllPos (); plusLot=Lot; newLot=Lot; }
}
//+------------------------------------------------------------------+
void deleteAllPos () {
int i, ot;
for (i=0; i<OrdersTotal(); i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==Symb && OrderMagicNumber()==MagicNumber) {
ot=OrderType();
if (ot>1 && ot<6) {
if (!OrderDelete(OrderTicket())) Print("Не удалось удалить ордер!");
}
if(ot==0){
if (!OrderClose(OrderTicket(), OrderLots(), Bid, Slippage)) Print("Не удалось закрыть ордер!");
else stopBuySell=false;
}
if(ot==1) {
if (!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage)) Print("Не удалось закрыть ордер!");
else stopBuySell=false;
}
}
}
}
}
//+------------------------------------------------------------------+
void managerOrder () {
double price = OrderOpenPrice ();
if(price>-1) {
if(SellOrBuy==0 && OrderType()==0) {
if(Bid>=price+ClosePosition*Point && ClosePosition>0) { // закрываем и открываем новый
int ticket = OrderTicket();
if(OrderClose(ticket, OrderLots(), Bid, Slippage)) {
if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_HISTORY)) pricePoint = OrderClosePrice();
stopBuySell=false;
}
else Print("Не удалось закрыть ордер BUY!");
}
}
if(SellOrBuy==1 && OrderType()==1) {
if(Ask<=price-ClosePosition*Point && ClosePosition>0) { // закрываем и открываем новый
int ticket = OrderTicket();
if(OrderClose(ticket, OrderLots(), Bid, Slippage)) {
if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_HISTORY)) pricePoint = OrderClosePrice();
stopBuySell=false;
}
else Print("Не удалось закрыть ордер SELL!");
}
}
}
}
//+------------------------------------------------------------------+
bool BuyPos(double _lot) {
double sl=0, tp=0;
int ticket = OrderSend(Symb, OP_BUY, _lot, NormalizeDouble(Ask,Digits), Slippage, NormalizeDouble(sl,Digits), NormalizeDouble(tp,Digits), NULL, MagicNumber);
if (ticket == -1) { stopBuySell=true; Print("Ошибка совершении сделки!"); return(false);}
if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)) pricePoint = OrderOpenPrice();
return (true);
}
bool SellPos(double _lot) {
double sl=0, tp=0;
int ticket = OrderSend(Symb, OP_SELL, _lot, NormalizeDouble(Bid,Digits), Slippage, NormalizeDouble(sl,Digits), NormalizeDouble(tp,Digits), NULL, MagicNumber);
if (ticket == -1) { stopBuySell=true; Print("Ошибка совершении сделки!"); return(false);}
if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)) pricePoint = OrderOpenPrice();
return (true);
}
//+------------------------------------------------------------------+
При открытии 2 оставшиеся отложки закрыть
при прикреплении к графику искала ордера, если ордеров нет
Да, сейчас делаем только что бы в случае закрытия сделки по трейлингу, остальные сделки тоже закрывались по данному направлению.
if(AccountEquity()>=balance*Profit/100+balance) deleteAllPos ();
if(AccountEquity()>=balance*Profit/100+balance) { deleteAllPos (); newLot=Lot; }
//+------------------------------------------------------------------+
//| Beton_Exp1.mq4 |
//| Oxy |
//| http://oxy.opentraders.ru/bio/ |
//+------------------------------------------------------------------+
#property copyright "Oxy"
#property link "http://oxy.opentraders.ru/bio/"
#property version "1.00"
#property strict
//------- Внешние параметры советника -----------------------------------------+
extern double Lot = 0.1; // Лот
extern double ClosePosition = 200; // Через сколько пунктов закрываем позицию и открываем новую, 0 - не будет закрытия
extern double Drawdown = 100; // Просадка в пунктах, 0 - без просадки
extern int SellOrBuy = 1; // SELL=1, BUY=0
extern int Profit = 10; // Процент прибыли
extern int WhichLotsRise = 0; // Увеличивает ордера: 0 - в просадке, 1 - по тейкпрофиту
extern int Slippage = 30; // Проскальзывание цены
extern int MagicNumber= 567582; // Идентификатор ордера
//------- Глобальные переменные советника -------------------------------------+
string Symb;
double pricePoint = -1;
double newLot=Lot;
double balance;
bool stopBuySell = false;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if (!IsTradeAllowed()) { Print("Необходимо разрешить советнику торговать"); return(INIT_FAILED);}
Symb = Symbol();
balance = AccountEquity();
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) { }
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
if(stopBuySell) return;
// есть ордера
if(OrdersTotal ()>0) {
int i, k=OrdersTotal ();
for (i=k-1; i>=0; i--) {
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==Symb && OrderMagicNumber()==MagicNumber) {
if(OrderType()==SellOrBuy) {
managerOrder ();
}
}
}
}
}
// откат и начало !!!
if(SellOrBuy==0 && Ask<=pricePoint-Drawdown*Point && Drawdown>0) {
if(pricePoint==-1) newLot=Lot;
else {
if(WhichLotsRise==0) newLot=Lot+newLot;
if(WhichLotsRise==1) newLot=Lot;
}
BuyPos(newLot);
}
if(SellOrBuy==1 && Bid>=pricePoint+Drawdown*Point && Drawdown>0) {
if(pricePoint==-1) newLot=Lot;
else {
if(WhichLotsRise==0) newLot=Lot+newLot;
if(WhichLotsRise==1) newLot=Lot;
}
SellPos(newLot);
}
// ордеров, выставленных, нет !!!
if(OrdersTotal ()==0) {
if(SellOrBuy==0) {
if(WhichLotsRise==0) newLot=Lot;
if(WhichLotsRise==1) newLot=Lot+newLot;
balance = AccountEquity(); BuyPos(newLot);
}
if(SellOrBuy==1) {
if(WhichLotsRise==0) newLot=Lot;
if(WhichLotsRise==1) newLot=Lot+newLot;
balance = AccountEquity(); SellPos(newLot);
}
}
if(AccountEquity()>=balance*Profit/100+balance) deleteAllPos ();
}
//+------------------------------------------------------------------+
void deleteAllPos () {
int i, ot;
for (i=0; i<OrdersTotal(); i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==Symb && OrderMagicNumber()==MagicNumber) {
ot=OrderType();
if (ot>1 && ot<6) {
if (!OrderDelete(OrderTicket())) Print("Не удалось удалить ордер!");
}
if(ot==0){
if (!OrderClose(OrderTicket(), OrderLots(), Bid, Slippage)) Print("Не удалось закрыть ордер!");
else stopBuySell=false;
}
if(ot==1) {
if (!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage)) Print("Не удалось закрыть ордер!");
else stopBuySell=false;
}
}
}
}
}
//+------------------------------------------------------------------+
void managerOrder () {
double price = OrderOpenPrice ();
if(price>-1) {
if(SellOrBuy==0 && OrderType()==0) {
if(Bid>=price+ClosePosition*Point && ClosePosition>0) { // закрываем и открываем новый
int ticket = OrderTicket();
if(OrderClose(ticket, OrderLots(), Bid, Slippage)) {
if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_HISTORY)) pricePoint = OrderClosePrice();
stopBuySell=false;
}
else Print("Не удалось закрыть ордер BUY!");
}
}
if(SellOrBuy==1 && OrderType()==1) {
if(Ask<=price-ClosePosition*Point && ClosePosition>0) { // закрываем и открываем новый
int ticket = OrderTicket();
if(OrderClose(ticket, OrderLots(), Bid, Slippage)) {
if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_HISTORY)) pricePoint = OrderClosePrice();
stopBuySell=false;
}
else Print("Не удалось закрыть ордер SELL!");
}
}
}
}
//+------------------------------------------------------------------+
bool BuyPos(double _lot) {
double sl=0, tp=0;
int ticket = OrderSend(Symb, OP_BUY, _lot, NormalizeDouble(Ask,Digits), Slippage, NormalizeDouble(sl,Digits), NormalizeDouble(tp,Digits), NULL, MagicNumber);
if (ticket == -1) { stopBuySell=true; Print("Ошибка совершении сделки!"); return(false);}
if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)) pricePoint = OrderOpenPrice();
return (true);
}
bool SellPos(double _lot) {
double sl=0, tp=0;
int ticket = OrderSend(Symb, OP_SELL, _lot, NormalizeDouble(Bid,Digits), Slippage, NormalizeDouble(sl,Digits), NormalizeDouble(tp,Digits), NULL, MagicNumber);
if (ticket == -1) { stopBuySell=true; Print("Ошибка совершении сделки!"); return(false);}
if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)) pricePoint = OrderOpenPrice();
return (true);
}
//+------------------------------------------------------------------+
Oxy