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

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

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

Пересечение скользящих средних:

пересеничение скользящих средних

Пересечение главной и сигнальной линии стохастика:

Пересечение линий индикатора MACD:

пересечение линий индикатора MACD

Неважно, какой индикатор мы будем использовать. Всегда есть две закономерности:

Линия 2 пересекает линию 1 снизу вверх:

линия 2 пересекает линию 1 снизу вверх

Линия 2 пересекает линию 1 сверху вниз:

линия 2 пересекает линию 1 сверху вниз

Чтобы запрограммировать на MQL пересечение, нам нужно определить его математически. Мы можем получить значения линии 1 и линии 2 в определенные моменты времени и далее сравнить эти значения.

Мы определяем:

  • I1 (t1) как значение линии 1 в момент времени t1.
  • I1 (t2) как значение линии 1 в момент t2.
  • I2 (t1) как значение линии 2 в момент времени t1.
  • I2 (t2) как значение линии 2 в момент времени t2.

Имея эти значения, мы можем установить правила для пересечения.

Линия 2 пересекает линию 1 снизу, если I2 (t1) меньше I1 (t1), а I2 (t2) больше I1 (t2):

пересечение двух линий на MQL4 вариант 1

Линия 2 пересекает линию 1 сверху, если I2 (t1) больше I1 (t1) и I2 (t2) меньше I1 (t2):

пересечение двух линий на MQL4 вариант 2

Рассмотрим пример MQL4 кода, который обнаруживает пересечение быстрой скользящей средней и медленной скользящей средней:

//Определяем две переменные, которые будут являться истинными в случае пересечения.
bool CrossToBuy=false;
bool CrossToSell=false;
 
//Определим периоды индикатора.
int MASlowPeriod=50;
int MAFastPeriod=10;
 
//Напишем функцию для проверки на пересечение.
void CheckMACross(){
   CrossToBuy=false;
   CrossToSell=false;
 
   //iMA - функция для получения значения индикатора скользящей средней.
 
   //MASlowCurr - значение медленной скользящей средней на текущей свече.
   double MASlowCurr=iMA(Symbol(),0,MASlowPeriod,0,MODE_SMA,PRICE_CLOSE,0);
 
   //MASlowPrev - значение медленной скользящей средней на последней закрытой свече.
   double MASlowPrev=iMA(Symbol(),0,MASlowPeriod,0,MODE_SMA,PRICE_CLOSE,1);
 
   //MAFastCurr - значение быстрой скользящей средней на текущей свече.
   double MAFastCurr=iMA(Symbol(),0,MAFastPeriod,0,MODE_SMA,PRICE_CLOSE,0);
 
   //MAFastPrev - значение быстрой скользящей средней на последней закрытой свече.
   double MAFastPrev=iMA(Symbol(),0,MAFastPeriod,0,MODE_SMA,PRICE_CLOSE,1);
 
   //Далее мы сравниваем значения и определяем, произошло ли одно из пересечений.
   if(MASlowPrev>MAFastPrev && MASlowCurr<MAFastCurr){
      CrossToBuy=true;
   }
   if(MASlowPrev<MAFastPrev && MASlowCurr>MAFastCurr){
      CrossToSell=true;
   }

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