Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
ooparadise
61
ooparadise  

Наткнулся на проблему, когда 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);
      }
   }
} 

 

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

Alexey Kozitsyn
7167
Alexey Kozitsyn  
ooparadise:

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

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

 

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

 

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

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

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

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