MQL4. Фрагмент, отвечающий за повторные попытки открыть ордерВозможно, что для некоторых людей, разрабатывающих советники на MQL 4, будет полезен следующий фрагмент.
Пускай есть ордер вида
ticket=OrderSend(Symbol(),OP_BUY,lots_buy,MarketInfo(Symbol(),MODE_ASK),
slippage,0.0,0.0,»MartingailExpert»,MagicBuy,0,Blue);
Одер по какой-то причине не открылся сразу, причина не носит фатальный характер и через несколько секунд ордер открылся бы успешно, если бы была предпринята еще одна или несколько попыток.
В начало программы добавляю строки вида
//—-
extern string Parameters_15 =»Число попыток исправить ошибку открытия ордера»;
extern int error_reset = 30;
int kod_error;
int i;
После ордера, который возможно не был открыт с первой попытки, добавляю код
….
ticket=OrderSend(Symbol(),OP_BUY,lots_buy,MarketInfo(Symbol(),MODE_ASK),
slippage,0.0,0.0,»MartingailExpert»,MagicBuy,0,Blue);
//—————————————————————————-
kod_error = GetLastError();
if ((kod_error != 0)&&( ticket<=0))
{
Print(«Не удается открыть ордер по символу «, Symbol(), » Ошибка «, GetLastError(),» Выполняем еще «, error_reset, «попыток устранить ошибку»);
for (i=1; i<=error_reset; i++) { Sleep(5000); RefreshRates(); ticket=OrderSend(Symbol(),OP_BUY,lots_buy,MarketInfo(Symbol(),MODE_ASK),
slippage,0.0,0.0,»MartingailExpert»,MagicBuy,0,Blue);
if ( ticket>0) {Print(«Ордер «,ticket,» успешно открыт. Попытка «, i); break;}
}
}
if (ticket<=0) Print(«Ордер не был открыт за отведенное число попыток. Ошибка «, GetLastError());
//———————————————————————————-
Красным цветом выделен тот фрагмент, где меняете информацию, записывая ее для вашего ордера. Естественно, что можно было написать более продвинутый код, но для стандартных ситуаций, когда ордер, например, не открывается из-за быстрого изменения цены (реквота), как правило, достаточно и такого простого кода.