Функция качественной модификации ордеров.
Она предназначена для того, чтобы предупреждать ситуации когда советник или скрипт не может изменить уровни StopLoss, TakeProfit или же переместить отложенные(Stop/Limit) ордера из-за ошибок сервера (реквоты, пропадание связи и пр.).
Функцию достаточно добавить в код и исправить Ваш вызов OrderModify:
result = OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(ldStopLoss, Digits),OrderTakeProfit(),0,CLR_NONE);
на
result = ModifyOrder(OrderTicket(),OrderOpenPrice(),NormalizeDouble(ldStopLoss, Digits),OrderTakeProfit(),0,CLR_NONE);
Сама функция:
bool ModifyOrder (int aticket, double aprice, double astoploss, double atakeprofit, datetime expiration, color arrow_color = CLR_NONE) { if (IsStopped()) { Print("Ошибка, остановлен: IsStopped() == true"); return(false); } int TryCount = 20; int cnt = 0; while(!IsTradeAllowed() && cnt < TryCount) { Sleep(500); cnt++; } if (!IsTradeAllowed()) { Print("Ошибка: Операция недопустима - IsTradeAllowed()==false"); return(false); } if (OrderSelect(aticket, SELECT_BY_TICKET,MODE_TRADES)) { string symbol = OrderSymbol(); int digits = int(MarketInfo(symbol, MODE_DIGITS)); if (digits > 0) { aprice = NormalizeDouble(aprice,digits); astoploss = NormalizeDouble(astoploss,digits); atakeprofit = NormalizeDouble(atakeprofit,digits); } } int err = GetLastError(); // so we clear the global variable. err = 0; bool exit_loop = false; bool result = false; while (!exit_loop) { if (IsTradeAllowed()) { result = OrderModify(aticket, aprice, astoploss, atakeprofit, expiration, arrow_color); err = GetLastError(); } else cnt++; if (result == true) exit_loop = true; switch (err) { case ERR_NO_ERROR: exit_loop = true; break; case ERR_NO_RESULT: exit_loop = 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: cnt++; break; case ERR_PRICE_CHANGED: case ERR_REQUOTE: RefreshRates(); continue; default: exit_loop = true; break; } // end switch if (cnt > TryCount) exit_loop = true; if (!exit_loop) { Print("Ошибка, попыток: (" + IntegerToString(cnt) + "/" + IntegerToString(TryCount)); Sleep(500); RefreshRates(); } if (exit_loop) { if ((err != ERR_NO_ERROR) && (err != ERR_NO_RESULT)) Print("Ошибка: " + IntegerToString(err)); } } // while (!exit_loop) if ((result == true) || (err == ERR_NO_ERROR)) { Print("Успешная модификация"); if(OrderSelect(aticket, SELECT_BY_TICKET, MODE_TRADES)) { OrderPrint(); return(true); // SUCCESS! } else { return(false); } } if (err == ERR_NO_RESULT) { return(true); } Print("Ошибка модификации после " + IntegerToString(cnt) + " попыток"); Print("Ошибка модификации: " + IntegerToString(aticket) + " " + Symbol() + "@" + DoubleToString(aprice) + " tp@" + DoubleToString(atakeprofit) + " sl@" + DoubleToString(astoploss)); Print("Ошибка : " + IntegerToString(err)); return(false); }