Как выполнить какую–либо задачу при открытии новой свечи на MQL4?

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

В автоматизации торговли часто требуется выполнить некоторые задачи или проверки, когда свеча закрывается и открывается. К примеру:

  • Отправка уведомлений о статусе последней закрытой свечи.
  • Проверка, стоит ли открывать или закрывать новый ордер при определенных значениях индикатора.
  • Обновление цен для тейк-профита или стоп-лосса.

Эти задачи можно выполнять всего лишь один раз на открытии свечи. Посмотрим, как это можно реализовать в коде.

//Создаем переменную для хранения времени открытия новой свечи. Присваиваем переменной текущее время сервера.
datetime NewCandleTime=TimeCurrent();
 
//Создааем функцию, кторая возвращает true каждый раз, когда инициализируется скрипт, например, при первой загрузке индикатора или советника или при изменении таймфрейма.
bool IsNewCandle(){
 
   //Если время свечи при последнем запуске функции совпадает со временем открытия этой свечи, возвращаем false, потому что это не новая свеча.
   if(NewCandleTime==iTime(Symbol(),0,0)) return false;
 
   //В противном случае это новая свеча, возвращаем true и обновляем ее время.
   else{
      NewCandleTime=iTime(Symbol(),0,0);
      return true;
   }
}
 
void OnTick(){
 
   if(IsNewCandle()){
 
      //Задание, которое должно быть выполнено в начале открытия новой свечи.
 
   }
 
}

Логика кода следующая:

  1. Создаем переменную и сохраняем в нее текущее время сервера.
  2. Создаем функцию, которая проверяет время и возвращает истину, если это новая свеча, и ложь, если нет.
  3. Сравниваем время открытия последней свечи со временем открытия текущей свечи.
  4. Если это время одинаковое, тогда это та же самая свеча, если оно другое, тогда это новая свеча.
  5. Если это новая свеча, возвращаем true и обновляем ее время.

Стоит помнить, что IsNewCandle() будет возвращать true каждый раз при инициализации функции. Например, при первом запуске, а также при изменении торгового инструмента или таймфрейма.