Не все ордера и позиции закрываются

 

Наткнулся на проблему, когда MT возвращает определенное количество ордеров или позиций, но не по всем может вернуть тикет, поэтому не получается закрыть позицию или удалить ордер. Приходится в цикле повторять действие несколько раз.

Этот код НЕ работает (остаются некоторые позиции и ордера):

void Stop()
{
   ulong ticket = 0;
   int count = OrdersTotal();
   for(int i=0; i<count; i++)
   {
      if ((ticket = OrderGetTicket(i)) > 0)
         DeleteLimitOrder(ticket);
   }
   
   count = PositionsTotal();
   for(int i=0; i<count; i++)
   {
      if ((ticket = PositionGetTicket(i)) > 0)
         DeletePosition(ticket);
   }
} 

 

Этот код работает (все позиции закрываются и все ордера удаляются): 

void Stop()
{
   ulong ticket = 0;
   int count = ;
   while ((count = OrdersTotal()) > 0)
   {
      for(int i=0; i<count; i++)
      {
         if ((ticket = OrderGetTicket(i)) > 0)
            DeleteLimitOrder(ticket);
      }
   }

   while ((count = PositionsTotal()) > 0)
   {
      for(int i=0; i<count; i++)
      {
         if ((ticket = PositionGetTicket(i)) > 0)
            DeletePosition(ticket);
      }
   }
} 

 

Почему мне нужно в цикле несколько раз брать ордера и позиции, чтобы точно закрыть все?

 
ooparadise:

Наткнулся на проблему, когда MT возвращает определенное количество ордеров или позиций, но не по всем может вернуть тикет, поэтому не получается закрыть позицию или удалить ордер. Приходится в цикле повторять действие несколько раз.

Этот код НЕ работает (остаются некоторые позиции и ордера):

 

Этот код работает (все позиции закрываются и все ордера удаляются): 

 

Почему мне нужно в цикле несколько раз брать ордера и позиции, чтобы точно закрыть все?

Потому, что нужно закрывать ордера/позиции, начиная с последней.
 

Более правильный перебор всех открытых позиций и отложенных ордеров.

   for(int i=OrdersTotal()-1; i>=0; i--)         
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) //ордер предварительно должен быть выбран
      {     
          .........
          //Любые действия с ордерами 
      }
   }
Причина обращения: