English 中文 Español Deutsch 日本語 Português 한국어 Français Italiano Türkçe
preview
Разработка торговой системы на основе индикатора DeMarker

Разработка торговой системы на основе индикатора DeMarker

MetaTrader 5Трейдинг | 17 ноября 2022, 15:40
1 476 0
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

Введение

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

  1. Определение индикатора DeMarker
  2. Стратегии по индикатору DeMarker
  3. Схема стратегий по DeMarker
  4. Торговые системы по DeMarker
  5. Заключение

В статье будем использовать торговую платформу MetaTrader 5, встроенный редактор кода MetaEditor и язык программирования MQL5 (MetaQuotes Language) для написания советников. Если вы не знаете, как загрузить или использовать MetaTrader 5, почитайте раздел "Как написать MQL5-код в редакторе MetaEditor" в одной из предыдущих статьей — там все подробно описано.

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

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

Определение индикатора DeMarker

Чтобы научиться правильно работать с индикатором Демарка, нужно для начала узнать, что он из себя представляет, что измеряет, как его рассчитать и как интерпретировать его показатели. Индикатор DeMarker — это осциллятор, который создал технический аналитик Томас Демарк. Отсюда понятно название индикатора — по имени создателя. Можно встретить разные варианты — DeMarker, DeM, Демарк. Этот технический инструмент измеряет спрос на финансовый инструмент и оценивает направленность рынка путем сравнения текущих максимальных и минимальных цен с предыдущими ценами.

Индикатор можно рассчитать вручную в несколько шагов:

DMark (i) = SMA (DeMax, N) / (SMA (DeMax, N) + SMA (DeMin, N))

где:

  • DMark (i) = текущее значение Демарка
  • SMA = простое скользящее среднее
  • DeMax = максимальное значение индикатора Демарка
  • N = период
  • DeMin = минимальное значение индикатора Демарка


Значение DeMax рассчитывается следующим образом:

DeMax (i) = HIGH (i) - HIGH (i - 1), где HIGH — максимум

В противном случае:

DeMax (i) = 0


Значение DeMin рассчитывается так:

DeMin (i) = LOW (i - 1) - LOW (i), где LOW — это минимум

В противном случае:

DeMin (i) = 0

Индикатор строит линию, которая колеблется между уровнями 0 и 1 и отображает спрос на финансовый инструмент. Но рассчитывать индикатор вручную не нужно, поскольку уже есть готовый к использованию индикатор в торговом терминале MetaTrader 5, и все, что нужно сделать, это выбрать его из списка индикаторов.

Как запустить индикатор DeMarker на графике в MetaTrader 5:

В торговой платформе MetaTrader 5 выбираем меню Вставка --> Индикаторы --> Осцилляторы --> DeMarker.

Запуск на графике DeM

После этого откроется окно параметров индикатора. Выглядит оно так:

Параметры индикатора DeM

1 - период расчета

2 - цвет линии индикатора

3 - стиль линии индикатора

4 - толщина линии индикатора

Настраиваем параметры, нажимаем кнопку OK, и индикатор запустится на графике, как показано ниже:

Индикатор DeM на графике

На скриншоте выше видно, что индикатор запустился в дополнительном окне графика — в нем появилась линия, которая колеблется между уровнями 0 и 1. Показатели индикатора следует интерпретировать в соответствии с положением линии в этом окне. Если линия приближается к 0,70, это означает, что на рынке сложилась ситуация перекупленности. Значения около 0,30 означают сложившиеся условия перепроданности.

Стратегии по индикатору DeMarker

В этом раздели рассмотрим варианты использования индикатора DeMarker в соответствии с его концепцией. Для этого познакомимся с тремя простыми стратегиями.

    Стратегия первая: сила Демарка

      В этой стратегии мы будем получать сигналы о сильном или слабом индикаторе Демарка. Такой сигнал будет генерироваться на основе анализа значения DeMarker и среднего значения индикатора за последние 5 периодов. Если текущее значение индикатора DeMarker выше, чем среднее значение за последние пять периодов, это показатель сильного значения. И наоборот, если текущее значение индикатора DeMarker ниже, чем среднее значение за последние пять периодов, это показатель слабого значения.

      Проще говоря:

      Значение DeMarker >= 5-периодного среднего значения DeMarker --> DeMarker сильный

      Значение DeMarker <= 5-периодного среднего значения DeMarker --> DeMarker слабый

        Стратегия вторая: DeMarker, перекупленность и перепроданность

          По этой стратегии получать сигналы будем, когда индикатор будет заходить в зоны перекупленности и перепроданности. Если текущее значение DeM больше или равно 0,70, это будет сигналом о входе в зону перекупленности. Если текущее значение DeM меньше или равно 0,30, это признак зоны перепроданности.

          Схематично:

          Значение DeMarker >= 0.70 --> Перекупленность

          Значение DeMarker <= 0.30 --> Перепроданность

            Стратегия третья: дивергенция по Демарку

              Эта стратегия будет формировать сигналы бычьей или медвежьей дивергенции, которые дают представление о вероятности изменения текущего движения. Для этого нужно анализировать четыре значения: текущий и предыдущий максимум, а также текущее и предыдущее значение индикатора DeMarker. Здесь мы рассматриваем самые простые варианты расхождения. Более эффективным же будет сравнивать и анализировать максимумы и минимумы цены с максимумами и минимумами индикатора. В нашей же простой стратегии сигнал о бычьем расхождении будем получать, если текущий максимум выше предыдущего максимума, в то время как текущее значение DeMarker ниже его предыдущего значения. Если текущий минимум ниже предыдущего максимума, а текущее значение индикатора больше его предыдущего значения, это признак бычьего расхождения (дивергенции).

              Если рассмотреть схематично:

              Текущий максимум > предыдущий максимум и текущее значение DeM < предыдущий DeM --> медвежья дивергенция

              Текущий минимум < предыдущего минимума, а текущий показатель DeMarker > предыдущего --> бычье расхождение.

              Схема стратегий по DeMarker

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

                Стратегия первая: сила Демарка

                  Торговая система по этой стратегии должна автоматически проверять два значения и сравнивать их. Это текущий показатель индикатора DeMarker и среднее последних пяти значений индикатора. Если текущее значение больше среднего, торговая система будет выводить на график комментарий со следующими значениями:

                  • Индикатор DeMarker сильный
                  • Текущее значение DeMarker
                  • 5-периодная средняя DeMarker

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

                  • Индикатор DeMarker слабый
                  • Текущее значение DeMarker
                  • 5-периодная средняя DeMarker
                  Ниже показана пошаговая схема, которая поможет разработать торговую систему по этой стратегии.

                  Схема стратегии силы DeMarker

                    Стратегия вторая: DeMarker, перекупленность и перепроданность

                      Система, основанная на этой стратегии, будет проверять условия формирования сигнала и выводить этот сигнал на график. Для этого система будет проверять три значения: текущее значение индикатора DeMarker, а также два его уровня: 0.70 и 0.30. Если текущее значение DeMarker больше или равно уровню 0,70, торговая система будет выводить на график вот такой комментарий:

                      • Перекупленность
                      • Значение DeMarker

                      В противном случае, если текущее значение DeMarker меньше или равно уровню 0,30, торговая система будет выводить на график вот такой комментарий:

                      • Перепроданность
                      • Значение DeMarker
                      Схема стратегии DeMarker OB, OS
                        Стратегия третья: дивергенция по Демарку

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

                          • Медвежья дивергенция
                          • Текущий максимум
                          • Предыдущий максимум
                          • Текущее значение DeMarker
                          • Предыдущее значение DeMarker

                          В противоположной ситуации, если текущий минимум ниже предыдущего и при этом текущее значение Демарка выше его предыдущего значения, торговая система должна вывести другой комментарий на графике:

                          • Бычье расхождение
                          • Текущий максимум
                          • Предыдущий максимум
                          • Текущее значение DeMarker
                          • Предыдущее значение DeMarker

                          Схема стратегии DeMarker Divergence

                          Торговые системы по DeMarker

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

                          Шаг первый

                          Создаем массив deMarkerArray используя функцию double для получения значений с плавающей точкой.

                          double deMarkerArray[];

                          Шаг второй

                          С помощью функции ArraySetAsSeries устанавливаем флаг AS_SERIES массиву deMarkerArray — функция возвращает логическое значение true или false в зависимости от результата.

                          ArraySetAsSeries(deMarkerArray,true);

                          Шаг третий

                          Определяем индикатор DeMarker с помощью функции "DeMarker, которая возвращает хэндл индикатора. Параметры функции:

                          • symbol — имя символа; у нас это "_Symbol", то есть рассчитываем индикатор по символу текущего графика.
                          • period — таймфрейм для расчета; значение "_Period" означает, что индикатор будет рассчитываться на текущем таймфрейме.
                          • ma_period — период усреднения, мы будем использовать 14.
                          int deMarkerDef = iDeMarker(_Symbol,_Period,14);

                          Шаг четвертый

                          Получаем данные из буфера индикатора DeMarker с помощью функции CopyBuffer. Параметры функции:

                          • indicator_handle — стандартный хэндл индикатора deMarkerDef
                          • buffer_num — номер индикаторного буфера, установим 0
                          • start_pos — установим позицию начала расчета, укажем 0
                          • count — количество данных для копирования, укажем 3
                          • buffer[] — определяем ценовой массив для копирования, у нас это deMarkerArray
                          CopyBuffer(deMarkerDef,0,0,3,deMarkerArray);

                          Шаг пятый

                          Определяем текущее значение deMarker с помощью функции NormalizeDouble, которая возвращает значение типа double. Параметры функции:

                          • value — нормализуемое число
                          • digits — количество знаков после запятой
                          double deMarkerVal = NormalizeDouble(deMarkerArray[0],6);

                          Шаг шестой

                          С помощью функции Comment выводим на график комментарий с текущим значением индикатора DeMarker.

                          Comment("DeMarker Value is ",deMarkerVal);

                          Полный код программы, выводящей значение индикатора на графике, показан ниже:

                          //+------------------------------------------------------------------+
                          //|                                       Simple DeMarker System.mq5 |
                          //|                                  Copyright 2022, MetaQuotes Ltd. |
                          //|                                             https://www.mql5.com |
                          //+------------------------------------------------------------------+
                          #property copyright "Copyright 2022, MetaQuotes Ltd."
                          #property link      "https://www.mql5.com"
                          #property version   "1.00"
                          //+------------------------------------------------------------------+void OnTick()
                            void OnTick()
                            {
                             double deMarkerArray[];
                          
                             ArraySetAsSeries(deMarkerArray,true);
                          
                             int deMarkerDef = iDeMarker(_Symbol,_Period,14);
                          
                             CopyBuffer(deMarkerDef,0,0,3,deMarkerArray);
                          
                             double deMarkerVal = NormalizeDouble(deMarkerArray[0],6);
                          
                             Comment("DeMarker Value is ",deMarkerVal);
                          
                            }
                          //+------------------------------------------------------------------+
                          
                          

                          После компиляции программа советника появится в окне Навигатора в MetaTrader 5:

                          Навигатор

                          Запускаем двойным кликом на файле или перетаскиваем на график. После этого появится окно советника.

                           Окно программы Simple DeMarker

                          Нажимаем OK, и программа (советник) запустится на графике, как показано на рисунке ниже:

                          Программа Simple DeMarker на графике

                          Как видите, в правом верхнем углу графика появилась индикация, что на графике работает советник Simple DeMarker. Советник запущен и генерирует сигналы, которые отображаются на графике. Те же самые шаги нужно будет повторить для компиляции всех кодов по рассмотренным ранее стратегиям, после чего их можно запускать в платформе MetaTrader 5.

                          Ниже показаны примеры комментариев, сгенерированных при тестировании этой стратегии.

                          Как видите, в верхнем левом углу графика отображается комментарий с текущим значением индикатора DeMarker.

                            Стратегия первая: сила Демарка

                              Полный код торговой системы, работающей по этой стратегии, показан ниже.

                              //+------------------------------------------------------------------+
                              //|                                            DeMarker Strength.mq5 |
                              //|                                  Copyright 2022, MetaQuotes Ltd. |
                              //|                                             https://www.mql5.com |
                              //+------------------------------------------------------------------+
                              #property copyright "Copyright 2022, MetaQuotes Ltd."
                              #property link      "https://www.mql5.com"
                              #property version   "1.00"
                              //+------------------------------------------------------------------+
                              void OnTick()
                                {
                                 double deMarkerArray[];
                              
                                 ArraySetAsSeries(deMarkerArray,true);
                              
                                 int deMarkerDef = iDeMarker(_Symbol,_Period,14);
                              
                                 CopyBuffer(deMarkerDef,0,0,6,deMarkerArray);
                              
                                 double deMarkerVal = NormalizeDouble(deMarkerArray[0],4);
                                 double deMarkerVal1 = NormalizeDouble(deMarkerArray[1],4);
                                 double deMarkerVal2 = NormalizeDouble(deMarkerArray[2],4);
                                 double deMarkerVal3 = NormalizeDouble(deMarkerArray[3],4);
                                 double deMarkerVal4 = NormalizeDouble(deMarkerArray[4],4);
                                 double deMarkerVal5 = NormalizeDouble(deMarkerArray[5],4);
                              
                                 double deMarkerAvgVal = (deMarkerVal1+deMarkerVal2+deMarkerVal3+deMarkerVal4+deMarkerVal5)/5;
                              
                              
                                 if(deMarkerVal>deMarkerAvgVal)
                                   {
                                    Comment("DeMarker is strong","\n",
                                            "Current DeMarker Value is ",deMarkerVal,"\n",
                                            "AVG DeMarker Value is ",deMarkerAvgVal);
                                   }
                              
                                 if(deMarkerVal<deMarkerAvgVal)
                                   {
                                    Comment("DeMarker is weak","\n",
                                            "Current DeMarker Value is ",deMarkerVal,"\n",
                                            "AVG DeMarker Value is ",deMarkerAvgVal);
                                   }
                                }
                              //+------------------------------------------------------------------+
                              

                              Отличия в этом коде:

                              Определяем последние пять значений индикатора DeMarker с помощью функции NormalizeDouble в дополнение к текущему значению индикатора, который мы определили ранее с помощью той же функции.

                                 double deMarkerVal = NormalizeDouble(deMarkerArray[0],4);
                                 double deMarkerVal1 = NormalizeDouble(deMarkerArray[1],4);
                                 double deMarkerVal2 = NormalizeDouble(deMarkerArray[2],4);
                                 double deMarkerVal3 = NormalizeDouble(deMarkerArray[3],4);
                                 double deMarkerVal4 = NormalizeDouble(deMarkerArray[4],4);
                                 double deMarkerVal5 = NormalizeDouble(deMarkerArray[5],4);
                              

                              Рассчитываем среднее deMarkerAvgVal на основе пяти полученных значений DeMarker. Для этого используем функцию double, которая создает переменную deMarkerAvgVal. Значение переменной будет равно сумме последних пяти значений, поделенных на пять.

                              double deMarkerAvgVal = (deMarkerVal1+deMarkerVal2+deMarkerVal3+deMarkerVal4+deMarkerVal5)/5;

                              Настройка условий стратегии

                              Сравнение текущего значения индикатора и deMarkerAvg. Сильный сигнал deMarker будет сформирован, если текущее значение больше, чем deMarkerAvg. Для этого используем оператор If:

                              if(expression) --> operator

                              В случае сильного показателя, когда deMarkerVal больше, чем deMarkerAvgVal (это expression в синтаксисе выше), система будет возвращать сигнал и выводить на график комментарий о сильном показателе (operator).

                                 if(deMarkerVal>deMarkerAvgVal)
                                   {
                                    Comment("DeMarker is strong","\n",
                                            "Current DeMarker Value is ",deMarkerVal,"\n",
                                            "AVG DeMarker Value is ",deMarkerAvgVal);
                                   }
                              

                              При слабом показателе текущее значение Демарка будет ниже, чем значение среднее, на график тоже будет выведен соответствующий индикатор о слабом показателе.

                                 if(deMarkerVal<deMarkerAvgVal)
                                   {
                                    Comment("DeMarker is weak","\n",
                                            "Current DeMarker Value is ",deMarkerVal,"\n",
                                            "AVG DeMarker Value is ",deMarkerAvgVal);
                                   }
                              

                              После компиляции программы и запуска из Навигатора советник по этой стратегии появится на графике:

                              Система по стратегии Strength на графике

                              В правом верхнем углу графика появилась индикация, обозначающая, что на графике работает советник. Советник запущен и генерирует сигналы, тестовые примеры сигналов показаны ниже.

                              В случае сильного сигнала:

                              Strength - сильный сигнал

                              На графике в верхнем левом углу видно, что торговая система сгенерировала сигнал на основе этой стратегии.

                              • Показатель DeMarker сильный --> потому что текущее значение DeMarker выше среднего за предыдущие пять значений.
                              • Текущее значение DeMarker.
                              • Среднее значение DeMarker. 

                              В случае слабого сигнала:

                              Strength - слабый сигнал

                              Соответствующий сигнал отобразился на графике, в верхнем левом углу:

                              • Показатель DeMarker слабый --> потому что текущее значение DeMarker ниже среднего за предыдущие пять значений.
                              • Текущее значение DeMarker.
                              • Среднее значение DeMarker. 
                                Стратегия вторая: DeMarker, перекупленность и перепроданность

                                  Код этой стратегии:

                                  //+------------------------------------------------------------------+
                                  //|                                       Simple DeMarker System.mq5 |
                                  //|                                  Copyright 2022, MetaQuotes Ltd. |
                                  //|                                             https://www.mql5.com |
                                  //+------------------------------------------------------------------+
                                  #property copyright "Copyright 2022, MetaQuotes Ltd."
                                  #property link      "https://www.mql5.com"
                                  #property version   "1.00"
                                  //+------------------------------------------------------------------+void OnTick()
                                  void OnTick()
                                    {
                                     double deMarkerArray[];
                                  
                                     ArraySetAsSeries(deMarkerArray,true);
                                  
                                     int deMarkerDef = iDeMarker(_Symbol,_Period,14);
                                  
                                     CopyBuffer(deMarkerDef,0,0,3,deMarkerArray);
                                  
                                     double deMarkerVal = NormalizeDouble(deMarkerArray[0],6);
                                  
                                  
                                     if(deMarkerVal<=0.30)
                                       {
                                        Comment("Oversold","\n",
                                                "DeMarker Value is ",deMarkerVal);
                                       }
                                  
                                     if(deMarkerVal>=0.70)
                                       {
                                        Comment("Overbought","\n",
                                                "DeMarker Value is ",deMarkerVal);
                                       }
                                     if(deMarkerVal>0.30 && deMarkerVal<0.70)
                                       {
                                        Comment("DeMarker Value is ",deMarkerVal);
                                       }
                                  
                                    }
                                  //+------------------------------------------------------------------+
                                  
                                  

                                  Отличия в этом коде:

                                  Условия данной стратегии.

                                  В случае сигнала перепроданности, когда текущее значение меньше или равно 0,30 — это часть expression (выражение) в if-функции, operator будет сигнал перепроданности. Он и отобразится на графике.

                                     if(deMarkerVal<=0.30)
                                       {
                                        Comment("Oversold","\n",
                                                "DeMarker Value is ",deMarkerVal);
                                       }
                                  

                                  Сигнал перекупленности будет сгенерирован, когда текущее значение Демарка больше или равно 0,70.

                                     if(deMarkerVal>=0.70)
                                       {
                                        Comment("Overbought","\n",
                                                "DeMarker Value is ",deMarkerVal);
                                       }
                                  

                                  Если же текущее значение находится между 0,30 и 0,70, сигнал отсутствует.

                                     if(deMarkerVal>0.30 && deMarkerVal<0.70)
                                       {
                                        Comment("DeMarker Value is ",deMarkerVal);
                                       }
                                  

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

                                  OB-OS на графике

                                  Теперь мы готовы получать сигналы по этой стратегии. Примеры тестовых сигналов показаны ниже.

                                  В случае перекупленности:

                                  DeM, OB - OS - сигнал перекупленности

                                  На графике в верхнем левом углу отобразился сгенерированный сигнал и дополнительные значения:

                                  • Перекупленность
                                  • Текущее значение DeMarker

                                  В случае перепроданности:

                                  DeM, OB - OS - сигнал перепроданности

                                  Стратегия сгенерировала сигнал:

                                  • Перепроданность
                                  • Текущее значение DeMarker

                                  При отсутствии сигнала:

                                  DeM, OB - OS - нет сигнала

                                  Сигнала нет, отображается только текущее значение.

                                    Стратегия третья: дивергенция по Демарку

                                      Ниже приведен полный код для создания торговой системы по третьей стратегии:

                                      //+------------------------------------------------------------------+
                                      //|                                          DeMarker Divergence.mq5 |
                                      //|                                  Copyright 2022, MetaQuotes Ltd. |
                                      //|                                             https://www.mql5.com |
                                      //+------------------------------------------------------------------+
                                      #property copyright "Copyright 2022, MetaQuotes Ltd."
                                      #property link      "https://www.mql5.com"
                                      #property version   "1.00"
                                      //+------------------------------------------------------------------+
                                      void OnTick()
                                        {
                                         double deMarkerArray[];
                                         MqlRates pArray[];
                                      
                                      
                                         ArraySetAsSeries(deMarkerArray,true);
                                         ArraySetAsSeries(pArray,true);
                                      
                                         int deMarkerDef = iDeMarker(_Symbol,_Period,14);
                                         int pData = CopyRates(_Symbol,_Period,0,14,pArray);
                                      
                                         CopyBuffer(deMarkerDef,0,0,14,deMarkerArray);
                                      
                                         double deMarkerVal = NormalizeDouble(deMarkerArray[0],4);
                                         double deMarkerPrevVal = NormalizeDouble(deMarkerArray[1],4);
                                      
                                         double currentHigh = NormalizeDouble(pArray[0].high,6);
                                         double currentLow = NormalizeDouble(pArray[0].low,6);
                                         double prevHigh = NormalizeDouble(pArray[1].high,6);
                                         double prevLow = NormalizeDouble(pArray[1].low,6);
                                      
                                         if(currentHigh>prevHigh && deMarkerVal<deMarkerPrevVal)
                                           {
                                            Comment("Bearish divergence","\n",
                                                    "Current High is ",currentHigh,"\n",
                                                    "Prev. High Value is ",prevHigh,"\n",
                                                    "Current DeMarker Value is ",deMarkerVal,"\n",
                                                    "Prev. DeMarker Value is ",deMarkerPrevVal);
                                           }
                                         if(currentLow<prevLow && deMarkerVal>deMarkerPrevVal)
                                           {
                                            Comment("Bullish divergence","\n",
                                                    "Current Low is ",currentLow,"\n",
                                                    "Prev. Low Value is ",prevLow,"\n",
                                                    "Current DeMarker Value is ",deMarkerVal,"\n",
                                                    "Prev. DeMarker Value is ",deMarkerPrevVal);
                                           }
                                      
                                        }
                                      //+------------------------------------------------------------------+
                                      
                                      

                                      Отличия в этом коде.

                                      Создаем две переменные: deMarkerArray с помощью double-функции и pArray (цены), используя функцию MqlRates, которая хранит информацию о ценах, объеме и спреде.

                                         double deMarkerArray[];
                                         MqlRates pArray[];
                                      

                                      Устанавливаем флаг AS_SERIES этим двум переменным.

                                         ArraySetAsSeries(deMarkerArray,true);
                                         ArraySetAsSeries(pArray,true);
                                      

                                      Определяем deMarketDef, pData

                                         int deMarkerDef = iDeMarker(_Symbol,_Period,14);
                                         int pData = CopyRates(_Symbol,_Period,0,14,pArray);
                                      

                                      Заполняем deMarkerArray

                                      CopyBuffer(deMarkerDef,0,0,14,deMarkerArray);

                                      Объявляем deMarkerVal, deMarkerPrevVal, текущий максимум, текущий минимум, предыдущий максимум и предыдущий минимум

                                         double deMarkerVal = NormalizeDouble(deMarkerArray[0],4);
                                         double deMarkerPrevVal = NormalizeDouble(deMarkerArray[1],4);
                                      
                                         double currentHigh = NormalizeDouble(pArray[0].high,6);
                                         double currentLow = NormalizeDouble(pArray[0].low,6);
                                         double prevHigh = NormalizeDouble(pArray[1].high,6);
                                         double prevLow = NormalizeDouble(pArray[1].low,6);
                                      

                                      Условия стратегии.

                                      В случае медвежьей дивергенции:

                                         if(currentHigh>prevHigh && deMarkerVal<deMarkerPrevVal)
                                           {
                                            Comment("Bearish divergence","\n",
                                                    "Current High is ",currentHigh,"\n",
                                                    "Prev. High Value is ",prevHigh,"\n",
                                                    "Current DeMarker Value is ",deMarkerVal,"\n",
                                                    "Prev. DeMarker Value is ",deMarkerPrevVal);
                                           }
                                      

                                      В случае бычьей дивергенции:

                                         if(currentLow<prevLow && deMarkerVal>deMarkerPrevVal)
                                           {
                                            Comment("Bullish divergence","\n",
                                                    "Current Low is ",currentLow,"\n",
                                                    "Prev. Low Value is ",prevLow,"\n",
                                                    "Current DeMarker Value is ",deMarkerVal,"\n",
                                                    "Prev. DeMarker Value is ",deMarkerPrevVal);
                                           }
                                      

                                      После компиляции находим программу советника в окне Навигатора в MetaTrader 5 и запускаем. Программа начнет работать на графике:

                                      Divergence на графике

                                      Как видите, в правом верхнем углу графика появилась индикация, что на графике работает советник. Советник запущен и генерирует сигналы, которые отображаются на графике.

                                       В случае бычьей дивергенции:

                                       Сигнал бычьего расхождения

                                      Сгенерированный сигнал отображается в комментарии на графике в верхнем левом углу:

                                      • Бычье расхождение
                                      • Текущий максимум
                                      • Предыдущий максимум
                                      • Текущее значение DeMarker
                                      • Предыдущее значение DeMarker

                                      В случае медвежьей дивергенции:

                                       Сигнал медвежьего расхождения

                                      Сгенерированный сигнал отображается в комментарии на графике в верхнем левом углу:

                                      • Медвежья дивергенция
                                      • Текущий максимум
                                      • Предыдущий максимум
                                      • Текущее значение DeMarker
                                      • Предыдущее значение DeMarker

                                      Заключение

                                      Итак, мы с вами подробно рассмотрели очередной технический инструмент — индикатор Демарка (DeMarker, DeM). Узнали, что он из себя представляет, что измеряет, как его рассчитать и как интерпретировать показатели. Также мы рассмотрели несколько простых стратегий как пример использования индикатора. Вот эти простые стратегии:

                                      • Сила DeMarker — генерирует сигналы о силе или слабости на основе положения текущего значения DeMarker относительно его 5-периодной средней.
                                      • DeMarker, OB - OS — формирует сигналы перекупленности или перепроданности на основе положения текущего значения DeMarker на шкале от 0 до 1.
                                      • Расхождение по DeMarker — сигналы о бычьем или медвежьем расхождении на основе положения текущего и предыдущего показателя DeMarker, а также текущего и предыдущего экстремума относительно друг друга.

                                      Затем мы разработали пошаговый план для каждой рассмотренной стратегии, который должен помочь создать торговую систему. После этого перешли к самой интересной теме — научились писать на MQL5 торговые системы по этим стратегиям, которые могут автоматически и точно генерировать сигналы. Предназначены они для использования в торговой платформе MetaTrader 5.

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

                                      Перевод с английского произведен MetaQuotes Ltd.
                                      Оригинальная статья: https://www.mql5.com/en/articles/11394

                                      Прикрепленные файлы |
                                      Нейросети — это просто (Часть 33): Квантильная регрессия в распределенном Q-обучении Нейросети — это просто (Часть 33): Квантильная регрессия в распределенном Q-обучении
                                      Продолжаем изучение распределенного Q-обучение. И сегодня мы посмотрим на данный подход с другой стороны. О возможности использования квантильной регрессии в решение вопрос прогнозирования ценовых движений.
                                      DoEasy. Элементы управления (Часть 26): Дорабатываем WinForms-объект "ToolTip" и начинаем разработку "ProgressBar" DoEasy. Элементы управления (Часть 26): Дорабатываем WinForms-объект "ToolTip" и начинаем разработку "ProgressBar"
                                      В статье завершим разработку элемента управления ToolTip и начнём разрабатывать WinForms-объект ProgressBar. По мере работы над объектами, разработаем универсальный функционал для оживления элементов управления и их составляющих.
                                      DoEasy. Элементы управления (Часть 27): Продолжаем работу над WinForms-объектом "ProgressBar" DoEasy. Элементы управления (Часть 27): Продолжаем работу над WinForms-объектом "ProgressBar"
                                      В статье продолжим разработку элемента управления ProgressBar. Создадим функционал для управления полосой прогресса и визуальными эффектами.
                                      Управление рисками и капиталом с помощью советников Управление рисками и капиталом с помощью советников
                                      Эта статья о том, чего вы не найдете в отчете о тестировании, чего следует ожидать при использовании советников, как управлять своими деньгами при использовании роботов и как покрыть значительный убыток, чтобы остаться в трейдинге при автоматизированной торговле.