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

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

MetaTrader 5Трейдинг | 7 декабря 2022, 09:41
2 209 0
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

Введение

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

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

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

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

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

Alligator — трендовый технический индикатор, который разработал Билл Вильямс. Индикатор основан на идее о том, что тренд существует не на всем протяжении жизни финансового инструмента, а всего 15-30 % времени, а большую же часть времени, от 85% до 70%, цена инструмента движется в боковом направлении. Получается, что у нас иногда растущий тренд, иногда падающий, но в большинстве своем движение просто флэтовое. О трендах мы уж не раз говорили в предыдущих статья. Например, можете прочитать подробное описание тренда, типа, способы его определения из более ранней статьи — это будет особенно полезно в текущем контексте. Индикатор использует числа Фибоначчи в расчетах и представляет собой комбинацию из трех сглаженных скользящих средних SМMA с периодами 5, 8 и 13. Три сглаженных средних образуют собой составные части индикатора Alligator:

  • Челюсти Аллигатора
  • Зубы Аллигатора
  • Губы Аллигатора

Линии индикатора рассчитываются по следующим формулам:

Челюсть аллигатора = SMMA (средняя цена, 13, 8)

Зубы аллигатора = SMA (средняя цена, 8, 5)

Губы аллигатора = SMMA (средняя цена, 5, 3)

Средняя цена = (максимум + минимум)/2

где:

SMMA — сглаженная скользящая средняя

Median price — медианная цена инструмента

High — цена максимума

Low — цена минимума

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

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

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

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

 Параметры стандартного индикатора Alligator

1 - период для расчета линии челюсти

2 - смещение челюстей по горизонтали

3 - период расчета линии зубов Аллигатора

4 - смещение зубов по горизонтали

5 - период для расчета линии губ

6 - смещение губ Аллигатора по горизонтали

7 - метод сглаживания

8 - цена, используемая для расчетов.

В следующем окне можно настроить стиль индикатора:

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

1 - цвет линии челюстей

2 - тип линии челюстей

3 - толщина линии челюстей

4 - цвет линии зубов

5 - тип линии зубов

6 - толщина линии зубов

7 - цвет линии губ

8 - тип линии губ

9 - толщина линии губ

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

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

На скриншоте выше видно, что индикатор запустился, а на графике отображаются три линии:

1 - линия губ Аллигатора

2 - линия зубов Аллигатора

3 - линия челюсти Аллигатора

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

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

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

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

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

      Губы > Зубы, Губы > Челюсти и Зубы > Челюстей --> Бычий сигнал

      Губы < Зубы, Губы < Челюсти и Зубы < Челюстей --> Медвежий сигнал

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

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

          Губы > Зубы, Губы > Челюсти --> Покупка

          Губы < Зубы, Губы < Челюсти --> Продажа

            Стратегия третья: продвинутая сигнальная система Аллигатора

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

              Губы < Зубы, Губы < Челюсти и Цена закрытия > Зубы --> Покупка

              Губы > Зубы, Губы > Челюсти и Цена закрытия < Зубы --> Продажа

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

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

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

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

                  • Значение Jaws
                  • Значение Teeth
                  • Значение Lips

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

                  • Бычий сигнал
                  • Значение Jaws = n
                  • Значение Teeth = n
                  • Значение Lips = n

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

                  • Медвежий сигнал
                  • Значение Jaws = n
                  • Значение Teeth = n
                  • Значение Lips = n

                  Вот такая пошаговая схема поможет разработать торговую систему по этой стратегии:

                  Схема стратегии Alligator Trend Identifier

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

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

                      • Значение губ
                      • Значение зубов
                      • Значение челюстей

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

                      • Покупка
                      • Значение Jaws = n
                      • Значение Teeth = n
                      • Значение Lips = n

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

                      • Продажа
                      • Значение Jaws = n
                      • Значение Teeth = n
                      • Значение Lips = n

                      Вот такая пошаговая схема поможет разработать торговую систему по этой стратегии:

                      Схема стратегии Alligator signals

                        Стратегия третья: продвинутая сигнальная система Аллигатора

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

                          • Значение губ
                          • Значение зубов
                          • Значение челюстей
                          • Цена закрытия

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

                          • Покупка
                          • Значение Lips = n
                          • Значение Teeth = n
                          • Цена закрытия: n
                          • Значение Jaws = n

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

                          • Продажа
                          • Значение Lips = n
                          • Значение Teeth = n
                          • Цена закрытия: n
                          • Значение Jaws = n

                          Вот такая пошаговая схема поможет разработать торговую систему по этой стратегии:

                          Схема стратегии Alligator Signals System Enhancement

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

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

                          Создаем массивы для каждого из компонентов Аллигатора (Губы, Зубы, Челюсти).

                             double jawsArray[];
                             double teethArray[];
                             double lipsArray[]; 
                          

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

                          • array[]
                          • flag
                             ArraySetAsSeries(jawsArray,true);
                             ArraySetAsSeries(teethArray,true);
                             ArraySetAsSeries(lipsArray,true);
                          

                          Определяем Alligator с помощью функции iAlligator. Параметры функции:

                          • 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_SMA.
                          • applied_price — определяет тип цены, используемой для расчета; используем среднюю цену
                          int alligatorDef=iAlligator(_Symbol,_Period,13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN);

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

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

                          Получаем значения трех компонентов.

                             double jawsValue=NormalizeDouble(jawsArray[0],5);
                             double teethValue=NormalizeDouble(teethArray[0],5);
                             double lipsValue=NormalizeDouble(lipsArray[0],5);
                          

                          Выводим комментарий с полученными значениями компонентов индикатора.

                             Comment("jawsValue = ",jawsValue,"\n",
                             "teethValue = ",teethValue,"\n",
                             "lipsValue = ",lipsValue);
                          

                          Полный код такой торговой системы выглядит так:

                          //+------------------------------------------------------------------+
                          //|                                      Simple Alligator 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 jawsArray[];
                             double teethArray[];
                             double lipsArray[];   
                             //Сортировка данных
                             ArraySetAsSeries(jawsArray,true);
                             ArraySetAsSeries(teethArray,true);
                             ArraySetAsSeries(lipsArray,true);
                             //определяем Alligator
                             int alligatorDef=iAlligator(_Symbol,_Period,13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN);      
                             // определяем данные и сохраняем результат
                             CopyBuffer(alligatorDef,0,0,3,jawsArray);
                             CopyBuffer(alligatorDef,1,0,3,teethArray);
                             CopyBuffer(alligatorDef,2,0,3,lipsArray);
                             //Получаем значения текущих данных
                             double jawsValue=NormalizeDouble(jawsArray[0],5);
                             double teethValue=NormalizeDouble(teethArray[0],5);
                             double lipsValue=NormalizeDouble(lipsArray[0],5);
                             //вывод комментария на графике
                             Comment("jawsValue = ",jawsValue,"\n",
                             "teethValue = ",teethValue,"\n",
                             "lipsValue = ",lipsValue);
                            }
                          //+------------------------------------------------------------------+
                          

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

                          Советник Simple Alligator System в навигаторе

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

                          Окно советника Simple Alligator System

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

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

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

                           Сигнал советника Simple Alligator System

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

                          Значение Jaws = n

                          Значение Teeth = n

                          Значение Lips = n

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

                              Создадим торговую систему на основе этой стратегии. Полный код такой системы показан ниже:

                              //+------------------------------------------------------------------+
                              //|                                   Alligator 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()
                                {
                              //создаем три массива для компонентов Alligator
                                 double jawsArray[];
                                 double teethArray[];
                                 double lipsArray[];
                              //Сортировка данных
                                 ArraySetAsSeries(jawsArray,true);
                                 ArraySetAsSeries(teethArray,true);
                                 ArraySetAsSeries(lipsArray,true);
                              //определяем Alligator
                                 int alligatorDef=iAlligator(_Symbol,_Period,13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN);
                              // определяем данные и сохраняем результат
                                 CopyBuffer(alligatorDef,0,0,13,jawsArray);
                                 CopyBuffer(alligatorDef,1,0,13,teethArray);
                                 CopyBuffer(alligatorDef,2,0,13,lipsArray);
                              //Получаем значения текущих данных
                                 double jawsValue=NormalizeDouble(jawsArray[0],5);
                                 double teethValue=NormalizeDouble(teethArray[0],5);
                                 double lipsValue=NormalizeDouble(lipsArray[0],5);
                              //условия стратегии
                                 if(lipsValue>teethValue && lipsValue>jawsValue && teethValue>jawsValue)
                                   {
                                    Comment("Bullish","\n",
                                            "jawsValue = ",jawsValue,"\n",
                                            "teethValue = ",teethValue,"\n",
                                            "lipsValue = ",lipsValue);
                                   }
                                 if(lipsValue<teethValue && lipsValue<jawsValue && teethValue<jawsValue)
                                   {
                                    Comment("Bearish","\n",
                                            "jawsValue = ",jawsValue,"\n",
                                            "teethValue = ",teethValue,"\n",
                                            "lipsValue = ",lipsValue);
                                   }
                                }
                              //+------------------------------------------------------------------+
                              

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

                              Условия стратегии для генерации бычьего сигнала:

                                 if(lipsValue>teethValue && lipsValue>jawsValue && teethValue>jawsValue)
                                   {
                                    Comment("Bullish","\n",
                                            "jawsValue = ",jawsValue,"\n",
                                            "teethValue = ",teethValue,"\n",
                                            "lipsValue = ",lipsValue);
                                   }
                              

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

                                 if(lipsValue<teethValue && lipsValue<jawsValue && teethValue<jawsValue)
                                   {
                                    Comment("Bearish","\n",
                                            "jawsValue = ",jawsValue,"\n",
                                            "teethValue = ",teethValue,"\n",
                                            "lipsValue = ",lipsValue);
                                   }
                              

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

                              Советника Alligator Trend Identifier на графике

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

                              Пример бычьего сигнала:

                              Alligator Trend Identifier - бычий сигнал

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

                              • Бычий сигнал
                              • Значение Jaws = n
                              • Значение Teeth = n
                              • Значение Lips = n 
                              Три линии расположены ниже цены, так что сформировался бычий сигнал.

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

                               Alligator Trend Identifier - медвежий сигнал

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

                              • Медвежий сигнал
                              • Значение Jaws = n
                              • Значение Teeth = n
                              • Значение Lips = n

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

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

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

                                  //+------------------------------------------------------------------+
                                  //|                                    Alligator Signals 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()
                                    {
                                  //создаем три массива для компонентов Alligator
                                     double jawsArray[];
                                     double teethArray[];
                                     double lipsArray[];
                                  //Сортировка данных
                                     ArraySetAsSeries(jawsArray,true);
                                     ArraySetAsSeries(teethArray,true);
                                     ArraySetAsSeries(lipsArray,true);
                                  //определяем Alligator
                                     int alligatorDef=iAlligator(_Symbol,_Period,13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN);
                                  // определяем данные и сохраняем результат
                                     CopyBuffer(alligatorDef,0,0,13,jawsArray);
                                     CopyBuffer(alligatorDef,1,0,13,teethArray);
                                     CopyBuffer(alligatorDef,2,0,13,lipsArray);
                                  //Получаем значения текущих данных
                                     double jawsValue=NormalizeDouble(jawsArray[0],5);
                                     double teethValue=NormalizeDouble(teethArray[0],5);
                                     double lipsValue=NormalizeDouble(lipsArray[0],5);
                                  //условия стратегии
                                     if(lipsValue>teethValue && lipsValue>jawsValue)
                                       {
                                        Comment("Buy","\n",
                                                "jawsValue = ",jawsValue,"\n",
                                                "teethValue = ",teethValue,"\n",
                                                "lipsValue = ",lipsValue);
                                       }
                                     if(lipsValue<teethValue && lipsValue<jawsValue)
                                       {
                                        Comment("Sell","\n",
                                                "jawsValue = ",jawsValue,"\n",
                                                "teethValue = ",teethValue,"\n",
                                                "lipsValue = ",lipsValue);
                                       }
                                    }
                                  //+------------------------------------------------------------------+
                                  

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

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

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

                                     if(lipsValue>teethValue && lipsValue>jawsValue)
                                       {
                                        Comment("Buy","\n",
                                                "jawsValue = ",jawsValue,"\n",
                                                "teethValue = ",teethValue,"\n",
                                                "lipsValue = ",lipsValue);
                                       }
                                  

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

                                     if(lipsValue<teethValue && lipsValue<jawsValue)
                                       {
                                        Comment("Sell","\n",
                                                "jawsValue = ",jawsValue,"\n",
                                                "teethValue = ",teethValue,"\n",
                                                "lipsValue = ",lipsValue);
                                       }
                                  

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

                                  Советник Alligator Signals System на графике

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

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

                                  Советник Alligator Signals System - сигнал на покупку

                                   

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

                                  • Покупка
                                  • Значение Jaws = n
                                  • Значение Teeth = n
                                  • Значение Lips = n
                                  Три линии расположены ниже цены, так что сформировался сигнал на покупку.

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

                                   Советник Alligator Signals System - сигнал на продажу

                                  У нас есть сигнал со следующими значениями:

                                  • Продажа
                                  • Значение Jaws = n
                                  • Значение Teeth = n
                                  • Значение Lips = n

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

                                    Стратегия третья: продвинутая сигнальная система Аллигатора

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

                                      //+------------------------------------------------------------------+
                                      //|                         Alligator Signals System Enhancement.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()
                                        {
                                      //создаем три массива для компонентов Alligator
                                         double jawsArray[];
                                         double teethArray[];
                                         double lipsArray[];
                                         MqlRates pArray[];
                                      //Сортировка данных
                                         ArraySetAsSeries(jawsArray,true);
                                         ArraySetAsSeries(teethArray,true);
                                         ArraySetAsSeries(lipsArray,true);
                                         int Data=CopyRates(_Symbol,_Period,0,1,pArray);
                                      //определяем Alligator
                                         int alligatorDef=iAlligator(_Symbol,_Period,13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN);
                                      // определяем данные и сохраняем результат
                                         CopyBuffer(alligatorDef,0,0,13,jawsArray);
                                         CopyBuffer(alligatorDef,1,0,13,teethArray);
                                         CopyBuffer(alligatorDef,2,0,13,lipsArray);
                                      //Получаем значения текущих данных
                                         double jawsValue=NormalizeDouble(jawsArray[0],5);
                                         double teethValue=NormalizeDouble(teethArray[0],5);
                                         double lipsValue=NormalizeDouble(lipsArray[0],5);
                                      //условия стратегии
                                         if(lipsValue<teethValue && lipsValue<jawsValue && pArray[0].close>teethValue)
                                           {
                                            Comment("Buy","\n",
                                                    "jawsValue = ",jawsValue,"\n",
                                                    "teethValue = ",teethValue,"\n",
                                                    "closingPrice = ",pArray[0].close,"\n",
                                                    "lipsValue = ",lipsValue);
                                           }
                                         if(lipsValue>teethValue && lipsValue>jawsValue && pArray[0].close<teethValue)
                                           {
                                            Comment("Sell","\n",
                                                    "jawsValue = ",jawsValue,"\n",
                                                    "teethValue = ",teethValue,"\n",
                                                    "closingPrice = ",pArray[0].close,"\n",
                                                    "lipsValue = ",lipsValue);
                                           }
                                        }
                                      //+------------------------------------------------------------------+
                                      

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

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

                                      MqlRates pArray[];

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

                                      • symbol — имя символа, _Symbol
                                      • timeframe — таймфрейм для расчета (_period)
                                      • start_pos — установим позицию начала расчета, укажем 0
                                      • count — количество данных для копирования, укажем 1
                                      • rates_array[] — массив, в который копируем данные, pArray
                                      int Data=CopyRates(_Symbol,_Period,0,1,pArray);

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

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

                                         if(lipsValue<teethValue && lipsValue<jawsValue && pArray[0].close>teethValue)
                                           {
                                            Comment("Buy","\n",
                                                    "jawsValue = ",jawsValue,"\n",
                                                    "teethValue = ",teethValue,"\n",
                                                    "closingPrice = ",pArray[0].close,"\n",
                                                    "lipsValue = ",lipsValue);
                                           }
                                      

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

                                         if(lipsValue>teethValue && lipsValue>jawsValue && pArray[0].close<teethValue)
                                           {
                                            Comment("Sell","\n",
                                                    "jawsValue = ",jawsValue,"\n",
                                                    "teethValue = ",teethValue,"\n",
                                                    "closingPrice = ",pArray[0].close,"\n",
                                                    "lipsValue = ",lipsValue);
                                           }
                                      

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

                                       Советник Alligator Signals System Enhancement на графике

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

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

                                       Советник Alligator Signals System Enhancement - сигнал на покупку

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

                                      • Покупка
                                      • Значение Jaws = n
                                      • Значение Teeth = n
                                      • Цена закрытия: n
                                      • Значение Lips = n 
                                      Поскольку три линии расположены выше цен, а цена закрытия оказалась выше линии зубов Аллигатора.

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

                                       Советник Alligator Signals System Enhancement - сигнал на продажу

                                      На графике выше в левом верхнем углу графика есть комментарий:

                                      • Продажа
                                      • Значение Jaws = n
                                      • Значение Teeth = n
                                      • Цена закрытия: n
                                      • Значение Lips = n

                                      Здесь три линии расположены ниже цен, а цена закрытия оказалась ниже линии зубов Аллигатора.

                                      Заключение

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

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

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

                                      Я надеюсь, вы самостоятельно писали свой код и повторяли все, о чем мы говорили в этой статье. Такой подход позволяет эффективнее развивать навыки программирования, а кроме того, может подсказать новые идеи. Если вам понравилась эта статья, если вы считаете ее полезной, почитайте мои предыдущие статьи из этой же серии, в которой мы учимся разрабатывать торговые системы на основе популярных технических индикаторов. Мы ранее изучали индикаторы Stochastic, RSI, Bollinger Bands, Moving Averages, Envelopes, MACD, ADX и другие.

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

                                      Популяционные алгоритмы оптимизации: Алгоритм оптимизации с кукушкой (Cuckoo Optimization Algorithm — COA) Популяционные алгоритмы оптимизации: Алгоритм оптимизации с кукушкой (Cuckoo Optimization Algorithm — COA)
                                      Следующий алгоритм, который рассмотрим — оптимизация поиском кукушки с использованием полётов Леви. Это один из новейших алгоритмов оптимизации и новый лидер в рейтинговой таблице.
                                      Нейросети — это просто (Часть 35): Модуль внутреннего любопытства (Intrinsic Curiosity Module) Нейросети — это просто (Часть 35): Модуль внутреннего любопытства (Intrinsic Curiosity Module)
                                      Продолжаем изучение алгоритмов обучения с подкреплением. Все ранее рассмотренные нами алгоритмы требовали создания политики вознаграждения таким образом, чтобы агент мог оценить каждое свое действие на каждом переходе из одного состояния системы в другое. Но такой подход довольно искусственный. На практике же между действием и вознаграждением существует некоторый временной лаг. В данной статье я предлагаю Вам познакомиться с алгоритмом обучения модели, способным работать с различными временными задержками от действия до вознаграждения.
                                      DoEasy. Элементы управления (Часть 29): Вспомогательный элемент управления "ScrollBar" DoEasy. Элементы управления (Часть 29): Вспомогательный элемент управления "ScrollBar"
                                      В статье начнём разработку элемента вспомогательного управления ScrollBar и его производных объектов — вертикальной и горизонтальной полос прокрутки. ScrollBar (полоса прокрутки) используется для прокручивания содержимого формы, если оно выходит за пределы контейнера. Полосы прокрутки обычно расположены снизу и справа формы. Горизонтальная, расположенная снизу, служит для прокрутки содержимого влево-вправо, а вертикальная — для прокрутки вверх-вниз.
                                      Машинное обучение и Data Science (Часть 07): Полиномиальная регрессия Машинное обучение и Data Science (Часть 07): Полиномиальная регрессия
                                      Полиномиальная регрессия — это гибкая модель, предназначенная для эффективного решения задач, с которыми не справляется модель линейной регрессии. В этой статье узнаем, как создавать полиномиальные модели на MQL5 и извлекать из них выгоду.