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

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

MetaTrader 5Трейдинг | 9 ноября 2022, 13:58
1 612 0
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

Введение

Представляю вашему вниманию новую статью из серии для начинающих, в которой мы учимся создавать торговые системы на основе популярных технических индикаторов и простых стратегий. Сегодня мы поговорим об индикаторе Скользящей средней с динамическим периодом усреднения (Variable Index Dynamic Average, VIDYA). Это трендовый индикатор, то есть его показатели следуют за трендом. В связи с этим индикатор запаздывающий, то есть его движение происходит после движения самой цены. Работу над индикатором снова разобьем на несколько тем:

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


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

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


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

VIDYA — трендовый индикатор, разработанный Тушаром Чанде. Он похож на экспоненциальную скользящую среднюю, а отличие в том, что индикатор будет динамически корректироваться на основе относительной волатильности цен. Для измерения волатильности в индикаторе используется осциллятор Chande Momentum Oscillator (CMO), который измеряет соотношение между суммой положительных и отрицательных движений. Это будет проще понять, когда мы попробуем рассчитать индикатор вручную. CMO используется для сглаживания экспоненциальной скользящей средней. Отсюда имеем такие параметры индикатора: период осциллятора CMO и период усреднения EMA. Индикатор можно использовать так же, как любую скользящую среднюю, для определения тип тренда: восходящий он или нисходящий. О трендах мы уж не раз говорили в предыдущих статья. Например, можете прочитать подробное описание тренда из статьи по ссылке. Также индикатор можно использовать для генерации сигналов на покупку или продажу. Подробнее рассмотрим варианты простых торговых стратегий по индикатору VIDYA в отдельном разделе.

Теперь давайте посмотрим, как рассчитать индикатор VIDYA вручную — это позволит понять концепцию индикатора или эффективнее его использовать. Для расчета индикатора нужно рассчитать его составляющие.

  • Считаем EMA:

EMA(i) = Price(i) * F + EMA(i-1)*(1-F)

где:

EMA(i) = текущая экспоненциальная средняя

Price(i) = текущая цена

F (фактор сглаживания) = 2/(EMA периода+1)

EMA(i-1) = предыдущее значение EMA

  • Находим значение индикатора VIDYA:

VIDYA(i) = Price(i) * F * ABS(CMO(i)) + VIDYA(i-1) * (1 - F* ABS(CMO(i)))

где:

VIDYA(i) = текущее значение индикатора VIDYA

ABS(CMO(i)) = абсолютное текущее значение осциллятора Chande Momentum Oscillator

VIDYA(i-1) = предыдущее значение индикатора VIDYA

  • Находим осциллятор импульса Чанде CMO:

CMO(i) = (UpSum(i) - DnSum(i))/(UpSum(i) + DnSum(i))

где:

UpSum(i) = текущее значение суммы положительных движений за период

DnSum(i) = текущее значение суммы отрицательных движений за период

После этого получаем показатели индикатора VIDYA. Но по факту рассчитывать индикатор вручную не нужно, ведь есть готовый индикатор, который идет в стандартной поставке платформы MetaTrader 5. Его можно выбрать из списка доступных индикаторов и сразу запустить на графике.

Вставка --> Индикаторы --> Трендовы --> Variable Index Dynamic Average

Вставка VIDYA

Откроется окно с параметрами индикатора:

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

1 - период осциллятора импульса Чанде CMO

2 - период экспоненциальной скользящей средней EMA

3 - тип цены

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

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

6 - толщина линии индикатора VIDYA

Выбираем подходящие параметры индикатора, нажимаем кнопку OK, и индикатор запустится на графике, как показано ниже:

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

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


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

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

    Стратегия первая: идентификатор тренда по VIDYA

      Стратегия будет сообщать тип тренда — растущий или падающий — сравнивая текущее закрытия и текущее значение VIDYA с настройками по умолчанию (9,12). Сигнал о восходящем тренде будет сформирован, если текущее закрытие выше значения VIDYA. И наоборот, если текущее закрытие ниже VIDYA, будет сформирован сигнал о нисходящем тренде.

      Текущее закрытие > VIDYA --> восходящий тренд

      Текущее закрытие < VIDYA --> нисходящий тренд

        Стратегия вторая: пересечение VIDYA

          Согласно этой стратегии, мы будем получать сигналы на покупку или продажу на основе анализа индикатора, как в предыдущей стратегии. Будет сформирован сигнал на покупку, если текущее закрытие выше значения VIDYA. И наоборот, если цена закрытия ниже значения VIDYA, будет сформирован сигнал на продажу.

          Текущее закрытие > VIDYA --> сигнал на покупку

          Текущее закрытие < VIDYA --> Сигнал на продажу

            Стратегия третья: пересечение двух VIDYA

              Сигналы на покупку или продажу будут генерироваться на основе анализа двух индикаторов VIDYA: с настройками (9, 12) и с настройками (20, 50). Сигнал на покупку будем получать, когда VIDYA (9, 12) поднимается выше VIDYA (20, 50). И наоборот, когда значение индикатора VIDYA с параметрами (9, 12) опускается ниже индикатора с параметрами (20, 50), это сигнал на продажу.

              VIDYA (9, 12) > VIDYA (20, 50) --> сигнал на покупку

              VIDYA (9, 12) < VIDYA (20, 50) --> сигнал на продажу

              Эти три простые стратегии показывают варианты использования индикатора VIDYA.


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

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

                Стратегия первая: идентификатор тренда по VIDYA

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

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

                  • Восходящий тренд
                  • Текущее значение цены закрытия
                  • Текущее значение VIDYA

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

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

                  • Нисходящий тренд
                  • Текущее значение цены закрытия
                  • Текущее значение VIDYA

                  На следующем рисунке показана схема этой стратегии:

                   Схема стратегии для идентификации тренда по VIDYA

                    Стратегия вторая: пересечение VIDYA

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

                      В таком случае, система будет выводить на график такой комментарий:

                      • Сигнал на покупку
                      • Текущее значение цены закрытия
                      • Текущее значение VIDYA

                      Если же текущее закрытие ниже VIDYA, это сигнал на продажу.

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

                      • Сигнал на продажу
                      • Текущее значение цены закрытия
                      • Текущее значение VIDYA
                      На следующем рисунке показана схема этой стратегии:

                      Схема стратегии пересечения VIDYA

                        Стратегия третья: пересечение двух VIDYA

                          Торговая система по этой стратегии будет формировать и выводить на график сигналы на покупку и продажу. Для этого нужно постоянно анализировать значения двух VIDYA с разными параметрами: VIDYA (9, 12) и VIDYA (20, 50). Если текущее значение VIDYA с параметрами (9, 12) больше текущего значения индикатора с параметрами (20, 50), это будет сигналом на покупку.

                          В таком случае, система будет выводить на график такой комментарий:

                          • Сигнал на покупку
                          • Текущее значение цены закрытия
                          • Текущее значение VIDYA (9, 12)
                          • Текущее значение VIDYA (20, 50)

                          Если наоборот, VIDYA с параметрами (9, 12) ниже VIDYA (20, 50), это сигнал на продажу.

                          В таком случае, система будет выводить на график такой комментарий:

                          • Сигнал на продажу
                          • Текущее значение цены закрытия
                          • Текущее значение VIDYA (9, 12)
                          • Текущее значение VIDYA (20, 50)

                          На следующем рисунке показана схема этой стратегии:


                          Схема стратегии пересечения двух VIDYA

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


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

                          По этой стратегии система будет просто показывать текущее значение VIDYA в виде комментария на графике.

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

                          Создаем массив vidyaArray, используя double-функцию. Double — это один вещественный тип, число с плавающей запятой, то есть значение с дробной частью.

                          double vidyaArray[];

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

                          ArraySetAsSeries(vidyaArray,true);

                          Создаем переменную integer vidyaDef, будет получать значения индикатора VIDYA. Используем функцию iVIDyA, которая возвращает хендл индикатора.

                          Параметры:

                          • symbol — имя символа; у нас это _Symbol, то есть рассчитываем индикатор по символу текущего графика
                          • period — таймфрейм для расчета; значение _Period означает, что индикатор будет рассчитываться на текущем таймфрейме
                          • cmo_period — период расчета индикатора Chande Momentum, у нас это 9
                          • ema_period — период сглаживания экспоненциальной скользящей средней, мы используем 12
                          • ma_shift — при необходимости можно задать горизонтальный сдвиг, установим в значение 0
                          • applied_price — определяет тип цены, используемой для расчета; используем цену закрытия
                          int vidyaDef = iVIDyA(_Symbol,_Period,9,12,0,PRICE_CLOSE);

                          Заполним созданный массив с помощью функции CopyBuffer для получения данных индикатора VIDYA.

                          Параметры этой функции:

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

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

                          Параметры этой функции:

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

                          Используем функцию Comment для создания комментария к графику с текущим значением индикатора VIDYA:

                          Comment("VIDYA Value is ",vidyaVal);

                          Полный код программы, который у нас получился, выглядит так:

                          //+------------------------------------------------------------------+
                          //|                                                 Simple VIDYA.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 vidyaArray[];
                          
                             ArraySetAsSeries(vidyaArray,true);
                          
                             int vidyaDef = iVIDyA(_Symbol,_Period,9,12,0,PRICE_CLOSE);
                          
                             CopyBuffer(vidyaDef,0,0,3,vidyaArray);
                          
                             double vidyaVal = NormalizeDouble(vidyaArray[0],6);
                          
                             Comment("VIDYA Value is ",vidyaVal);
                          
                            }
                          //+------------------------------------------------------------------+
                          

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

                           VIDYA в Навигаторе

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

                           Окно простой системы VIDYA

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

                          Простая системы VIDYA на графике

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

                           Сигнал от системы Simple VIDYA

                          Снова видно, что в левом верхнем углу графика отобразился комментарий с текущем значением VIDYA. Если хотите убедиться, что советник будет генерировать точно такое же значение, что и стандартный индикатор VIDYA из поставки MetaTrader 5, можно одновременно запустить индикатор и советник с одинаковыми настройками.

                           Сигналы от индикатора и стратегии VIDYA

                          На графике запущен советник — об этом свидетельствует индикация в верхнем правом углу. Также на графике в верхнем левом углу показано текущее значение от этого советника. Кроме того, к графику прикреплен встроенный индикатор VIDYA, его значение отображается справа в окне данных. Значения идентичны.

                            Стратегия первая: идентификатор тренда по VIDYA

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

                              //+------------------------------------------------------------------+
                              //|                                       VIDYA trend identifier.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()
                                {
                                 MqlRates priceArray[];
                                 double vidyaArray[];
                              
                                 int Data=CopyRates(_Symbol,_Period,0,3,priceArray);
                                 ArraySetAsSeries(vidyaArray,true);
                              
                                 int vidyaDef = iVIDyA(_Symbol,_Period,9,12,0,PRICE_CLOSE);
                              
                                 CopyBuffer(vidyaDef,0,0,3,vidyaArray);
                              
                                 double currentClose=NormalizeDouble(priceArray[2].close,6);
                                 double vidyaVal = NormalizeDouble(vidyaArray[0],6);
                              
                                 if(currentClose>vidyaVal)
                                   {
                                    Comment("Uptrend","\n",
                                            "Current Close Value is ",currentClose,"\n",
                                            "Current VIDYA Value is ",vidyaVal);
                                   }
                              
                                 if(currentClose<vidyaVal)
                                   {
                                    Comment("Downtrend","\n",
                                            "Current Close Value is ",currentClose,"\n",
                                            "Current VIDYA Value is ",vidyaVal);
                                   }
                              
                              
                                }
                              //+------------------------------------------------------------------+
                              

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

                              Создаем два массива: для цен с помощью функции MqlRates и для VIDYA с помощью функции double, как рассмотрели ранее.

                                 MqlRates priceArray[];
                                 double vidyaArray[];
                              

                              Сортируем массивы. Для массива цен priceArray используем функцию CopyRates и получаем исторические данные MqlRates. Параметры такие:

                              • symbol name (имя символа) —_Symbol
                              • timeframe (таймфрейм) — _Period
                              • start time (время начала) — 0
                              • stop time (время остановки) — 3
                              • rates array — priceArray

                              Для vidyaArray будем использовать функцию ArraySetAsSeries.

                                 int Data=CopyRates(_Symbol,_Period,0,3,priceArray);
                                 ArraySetAsSeries(vidyaArray,true);
                              

                              Определяем текущую цену закрытия и текущие значения VIDYA.

                                 double currentClose=NormalizeDouble(priceArray[2].close,6);
                                 double vidyaVal = NormalizeDouble(vidyaArray[0],6);
                              

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

                              1. В случае восходящего тренда

                                 if(currentClose>vidyaVal)
                                   {
                                    Comment("Uptrend","\n",
                                            "Current Close Value is ",currentClose,"\n",
                                            "Current VIDYA Value is ",vidyaVal);
                                   }
                              

                              2. В случае нисходящего тренда

                                 if(currentClose<vidyaVal)
                                   {
                                    Comment("Downtrend","\n",
                                            "Current Close Value is ",currentClose,"\n",
                                            "Current VIDYA Value is ",vidyaVal);
                                   }
                              

                              Компилируем код и программу запускаем на графике. Увидим примерно такое:

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

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

                              1. В случае восходящего тренда

                               Идентификатор тренда по VIDYA - сигнал растущего тренда

                              В верхнем левом углу графика отображается комментарий со следующими значениями:

                              • Восходящий тренд
                              • Текущее значение цены закрытия
                              • Текущее значение VIDYA

                              2. В случае нисходящего тренда

                               Идентификатор тренда по VIDYA - сигнал тренда вниз

                              На графике отображается соответствующий комментарий:

                              • Нисходящий тренд
                              • Текущее значение цены закрытия
                              • Текущее значение VIDYA
                                Стратегия вторая: пересечение VIDYA

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

                                  //+------------------------------------------------------------------+
                                  //|                                          VIDYA one crossover.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()
                                    {
                                     MqlRates priceArray[];
                                     double vidyaArray[];
                                  
                                     int Data=CopyRates(_Symbol,_Period,0,3,priceArray);
                                     ArraySetAsSeries(vidyaArray,true);
                                  
                                     int vidyaDef = iVIDyA(_Symbol,_Period,9,12,0,PRICE_CLOSE);
                                  
                                     CopyBuffer(vidyaDef,0,0,3,vidyaArray);
                                  
                                     double currentClose=NormalizeDouble(priceArray[2].close,6);
                                     double vidyaVal = NormalizeDouble(vidyaArray[0],6);
                                  
                                     if(currentClose>vidyaVal)
                                       {
                                        Comment("Buy signal","\n",
                                                "Current Close Value is ",currentClose,"\n",
                                                "Current VIDYA Value is ",vidyaVal);
                                       }
                                  
                                     if(currentClose<vidyaVal)
                                       {
                                        Comment("Sell signal","\n",
                                                "Current Close Value is ",currentClose,"\n",
                                                "Current VIDYA Value is ",vidyaVal);
                                       }
                                  
                                  
                                    }
                                  //+------------------------------------------------------------------+
                                  

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

                                  Комментарий на основе этой стратегии.

                                  1. С сигналом на покупку

                                     if(currentClose>vidyaVal)
                                       {
                                        Comment("Buy signal","\n",
                                                "Current Close Value is ",currentClose,"\n",
                                                "Current VIDYA Value is ",vidyaVal);
                                       }
                                  

                                  2. С сигналом на продажу

                                     if(currentClose<vidyaVal)
                                       {
                                        Comment("Sell signal","\n",
                                                "Current Close Value is ",currentClose,"\n",
                                                "Current VIDYA Value is ",vidyaVal);
                                       }
                                  

                                  Компилируем код и программу запускаем на графике:

                                  Пересечение по VIDYA на графике

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

                                  1. С сигналом на покупку

                                  VIDYA one crossover - сигнал на покупку

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

                                  • Сигнал на покупку
                                  • Текущее значение цены закрытия
                                  • Текущее значение VIDYA

                                  2. С сигналом на продажу

                                   VIDYA one crossover - сигнал на продажу

                                  В верхнем левом углу графика отображается комментарий со следующими значениями:

                                  • Сигнал на продажу
                                  • Текущее значение цены закрытия
                                  • Текущее значение VIDYA
                                    Стратегия третья: пересечение двух VIDYA

                                      Код стратегии по пересечению двух индикаторов VIDYA целиком:

                                      //+------------------------------------------------------------------+
                                      //|                                          VIDYA two crossover.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()
                                        {
                                         MqlRates priceArray[];
                                         double vidyaArray[];
                                         double vidyaArray1[];
                                      
                                         int Data=CopyRates(_Symbol,_Period,0,3,priceArray);
                                         ArraySetAsSeries(vidyaArray,true);
                                         ArraySetAsSeries(vidyaArray1,true);
                                      
                                         int vidyaDef = iVIDyA(_Symbol,_Period,9,12,0,PRICE_CLOSE);
                                         int vidyaDef1 = iVIDyA(_Symbol,_Period,20,50,0,PRICE_CLOSE);
                                      
                                         CopyBuffer(vidyaDef,0,0,3,vidyaArray);
                                         CopyBuffer(vidyaDef1,0,0,3,vidyaArray1);
                                      
                                         double currentClose=NormalizeDouble(priceArray[2].close,6);
                                         double vidyaVal = NormalizeDouble(vidyaArray[0],6);
                                         double vidyaVal1 = NormalizeDouble(vidyaArray1[0],6);
                                      
                                         if(vidyaVal>vidyaVal1)
                                           {
                                            Comment("Buy signal","\n",
                                                    "Current Close Value is ",currentClose,"\n",
                                                    "Current VIDYA (9,12) Value is ",vidyaVal,"\n",
                                                    "Current VIDYA (20,50) Value is ",vidyaVal1);
                                           }
                                      
                                         if(vidyaVal<vidyaVal1)
                                           {
                                            Comment("Sell signal","\n",
                                                    "Current Close Value is ",currentClose,"\n",
                                                    "Current VIDYA (9,12) Value is ",vidyaVal,"\n",
                                                    "Current VIDYA (20,50) Value is ",vidyaVal1);
                                           }
                                      
                                      
                                        }
                                      //+------------------------------------------------------------------+
                                      

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

                                      В этот раз используем три массива: цены, vidyaArray, vidyaArray1

                                         MqlRates priceArray[];
                                         double vidyaArray[];
                                         double vidyaArray1[];
                                      

                                      Сортируем массивы

                                         int Data=CopyRates(_Symbol,_Period,0,3,priceArray);
                                         ArraySetAsSeries(vidyaArray,true);
                                         ArraySetAsSeries(vidyaArray1,true);
                                      

                                      Определяем vidyaDef и vidyaDef1

                                         int vidyaDef = iVIDyA(_Symbol,_Period,9,12,0,PRICE_CLOSE);
                                         int vidyaDef1 = iVIDyA(_Symbol,_Period,20,50,0,PRICE_CLOSE);
                                      

                                      Заполняем массивы vidyaArray и vidyaArray1

                                         CopyBuffer(vidyaDef,0,0,3,vidyaArray);
                                         CopyBuffer(vidyaDef1,0,0,3,vidyaArray1);
                                      

                                      Определяем currentClose, vidyaVal и vidyaVal1

                                         double currentClose=NormalizeDouble(priceArray[2].close,6);
                                         double vidyaVal = NormalizeDouble(vidyaArray[0],6);
                                         double vidyaVal1 = NormalizeDouble(vidyaArray1[0],6);
                                      

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

                                      1. С сигналом на покупку

                                         if(vidyaVal>vidyaVal1)
                                           {
                                            Comment("Buy signal","\n",
                                                    "Current Close Value is ",currentClose,"\n",
                                                    "Current VIDYA (9,12) Value is ",vidyaVal,"\n",
                                                    "Current VIDYA (20,50) Value is ",vidyaVal1);
                                           }
                                      

                                      2. С сигналом на продажу

                                         if(vidyaVal<vidyaVal1)
                                           {
                                            Comment("Sell signal","\n",
                                                    "Current Close Value is ",currentClose,"\n",
                                                    "Current VIDYA (9,12) Value is ",vidyaVal,"\n",
                                                    "Current VIDYA (20,50) Value is ",vidyaVal1);
                                           }
                                      

                                      Компилируем код и программу запускаем на графике. Увидим примерно такое:

                                       Пересечение двух VIDYA на графике

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

                                      Сигнал на покупку:

                                      VIDYA two crossover - сигнал на покупку

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

                                      • Сигнал на покупку
                                      • Текущее значение цены закрытия
                                      • Текущее значение VIDYA (9,12)
                                      • Текущее значение VIDYA (20,50)

                                      Сигнал на продажу

                                       VIDYA two crossover - сигнал на продажу

                                      Комментарий на графике содержит такие значения:

                                      • Сигнал на продажу
                                      • Текущее значение цены закрытия
                                      • Текущее значение VIDYA (9,12)
                                      • Текущее значение VIDYA (20,50)


                                      Заключение

                                      Итак, мы с вами изучили индикатор Скользящей средней с динамическим периодом усреднения (Variable Index Dynamic Average, VIDYA). Как и во всех статьях, изучение разбили на несколько подразделов. Познакомились с определением расчета, узнали, что он измеряет и как его рассчитать вручную. Составляющие формулы расчета позволяют лучше понять саму суть индикатора. Также посмотрели, как использовать стандартный индикатор, входящий в поставку платформы. Далее мы посмотрели, как использовать индикатор — для этого в статье представлены простые стратегии, основанные на базовой концепции, лежащей в его основе. Мы изучили следующие стратегии:

                                      • Идентификатор тренда по VIDYA — стратегия сообщает тип тренда на рынке (восходящий или нисходящий).
                                      • Стратегия с пересечением VIDYA: сигналы на покупку и продажу генерируются при пересечении цены и линии индикатора.
                                      • Стратегия с пересечением двух VIDYA: сигналы на покупку и продажу генерируются при пересечении двух индикаторов VIDYA с параметрами (9,12) и (20,50).

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

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

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

                                      Прикрепленные файлы |
                                      Simple_VIDYA.mq5 (0.92 KB)
                                      Управление рисками и капиталом с помощью советников Управление рисками и капиталом с помощью советников
                                      Эта статья о том, чего вы не найдете в отчете о тестировании, чего следует ожидать при использовании советников, как управлять своими деньгами при использовании роботов и как покрыть значительный убыток, чтобы остаться в трейдинге при автоматизированной торговле.
                                      Возможности Мастера MQL5, которые вам нужно знать (Часть 3): Энтропия Шеннона Возможности Мастера MQL5, которые вам нужно знать (Часть 3): Энтропия Шеннона
                                      Современный трейдер почти всегда находится в поиске новых идей. Он постоянно пробует новые стратегии, модифицирует их и отбрасывает те, что не оправдали себя. В этой серии статей я постараюсь доказать, что Мастер MQL5 является настоящей опорой трейдера.
                                      DoEasy. Элементы управления (Часть 26): Дорабатываем WinForms-объект "ToolTip" и начинаем разработку "ProgressBar" DoEasy. Элементы управления (Часть 26): Дорабатываем WinForms-объект "ToolTip" и начинаем разработку "ProgressBar"
                                      В статье завершим разработку элемента управления ToolTip и начнём разрабатывать WinForms-объект ProgressBar. По мере работы над объектами, разработаем универсальный функционал для оживления элементов управления и их составляющих.
                                      Нейросети — это просто (Часть 32): Распределенное Q-обучение Нейросети — это просто (Часть 32): Распределенное Q-обучение
                                      В одной из статей данной серии мы с вами уже познакомились с методом Q-обучения. Данный метод усредняет вознаграждения за каждое действие. В 2017 году были представлены сразу 2 работы, в которых большего успеха добиваются при изучении функции распределения вознаграждения. Давайте рассмотрим возможность использования подобной технологии для решения наших задач.