void OrderSendX (string symbol, // символ
int cmd, // торговая операция
double volume, // количество лотов
double _price, // цена
int _slippage, // проскальзывание
double stoploss, // stop loss
double takeprofit, // take profit
string _comment, // комментарий
int magic=0, // идентификатор
datetime expiration=0, // срок истечения ордера
color arrow_color=clrNONE // цвет
)
{
int err = GetLastError();
err = 0;
bool exit_loops = false;
int cnt = 0;
while(!exit_loops)
{
if(IsTradeAllowed())
{
aticket = OrderSend(symbol,cmd,volume,_price,_slippage,stoploss,takeprofit,_comment,magic,expiration,arrow_color);
err = GetLastError();
}
switch(err)
{
case ERR_NO_ERROR: exit_loops=true; break;
case ERR_SERVER_BUSY:
case ERR_NO_CONNECTION:
case ERR_INVALID_PRICE:
case ERR_OFF_QUOTES:
case ERR_BROKER_BUSY:
case ERR_TRADE_CONTEXT_BUSY:
case ERR_TRADE_TIMEOUT:
Sleep(500);
RefreshRates();
cnt++;
break;
case ERR_PRICE_CHANGED:
case ERR_REQUOTE:
Sleep(500);
RefreshRates();
continue;
default:
exit_loops=true;
break;
}
if(aticket>0)exit_loops=true;
if(cnt>NumberTry)
exit_loops=true;
if(!exit_loops)
{
Sleep(1000);
RefreshRates();
}
if(exit_loops)
{
if(err != ERR_NO_ERROR)
{
Print("Ошибка открытия ордера "+symbol+" "+IntegerToString(err));
}
}
}
}