Отправка маркет-ордера на сервер.
int SendMarketOrder(int Type, double Lots, int TP, int SL, int Magic, string Cmnt, int& Error)
{
double Price, Take, Stop;
int Ticket, Slippage, Color, Err;
bool Delay = False;
if(Debug) Print("Функция SendMarketOrder");
while(!IsStopped())
{
if(!IsExpertEnabled())
{
Error = ERR_TRADE_DISABLED;
Print("Работа эксперта запрещена! Кнопка "Эксперты" отжата.");
return(-1);
}
if(Debug) Print("Работа эксперта разрешена, кнопка "Эксперты" нажата.");
if(!IsConnected())
{
Error = ERR_NO_CONNECTION;
Print("Связь с сервером отсутствует!");
return(-1);
}
if(Debug) Print("Связь с сервером установлена");
if(IsTradeContextBusy())
{
if(Debug) Print("Торговый поток занят!");
if(Debug) Print("Ожидаем 3 сек...");
Sleep(3000);
Delay = True;
continue;
}
if(Debug) Print("Торговый поток свободен");
if(Delay || (LastTickTime != MarketInfo(Symbol(),MODE_TIME)))
{
if(Debug) Print("Обновляем котировки");
RefreshRates();
LastTickTime = MarketInfo(Symbol(),MODE_TIME);
Delay = False;
}
else
{
if(Debug) Print("Котировки актуальны");
}
switch(Type)
{
case OP_BUY:
if(Debug) Print("Инициализируем параметры для BUY-ордера");
Price = NormalizeDouble( Ask, Digits);
Take = IIFd(TP == 0, 0, NormalizeDouble( Price + TP * Point, Digits));
Stop = IIFd(SL == 0, 0, NormalizeDouble( Price - SL * Point, Digits));
Color = Blue;
break;
case OP_SELL:
if(Debug) Print("Инициализируем параметры для SELL-ордера");
Price = NormalizeDouble( Bid, Digits);
Take = IIFd(TP == 0, 0, NormalizeDouble( Price - TP * Point, Digits));
Stop = IIFd(SL == 0, 0, NormalizeDouble( Price + SL * Point, Digits));
Color = Red;
break;
default:
if(Debug) Print("Тип ордера не соответствует требованиям.");
return(-1);
}
Slippage = MarketInfo(Symbol(), MODE_SPREAD);
if(Debug) Print("Slippage = ",Slippage);
if(IsTradeAllowed())
{
if(Debug) Print("Торговля разрешена, отправляем ордер...");
Ticket = OrderSend(Symbol(), Type, Lots, Price, Slippage, Stop, Take, Cmnt, Magic, 0, Color);
if(Ticket < 0)
{
Err = GetLastError();
if (Err == 4 || /* SERVER_BUSY */
Err == 129 || /* INVALID_PRICE */
Err == 135 || /* PRICE_CHANGED */
Err == 137 || /* BROKER_BUSY */
Err == 138 || /* REQUOTE */
Err == 146 || /* TRADE_CONTEXT_BUSY */
Err == 136 ) /* OFF_QUOTES */
{
if(Debug) Print("Ошибка(OrderSend - ", Err, "): ", ErrorDescription(Err));
if(Debug) Print("Ожидаем 3 сек...");
Sleep(3000);
Delay = True;
continue;
}
else
{
if(Debug) Print("Критическая ошибка(OrderSend - ", Err, "): ", ErrorDescription(Err));
Error = Err;
break;
}
}
break;
}
else
{
if(Debug) Print("Эксперту запрещено торговать! Снята галка в свойствах эксперта.");
//Print("Ожидаем 3 сек...");
//Sleep(3000);
//Delay = True;
//continue;
break;
}
}
if(Ticket > 0)
if(Debug) Print("Ордер отправлен успешно. Тикет = ",Ticket);
else
if(Debug) Print("Ошибка! Ордер не отправлен. (ErrorCode = ", Error, ": ", ErrorDescription(Error), ")");
return(Ticket);
}
//+------------------------------------------------------------------+
double IIFd(bool condition, double ifTrue, double ifFalse)
{
if (condition) return(ifTrue); else return(ifFalse);
}