Функция гарантированного открытия ордера
Функция открытия ордера. Применяя ее, Ваш советник гарантированно откроет ордер по рынку.
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 — цвет отображения на графике места открытия ордера.