Сб. Апр 20th, 2024

Функция гарантированной модификации ордера

Функция позаимствована у 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);
      }
    }
  }
}

Если что-то не понятно, задавайте вопросы в комментариях. Постараюсь ответить быстро.

Спасибо за внимание.


Поделись с друзьями:

от drivermql

Добавить комментарий

Ваш адрес email не будет опубликован.

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.