Удаление отложников

 
Доброго времени суток!
Столкнулся с небольшими трудностями, на сколько мне известно при достижении стоп лосса отложники (если они не открыты) не удаляются, а возможно как то реализовать удаление отложников при пересечении стоп лосса?
 
Filya1212:
Доброго времени суток!
Столкнулся с небольшими трудностями, на сколько мне известно при достижении стоп лосса отложники (если они не открыты) не удаляются, а возможно как то реализовать удаление отложников при пересечении стоп лосса?
можно конечно, реализаций множество, что бы вам помочь более конкретно необходимо видеть ваш код.
 
Sergey Gritsay:
можно конечно, реализаций множество, что бы вам помочь более конкретно необходимо видеть ваш код.
----------------------Открытие--------------------------------------------------------------------------------------------
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);
            }
прошу, в целом все стандартно
 
Filya1212:
----------------------Открытие--------------------------------------------------------------------------------------------
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());
           }

        }
     }
....
 
Sergey Gritsay:
тогда примерно будет так
//--------------------Закрытие и удаление--------------------------------------------
   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());
           }

        }
     }
....
Хмм, ни чего не изменилось, отложники как не удалялись так и не удаляются по стопу
 
Filya1212:
Хмм, ни чего не изменилось, отложники как не удалялись так и не удаляются по стопу

Если по стопу, то наверное как то так.

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_BUYSTOP)
        {
         double OOP=OrderOpenPrice();
         if(Bid<=OOP-StopLoss*Point)
           {
            res=OrderDelete(OrderTicket(),Violet);
            if(!res)Print("Ошибка удаления ордера ",OrderTicket()," № - ",GetLastError());
           }
        }
     }
 
Alekseu Fedotov:

Если по стопу, то наверное как то так.

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_BUYSTOP)
        {
         double OOP=OrderOpenPrice();
         if(Bid<=OOP-StopLoss*Point)
           {
            res=OrderDelete(OrderTicket(),Violet);
            if(!res)Print("Ошибка удаления ордера ",OrderTicket()," № - ",GetLastError());
           }
        }
     }
К сожалению это тоже не работает
 
Filya1212:
К сожалению это тоже не работает
К сожалению вы предоставили кусок кода, выкладывайте полностью, тогда будет решение.
 
Sergey Gritsay:
К сожалению вы предоставили кусок кода, выкладывайте полностью, тогда будет решение.

прошу прощения, прикладываю весь

это как было с открытием и закрытием

           if(chk==2)
        {
        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);
            }
        
        

         }
           }
          
        }

 как закрытие и удаление выглядит сейчас

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)
         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;
                    }
                 }
              }
           }
        }
     }
//---
  }
//+------------------------------------------------------------------+
....
 
Sergey Gritsay:
Опять вы выложили обрывок кода. Опишите тогда что вы хотите запрограммировать, из куска я понял что вы пытаетесь выставить сетку из отложенных ордеров. А весь код должен выглядеть так. Это код советника из стандартной поставки терминала.
//+------------------------------------------------------------------+
//|                                                  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. смысл прикреплять весь код, если вопрос только про удаление не реализованных отложников, если схемы есть, то я думаю вряд ли они будут сильно отличаться, если я не прав, тогда поясните)) 

Причина обращения: