Сб. Апр 20th, 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 для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.