Ошибка OrderSelect ?

 

Доброго дня.

Помогите разобраться с ситуацией, пожалуйста.

При тестировании возникает ситуация, когда

OrdersTotal() == 4 
а
OrderSelect( i, SELECT_BY_POS, MODE_TRADES)
выбрать часть из них не может

Задача: Удалить все отложенные ордера и закрыть все торговые ордера по текущей цене.

Примечание: Пользуюсь своим логгером событий, его логи и покажу.

Код:

int myOrderDelete()
{
      int errCode,
          i,
          total = 0;
          
      Alert  ("[myOrderDelete]: Сбрасываем баласт");
      logThis("[myOrderDelete]: Сбрасываем баласт");
      total = OrdersTotal();
      logThis(StringConcatenate("[myOrderDelete]: OrdersTotal: "  , total));
      
      for (i = 0; i < total; i++)
      {     // листаем все открытые и отложенные ордера
            if( true != OrderSelect( i, SELECT_BY_POS, MODE_TRADES))
            {
                  errCode = GetLastError();
                  logThis(StringConcatenate("[myOrderDelete]: ошибка OrderSelect: ", ErrorDescription(errCode)));
            }
            else
            {
                  logThis(StringConcatenate("[myOrderDelete]: выбран ордер: ", OrderTicket()));
                  logThis(StringConcatenate("[myOrderDelete]: тип ордера: "  , OrderType()));
            
                  logThis(StringConcatenate("[myOrderDelete]: i: "  , i, "; total = ", total));
            
                  if (( OrderType() == OP_BUY ) || ( OrderType() == OP_SELL ))
                  {     // закрываем только открытые ордера
                        logThis("[myOrderDelete]: закрываем ордер");
                        //RefreshRates();
                        if( true != OrderClose(OrderTicket(), OrderLots() , Ask, 20, CLR_NONE))
                        {
                              errCode = GetLastError();
                              logThis(StringConcatenate("[myOrderDelete]: ошибка OrderClose: ", ErrorDescription(errCode)));
                        }
                  }
                  else
                  {     // удаляем и текущие отложенники
                        logThis(StringConcatenate("[myOrderDelete]: а этот с типом ", OrderType(), " тоже удалим"));
                        if( true != OrderDelete(OrderTicket(), CLR_NONE))
                        {
                              errCode = GetLastError();
                              logThis(StringConcatenate("[myOrderDelete]: ошибка OrderDelete: ", ErrorDescription(errCode)));
                        }
                  }
            }
      }
      mmSecondPart = true;
}

Лог:

12:54:00 12:54:00 [myOrderDelete]: Сбрасываем баласт
12:54:00 12:54:00 [myOrderDelete]: OrdersTotal: 4
12:54:00 12:54:00 [myOrderDelete]: выбран ордер: 19
12:54:00 12:54:00 [myOrderDelete]: тип ордера: 0
12:54:00 12:54:00 [myOrderDelete]: i: 0; total = 4
12:54:00 12:54:00 [myOrderDelete]: закрываем ордер
12:54:00 12:54:00 [myOrderDelete]: выбран ордер: 21
12:54:00 12:54:00 [myOrderDelete]: тип ордера: 0
12:54:00 12:54:00 [myOrderDelete]: i: 1; total = 4
12:54:00 12:54:00 [myOrderDelete]: закрываем ордер
12:54:00 12:54:00 [myOrderDelete]: ошибка OrderSelect: no error
12:54:00 12:54:00 [myOrderDelete]: ошибка OrderSelect: no error


 

Раз в месяц кто-нибудь выходит с этой ошибкой.

При закрытии ордеров считать ордера надо с конца, а не с начала. Т.е.

for (i = total-1; i >=0; i--)

 
Roger >>:

Раз в месяц кто-нибудь выходит с этой ошибкой.

При закрытии ордеров считать ордера надо с конца, а не с начала. Т.е.

for (i = total-1; i >=0; i--)

блин, стыдно :-[

Большое спасибо, помогли.