Как выбрать ордер и получить о нем информацию с помощью MQL4?

Когда вы планируете разработку нового советника, вы должны учитывать, что он просто следует вашим правилам, поэтому всегда будьте осторожны, когда пишете код. Важным правилом при запуске советника является проверка открытых ордеров. В этой статье мы увидим, как можно выбрать открытые ордера с помощью MQL4.

Предположим, что вы программируете советника, который размещает ордер на покупку, если цена находится выше скользящей средней с периодом 25. Если цена будет выше МА 25, советник разместит ордер. Затем он будет перезапущен на следующем тике, и если цена опять будет выше МА 25, он разместит еще один ордер, и еще один на следующем тике и т. д. Это будет происходить пока маржа на вашем торговом счете не исчерпает себя. Это очень распространенная и глупая ошибка, с которой сталкиваются многие начинающие программисты, когда они начинают создавать свой первый советник. Решение этой проблемы очень простое: мы можем проверить, есть ли уже открытые ордера для данного торгового инструмента. Далее создать условие не открывать новые ордера, если результаты проверки положительные.

После того, как мы успешно разместили ордер, нужно выбрать его, если мы хотим получить о нем информацию, а также изменить или закрыть его. Мы делаем это с помощью функции OrderSelect(). Чтобы использовать функцию OrderSelect (), мы можем использовать номер тикета, либо пройтись по списку открытых ордеров и выбрать каждый из них по порядку.

Вот синтаксис функции OrderSelect():

bool  OrderSelect(
   int     index,            // индекс или тикет ордера
   int     select,           // флаг способа выбора
   int     pool,             // источник данных для выбора
   );
  • index — порядковый номер или тикет ордера.
  • select — константа, которая указывает, является ли параметр index порядковым номером или тикетом ордера. Соответственно может принимать два значения: SELECT_BY_POS — значением параметра index является порядковый номер ордера, SELECT_BY_TICKET — Значением параметра index является тикет ордера.
  • pool — необязательная константа, которая обозначает тип ордеров: отложенные, открытые или закрытые. Может принимать два значения: MODE_TRADES — значение по умолчанию для текущих открытых ордеров, MODE_HISTORY — для закрытых ордеров.

Если функция OrderSelect() успешно выберет ордер, возвращаемое значение будет true, в противном случае возвращаемое значение будет false.

После вызова функции OrderSelect() мы можем использовать следующие функции для получения информации об ордере:

  • OrderSymbol() — торговый инструмент выбранного ордера.
  • OrdersTotal() — количество открытых и отложенных ордеров.
  • OrderType() — тип ордера: ордер на покупку или продажу, рыночный, стоп или лимитный ордер.
  • OrderOpenPrice() — цена открытия.
  • OrderLots() — размер лота.
  • OrderStopLoss() — цена стоп-лосс.
  • OrderTakeProfit() — цена тейк-профита.
  • OrderTicket() — номер тикета.
  • OrderMagicNumber() — магический номер.
  • OrderComment() — комментарий, который был размещен вместе с ордером.
  • OrderOpenTime() — время открытия.
  • OrderProfit() — возвращает значение чистой прибыли.

Использовуя оператор цикла for, мы можем перебрать все ордера и проверить, есть ли уже открытый ордер для торгового инструмента, на котором работает советник.

//Мы объявляем функцию CheckOpenOrders типа boolean и возвращаем true, если для данного торгового инструмента есть открытые ордера, и false, если их нет.
bool CheckOpenOrders(){
   //Далее нам нужно проверить, есть ли открытые или отложенные ордера. Нам возвращается общее количество рыночных и отложенных ордеров. Далее мы перебираем все ордера и проверяем, совпадают ли они с текущим символом, на котором работает советник.
   for(int i=0; i<OrdersTotal(); i++) {
      //Выбираем порядок выбора индекса ордера.
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      //Если пара ордеров OrderSymbol() равна символу, на котором работает советник, возвращаем true.
      if(OrderSymbol() == Symbol()) return(true);
   }
   //Если цикл завершается, это означает, что для данной пары не было открытых ордеров.
   return(false);
}
 
 
int OnInit()
{
   return(INIT_SUCCEEDED);
}
 
void OnDeinit(const int reason)
{
 
}
 
void OnTick()
{
   Alert("Есть ли открытые ордера для данного символа? ",CheckOpenOrders());
}

После того, как эксперт находит открытые ордера, мы можем добавить дополнительное условие не открывать новые ордера. Данный код можно улучшить с помощью дополнительных условий для проверки:

  • Проверять магический номер ордера.
  • Проверять тип ордера (ордер на покупку или на продажу).
  • Проверять, убыточный ордер или прибыльный.
Комментарии (1)
  1. А он не будет считать и отложки тоже?