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

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

Как правило, весь код функции OnTick() эксперта или OnCalculate() индикатора будет выполняться на каждом полученном тике. Вы можете спросить, почему я должен ограничивать выполнение определенного действия только один раз за свечу? Рассмотрим несколько примеров:

  • Отправить только один ордер за формирование свечи.
  • Выполнить перенос стопа только один раз за формирование свечи.
  • Отправка уведомления только один раз за формирование свечи.
  • Это экономия ресурсов, так как значения пересчитываются только один раз за формирование свечи.

Рассмотрим пример кода, который запускается после закрытия свечи или после начала формирования новой свечи. Мы будем использовать предопределенную переменную-массив Time[0], которая содержит время открытия текущей свечи. Затем нам нужно будет сохранить значение Time[0] в другой переменной. Далее мы можем сравнивать значения Time[0] со значениями переменной.

#property copyright "Александр Паркер"
#property link      "https://traderblog.net/"
#property version   "1.00"
#property strict

datetime LastActiontime;
 
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   //Сравнение LastActionTime с текущим временем формирования свечи.
   if(LastActiontime!=Time[0]){
      //Выполнить следующий код один раз за свечу.
      Alert("Этот год выполняется один раз за свечу ",Time[0]);
      
      LastActiontime=Time[0];
   }
  }

Если вы выберем на графике минутный таймфрейм, то результат будет следующим:

запуск кода советника один раз за свечу

Если ваша цель состоит в том, чтобы запускать какой-либо код только один раз за свечу, однако не при ее открытии, нам нужно добавить еще одно условие.

#property copyright "Александр Паркер"
#property link      "https://traderblog.net/"
#property version   "1.00"
#property strict


datetime LastActiontime;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   //Сравнение LastActionTime с текущим временем формирования свечи.
   if(LastActiontime!=Time[0] && Ваше условие){
      //Выполнить следующий код один раз за свечу.
      Alert("Этот год выполняется один раз за свечу ",Time[0]);
      
      LastActiontime=Time[0];
   }
  }