Функция гарантированной модификации ордера
Функция позаимствована у Kimiv.
Внешний параметр (можно просто объявить без возможности редактирования. Много вариантов):
extern int NumberOfTry = 20; // Количество попыток модификации ордера
Чтобы компилятор не ругался на это: ErrorDescription,
в начале кода советника подключите библиотеку:
#include <stderror.mqh>
Перед вызовом функции для модификации ордера, этот ордер надо выбрать, примерно так:
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
{
// тут как раз-таки и вызываем функцию модификации
}
Параметры:
pp — цена установки ордера
sl — ценовой уровень стопа
tp — ценовой уровень тейка
cl — цвет значка модификации
Сама функция модификации ордера:
void ModifyOrder(double pp, double sl, double tp, color cl) {
bool fm;
double op, pa, pb, os, ot;
int dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er, it;
if (pp<=0) pp=OrderOpenPrice();
if (sl<0 ) sl=OrderStopLoss();
if (tp<0 ) tp=OrderTakeProfit();
pp=NormalizeDouble(pp, dg);
sl=NormalizeDouble(sl, dg);
tp=NormalizeDouble(tp, dg);
op=NormalizeDouble(OrderOpenPrice() , dg);
os=NormalizeDouble(OrderStopLoss() , dg);
ot=NormalizeDouble(OrderTakeProfit(), dg);
if (pp!=op || sl!=os || tp!=ot) {
for (it=1; it<=NumberOfTry; it++) {
if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
while (!IsTradeAllowed()) Sleep(5000);
RefreshRates();
fm=OrderModify(OrderTicket(), pp, sl, tp, 0, cl);
if (fm)
{
break;
}
else {
er=GetLastError();
pa=MarketInfo(OrderSymbol(), MODE_ASK);
pb=MarketInfo(OrderSymbol(), MODE_BID);
Print("Error(",er,") modifying order: ",ErrorDescription(er),", try ",it);
Print("Ask=",pa," Bid=",pb," sy=",OrderSymbol(),
" op="+OrderType()," pp=",pp," sl=",sl," tp=",tp);
Sleep(1000*10);
}
}
}
}
Если что-то не понятно, задавайте вопросы в комментариях. Постараюсь ответить быстро.
Спасибо за внимание.