CloseAll() — Закрыть все открытые ордера на текущей валютной паре.

Функция CloseAll() — Закрыть все открытые ордера. Из названия уже становиться понятно, какую функцию он выполняет.

Функция учитывает Magic ордера, поэтому её необходимо использовать с учётом названия параметра вашего магического номера, либо удалить из условия

 if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)

часть && OrderMagicNumber() == Magic

Т.е. условие будет выглядеть так:

 

 if (OrderSymbol() == Symbol())

 

Итак, функция:

//+------------------------------------------------------------------+
//| Expert function                                                  |
//+------------------------------------------------------------------+
void CloseAll() 
{
   bool IsClosed;
   int  err     = 0,
        counter = 0, 
        MaxTry  = 100; // количество попыток на закрытие ордера
   
   for (int trade = OrdersTotal() - 1; trade >= 0; trade--) 
   {
      if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES)) 
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) 
         {
            if (OrderType() == OP_BUY) 
            {
               IsClosed = false;
               counter = 0;
               while(!IsClosed)
               { 
                  IsClosed = OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Black);
                  if (!IsClosed)
                  {
                     err = GetLastError();
                     Print("Ошибка закрытия ордера " + IntegerToString(OrderTicket()) +", код ошибки: "+ IntegerToString(err));
                     counter++;
                     if (counter >= MaxTry)
                        break;
                     Sleep(100); 
                     RefreshRates();
                  }
               }                
            }
            if (OrderType() == OP_SELL) 
            {
               IsClosed = false;
               counter = 0;
               while(!IsClosed)
               { 
                  IsClosed = OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Black);
                  if (!IsClosed)
                  {
                     err = GetLastError();
                     Print("Ошибка закрытия ордера " + IntegerToString(OrderTicket()) +", код ошибки: "+ IntegerToString(err));
                     counter++;
                     if (counter >= MaxTry)
                        break;
                     Sleep(100); 
                     RefreshRates();
                  }
               }                
            }
         }
         Sleep(100);
      }
   }
}

//+------------------------------------------------------------------+

 

 

 

Written by 

Добавить комментарий