English 中文 Español Deutsch 日本語 Português
preview
Разработка торговой системы на основе индикатора Gator Oscillator

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

MetaTrader 5Трейдинг | 3 апреля 2023, 16:33
1 341 0
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

Введение

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

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

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

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

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

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


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

      В этом разделе подробно рассмотрим индикатор Gator Oscillator, чтобы понять концепцию, лежащую в его основе, и научиться правильно и эффективно его использовать. Индикатор Gator Oscillator разработал Билл Вильямс. Он должен определять, находится ли рынок в тренде или движется в неком боковом диапазоне, и если он в тренде, как долго этот тренд может продлится с точки зрения импульса. Эту информацию следует использовать для определения времени входа и выхода из сделки. Как все мы понимаем, эти две вещи очень важны в торговле. Gator Oscillator создан на основе индикатора Alligator, о котором мы уже подробно разговаривали в моей предыдущей статье Разработка торговой системы на основе индикатора Alligator.

      Расчет индикатора Gator основан на схождении и расхождении балансовые линии Аллигатора. Ниже приведен расчет индикатора Gator:

      • Шаг первый: рассчитываем медианную цену

      Median Price = (High + Low) /2

      • Шаг второй: вычисляем Челюсти (Jaw), Зубы (Teeth) и Губы (Lips) Аллигатора
      Alligator Jaw = SMMA (Median Price, 13,8)
      Alligator Teeth = SMMA (Median Price, 8, 5)
      Alligator Lips = SMMA (Median Price, 5, 3)
      • где:

      Median Price — тип цены, используемой для расчетов (медианная)

      High — максимальное значение цены

      Low — минимальное значение цены

      SMMA — сглаженное скользящее среднее, которое находит скользящее среднее цены с указанным сглаживанием и возможным сдвигом. Если у нас средняя SMMA (Median Price, 13, 5), это означае, что мы получили сглаженную скользящую среднюю от медианных цен с периодом сглаживания 13 и сдвигом в будущее равным 5. 

      Alligator Jaws — линия челюстей индикатора, отображается синим цветом

      Alligator Teeth — линия зубов Аллигатора, красного цвета

      Alligator Lips — линия губ Аллигатора, отображается зеленым

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

      Открываем торговый терминал MetaTrader 5, выбираем на меню "Вставка" --> Индикаторы --> Bill Williams --> Gator Oscillator

      Запуск индикатора Gator на графике

      После выбора Gator Oscillator откроется окно параметров Gator как показано на рисунке ниже:

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

      На предыдущем рисунке показано окно с настройками индикатора Gator Oscillator, в котором можно установить следующие параметры:

      1. Период линии челюстей
      2. Горизонтальный сдвиг линии челюстей
      3. Период расчета линии зубов
      4. Горизонтальный сдвиг линии зубов
      5. Период расчета линии губ
      6. Горизонтальный сдвиг линии губ
      7. Метод усреднения
      8. Тип цены, используемой для расчета индикатора Gator Oscillator.
      9. Цвет для показателей вверх
      10. Цвет для показателей вниз
      11. Толщина баров индикатора Gator.  

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

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

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


      Стратегия по индикатору Gator Oscillator

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

        Стратегия первая — Gator Status

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

          Таким образом имеем следующее:

          Оба бара красные ==> Фаза сна

          Оба бара зеленые ==> фаза еды

          Бары сначала красные, затем становятся зелеными ==> фаза пробуждения

          Бары были зеленые, становятся красными ==> фаза насыщения

            Стратегия вторая — сигналы от Gator

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

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

              Индикатор Gator в фазе пробуждения ==> Возможности входа

              Индикатор Gator в фазе еды ==> Удержание текущей позиции

              Индикатор Gator в фазе насыщения ==> Ищем выход

              Если индикатор в любом другом состоянии ==> Не делаем ничего

                Стратегия третья: Gator с MA

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

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

                  Два зеленых бара и цена закрытия > скользящей средней ==> возможность позиции на покупку

                  Два красных бара и цена закрытия < скользящей средней ==> возможность позиции на продажу

                  Другие сигналы ==> не делать ничего


                  Схемы торговых стратегий по индикатору Gator Oscillator

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

                    Стратегия первая — Gator Status  

                      На основе этой стратегии создадим программу-советник, который будем использовать для автоматической проверки значений индикатора Gator на каждом тике. Программа будет определять два состояния: когда значения последовательно растут и когда значения последовательно понижаются. Советник проводит эту проверку и определяет положение значений, сравнивая их между собой. Сначала сравнивает верхние значения — текущее и предыдущее значение Gator и определяет, которое из них выше. Затем сравнивает нижние значения текущего и предыдущего бара, и определяет, какое из этих двух значений больше. Результатом такого сравнения и будут ожидаемые сигналы для определения статуса индикатора Gator.

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

                      Ниже приведена схема работа такой торговой системы:

                      Схема стратегии для определения статуса индикатора Gator


                        Стратегия вторая — сигналы от Gator

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

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

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

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

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

                          Схема стратегии сигналов Gator



                            Стратегия третья: Gator с MA

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

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

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

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

                              Схема стратегии Gator и MA


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

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

                              Такая простая программа по осциллятору Gator будет возвращать текущие значения индикатора в виде комментария на графике. Рассмотрим по шагам, как написать код такой программы.

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

                                 double upGatorArray[];
                                 double downGatorArray[];
                              

                              Устанавливаем сортировку данных в массивах с помощью функции ArraySetAsSeries. Параметры функции:

                                 ArraySetAsSeries(upGatorArray,true);
                                 ArraySetAsSeries(downGatorArray,true);
                              

                              Создаем переменную типа integer gatorDef, определяем осциллятор Gator с помощью функции iGator. Функция возвращает хендл индикатора. Параметры функции:

                              • symbol — имя символа; у нас это _SYMBOL, то есть рассчитываем индикатор по символу текущего графика. 
                              • period — таймфрейм для расчета; используемое значение _PERIOD означает, что индикатор будет рассчитываться на текущем таймфрейме.
                              • jaw_period — период усреднения для расчета линии челюсти, мы используем 13. 
                              • jaw_shift — горизонтальный сдвиг линии челюстей при необходимости. Мы установим значение 8.
                              • teeth_period — период расчета линии зубов. Мы установим значение 8.
                              • teeth_shift — горизонтальный сдвиг линии зубов при необходимости. Мы установим значение 5.
                              • lips_period — период расчета линии губ. Мы установим значение 5.
                              • lips_shift — установим горизонтальный сдвиг для линии губ, у нас это 3.
                              • ma_method — метод сглаживания скользящей средней. Используем MODE_SMMA.
                              • applied_price — тип цены, используемой в расчетах. Установим значение PRICE_MEDIAN.
                              int gatorDef=iGator(_Symbol,_Period,13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN);

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

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

                              Получаем значения upGator и downGator в созданные для них переменных типа double. Затем используем функцию NormalizeDouble для округления.

                              • value — upGatorArray[0] текущее значение.
                              • digits — количество знаков после запятой, 6.
                                 double gatorUpValue=NormalizeDouble(upGatorArray[0],6);
                                 double gatorDownValue=NormalizeDouble(downGatorArray[0],6);
                              

                              Используем функцию Comment для вывода текущих значений upGator and downGator.

                                 Comment("gatorUpValue = ",gatorUpValue,"\n",
                                         "gatorDownValue = ",gatorDownValue);
                              

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

                              //+------------------------------------------------------------------+
                              //|                               Simple Gator Oscillator 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()
                                {
                                 double upGatorArray[];
                                 double downGatorArray[];
                                 ArraySetAsSeries(upGatorArray,true);
                                 ArraySetAsSeries(downGatorArray,true);
                                 int gatorDef=iGator(_Symbol,_Period,13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN);
                                 CopyBuffer(gatorDef,0,0,3,upGatorArray);
                                 CopyBuffer(gatorDef,2,0,3,downGatorArray);
                                 double gatorUpValue=NormalizeDouble(upGatorArray[0],6);
                                 double gatorDownValue=NormalizeDouble(downGatorArray[0],6);
                                 Comment("gatorUpValue = ",gatorUpValue,"\n",
                                         "gatorDownValue = ",gatorDownValue);
                                }
                              //+------------------------------------------------------------------+
                              

                              После написания этого кода его нужно скомпилировать. При компиляции нужно убедиться, что нет ошибок и предупреждений. После этого скомпилированная программа должна появиться в Навигаторе в торговом терминале:

                               Индикатор Gator в навигаторе

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

                              Окно программы Simple Gator Oscillator System

                              Разрешаем автоматическую торговлю (Allow Algo Trading), нажимаем ОК, и программа запустится на графике, как показано ниже:

                               Советник Simple Gator Oscillator System на графике

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

                              Сигналы программы Simple Gator Oscillator System


                                Стратегия первая — Gator Status

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

                                  //+------------------------------------------------------------------+
                                  //|                                      Gator Status 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()
                                    {
                                     double upGatorArray[];
                                     double downGatorArray[];
                                     ArraySetAsSeries(upGatorArray,true);
                                     ArraySetAsSeries(downGatorArray,true);
                                     int gatorDef=iGator(_Symbol,_Period,13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN);
                                     CopyBuffer(gatorDef,0,0,5,upGatorArray);
                                     CopyBuffer(gatorDef,2,0,5,downGatorArray);
                                     double gatorUpValue=NormalizeDouble(upGatorArray[0],6);
                                     double gatorUpPreValue1=NormalizeDouble(upGatorArray[1],6);
                                     double gatorUpPreValue2=NormalizeDouble(upGatorArray[2],6);
                                     double gatorDownValue=NormalizeDouble(downGatorArray[0],6);
                                     double gatorDownPreValue1=NormalizeDouble(downGatorArray[1],6);
                                     double gatorDownPreValue2=NormalizeDouble(downGatorArray[2],6);
                                     if(gatorUpValue<gatorUpPreValue1&&gatorDownValue>gatorDownPreValue1)
                                       {
                                        Comment("Sleeping Phase");
                                       }
                                     else
                                        if(gatorUpValue>gatorUpPreValue1&&gatorDownValue<gatorDownPreValue1)
                                          {
                                           Comment("Eating Phase");
                                          }
                                     if(gatorUpPreValue1<gatorUpPreValue2&&gatorDownPreValue1>gatorDownPreValue2&&
                                        gatorUpValue>gatorUpPreValue1&&gatorDownValue<gatorDownPreValue1)
                                       {
                                        Comment("Awakening Phase");
                                       }
                                     else
                                        if(
                                           gatorUpPreValue1>gatorUpPreValue2&&gatorDownPreValue1<gatorDownPreValue2&&
                                           gatorUpValue<gatorUpPreValue1&&gatorDownValue>gatorDownPreValue1)
                                          {
                                           Comment("Sated Phase");
                                          }
                                    }
                                  //+------------------------------------------------------------------+
                                  
                                  

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

                                  Определение и получение трех последних значений upGator

                                     double gatorUpValue=NormalizeDouble(upGatorArray[0],6);
                                     double gatorUpPreValue1=NormalizeDouble(upGatorArray[1],6);
                                     double gatorUpPreValue2=NormalizeDouble(upGatorArray[2],6);
                                  

                                  Определение и получение трех последних значений downGator

                                     double gatorDownValue=NormalizeDouble(downGatorArray[0],6);
                                     double gatorDownPreValue1=NormalizeDouble(downGatorArray[1],6);
                                     double gatorDownPreValue2=NormalizeDouble(downGatorArray[2],6);
                                  

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

                                  Условия для определения фазы сна

                                     if(gatorUpValue<gatorUpPreValue1&&gatorDownValue>gatorDownPreValue1)
                                       {
                                        Comment("Sleeping Phase");
                                       }
                                  

                                  Условия для определения фазы еды

                                     else
                                        if(gatorUpValue>gatorUpPreValue1&&gatorDownValue<gatorDownPreValue1)
                                          {
                                           Comment("Eating Phase");
                                          }
                                  

                                  Условия для определения фазы пробуждения

                                     if(gatorUpPreValue1<gatorUpPreValue2&&gatorDownPreValue1>gatorDownPreValue2&&
                                        gatorUpValue>gatorUpPreValue1&&gatorDownValue<gatorDownPreValue1)
                                       {
                                        Comment("Awakening Phase");
                                       }
                                  

                                  Условия для определения фазы насыщения

                                     else
                                        if(
                                           gatorUpPreValue1>gatorUpPreValue2&&gatorDownPreValue1<gatorDownPreValue2&&
                                           gatorUpValue<gatorUpPreValue1&&gatorDownValue>gatorDownPreValue1)
                                          {
                                           Comment("Sated Phase");
                                          }
                                  

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

                                   Советник Gator Status Identifier на графике

                                  Как видите, в правом верхнем углу графика появилась индикация, что на графике работает советник Gator Status Identifier.

                                  Сигналы от советника выводятся в следующем виде (примеры получены при тестировании).

                                  Аллигатор в фазе сна:

                                   Сигнал фазы сна Gator Status Identifier

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

                                  Аллигатор ест:

                                   Сигнал фазы еды Gator Status Identifier

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

                                  Индикатор Gator в фазе пробуждения:

                                  Сигнал фазы пробуждения Gator Status Identifier

                                  На графике отображается сигнал о фазе пробуждения от стратегии Gator Status Identifier.

                                  Индикатор Gator в фазе насыщения:

                                  Сигнал фазы насыщения Gator Status Identifier

                                  Комментарий на графике показывает фазу насыщения.


                                    Стратегия вторая — сигналы от Gator

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

                                      //+------------------------------------------------------------------+
                                      //|                                                Gator signals.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 upGatorArray[];
                                         double downGatorArray[];
                                         ArraySetAsSeries(upGatorArray,true);
                                         ArraySetAsSeries(downGatorArray,true);
                                         int gatorDef=iGator(_Symbol,_Period,13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN);
                                         CopyBuffer(gatorDef,0,0,3,upGatorArray);
                                         CopyBuffer(gatorDef,2,0,3,downGatorArray);
                                         double gatorUpValue=NormalizeDouble(upGatorArray[0],6);
                                         double gatorUpPreValue1=NormalizeDouble(upGatorArray[1],6);
                                         double gatorUpPreValue2=NormalizeDouble(upGatorArray[2],6);
                                         double gatorDownValue=NormalizeDouble(downGatorArray[0],6);
                                         double gatorDownPreValue1=NormalizeDouble(downGatorArray[1],6);
                                         double gatorDownPreValue2=NormalizeDouble(downGatorArray[2],6);
                                         bool awakeningPhase = gatorUpPreValue1<gatorUpPreValue2&&gatorDownPreValue1>gatorDownPreValue2&&
                                                               gatorUpValue>gatorUpPreValue1&&gatorDownValue<gatorDownPreValue1;
                                         bool eatingPhase = gatorUpValue>gatorUpPreValue1&&gatorDownValue<gatorDownPreValue1;
                                         bool satedPhase = gatorUpPreValue1>gatorUpPreValue2&&gatorDownPreValue1<gatorDownPreValue2&&
                                                           gatorUpValue<gatorUpPreValue1&&gatorDownValue>gatorDownPreValue1;
                                         if(awakeningPhase)
                                           {
                                            Comment("Find a good entry");
                                           }
                                         else
                                            if(eatingPhase)
                                              {
                                               Comment("Hold current position");
                                              }
                                            else
                                               if(satedPhase)
                                                 {
                                                  Comment("Find a good exit");
                                                 }
                                               else
                                                  Comment("");
                                        }
                                      //+------------------------------------------------------------------+
                                      

                                      Что изменилось в коде по сравнению с предыдущим:

                                      Создаем логическую переменную для трех возможных фаз аллигатора: awakeningPhase, eatingPhase, and satedPhase;

                                         bool awakeningPhase = gatorUpPreValue1<gatorUpPreValue2&&gatorDownPreValue1>gatorDownPreValue2&&
                                                               gatorUpValue>gatorUpPreValue1&&gatorDownValue<gatorDownPreValue1;
                                         bool eatingPhase = gatorUpValue>gatorUpPreValue1&&gatorDownValue<gatorDownPreValue1;
                                         bool satedPhase = gatorUpPreValue1>gatorUpPreValue2&&gatorDownPreValue1<gatorDownPreValue2&&
                                                           gatorUpValue<gatorUpPreValue1&&gatorDownValue>gatorDownPreValue1;
                                      

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

                                      В случае фазы пробуждения

                                         if(awakeningPhase)
                                           {
                                            Comment("Find a good entry");
                                           }
                                      

                                      Когда аллигатор ест

                                         else
                                            if(eatingPhase)
                                              {
                                               Comment("Hold current position");
                                              }
                                      

                                      Индикатор в фазе насыщения

                                            else
                                               if(satedPhase)
                                                 {
                                                  Comment("Find a good exit");
                                                 }
                                      

                                      В остальных случаях

                                               else
                                                  Comment("");
                                      

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

                                      Программа Gator signals на графике

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

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

                                      В случае фазы пробуждения

                                      Сигнал на вход от Gator signals

                                      На графике выше в верхнем левом углу отображается комментарий на вход "Find a good entry".

                                      Когда аллигатор ест

                                       Сигнал на удержание от Gator signals

                                      На графике выше в верхнем левом углу отображается комментарий на удержание позиции "Hold current position".

                                      Индикатор в фазе насыщения

                                       Сигнал на выход от Gator signals

                                      На графике выше в верхнем левом углу отображается комментарий на выход из позиции "Find a good exit".


                                      Стратегия третья: Gator с MA

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

                                      //+------------------------------------------------------------------+
                                      //|                                       Gator with MA strategy.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 upGatorArray[];
                                         double downGatorArray[];
                                         MqlRates pArray[];
                                         double maArray[];
                                         ArraySetAsSeries(upGatorArray,true);
                                         ArraySetAsSeries(downGatorArray,true);
                                         ArraySetAsSeries(maArray,true);
                                         int gatorDef=iGator(_Symbol,_Period,13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN);
                                         int maDef=iMA(_Symbol,_Period,13,0,MODE_EMA,PRICE_CLOSE);
                                         int data=CopyRates(_Symbol,_Period,0,13,pArray);
                                         CopyBuffer(gatorDef,0,0,3,upGatorArray);
                                         CopyBuffer(gatorDef,2,0,3,downGatorArray);
                                         CopyBuffer(maDef,0,0,3,maArray);
                                         double gatorUpValue=NormalizeDouble(upGatorArray[0],6);
                                         double gatorUpPreValue1=NormalizeDouble(upGatorArray[1],6);
                                         double gatorUpPreValue2=NormalizeDouble(upGatorArray[2],6);
                                         double gatorDownValue=NormalizeDouble(downGatorArray[0],6);
                                         double gatorDownPreValue1=NormalizeDouble(downGatorArray[1],6);
                                         double gatorDownPreValue2=NormalizeDouble(downGatorArray[2],6);
                                         double maValue=NormalizeDouble(maArray[0],5);
                                         double closingPrice=pArray[0].close;
                                         bool douleGreen = gatorUpValue>gatorUpPreValue1&&gatorUpPreValue1>gatorUpPreValue2&&
                                                           gatorDownValue<gatorDownPreValue1&&gatorDownPreValue1<gatorDownPreValue2;
                                         bool douleRed = gatorUpValue<gatorUpPreValue1&&gatorUpPreValue1<gatorUpPreValue2&&
                                                         gatorDownValue>gatorDownPreValue1&&gatorDownPreValue1>gatorDownPreValue2;  
                                         if(douleGreen&&closingPrice>maValue)
                                           {
                                            Comment("Find a good buy position");
                                           }
                                         else
                                            if(douleRed&&closingPrice<maValue)
                                              {
                                               Comment("Find a good sell position");
                                              }
                                            else
                                               Comment("");
                                        }
                                      //+------------------------------------------------------------------+
                                      

                                      Что изменилось в коде по сравнению с предыдущим:

                                      Создаем два дополнительных массива pArray и maArray. Используем функцию MqlRates для массива pArray для хранения информации о ценах и "double" для массива maArray;

                                         MqlRates pArray[];
                                         double maArray[];
                                      

                                      Устанавливаем сортировку данных в массивах с помощью функции ArraySetAsSeries.

                                      ArraySetAsSeries(maArray,true);

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

                                      • symbol — имя символа Используем _SYMBOL — символ текущего графика.
                                      • period — таймфрейм для расчета; используемое значение _PERIOD означает, что индикатор будет рассчитываться на текущем таймфрейме, то же самое, что PERIOD_CURRENT.
                                      • ma_period — период расчета скользящей средней; 13. 
                                      • ma_shift — горизонтальный сдвиг MA. Установим 0, чтобы не сдвигать. 
                                      • ma_method — тип скользящей средней, у нас это EMA (Exponential Moving Average) 
                                      • applied_price — определяет тип цены, используемой для расчета; используем цену закрытия
                                      int maDef=iMA(_Symbol,_Period,13,0,MODE_EMA,PRICE_CLOSE);

                                      Получаем исторические данные MqlRates с помощью функции CopyRates:

                                      • symbol_name — имя символа для расчета индикатора, _Symbol — текущий символ. 
                                      • timeframe — таймфрейм для расчета, _Period означает текущий таймфрейм графика. 
                                      • start_pos — позиция начала расчета индикатора, укажем 0 для расчета от текущей позиции
                                      • count — количество данных для копирования, 13. 
                                      • rates_array[] — массив, в который копируем данные, pArray 
                                      int data=CopyRates(_Symbol,_Period,0,13,pArray);

                                      Определяем данные и сохранение результатов в maArray с помощью функции CopyBuffer

                                      CopyBuffer(maDef,0,0,3,maArray);

                                      Получаем значения текущей экспоненциальной скользящей средней и нормализуем его.

                                      double maValue=NormalizeDouble(maArray[0],5);

                                      Получение текущего значения цены закрытия.

                                      double closingPrice=pArray[0].close;

                                      Создадим логические переменных двойных зеленых и двойных красных баров индикатора Gator Oscillator.

                                         bool douleGreen = gatorUpValue>gatorUpPreValue1&&gatorUpPreValue1>gatorUpPreValue2&&
                                                           gatorDownValue<gatorDownPreValue1&&gatorDownPreValue1<gatorDownPreValue2;
                                         bool douleRed = gatorUpValue<gatorUpPreValue1&&gatorUpPreValue1<gatorUpPreValue2&&
                                                         gatorDownValue>gatorDownPreValue1&&gatorDownPreValue1>gatorDownPreValue2; 
                                      

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

                                      Условия покупки

                                         if(douleGreen&&closingPrice>maValue)
                                           {
                                            Comment("Find a good buy position");
                                           }
                                      

                                      Условия продажи

                                         else
                                            if(douleRed&&closingPrice<maValue)
                                              {
                                               Comment("Find a good sell position");
                                              }
                                      

                                      В остальных случаях

                                            else
                                               Comment("");
                                      

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

                                       Стратегия Gator with MA на графике

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

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

                                      Условия покупки

                                       Сигнал на покупку от советника Gator with MA

                                      На графике выше есть комментарий с сигналом на покупку (Find a good buy position).

                                      Условия продажи

                                      Сигнал на продажу от советника Gator with MA

                                      Здесь в комментарии сигнал на продажу (Find a good sell position).

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


                                      Заключение

                                      Мы рассмотрели все темы этой статьи, в которой учились разрабатывать торговые системы с помощью индикатора Gator Oscillator. Мы узнали, что из себя представляет индикатор Gator Oscillator, как его рассчитать и как его использовать, на примере трех простых торговых стратегий, а именно:

                                      • Определение состояния Gator: эта стратегия определяет состояние осциллятора Gator (пробуждение, сон, еда, насыщение) в зависимости от различных условий.
                                      • Сигналы по индикатору Gator: для получения сигналов о возможности принятия решения (поиск хорошей возможности входа, удержания текущей позиции или поиск выхода) на основе различных условий осциллятора Gator.
                                      • Совместное использование Gator и MA: сигналы на открытие позиций на покупку или продажу на основе Gator Oscillator с индикатором скользящей средней.

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

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

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

                                      Торговая стратегия на индикаторе улучшенного распознавания свечей Доджи Торговая стратегия на индикаторе улучшенного распознавания свечей Доджи
                                      Индикатор на метабарах обнаруживал больше свечей чем классический. Проверим, дает ли это реальную пользу в автоматической торговле.
                                      Измерение информативности индикатора Измерение информативности индикатора
                                      Машинное обучение стало популярным методом разработки стратегий. В трейдинге традиционно больше внимания уделяется максимизации прибыльности и точности прогнозов. При этом обработка данных, используемых для построения прогностических моделей, остается на периферии. В этой статье мы рассматриваем использование концепции энтропии для оценки пригодности индикаторов при построении прогностических моделей, как описано в книге Тимоти Мастерса "Тестирование и настройка систем рыночной торговли" (Testing and Tuning Market Trading Systems by Timothy Masters).
                                      Пример ансамбля ONNX-моделей в MQL5 Пример ансамбля ONNX-моделей в MQL5
                                      ONNX (Open Neural Network eXchange) — открытый стандарт представления нейронных сетей. В данной статье мы покажем возможность одновременного использования двух ONNX-моделей в одном эксперте.
                                      Машинное обучение и Data Science (Часть 10): Гребневая регрессия Машинное обучение и Data Science (Часть 10): Гребневая регрессия
                                      Гребневая регрессия (ридж-регрессия) — это простой метод для уменьшения сложности модели и борьбы с подгонкой, которая может возникнуть в результате простой линейной регрессии.