Доброго времени суток!
Столкнулся с небольшими трудностями, на сколько мне известно при достижении стоп лосса отложники (если они не открыты) не удаляются, а возможно как то реализовать удаление отложников при пересечении стоп лосса?
можно конечно, реализаций множество, что бы вам помочь более конкретно необходимо видеть ваш код.
ticket2=OrderSend(Symbol(),OP_BUYSTOP, Lots2, NormalizeDouble(Ask*Point,Digits),2,NormalizeDouble(Ask-StopLoss*Point,Digits),NormalizeDouble(Ask+TakeProfit*Point,Digits),"take_trend",MagicNumber2,0,Blue);
if(ticket2>0)
{
if(OrderSelect(ticket2,SELECT_BY_TICKET,MODE_TRADES))
Print("Открыт ордер BUY2: ",OrderOpenPrice());
Time_open = TimeCurrent()-Time[0];
Time_bar = Time[0];
chk=0;
}
else
{
Print("Ошибка открытия BUY2 ордера : ",GetLastError());
return(0);
}
--------------------Закрытие и удаление--------------------------------------------
if(OrderType()==OP_BUY)
{
if((SMMA>MA28) && (SMMA1<MA28_1))
{
OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),3,Violet);
return(0);
}
// check for trailing stop
}
if(OrderType()==OP_BUYSTOP)
{
if((SMMA>MA28) && (SMMA1<MA28_1))
{
OrderDelete(OrderTicket(),Violet);
return(0);
}
ticket2=OrderSend(Symbol(),OP_BUYSTOP, Lots2, NormalizeDouble(Ask*Point,Digits),2,NormalizeDouble(Ask-StopLoss*Point,Digits),NormalizeDouble(Ask+TakeProfit*Point,Digits),"take_trend",MagicNumber2,0,Blue);
if(ticket2>0)
{
if(OrderSelect(ticket2,SELECT_BY_TICKET,MODE_TRADES))
Print("Открыт ордер BUY2: ",OrderOpenPrice());
Time_open = TimeCurrent()-Time[0];
Time_bar = Time[0];
chk=0;
}
else
{
Print("Ошибка открытия BUY2 ордера : ",GetLastError());
return(0);
}
--------------------Закрытие и удаление--------------------------------------------
if(OrderType()==OP_BUY)
{
if((SMMA>MA28) && (SMMA1<MA28_1))
{
OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),3,Violet);
return(0);
}
// check for trailing stop
}
if(OrderType()==OP_BUYSTOP)
{
if((SMMA>MA28) && (SMMA1<MA28_1))
{
OrderDelete(OrderTicket(),Violet);
return(0);
}
if(SMMA>MA28 && SMMA1<MA28_1)
{
int total=OrdersTotal();
bool res;
for(int i=total-1; i>=0; i--)
{
if(!OrderSelect(i,SELECT_BY_POS))continue;
if(OrderMagicNumber()!=MagicNumber2)continue;
if(OrderSymbol()!=symbol)continue;
if(OrderType()==OP_BUY)
{
res=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),3,Violet);
if(!res)Print("Ошибка закрытия ордера ",OrderTicket()," № - ",GetLastError());
}
if(OrderType()==OP_BUYSTOP)
{
res=OrderDelete(OrderTicket(),Violet);
if(!res)Print("Ошибка удаления ордера ",OrderTicket()," № - ",GetLastError());
}
}
}
тогда примерно будет так
if(SMMA>MA28 && SMMA1<MA28_1)
{
int total=OrdersTotal();
bool res;
for(int i=total-1; i>=0; i--)
{
if(!OrderSelect(i,SELECT_BY_POS))continue;
if(OrderMagicNumber()!=MagicNumber2)continue;
if(OrderSymbol()!=symbol)continue;
if(OrderType()==OP_BUY)
{
res=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),3,Violet);
if(!res)Print("Ошибка закрытия ордера ",OrderTicket()," № - ",GetLastError());
}
if(OrderType()==OP_BUYSTOP)
{
res=OrderDelete(OrderTicket(),Violet);
if(!res)Print("Ошибка удаления ордера ",OrderTicket()," № - ",GetLastError());
}
}
}
Хмм, ни чего не изменилось, отложники как не удалялись так и не удаляются по стопу
Если по стопу, то наверное как то так.
bool res;
for(int i=total-1; i>=0; i--)
{
if(!OrderSelect(i,SELECT_BY_POS))continue;
if(OrderMagicNumber()!=MagicNumber2)continue;
if(OrderSymbol()!=Symbol())continue;
if(OrderType()==OP_BUYSTOP)
{
double OOP=OrderOpenPrice();
if(Bid<=OOP-StopLoss*Point)
{
res=OrderDelete(OrderTicket(),Violet);
if(!res)Print("Ошибка удаления ордера ",OrderTicket()," № - ",GetLastError());
}
}
}
Если по стопу, то наверное как то так.
bool res;
for(int i=total-1; i>=0; i--)
{
if(!OrderSelect(i,SELECT_BY_POS))continue;
if(OrderMagicNumber()!=MagicNumber2)continue;
if(OrderSymbol()!=Symbol())continue;
if(OrderType()==OP_BUYSTOP)
{
double OOP=OrderOpenPrice();
if(Bid<=OOP-StopLoss*Point)
{
res=OrderDelete(OrderTicket(),Violet);
if(!res)Print("Ошибка удаления ордера ",OrderTicket()," № - ",GetLastError());
}
}
}
К сожалению это тоже не работает
К сожалению вы предоставили кусок кода, выкладывайте полностью, тогда будет решение.
прошу прощения, прикладываю весь
это как было с открытием и закрытием
{
if ( (SMMA1<MA28_1))
{
ticket=OrderSend(NULL,OP_BUY,Lots,NormalizeDouble(Ask,Digits),3,NormalizeDouble(Ask-StopLoss*Point,Digits),NormalizeDouble(Ask+TakeProfit*Point,Digits),
"EMA position:",16384,0,Green);
for(i=stop_positions;i>=0; i--)
{
open_step_2=open_step_2+Open_Step;
ticket2=OrderSend(Symbol(),OP_BUYSTOP, Lots2, NormalizeDouble(Ask+open_step_2*Point,Digits),2,NormalizeDouble(Ask-StopLoss*Point,Digits),NormalizeDouble(Ask+TakeProfit*Point,Digits),"take_trend",MagicNumber2,0,Blue);
if(ticket2>0)
{
if(OrderSelect(ticket2,SELECT_BY_TICKET,MODE_TRADES))
Print("Открыт ордер BUY2: ",OrderOpenPrice());
Time_open = TimeCurrent()-Time[0]; //вводим новую строку (запоминаем интервал от времени открытия бара, на котором был вход, до момента входа)
Time_bar = Time[0];
chk=0;
}
else
{
Print("Ошибка открытия BUY2 ордера : ",GetLastError());
return(0);
}
}
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("Открыт ордер BUY: ",OrderOpenPrice());
Time_open = TimeCurrent()-Time[0]; //вводим новую строку (запоминаем интервал от времени открытия бара, на котором был вход, до момента входа)
Time_bar = Time[0];
chk=0;
}
else
{
Print("Ошибка открытия BUY ордера : ",GetLastError());
return(0);
}
return(0);
}
return(0);
}
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()==OP_BUY)
{
if((SMMA>MA28) && (SMMA1<MA28_1))
{
OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),3,Violet);
return(0); // exit
}
}
else // go to short position
{
// should it be closed?
if((SMMA<MA28) && (SMMA1>MA28_1) )
{
OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),3,Violet); // close position
return(0); // exit
}
// check for trailing stop
}
}
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()==OP_BUYSTOP)
{
// проверим, может уже пора закрываться?
if((SMMA>MA28) && (SMMA1<MA28_1) )
{
OrderDelete(OrderTicket(),Violet);
return(0);
}
}
else
{
// should it be closed?
if((SMMA<MA28) && (SMMA1>MA28_1) )
{
OrderDelete(OrderTicket(),Violet);
return(0);
}
}
}
}
как закрытие и удаление выглядит сейчас
for(int i=total-1; i>=0; i--)
{
if(!OrderSelect(i,SELECT_BY_POS))continue;
if(OrderMagicNumber()!=MagicNumber2)continue;
if(OrderSymbol()!=Symbol())continue;
if(OrderType()==OP_BUY)
if(SMMA>MA28 && SMMA1<MA28_1)
{
{
res=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),3,Violet);
if(!res)Print("Ошибка закрытия ордера ",OrderTicket()," № - ",GetLastError());
}
}
if(OrderType()==OP_BUYSTOP)
{
double OOP=OrderOpenPrice();
if((Bid<=OOP-StopLoss*Point) || (SMMA>MA28 && SMMA1<MA28_1))
{
res=OrderDelete(OrderTicket(),Violet);
if(!res)Print("Ошибка удаления ордера ",OrderTicket()," № - ",GetLastError());
}
}
}
//| MACD Sample.mq4 |
//| Copyright 2005-2014, MetaQuotes Software Corp. |
//| http://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright "2005-2014, MetaQuotes Software Corp."
#property link "http://www.mql4.com"
input double TakeProfit =50;
input double Lots =0.1;
input double TrailingStop =30;
input double MACDOpenLevel =3;
input double MACDCloseLevel=2;
input int MATrendPeriod =26;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void OnTick(void)
{
double MacdCurrent,MacdPrevious;
double SignalCurrent,SignalPrevious;
double MaCurrent,MaPrevious;
int cnt,ticket,total;
//---
// initial data checks
// it is important to make sure that the expert works with a normal
// chart and the user did not make any mistakes setting external
// variables (Lots, StopLoss, TakeProfit,
// TrailingStop) in our case, we check TakeProfit
// on a chart of less than 100 bars
//---
if(Bars<100)
{
Print("bars less than 100");
return;
}
if(TakeProfit<10)
{
Print("TakeProfit less than 10");
return;
}
//--- to simplify the coding and speed up access data are put into internal variables
MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);
MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0);
MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1);
total=OrdersTotal();
if(total<1)
{
//--- no opened orders identified
if(AccountFreeMargin()<(1000*Lots))
{
Print("We have no money. Free Margin = ",AccountFreeMargin());
return;
}
//--- check for long position (BUY) possibility
if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious &&
MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("BUY order opened : ",OrderOpenPrice());
}
else
Print("Error opening BUY order : ",GetLastError());
return;
}
//--- check for short position (SELL) possibility
if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&
MacdCurrent>(MACDOpenLevel*Point) && MaCurrent<MaPrevious)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"macd sample",16384,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("SELL order opened : ",OrderOpenPrice());
}
else
Print("Error opening SELL order : ",GetLastError());
}
//--- exit from the "no opened orders" block
return;
}
//--- it is important to enter the market correctly, but it is more important to exit it correctly...
for(cnt=0;cnt<total;cnt++)
{
if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
continue;
if(OrderType()<=OP_SELL && // check for opened position
OrderSymbol()==Symbol()) // check for symbol
{
//--- long position is opened
if(OrderType()==OP_BUY)
{
//--- should it be closed?
if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&
MacdCurrent>(MACDCloseLevel*Point))
{
//--- close order and exit
if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet))
Print("OrderClose error ",GetLastError());
return;
}
//--- check for trailing stop
if(TrailingStop>0)
{
if(Bid-OrderOpenPrice()>Point*TrailingStop)
{
if(OrderStopLoss()<Bid-Point*TrailingStop)
{
//--- modify order and exit
if(!OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green))
Print("OrderModify error ",GetLastError());
return;
}
}
}
}
else // go to short position
{
//--- should it be closed?
if(MacdCurrent<0 && MacdCurrent>SignalCurrent &&
MacdPrevious<SignalPrevious && MathAbs(MacdCurrent)>(MACDCloseLevel*Point))
{
//--- close order and exit
if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet))
Print("OrderClose error ",GetLastError());
return;
}
//--- check for trailing stop
if(TrailingStop>0)
{
if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
{
if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
{
//--- modify order and exit
if(!OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red))
Print("OrderModify error ",GetLastError());
return;
}
}
}
}
}
}
//---
}
//+------------------------------------------------------------------+
Опять вы выложили обрывок кода. Опишите тогда что вы хотите запрограммировать, из куска я понял что вы пытаетесь выставить сетку из отложенных ордеров. А весь код должен выглядеть так. Это код советника из стандартной поставки терминала.
//| MACD Sample.mq4 |
//| Copyright 2005-2014, MetaQuotes Software Corp. |
//| http://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright "2005-2014, MetaQuotes Software Corp."
#property link "http://www.mql4.com"
input double TakeProfit =50;
input double Lots =0.1;
input double TrailingStop =30;
input double MACDOpenLevel =3;
input double MACDCloseLevel=2;
input int MATrendPeriod =26;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void OnTick(void)
{
double MacdCurrent,MacdPrevious;
double SignalCurrent,SignalPrevious;
double MaCurrent,MaPrevious;
int cnt,ticket,total;
//---
// initial data checks
// it is important to make sure that the expert works with a normal
// chart and the user did not make any mistakes setting external
// variables (Lots, StopLoss, TakeProfit,
// TrailingStop) in our case, we check TakeProfit
// on a chart of less than 100 bars
//---
if(Bars<100)
{
Print("bars less than 100");
return;
}
if(TakeProfit<10)
{
Print("TakeProfit less than 10");
return;
}
//--- to simplify the coding and speed up access data are put into internal variables
MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);
MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0);
MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1);
total=OrdersTotal();
if(total<1)
{
//--- no opened orders identified
if(AccountFreeMargin()<(1000*Lots))
{
Print("We have no money. Free Margin = ",AccountFreeMargin());
return;
}
//--- check for long position (BUY) possibility
if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious &&
MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("BUY order opened : ",OrderOpenPrice());
}
else
Print("Error opening BUY order : ",GetLastError());
return;
}
//--- check for short position (SELL) possibility
if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&
MacdCurrent>(MACDOpenLevel*Point) && MaCurrent<MaPrevious)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"macd sample",16384,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("SELL order opened : ",OrderOpenPrice());
}
else
Print("Error opening SELL order : ",GetLastError());
}
//--- exit from the "no opened orders" block
return;
}
//--- it is important to enter the market correctly, but it is more important to exit it correctly...
for(cnt=0;cnt<total;cnt++)
{
if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
continue;
if(OrderType()<=OP_SELL && // check for opened position
OrderSymbol()==Symbol()) // check for symbol
{
//--- long position is opened
if(OrderType()==OP_BUY)
{
//--- should it be closed?
if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&
MacdCurrent>(MACDCloseLevel*Point))
{
//--- close order and exit
if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet))
Print("OrderClose error ",GetLastError());
return;
}
//--- check for trailing stop
if(TrailingStop>0)
{
if(Bid-OrderOpenPrice()>Point*TrailingStop)
{
if(OrderStopLoss()<Bid-Point*TrailingStop)
{
//--- modify order and exit
if(!OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green))
Print("OrderModify error ",GetLastError());
return;
}
}
}
}
else // go to short position
{
//--- should it be closed?
if(MacdCurrent<0 && MacdCurrent>SignalCurrent &&
MacdPrevious<SignalPrevious && MathAbs(MacdCurrent)>(MACDCloseLevel*Point))
{
//--- close order and exit
if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet))
Print("OrderClose error ",GetLastError());
return;
}
//--- check for trailing stop
if(TrailingStop>0)
{
if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
{
if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
{
//--- modify order and exit
if(!OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red))
Print("OrderModify error ",GetLastError());
return;
}
}
}
}
}
}
//---
}
//+------------------------------------------------------------------+
Да, все верно, я выставляю сетку из отложников с шагом(произвольным) от основного рыночного ордера, для закрытия используется один и тот же стоп лосс и обратные сигналы, все работает так как надо, но хотелось бы удалить все отложники при достижении стоп лосса (как вариант удаление можно производить при закрытии сделок)
P.S. смысл прикреплять весь код, если вопрос только про удаление не реализованных отложников, если схемы есть, то я думаю вряд ли они будут сильно отличаться, если я не прав, тогда поясните))
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Столкнулся с небольшими трудностями, на сколько мне известно при достижении стоп лосса отложники (если они не открыты) не удаляются, а возможно как то реализовать удаление отложников при пересечении стоп лосса?