Обёртка для функции OrderSend

Функция качественного открытия ордеров BUY/SELL.

Она предназначена для того, чтобы предупреждать ситуации когда советник или скрипт не может открыть ордер из-за ошибок сервера (реквоты, пропадание связи и пр.).

Функцию достаточно добавить в код и исправить Ваш вызов OrderSend:

ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, comment, Magic, 0, Blue);

на

ticket = OpenOrder(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, comment, Magic, 0, Blue);

 

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

int OpenOrder (string asymbol, int cmd, double avolume, double aprice,
               int aslippage, double astoploss, double atakeprofit,
               string acomment, int amagic, datetime aexpiration = 0,
               color arrow_color = CLR_NONE)
{
   int err = GetLastError();
   err = 0;
   bool exit_loop = false;
   int  aticket = -1;
   err = GetLastError();
   err = 0;
   aticket = -1;

   int TryCount = 20; // Количество попыток на открытие ордера
   if (cmd == OP_BUY || cmd == OP_SELL)
   {
      int cnt = 0;
      while (!exit_loop)
      {
         if (IsTradeAllowed())
         {
             aticket = OrderSend(asymbol, cmd, avolume, aprice, aslippage,
                                 astoploss, atakeprofit, acomment, amagic, aexpiration, arrow_color);

             err = GetLastError();
         }
         else
         {
             cnt++;
         }

         switch (err)
         {
            case ERR_NO_ERROR:
                 exit_loop = true;
                 break;

            case ERR_SERVER_BUSY:
            case ERR_NO_CONNECTION:
            case ERR_INVALID_PRICE:
            case ERR_OFF_QUOTES:
            case ERR_BROKER_BUSY:
            case ERR_TRADE_CONTEXT_BUSY:
                 cnt++;
                 break;

            case ERR_PRICE_CHANGED:
            case ERR_REQUOTE:
                 RefreshRates();
                 continue;

            default:
                 exit_loop = true;
                 break;
         }  // end switch

         if (cnt > TryCount)
            exit_loop = true;

         if (!exit_loop)
         {
            Sleep(1000);
            RefreshRates();
         }

         if (exit_loop)
         {
            if (err != ERR_NO_ERROR)
            {
                Print("Ошибка : " + IntegerToString(err));
            }
         }
      }

      if (err == ERR_NO_ERROR)
      {
         if (OrderSelect(aticket, SELECT_BY_TICKET, MODE_TRADES))
             return(aticket);
         else return(-1);
      }  

      Print("Ошибка открытия ордера после " + IntegerToString(cnt) + " попыток.");
      Print("Ошибка : " + IntegerToString(err));
      return(-1);
   }
 return(-1);
}

 

Written by 

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