int SendOrder(int Type, double Lots, int TP, int SL, int Magic, string Cmnt, int& err)
{
double Price, Take, Stop;
int Ticket, Slippage, Color, Err;
bool Delay = False;
Print("Функция SendOrder");
[B]while(!IsStopped())
{
if(!IsExpertEnabled())
{
err = ERR_TRADE_DISABLED;
Print("Эксперту запрещено торговать!");
return(-1);
}
Print("Эксперту разрешено торговать");
if(!IsConnected())
{
err = ERR_NO_CONNECTION;
Print("Связь отсутствует!");
return(-1);
}
Print("Связь с сервером установлена");
if(IsTradeContextBusy())
{
Print("Торговый поток занят!");
Print("Ожидаем 3 сек...");
Sleep(3000);
Delay = True;
continue;
}
Print("Торговый поток свободен");
if(Delay)
{
Print("Обновляем котировки");
RefreshRates();
Delay = False;
}
else
{
Print("Задержек не было");
}
switch(Type)
{
case OP_BUY:
Print("Инициализируем параметры для BUY-ордера");
Price = NormalizeDouble( Ask, Digits);
Take = IIFd(TP == 0, 0, NormalizeDouble( Ask + TP * Point, Digits));
Stop = IIFd(SL == 0, 0, NormalizeDouble( Ask - SL * Point, Digits));
Color = Blue;
break;
case OP_SELL:
Print("Инициализируем параметры для SELL-ордера");
Price = NormalizeDouble( Bid, Digits);
Take = IIFd(TP == 0, 0, NormalizeDouble( Bid - TP * Point, Digits));
Stop = IIFd(SL == 0, 0, NormalizeDouble( Bid + SL * Point, Digits));
Color = Red;
break;
case OP_BUYSTOP:
Print("Инициализируем параметры для BUYSTOP-ордера");
Price = NormalizeDouble(Ask + Dist * Point, Digits);
Take = IIFd(TP == 0, 0, NormalizeDouble((Ask + Dist * Point) + (TakeProfit * Point), Digits));
Stop = IIFd(SL == 0, 0, NormalizeDouble( Ask + Dist * Point - SL * Point, Digits));
Color = DarkBlue;
break;
case OP_SELLSTOP:
Print("Инициализируем параметры для SELLSTOP-ордера");
Price = NormalizeDouble( Bid - Dist * Point, Digits);
Take = IIFd(TP == 0, 0, NormalizeDouble((Bid - Dist * Point) - (TakeProfit * Point), Digits));
Stop = IIFd(SL == 0, 0, NormalizeDouble( Bid - Dist * Point + SL * Point, Digits));
Color = Maroon;
break;
default:
Print("Тип ордера не соответствует требованиям.");
return(-1);
}
Slippage = MarketInfo(Symbol(), MODE_SPREAD);
Print("Slippage = ",Slippage);
if(IsTradeAllowed())
{
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 == 130 || /* INVALID_STOPS */
Err == 135 || /* PRICE_CHANGED */
Err == 137 || /* BROKER_BUSY */
Err == 138 || /* REQUOTE */
Err == 146 || /* TRADE_CONTEXT_BUSY */
Err == 136 ) /* OFF_QUOTES */
{
Print("Ошибка(OrderSend - ", Err, "): ", ErrorDescription(Err));
Print("Ожидаем 3 сек...");
Sleep(3000);
Delay = True;
continue;
}
else
{
Print("Критическая ошибка(OrderSend - ", Err, "): ", ErrorDescription(Err));
err = Err;
break;
}
}
break;
}
else
{
Print("Эксперту запрещено торговать или торговый поток занят!");
Print("Ожидаем 3 сек...");
Sleep(3000);
Delay = True;
continue;
}
}
Print("Ордер отправлен успешно. Тикет = ",Ticket);
return(Ticket);[/B]
}