удаление всех ордеров

 

написал скрипт, исходя из прочтенного в документации:

int  i = OrdersTotal() - 1;

   

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

   { 

   OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

   Alert(GetLastError());

   OrderDelete(OrderTicket());

   Alert(GetLastError());

   }

   первый алерт  пишет об отсутствие ошибки(0)

второй алерт возвращает 4108(ошибка в номере тикета). Где ошибка понять не могу, в теории должно работать. Помогите плиз

 
cheater.wot:

второй алерт возвращает 4108(ошибка в номере тикета). Где ошибка понять не могу, в теории должно работать. Помогите плиз

Не должно работать, т. к. перед удалением ордера нужно проверить его тип. Рыночные ордера удалить невозможно. Только закрыть. Поэтому:

for (int i = OrdersTotal() - 1; i >= 0; i--)
{ 
   if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      continue;

   if (OrderType() == OP_BUY || OrderType() == OP_SELL)
      continue;

   ResetLastError();
   if (!OrderDelete(OrderTicket()))
        Alert(GetLastError());
}
 
#property strict

input int      MagicNumber    = 12345,  // Магик номер
               SlipPage       = 5;      // Проскальзывание
input bool     Symbol_type    = false,  // FALSE: все ордера, TRUE: только ордера Symbol графика
               Magic_type     = false,  // FALSE: все ордера, TRUE: только ордера с MagicNumber
               Close_BUY      = false,  // BUY ордера. TRUE: закрыть, FALSE: не закрывать
               Close_SELL     = false,  // SELL ордера. TRUE: закрыть, FALSE: не закрывать
               Del_BUYLIMIT   = false,  // BUYLIMIT ордера. TRUE: удалить, FALSE: не удалять
               Del_BUYSTOP    = false,  // BUYSTOP ордера. TRUE: удалить, FALSE: не удалять
               Del_SELLLIMIT  = false,  // SELLLIMIT ордера. TRUE: удалить, FALSE: не удалять
               Del_SELLSTOP   = false;  // SELLSTOP ордера. TRUE: удалить, FALSE: не удалять

void OnStart()
{
     for (int i = OrdersTotal() - 1; i >= 0; i--)
     {
          if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
               continue;
          if( Symbol_type )
               if (OrderSymbol()!=_Symbol)
                    continue;
          if( Magic_type )
               if (OrderMagicNumber()!=MagicNumber)
                    continue;

          ResetLastError();
          switch( OrderType() )
          {
               case OP_BUY:
                    if( !Close_BUY ) break;
                    if(!OrderClose(OrderTicket(), OrderLots(), SymbolInfoDouble(OrderSymbol(), SYMBOL_BID), SlipPage))
                         Alert(GetLastError());
                    break;
               case OP_SELL:
                    if( !Close_SELL ) break;
                    if(!OrderClose(OrderTicket(), OrderLots(), SymbolInfoDouble(OrderSymbol(), SYMBOL_ASK), SlipPage))
                         Alert(GetLastError());
                    break;
               case OP_BUYLIMIT:
                    if( !Del_BUYLIMIT ) break;
                    if (!OrderDelete(OrderTicket()))
                         Alert(GetLastError());
                    break;
               case OP_BUYSTOP:
                    if( !Del_BUYSTOP ) break;
                    if (!OrderDelete(OrderTicket()))
                         Alert(GetLastError());
                    break;
               case OP_SELLLIMIT:
                    if( !Del_SELLLIMIT ) break;
                    if (!OrderDelete(OrderTicket()))
                         Alert(GetLastError());
                    break;
               case OP_SELLSTOP:
                    if( !Del_SELLSTOP ) break;
                    if (!OrderDelete(OrderTicket()))
                         Alert(GetLastError());
                    break;
          }
     }
}
Лучше сделать экспертом.