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

Разработка торговой системы по индикатору фракталов Fractals

MetaTrader 5Трейдинг | 20 декабря 2022, 16:38
2 940 1
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

Введение

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

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

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

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

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

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

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

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

Индикатор формирует стрелки двух типов: стрелки восходящего фрактала и нисходящего. Так на основе каких расчетов индикатор генерирует соответствующие сигналы и стрелки?

Для этого индикатор ищет определенные паттерны, сформированные в направлении роста или падения.

Вот такой паттерн должен сформироваться для фрактала вверх:

  • Серия из минимум пяти последовательных свечей или баров.
  • Самый высокий максимум из пяти свечей должен быть в центре (третья свеча).
  • Максимумы с каждой стороны это центральной свечи должны быть ниже.
  • После закрытия пятой свечи в таком формировании над третьей свечой появится направленная вверх фрактальная стрелка.

Для формирования противоположного фрактала вниз паттерн будет таким:

  • Серия из минимум пяти последовательных свечей или баров.
  • Самый низкий минимум из пяти свечей должен быть в центре (третья свеча).
  • Минимумы с каждой стороны это центральной свечи должны быть выше.
  • После закрытия пятой свечи в таком формировании над третьей свечой появится направленная вниз фрактальная стрелка.

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

Вставка --> Индикаторы --> Bill Williams --> Fractals

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

После выбора индикатора из списка откроется окно параметров:

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

1 - цвет стрелок

2 - толщина

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

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

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

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

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

Стратегия первая: максимумы и минимумы фракталов

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

    То есть:

    Стрелка внизу --> Fractals Low

    Стрелка сверху --> Fractals High

    Стратегия вторая: Fractals и скользящая средняя

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

      То есть:

      Цена закрытия > MA + появилась нижняя стрелка --> сигнал на покупку

      Цена закрытия < MA и появилась верхняя стрелка --> сигнал на продажу

      Стратегия третья: Fractals и Alligator

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

        То есть:

        Линия губ > линии зубов и челюстей, линия зубов > линии челюстей, цена закрытия > линии зубов, нижняя стрелка Fractals --> сигнал на покупку

        Линия губ < линии зубов и челюстей, линия зубов < линии челюстей, цена закрытия < линии зубов, верхняя стрелка Fractals --> сигнал на продажу

        Схемы стратегий на основе индикатора Fractals

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

        1. Фрактальные максимумы и минимумы

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

            • Максимум Fractals: n

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

            • Минимум Fractals: n

          Схема такой стратегии показана на рисунке ниже:

          Схема стратегии Fractals максимумы и минимумы

          2. Fractals и скользящая средняя

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

              • Цена закрытия
              • Значение экспоненциальной скользящей средней EMA
              • Значение fracDown
              • Значение fracUp

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

              • Покупка
              • Текущая EMA
              • Минимум Fractals: n

            И наоборот, если цена закрытия ниже значения средней EMA, а значение fracUp непустое, система вернет противоположный сигнал и выведет значения:

              • Продажа
              • Текущая EMA
              • Максимум Fractals: n

            Так выглядит схема для разработки этой системы:

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

            3. Fractals и Alligator

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

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

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

                • Покупка
                • Значение Jaws n
                • Значение Teeth n
                • Значение Lips n
                • Минимум Fractals: n

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

                • Продажа
                • Значение Jaws n
                • Значение Teeth n
                • Значение Lips n
                • Максимум Fractals: n

              Так выглядит схема для разработки этой системы:

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

              Торговые системы, работающие по фракталам

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

              Для этого создадим массивы для фракталов вверх и вниз с помощью функции double.

                 double fracUpArray[];
                 double fracDownArray[];
              

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

              • array[] — созданные массивы fracUpArray и fracDownArray.
              • flag — флаг установим true.
                 ArraySetAsSeries(fracUpArray,true);
                 ArraySetAsSeries(fracDownArray,true);
              

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

              • symbol — символ для расчетов; _Symbol означает символ текущего графика.
              • period — период для расчетов, _Period означает текущий таймфрейм.
              int fracDef=iFractals(_Symbol,_Period);

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

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

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

                 double fracUpValue=NormalizeDouble(fracUpArray[0],5);
                 double fracDownValue=NormalizeDouble(fracDownArray[0],5);
              

              Возвращаем ноль, если у fracUpValue и fracDownValue пустые значения.

                 if(fracUpValue==EMPTY_VALUE)
                    fracUpValue = 0;
                 if(fracDownValue==EMPTY_VALUE)
                    fracDownValue = 0;
              

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

                 Comment("Fractals Up Value = ",fracUpValue,"\n",
                         "Fractals Down Value = ",fracDownValue);
              

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

              //+------------------------------------------------------------------+
              //|                                       Simple Fractals 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()
                {
              //creating price array
                 double fracUpArray[];
                 double fracDownArray[];
              //Sorting data
                 ArraySetAsSeries(fracUpArray,true);
                 ArraySetAsSeries(fracDownArray,true);
              //define frac
                 int fracDef=iFractals(_Symbol,_Period);
              //define data and store result
                 CopyBuffer(fracDef,UPPER_LINE,2,1,fracUpArray);
                 CopyBuffer(fracDef,LOWER_LINE,2,1,fracDownArray);
              //get values of fracUp and fracDown
                 double fracUpValue=NormalizeDouble(fracUpArray[0],5);
                 double fracDownValue=NormalizeDouble(fracDownArray[0],5);
              //returning zero if there is empty value of fracUp
                 if(fracUpValue==EMPTY_VALUE)
                    fracUpValue = 0;
              //returning zero if there is empty value of fracDown
                 if(fracDownValue==EMPTY_VALUE)
                    fracDownValue = 0;
              //comment on the chart
                 Comment("Fractals Up Value = ",fracUpValue,"\n",
                         "Fractals Down Value = ",fracDownValue);
                }
              //+------------------------------------------------------------------+
              

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

               Советник Fractals в Навигаторе

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

               Окно советника Simple Fractals

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

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

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

               Сигналы советника Simple Fractals

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

              • Fractals Up = n
              • Fractals Down = 0

              В этом примере значение Fractals Down равно нулю, поскольку у нас есть значение Fractals up.

               Сигналы советника Simple Fractals 2

              Имеем два значения:

              • Fractals Up = 0
              • Fractals Down = n

              Но значение Fractals Up равно нулю, так как у нас есть значение Fractals down.

              1. Фрактальные максимумы и минимумы

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

                //+------------------------------------------------------------------+
                //|                                      Fractals highs and lows.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()
                  {
                //creating arrays
                   double fracUpArray[];
                   double fracDownArray[];
                //Sorting data
                   ArraySetAsSeries(fracUpArray,true);
                   ArraySetAsSeries(fracDownArray,true);
                //define frac
                   int fracDef = iFractals(_Symbol,_Period);
                //define data and store result
                   CopyBuffer(fracDef,UPPER_LINE,2,1,fracUpArray);
                   CopyBuffer(fracDef,LOWER_LINE,2,1,fracDownArray);
                //define values
                   double fracUpValue = NormalizeDouble(fracUpArray[0],5);
                   double fracDownValue = NormalizeDouble(fracDownArray[0],5);
                //returning zero in case of empty values
                   if(fracUpValue ==EMPTY_VALUE)
                      fracUpValue = 0;
                   if(fracDownValue ==EMPTY_VALUE)
                      fracDownValue = 0;
                //conditions of the strategy and comment on the chart with highs and lows
                //in case of high
                   if(fracUpValue>0)
                     {
                      Comment("Fractals High around: ",fracUpValue);
                     }
                //in case of low
                   if(fracDownValue>0)
                     {
                      Comment("Fractals Low around: ",fracDownValue);
                     }
                  }
                //+------------------------------------------------------------------+
                

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

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

                Максимум:

                   if(fracUpValue>0)
                     {
                      Comment("Fractals High around: ",fracUpValue);
                     }
                

                Минимум:

                   if(fracDownValue>0)
                     {
                      Comment("Fractals Low around: ",fracDownValue);
                     }
                

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

                 Советник Fractals highs and lows на графике

                Теперь мы можем получать нужные нам максимумы и минимумы. Сигналы минимумов:

                 Советник Fractals highs and lows — сигнал low

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

                Сигнал максимума:

                Советник Fractals highs and lows — сигнал high

                Здесь в комментарии на графике отобразился максимум фракталов.

                2. Fractals и скользящая средняя

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

                  //+------------------------------------------------------------------+
                  //|                                             Fractals with MA.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()
                    {
                  //creating arrays
                     double fracUpArray[];
                     double fracDownArray[];
                     MqlRates priceArray[];
                     double maArray[];
                  //Sorting data
                     ArraySetAsSeries(fracUpArray,true);
                     ArraySetAsSeries(fracDownArray,true);
                     ArraySetAsSeries(priceArray,true);
                     ArraySetAsSeries(maArray,true);
                  //define values
                     int fracDef = iFractals(_Symbol,_Period);
                     int Data = CopyRates(_Symbol,_Period,0,3,priceArray);
                     int maDef = iMA(_Symbol,_Period,50,0,MODE_EMA,PRICE_CLOSE);
                  //define data and store result
                     CopyBuffer(fracDef,UPPER_LINE,2,1,fracUpArray);
                     CopyBuffer(fracDef,LOWER_LINE,2,1,fracDownArray);
                     CopyBuffer(maDef,0,0,3,maArray);
                  //get values
                     double fracUpValue = NormalizeDouble(fracUpArray[0],5);
                     double fracDownValue = NormalizeDouble(fracDownArray[0],5);
                     double closingPrice = priceArray[0].close;
                     double maValue = NormalizeDouble(maArray[0],6);
                     bool isBuy = false;
                     bool isSell = false;
                  //conditions of the strategy and comment on the chart
                  //in case of buy
                     if(closingPrice > maValue && fracDownValue != EMPTY_VALUE)
                       {
                        Comment("Buy","\n",
                                "Current EMA: ",maValue,"\n",
                                "Fractals Low around: ",fracDownValue);
                        isBuy = true;
                       }
                  //in case of sell
                     if(closingPrice < maValue && fracUpValue != EMPTY_VALUE)
                       {
                        Comment("Sell","\n",
                                "Current EMA: ",maValue,"\n",
                                "Fractals High around: ",fracUpValue);
                        isSell = true;
                       }
                    }
                  //+------------------------------------------------------------------+
                  

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

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

                     MqlRates priceArray[];
                     double maArray[];
                  

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

                     ArraySetAsSeries(priceArray,true);
                     ArraySetAsSeries(maArray,true);
                  

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

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

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

                  • symbol — имя символа
                  • period — период расчета
                  • ma_period — период усреднения, 50
                  • ma_shift — горизонтальный сдвиг, 0
                  • ma_method — тип скользящей средней, у нас это EMA (Exponential Moving Average)
                  • applied_price — тип цены, используемой в расчетах (цена закрытия
                     int Data = CopyRates(_Symbol,_Period,0,3,priceArray);
                     int maDef = iMA(_Symbol,_Period,50,0,MODE_EMA,PRICE_CLOSE);
                  

                  Сортировка данных.

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

                  Определение цены закрытия и значения MA.

                  double closingPrice = priceArray[0].close;
                  double maValue = NormalizeDouble(maArray[0],6);
                  

                  Создаем две bool-переменные для isBuy и isSell, чтобы избежать конфликта между сигналами на покупку и продажу одной и той же свечи.

                     bool isBuy = false;
                     bool isSell = false;
                  

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

                  Для формирования сигнала на покупку:

                     if(closingPrice > maValue && fracDownValue != EMPTY_VALUE)
                       {
                        Comment("Buy","\n",
                                "Current EMA: ",maValue,"\n",
                                "Fractals Low around: ",fracDownValue);
                        isBuy = true;
                       }
                  

                  Для формирования сигнала на продажу:

                     if(closingPrice < maValue && fracUpValue != EMPTY_VALUE)
                       {
                        Comment("Sell","\n",
                                "Current EMA: ",maValue,"\n",
                                "Fractals High around: ",fracUpValue);
                        isSell = true;
                       }
                  

                  Компилируем код и запускаем получившегося советника из навигатора в терминале MetaTrader 5.

                   Система Fractals и MA на графике

                  Как видите, советник Fractals + MA прикреплен к графику (в правом верхнем углу есть соответствующий значок). Посмотрим на примеры сформированных сигналов от советника.

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

                   Fractals + MA - сигнал на покупку

                  На графике показан комментарий со значениями:

                  • Покупка
                  • Текущая EMA
                  • Минимум Fractals: n

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

                   Fractals + MA - сигнал на продажу

                  Имеем следующие значения:

                  • Продажа
                  • Текущая EMA
                  • Максимум Fractals: n

                  3. Fractals и Alligator

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

                    //+------------------------------------------------------------------+
                    //|                                      Fractals with Alligator.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()
                      {
                    //creating arrays
                       double fracUpArray[];
                       double fracDownArray[];
                       MqlRates priceArray[];
                       double jawsArray[];
                       double teethArray[];
                       double lipsArray[];
                    //Sorting data
                       ArraySetAsSeries(fracUpArray,true);
                       ArraySetAsSeries(fracDownArray,true);
                       ArraySetAsSeries(jawsArray,true);
                       ArraySetAsSeries(teethArray,true);
                       ArraySetAsSeries(lipsArray,true);
                    //define values
                       int fracDef=iFractals(_Symbol,_Period);
                       int Data = CopyRates(_Symbol,_Period,0,3,priceArray);
                       int alligatorDef=iAlligator(_Symbol,_Period,13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN);
                    //define data and store result
                       CopyBuffer(fracDef,UPPER_LINE,2,1,fracUpArray);
                       CopyBuffer(fracDef,LOWER_LINE,2,1,fracDownArray);
                       CopyBuffer(alligatorDef,0,0,3,jawsArray);
                       CopyBuffer(alligatorDef,1,0,3,teethArray);
                       CopyBuffer(alligatorDef,2,0,3,lipsArray);
                    //get values
                       double fracUpValue=NormalizeDouble(fracUpArray[0],5);
                       double fracDownValue=NormalizeDouble(fracDownArray[0],5);
                       double closingPrice = priceArray[0].close;
                       double jawsValue=NormalizeDouble(jawsArray[0],5);
                       double teethValue=NormalizeDouble(teethArray[0],5);
                       double lipsValue=NormalizeDouble(lipsArray[0],5);
                    //creating bool variables to avoid buy and sell signals at the same time
                       bool isBuy = false;
                       bool isSell = false;
                    //conditions of the strategy and comment on the chart
                    //in case of buy
                       if(lipsValue>teethValue && lipsValue>jawsValue && teethValue>jawsValue
                       && closingPrice > teethValue && fracDownValue != EMPTY_VALUE)
                         {
                          Comment("Buy","\n",
                                  "jawsValue = ",jawsValue,"\n",
                                  "teethValue = ",teethValue,"\n",
                                  "lipsValue = ",lipsValue,"\n",
                                  "Fractals Low around: ",fracDownValue);
                          isBuy = true;
                         }
                    //in case of sell
                       if(lipsValue<teethValue && lipsValue<jawsValue && teethValue<jawsValue
                       && closingPrice < teethValue && fracUpValue != EMPTY_VALUE)
                         {
                          Comment("Sell","\n",
                                  "jawsValue = ",jawsValue,"\n",
                                  "teethValue = ",teethValue,"\n",
                                  "lipsValue = ",lipsValue,"\n",
                                  "Fractals High around: ",fracUpValue);
                          isSell = true;
                         }
                      }
                    //+------------------------------------------------------------------+
                    

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

                    Создаем три массива для компонентов Alligator.

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

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

                       ArraySetAsSeries(jawsArray,true);
                       ArraySetAsSeries(teethArray,true);
                       ArraySetAsSeries(lipsArray,true);
                    

                    Объявляем индикатор Аллигатора с помощью функции 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);
                    

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

                       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
                       && closingPrice > teethValue && fracDownValue != EMPTY_VALUE)
                         {
                          Comment("Buy","\n",
                                  "jawsValue = ",jawsValue,"\n",
                                  "teethValue = ",teethValue,"\n",
                                  "lipsValue = ",lipsValue,"\n",
                                  "Fractals Low around: ",fracDownValue);
                          isBuy = true;
                         }
                    

                    Для формирования сигнала на продажу:

                       if(lipsValue<teethValue && lipsValue<jawsValue && teethValue<jawsValue
                       && closingPrice < teethValue && fracUpValue != EMPTY_VALUE)
                         {
                          Comment("Sell","\n",
                                  "jawsValue = ",jawsValue,"\n",
                                  "teethValue = ",teethValue,"\n",
                                  "lipsValue = ",lipsValue,"\n",
                                  "Fractals High around: ",fracUpValue);
                          isSell = true;
                         }
                    

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

                     Система Fractals и Alligator на графике

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

                    Примеры сигналов, сгенерированных при тестировании этой стратегии.

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

                     Fractals + Alligator - сигнал на покупку

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

                    • Покупка
                    • Значение челюстей
                    • Значение зубов
                    • Значение губ
                    • Минимум Fractals

                     Fractals + Alligator - сигнал на продажу

                    На предыдущем графике имеем сигнал и следующие значения:

                    • Продажа
                    • Значение челюстей
                    • Значение зубов
                    • Значение губ
                    • Максимум Fractals


                    Заключение

                    Технический индикатор Fractals — полезный и эффективный инструмент, который можно использовать самостоятельно или в сочетании с другими техническими индикаторами. Предполагается, что вы познакомились с индикатором, узнали, что он измеряет, как он может формироваться на графике и как найти встроенный индикатор в терминале MetaTrader 5. Кроме того мы посмотрели, как можно использовать фракталы, с помощью следующих простых торговых стратегий:

                    • Максимумы и минимумы Fractals: для поиска максимумов и минимумов индикатора Fractals и получения сигнала на графике.
                    • Fractals и скользящая средняя: сигналы на покупку на основе показателей от индикатора фракталов и положения цены относительно скользящей средней.
                    • Fractals и Alligator: сигналы на покупку на основе показателей от индикатора фракталов, индикатора Alligator и положения цены.

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

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

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

                    Прикрепленные файлы |
                    Последние комментарии | Перейти к обсуждению на форуме трейдеров (1)
                    Roman Shiredchenko
                    Roman Shiredchenko | 20 дек. 2022 в 18:12


                    Спс автору. Все очень хорошо расжевано в статьях. Сам не исключаю - что код по сигналам тс по фракталам и ма возьму для доукомплектования его еще чем нибудь - например скоростью тиков для своего биржевого робота скальпера. Причем на тиках может вообще все сделать - а может и на м1. Также можно а ля усреднялку чисто на отбойках от фракталов и тралом по первой тс тут тоже кое чем докрутить. В общем респектую за полезные статьи по данным темам автору!
                    Популяционные алгоритмы оптимизации: Светлячковый алгоритм (Firefly Algorithm - FA) Популяционные алгоритмы оптимизации: Светлячковый алгоритм (Firefly Algorithm - FA)
                    Рассмотрим метод оптимизации "Поиск с помощью светлячкового алгоритма" (FA). Из аутсайдера путем модификации алгоритм превратился в настоящего лидера рейтинговой таблицы.
                    DoEasy. Элементы управления (Часть 30): Оживляем элемент управления "ScrollBar" DoEasy. Элементы управления (Часть 30): Оживляем элемент управления "ScrollBar"
                    В статье продолжим разрабатывать элемент управления ScrollBar и начнём делать функционал взаимодействия с мышкой. Помимо этого расширим списки флагов состояния и событий мышки.
                    Машинное обучение и Data Science (Часть 8): Кластеризация методом k-средних в MQL5 Машинное обучение и Data Science (Часть 8): Кластеризация методом k-средних в MQL5
                    Для всех, кто работает с данными, включая трейдеров, data mining может открыть совершенно новые возможности, ведь зачастую данные не такие простые, какими кажутся. Человеческому глазу сложно увидеть глубинные закономерности и отношения в наборе данных. Одно из решений — алгоритм К-средних. Давайте посмотрим, полезен ли он.
                    Разработка торгового советника с нуля (Часть 31): Навстречу будущему (IV) Разработка торгового советника с нуля (Часть 31): Навстречу будущему (IV)
                    Мы продолжаем удалять разные вещи внутри советника. Это будет последняя статья в этой серии. Последнее, что будет удалено в данной серии статей - это звуковая система. Это может сбить читателя с толку, если он не следил за этими статьями.