Чт. Ноя 21st, 2024

Функция гарантированного открытия ордера

Функция открытия ордера. Применяя ее, Ваш советник гарантированно откроет ордер по рынку.

int OrderSendX(string symbol,int cmd,double lots,double price,int slippage,double stoploss,double takeprofit,string comment="",int magic=0,int expiration=0,color arrow_color=CLR_NONE)
  {
   Print("OrderSendReliable("+symbol+","+cmd+","+lots+","+price+","+slippage+","+stoploss+","+takeprofit+","+comment+
         ","+magic+","+expiration+","+arrow_color+")");
   while(true)
     {
      if(IsStopped())
        {
         Print("OrderSendReliable(): Trading is stopped!");
         return (-1);
        }
      RefreshRates();
      if(cmd == OP_BUY) price = Ask;
      if(cmd == OP_SELL) price = Bid;
      if(!IsTradeContextBusy())
        {
         int ticket=OrderSend(symbol,cmd,lots,NormalizeDouble(price,MarketInfo(symbol,MODE_DIGITS)),slippage,NormalizeDouble(stoploss,MarketInfo(symbol,
                              MODE_DIGITS)),NormalizeDouble(takeprofit,MarketInfo(symbol,MODE_DIGITS)),comment,magic,expiration,arrow_color);
         if(ticket>0)
           {
            Print("OrderSendReliable(): Success! Ticket: "+ticket);
            return (ticket);
           }
         int error=GetLastError();
         if(IsTemporaryError(error))
            Print("OrderSendReliable(): Temporary Error: "+error+" "+ErrorDescription(error)+". waiting.");
         else
           {
            Print("OrderSendReliable(): Permanent Error: "+error+" "+ErrorDescription(error)+". giving up.");
            return (-1);
           }
        }
      else
         Print("OrderSendReliable(): Must wait for trade context");

      Sleep(MathRand()/10);
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool IsTemporaryError(int error)
  {
   return (error == ERR_NO_ERROR
           || error == ERR_COMMON_ERROR
           || error == ERR_SERVER_BUSY
           || error == ERR_NO_CONNECTION
           || error == ERR_MARKET_CLOSED
           || error == ERR_PRICE_CHANGED
           || error == ERR_INVALID_PRICE
           || error == ERR_OFF_QUOTES
           || error == ERR_BROKER_BUSY
           || error == ERR_REQUOTE
           || error == ERR_TRADE_TIMEOUT
           || error == ERR_TRADE_CONTEXT_BUSY
           );
  }

Пример вызова функции в советнике:

ticketsell=OrderSendX(Symbol(),OP_SELL,LastLots,Bid,Slippage,0,0,name+" #new-SELL",Magic2,0,Red);

где:
ticketsell — присваиваемый тикет ордеру;
Symbol() — символ;
OP_SELL — тут бай или селл;
LastLots — Объем открываемого ордера (лот);
Bid — цена открытия (бид или аск);
Slippage — проскальзывание;
0 — стоп-лосс;
0— тейк-профит;
name+» #new-SELL» — комментарий к ордеру;
Magic2 — меджик-номер;
0 — срок истечения ордера (для отложенных ордеров);
Red — цвет отображения на графике места открытия ордера.

от drivermql

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

Ваш адрес email не будет опубликован.

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.