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

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

MetaTrader 5Трейдинг | 1 сентября 2022, 08:06
2 566 0
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

Введение

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

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

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

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

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

Что же, приступим к изучению индикатора.


Определение Индекса силы

В этом разделе в деталях изучим индикатор Force Index, узнаем, что такое индекс силы, что он измеряет и как его рассчитать. Мой подход заключается в том, чтобы добраться до самых корней. Это позволит не только эффективнее использовать инструменты, но и поможет развивать другие идеи. Индекс силы Force Index разработал Александр Элдер. Он представил его в своей книге «Как играть и выигрывать на бирже». Индикатор измеряет силу движения и определяет потенциальные точки разворота. Force Index использует в своих расчетах цену и объем, и это позволяет измерять силу любого движения на рынке.

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

1. Индекс силы 1 периода = (Закрытие периода - Закрытие предыдущего периода) * Объем

2. Индекс силы 13 периодов = 13-периодная EMA от Индекса силы 1 период

Расчет индикатора мы изучаем, только чтобы лучше понять суть. Но применять его не придется, поскольку уже есть готовый к использованию индикатор в торговом терминале MetaTrader 5, и все, что нужно сделать, это выбрать его из списка индикаторов. В торговой платформе MetaTrader 5 выбираем меню "Вставка" --> Индикаторы --> Осцилляторы --> Force Index.

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

Выбор индикатора Force Index в платформе

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

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

1 — период индикатора. Будем использовать (13) в качестве настройки индикатора по умолчанию.

2 — тип усреднения скользящей средней. Мы будем использовать экспоненциальную.

3 — тип объемов. Будем использовать тиковые объемы.

4 — цвет линии индикатора.

5 — стиль линии индикатора.

6 — толщина линии индикатора.

После настройки параметров индикатор появится на графике, как показано ниже.

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

Индикатор Force Index — это осциллятор, поэтому он отображается в дополнительном окне графика. Он рисует линию, которая колеблется выше и ниже уровня нуля.


Стратегии по Индексу силы

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

    Стратегия первая: Индекс силы — идентификатор тренда

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

      То есть:

      Индекс силы > Нулевой уровень --> Бычье движение.

      Индекс силы < Нулевой уровень --> Медвежье движение.

        Стратегия вторая: Индекс силы — вверх или дивергенция

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

          Получается так:

          Текущий максимум > Предыдущий максимум и Текущий индекс силы > Предыдущий индекс силы --> Сильное движение вверх.

          Текущий максимум > Предыдущий максимум и Текущий индекс силы < Предыдущий индекс силы --> Медвежья дивергенция.

            Стратегия третья: Индекс силы — вниз или дивергенция

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

              Итак:

              Текущий минимум < Предыдущего минимума и Текущий индекс силы < Предыдущего индекса силы --> Сильное движение вниз.

              Текущий минимум < Предыдущий минимум и Текущий индекс силы > Предыдущий индекс силы --> Бычье расхождение.

                Стратегия четвертая: Сигналы индекса силы

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

                  Цена закрытия > EMA, Предыдущий индекс силы < Уровень нуля и Текущий индекс силы > Уровень нуля --> Сигнал на покупку.

                  Цена закрытия < EMA, Предыдущий индекс силы > Уровень нуля и Текущий индекс силы < Уровень нуля --> Сигнал на продажу.


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

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

                    Стратегия первая: Индекс силы — идентификатор тренда

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

                      Схема стратегии Force Index - Идентификатор тренда

                        Стратегия вторая: Индекс силы — вверх или дивергенция

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

                          • Strong up move (сильное движение вверх)
                          • Текущий максимум
                          • Предыдущий максимум
                          • Текущее значение индекса силы
                          • Предыдущее значение индекса силы

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

                          • Bearish divergence (медвежье расхождение)
                          • Текущий максимум
                          • Предыдущий максимум
                          • Текущее значение индекса силы
                          • Предыдущее значение индекса силы

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

                          Схема стратегии Force Index - Вверх или дивергенция

                            Стратегия третья: Индекс силы — вниз или дивергенция

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

                              • Strong down move (сильное движение вниз)
                              • Текущий минимум
                              • Текущий минимум
                              • Текущее значение индекса силы
                              • Предыдущее значение индекса силы

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

                              • Bullish divergence (бычье расхождение)
                              • Текущий минимум
                              • Текущий минимум
                              • Текущее значение индекса силы
                              • Предыдущее значение индекса силы

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

                              Схема стратегии Force Index - Вниз или дивергенция

                                Стратегия четвертая: Сигналы индекса силы

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

                                  • Сигнал на покупку
                                  • Текущая цена закрытия
                                  • Текущее значение экспоненциальной скользящей средней
                                  • Текущее значение индекса силы
                                  • Предыдущее значение индекса силы

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

                                  • Сигнал на продажу
                                  • Текущая цена закрытия
                                  • Текущее значение экспоненциальной скользящей средней
                                  • Текущее значение индекса силы
                                  • Предыдущее значение индекса силы

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

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

                                  Торговые системы по Индексу силы

                                  Давайте теперь посмотрим, как на языке MQL5 создать торговую систему по каждой из рассмотренных стратегий и получать автоматические сигналы в платформе MetaTrader 5. Сначала напишем простую программу, которая будет выводить на график комментарий со значением индикатора Force Index. Она послужит основой для всех других систем.

                                  • Создаем массив fiArray с помощью функции типа "double".
                                  double fiArray[];
                                  • Сортируем массив в обратном порядке, начиная с текущих данных, с помощью функции ArraySetAsSeries (возвращает true или false): Параметры этой функции:
                                    • array[]
                                    • flag
                                  ArraySetAsSeries(fiArray,true);
                                  • Определяем объем с помощью функции iForce — для этого создали переменную fiDef. Функция iForce возвращает хэндл индикатора Force Index. Параметры этой функции:
                                    • symbol — будем использовать значение _Symbol, что означает расчет по ткущему символу.
                                    • period — будем использовать значение _Period для расчета по текущему периоду или таймфрейму.
                                    • ma_period — период MA (13) как длина используемой скользящей средней.
                                    • ma_method — тип усреднения скользящей, у нас это MODE_EMA
                                    • applied_volume — будем использовать тиковые объемы (VOLUME_TICK)
                                  int fiDef = iForce(_Symbol,_Period,13,MODE_EMA,VOLUME_TICK);
                                  • Заполняем массив с помощью функции CopyBuffer данными от индикатора Force Index. Параметры этой функции:
                                    • indicator_handle — хэндл индикатора, используем fiDef.     
                                    • buffer_num — номер индикаторного буфера, у нас (0).
                                    • start_pos — время начала расчета, у нас (0).         
                                    • count — количество копируемых данных, у используем (13).                
                                    • buffer[] — целевой буфер для копирования, используем наш fiArray.
                                  CopyBuffer(fiDef,0,0,3,fiArray);
                                  • Определяем текущее значение Force Index с помощью функции NormalizeDouble после создания переменной для fiVal. Функция NormalizeDouble возвращает значение типа double. Ее параметры:
                                    • value — нормализуемое значение, у нас это fiArray[0].
                                    • digits — количество знаков после запятой после нормализации, используем 6.
                                  double fiVal = NormalizeDouble(fiArray[0],6);
                                  • С помощью функции Comment выводим на график комментарий со значением индекса силы
                                  Comment("Force Index Value is ",fiVal);

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

                                  //+------------------------------------------------------------------+
                                  //|                                           Simple Force Index.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 fiArray[];
                                  
                                     ArraySetAsSeries(fiArray,true);
                                  
                                     int fiDef = iForce(_Symbol,_Period,13,MODE_EMA,VOLUME_TICK);
                                  
                                     CopyBuffer(fiDef,0,0,3,fiArray);
                                  
                                     double fiVal = NormalizeDouble(fiArray[0],6);
                                  
                                     Comment("Force Index Value is ",fiVal);
                                  
                                    }
                                  //+------------------------------------------------------------------+
                                  
                                  

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

                                  Force Index в Навигаторе 1

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

                                  Окно простой системы по индикатору Force Index

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

                                  Простая система по индикатору Force Index на графике

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

                                  Система будет генерировать сигналы. Примеры таких сигналов показаны на скриншоте ниже:

                                  Сигнал системы по индикатору Force Index на графике

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

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

                                  Индикатор Force Index - совпадающие сигналы

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

                                    Стратегия первая: Индекс силы — идентификатор тренда

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

                                      //+------------------------------------------------------------------+
                                      //|                               Force Index - 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()
                                        {
                                         double fiArray[];
                                      
                                         ArraySetAsSeries(fiArray,true);
                                      
                                         int fiDef = iForce(_Symbol,_Period,100,MODE_EMA,VOLUME_TICK);
                                      
                                         CopyBuffer(fiDef,0,0,3,fiArray);
                                      
                                         double fiVal = NormalizeDouble(fiArray[0],6);
                                      
                                         if(fiVal>0)
                                           {
                                            Comment("Bullish Movement","\n","Force Index Value is ",fiVal);
                                           }
                                      
                                         if(fiVal<0)
                                           {
                                            Comment("Bearish Movement","\n","Force Index Value is ",fiVal);
                                           }
                                      
                                        }
                                      //+------------------------------------------------------------------+
                                      

                                      Этот код отличается условиями стратегии.

                                      В случае бычьего движения

                                         if(fiVal>0)
                                           {
                                            Comment("Bullish Movement","\n","Force Index Value is ",fiVal);
                                           }
                                      

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

                                         if(fiVal<0)
                                           {
                                            Comment("Bearish Movement","\n","Force Index Value is ",fiVal);
                                           }
                                      

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

                                      Force Index в Навигаторе

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

                                      Окно стратегии Force Index - Идентификатор тренда

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

                                      Система Force Index - Идентификатор тренда на графике

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

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

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

                                      Force Index - Идентификатор тренда на графике - бычий сигнал

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

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

                                      Force Index - Идентификатор тренда на графике - медвежий сигнал

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

                                        Стратегия вторая: Индекс силы — вверх или дивергенция

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

                                          //+------------------------------------------------------------------+
                                          //|                               Force Index - Up or Divergence.mq5 |
                                          //|                                  Copyright 2022, MetaQuotes Ltd. |
                                          //|                                             https://www.mql5.com |
                                          //+------------------------------------------------------------------+
                                          #property copyright "Copyright 2022, MetaQuotes Ltd."
                                          #property link      "https://www.mql5.com"
                                          #property version   "1.00"
                                          //+------------------------------------------------------------------+
                                          void OnTick()
                                            {
                                             double fiArray[];
                                             MqlRates pArray[];
                                          
                                             ArraySetAsSeries(fiArray,true);
                                             int Data=CopyRates(_Symbol,_Period,0,3,pArray);
                                          
                                             int fiDef = iForce(_Symbol,_Period,13,MODE_EMA,VOLUME_TICK);
                                          
                                             CopyBuffer(fiDef,0,0,3,fiArray);
                                          
                                             double fiCurrentVal = NormalizeDouble(fiArray[0],6);
                                             double fiPrevVal = NormalizeDouble(fiArray[1],6);
                                          
                                             double currentHighVal=NormalizeDouble(pArray[2].high,6);
                                             double prevHighVal=NormalizeDouble(pArray[1].high,6);
                                          
                                             if(currentHighVal>prevHighVal && fiCurrentVal>fiPrevVal)
                                               {
                                                Comment("Strong up move","\n",
                                                "Current High is ",currentHighVal,"\n",
                                                "Previous High is ",prevHighVal,"\n",
                                                "Current Force Index Value is ",fiCurrentVal,"\n",
                                                "Previous Force Index Value is ",fiPrevVal);
                                               }
                                          
                                             if(currentHighVal>prevHighVal && fiCurrentVal<fiPrevVal)
                                               {
                                                Comment("Bearish Divergence","\n",
                                                "Current High is ",currentHighVal,"\n",
                                                "Previous High is ",prevHighVal,"\n",
                                                "Current Force Index Value is ",fiCurrentVal,"\n",
                                                "Previous Force Index Value is ",fiPrevVal);
                                               }
                                          
                                            }
                                          //+------------------------------------------------------------------+
                                          

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

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

                                             double fiArray[];
                                             MqlRates pArray[];
                                          

                                          Сортируем эти массивы. Для fiArray мы будем использовать функцию ArraySetAsSeries так же, как делали в предыдущем примере. Для pArray используем функцию CopyRates и получаем исторические данные MqlRates. Параметры функции:

                                          • symbol name — имя символа, используем _Symbol.
                                          • timeframe — используем текущий период_Period.
                                          • start time — время начала, используем 0.
                                          • stop time — время остановки, используем 3.
                                          • rates array — укажем pArray.
                                             ArraySetAsSeries(fiArray,true);
                                             int Data=CopyRates(_Symbol,_Period,0,3,pArray);
                                          

                                          Определение текущего и предыдущего значений индекса силы

                                             double fiCurrentVal = NormalizeDouble(fiArray[0],6);
                                             double fiPrevVal = NormalizeDouble(fiArray[1],6);
                                          

                                          Определение текущего максимума и предыдущего максимума

                                             double currentHighVal=NormalizeDouble(pArray[2].high,6);
                                             double prevHighVal=NormalizeDouble(pArray[1].high,6);
                                          

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

                                          Сильное движение вверх

                                             if(currentHighVal>prevHighVal && fiCurrentVal>fiPrevVal)
                                               {
                                                Comment("Strong up move","\n",
                                                "Current High is ",currentHighVal,"\n",
                                                "Previous High is ",prevHighVal,"\n",
                                                "Current Force Index Value is ",fiCurrentVal,"\n",
                                                "Previous Force Index Value is ",fiPrevVal);
                                               }
                                          

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

                                           
                                             if(currentHighVal>prevHighVal && fiCurrentVal<fiPrevVal)
                                               {
                                                Comment("Bearish Divergence","\n",
                                                "Current High is ",currentHighVal,"\n",
                                                "Previous High is ",prevHighVal,"\n",
                                                "Current Force Index Value is ",fiCurrentVal,"\n",
                                                "Previous Force Index Value is ",fiPrevVal);
                                               }
                                          

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

                                          Индикатор Force Index в Навигаторе

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

                                          Окно стратегии Force Index - Вверх или дивергенция

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

                                          Система по стратегии Force Index - Вверх или дивергенция - на графике

                                          Снова на графике присутствует индикация, что запущен советник.

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

                                          В случае сильного движения + текущие данные:

                                          Стратегия Force Index - Вверх или дивергенция - сильный сигнал - текущие данные

                                          Предыдущие данные в окне:

                                           Стратегия Force Index - Вверх или дивергенция - сильный сигнал - предыдущие данные

                                          Медвежья дивергенция и текущие данные

                                          Стратегия Force Index - Вверх или дивергенция - сигнал дивергенции - текущие данные

                                          Предыдущие данные в окне:

                                          Стратегия Force Index - Вверх или дивергенция - сигнал дивергенции - предыдущие данные

                                            Стратегия третья: Индекс силы — вниз или дивергенция

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

                                              //+------------------------------------------------------------------+
                                              //|                             Force Index - Down or Divergence.mq5 |
                                              //|                                  Copyright 2022, MetaQuotes Ltd. |
                                              //|                                             https://www.mql5.com |
                                              //+------------------------------------------------------------------+
                                              #property copyright "Copyright 2022, MetaQuotes Ltd."
                                              #property link      "https://www.mql5.com"
                                              #property version   "1.00"
                                              //+------------------------------------------------------------------+
                                              void OnTick()
                                                {
                                                 double fiArray[];
                                                 MqlRates pArray[];
                                              
                                                 ArraySetAsSeries(fiArray,true);
                                                 int Data=CopyRates(_Symbol,_Period,0,3,pArray);
                                              
                                                 int fiDef = iForce(_Symbol,_Period,13,MODE_EMA,VOLUME_TICK);
                                              
                                                 CopyBuffer(fiDef,0,0,3,fiArray);
                                              
                                                 double fiCurrentVal = NormalizeDouble(fiArray[0],6);
                                                 double fiPrevVal = NormalizeDouble(fiArray[1],6);
                                              
                                                 double currentLowVal=NormalizeDouble(pArray[2].low,6);
                                                 double prevLowVal=NormalizeDouble(pArray[1].low,6);
                                              
                                                 if(currentLowVal<prevLowVal && fiCurrentVal<fiPrevVal)
                                                   {
                                                    Comment("Strong down move","\n",
                                                    "Current Low is ",currentLowVal,"\n",
                                                    "Previous Low is ",prevLowVal,"\n",
                                                    "Current Force Index Value is ",fiCurrentVal,"\n",
                                                    "Previous Force Index Value is ",fiPrevVal);
                                                   }
                                              
                                                 if(currentLowVal<prevLowVal && fiCurrentVal>fiPrevVal)
                                                   {
                                                    Comment("Bullish Divergence","\n",
                                                    "Current Low is ",currentLowVal,"\n",
                                                    "Previous Low is ",prevLowVal,"\n",
                                                    "Current Force Index Value is ",fiCurrentVal,"\n",
                                                    "Previous Force Index Value is ",fiPrevVal);
                                                   }
                                              
                                                }
                                              //+------------------------------------------------------------------+
                                              

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

                                              Определение текущего минимума и предыдущего минимума:

                                                 double currentLowVal=NormalizeDouble(pArray[2].low,6);
                                                 double prevLowVal=NormalizeDouble(pArray[1].low,6);
                                              

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

                                              In case of Strong down move:

                                                 if(currentLowVal<prevLowVal && fiCurrentVal<fiPrevVal)
                                                   {
                                                    Comment("Strong down move","\n",
                                                    "Current Low is ",currentLowVal,"\n",
                                                    "Previous Low is ",prevLowVal,"\n",
                                                    "Current Force Index Value is ",fiCurrentVal,"\n",
                                                    "Previous Force Index Value is ",fiPrevVal);
                                                   }
                                              

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

                                                 if(currentLowVal<prevLowVal && fiCurrentVal>fiPrevVal)
                                                   {
                                                    Comment("Bullish Divergence","\n",
                                                    "Current Low is ",currentLowVal,"\n",
                                                    "Previous Low is ",prevLowVal,"\n",
                                                    "Current Force Index Value is ",fiCurrentVal,"\n",
                                                    "Previous Force Index Value is ",fiPrevVal);
                                                   }
                                              

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

                                              Индикатор Force Index в Навигаторе

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

                                              Окно стратегии Force Index - Вниз или дивергенция

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

                                              Система по стратегии Force Index - Вниз или дивергенция - на графике

                                              Снова на графике присутствует индикация, что запущен советник.

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

                                              Сильное движение вниз и текущие данные:

                                              Стратегия Force Index - Вниз или дивергенция - сильный сигнал вниз - текущие данные

                                              Предыдущие данные:

                                              Стратегия Force Index - Вниз или дивергенция - сильный сигнал вниз - предвдущие данные

                                              Бычье расхождение и текущие данные

                                              Стратегия Force Index - Вниз или дивергенция - сигнал дивергенции - текущие данные

                                              Предыдущие данные:

                                              Стратегия Force Index - Вниз или дивергенция - сигнал дивергенции - предыдущие данные

                                                Стратегия четвертая: Сигналы индекса силы

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

                                                  //+------------------------------------------------------------------+
                                                  //|                                          Force Index 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 fiArray[];
                                                     double maArray[];
                                                     MqlRates pArray[];
                                                  
                                                  
                                                  
                                                     ArraySetAsSeries(fiArray,true);
                                                     ArraySetAsSeries(maArray,true);
                                                  
                                                  
                                                     int fiDef = iForce(_Symbol,_Period,13,MODE_EMA,VOLUME_TICK);
                                                     int maDef = iMA(_Symbol,_Period,50,0,MODE_EMA,PRICE_CLOSE);
                                                     int Data=CopyRates(_Symbol,_Period,0,3,pArray);
                                                  
                                                     CopyBuffer(fiDef,0,0,3,fiArray);
                                                     CopyBuffer(maDef,0,0,3,maArray);
                                                  
                                                     double fiCurrentVal = NormalizeDouble(fiArray[0],6);
                                                     double fiPrevVal = NormalizeDouble(fiArray[1],6);
                                                  
                                                     double maCurrentVal = NormalizeDouble(maArray[0],6);
                                                     double closePrice = NormalizeDouble(pArray[2].close,6);
                                                  
                                                  
                                                     if(closePrice>maCurrentVal && fiPrevVal<0 && fiCurrentVal>0)
                                                       {
                                                        Comment("Buy Signal","\n",
                                                                "Current Closing Price ",closePrice,"\n",
                                                                "EMA is ",maCurrentVal,"\n",
                                                                "Current Force Index Value is ",fiCurrentVal,"\n",
                                                                "Previous Force Index Value is ",fiPrevVal);
                                                       }
                                                  
                                                     if(closePrice<maCurrentVal && fiPrevVal>0 && fiCurrentVal<0)
                                                       {
                                                        Comment("Sell Signal","\n",
                                                                "Current Closing Price ",closePrice,"\n",
                                                                "EMA is ",maCurrentVal,"\n",
                                                                "Current Force Index Value is ",fiCurrentVal,"\n",
                                                                "Previous Force Index Value is ",fiPrevVal);
                                                       }
                                                  
                                                    }
                                                  //+------------------------------------------------------------------+
                                                  

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

                                                  Создаем три переменные: fiArray, maArray и MqlRates

                                                     double fiArray[];
                                                     double maArray[];
                                                     MqlRates pArray[];
                                                  

                                                  Сортировка массивов fiArray и maArray

                                                     ArraySetAsSeries(fiArray,true);
                                                     ArraySetAsSeries(maArray,true);
                                                  

                                                  Определение fiDef для индекса силы, maDef для скользящей средней

                                                     int fiDef = iForce(_Symbol,_Period,13,MODE_EMA,VOLUME_TICK);
                                                     int maDef = iMA(_Symbol,_Period,50,0,MODE_EMA,PRICE_CLOSE);
                                                  

                                                  Сортировка pArray с функцией CopyRates

                                                  int Data=CopyRates(_Symbol,_Period,0,3,pArray);

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

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

                                                  Определяем четыре значения: текущее и предыдущее значение индекса силы, текущая скользящая средняя и цена закрытия

                                                     double fiCurrentVal = NormalizeDouble(fiArray[0],6);
                                                     double fiPrevVal = NormalizeDouble(fiArray[1],6);
                                                  
                                                     double maCurrentVal = NormalizeDouble(maArray[0],6);
                                                     double closePrice = NormalizeDouble(pArray[2].close,6);
                                                  

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

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

                                                     if(closePrice>maCurrentVal && fiPrevVal<0 && fiCurrentVal>0)
                                                       {
                                                        Comment("Buy Signal","\n",
                                                                "Current Closing Price ",closePrice,"\n",
                                                                "EMA is ",maCurrentVal,"\n",
                                                                "Current Force Index Value is ",fiCurrentVal,"\n",
                                                                "Previous Force Index Value is ",fiPrevVal);
                                                       }
                                                  

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

                                                     if(closePrice<maCurrentVal && fiPrevVal>0 && fiCurrentVal<0)
                                                       {
                                                        Comment("Sell Signal","\n",
                                                                "Current Closing Price ",closePrice,"\n",
                                                                "EMA is ",maCurrentVal,"\n",
                                                                "Current Force Index Value is ",fiCurrentVal,"\n",
                                                                "Previous Force Index Value is ",fiPrevVal);
                                                       }
                                                  

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

                                                  Индикатор Force Index в Навигаторе

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

                                                  Окно стратегии Сигналы по Индексу силы

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

                                                   Сигналы по Индексу силы на графике

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

                                                  Пример сигнала на покупку и отображение текущих данных:

                                                  Стратегия Force Index - сигнал на покупку - текущие данные

                                                  Предыдущие данные:

                                                  Стратегия Force Index - сигнал на покупку - предыдущие данные

                                                  Пример сигнала на продажу и отображение текущих данных:

                                                  Стратегия Force Index - сигнал на продажу - текущие данные

                                                  Предыдущие данные:

                                                   Стратегия Force Index - сигнал на продажу - предыдущие данные


                                                  Заключение

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

                                                  • Force Index — идентификатор тренда: для получения сигналов бычьего и медвежьего движения.
                                                  • Индекс силы — вверх или дивергенция: чтобы получать сигналы сильного движения вверх или медвежьего расхождения.
                                                  • Индекс силы — Down или дивергенция: чтобы получать сигналы сильного движения вниз или медвежьего расхождения.
                                                  • Сигналы индекса силы: для получения сигналов покупки или продажи на основе анализа цены закрытия, значения индекса силы и экспоненциальной скользящей средней.

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

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

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

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

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

                                                  Нейросети — это просто (Часть 28): Policy gradient алгоритм Нейросети — это просто (Часть 28): Policy gradient алгоритм
                                                  Продолжаем изучение методов обучение с подкреплением. В предыдущей статье мы познакомились с методом глубокого Q-обучения. В котором мы обучаем модель прогнозирования предстоящей награды в зависимости от совершаемого действия в конкретной ситуации. И далее совершаем действие в соответствии с нашей политикой и ожидаемой наградой. Но не всегда возможно аппроксимировать Q-функцию. Или её аппроксимация не даёт желаемого результата. В таких случаях используют методы аппроксимации не функции полезности, а на прямую политику (стратегию) действий. Именно к таким методам относится policy gradient.
                                                  Нейросети — это просто (Часть 27): Глубокое Q-обучение (DQN) Нейросети — это просто (Часть 27): Глубокое Q-обучение (DQN)
                                                  Продолжаем изучение обучения с подкреплением. И в этой статье мы познакомимся с методом глубокого Q-обучения. Использование данного метода позволило команде DeepMind создать модель, способную превзойти человека при игре в компьютерные игры Atari. Думаю, будет полезно оценить возможности подобной технологии для решения задач трейдинга.
                                                  DoEasy. Элементы управления (Часть 17): Отсечение невидимых участков объектов, вспомогательные WinForms-объекты кнопки со стрелками DoEasy. Элементы управления (Часть 17): Отсечение невидимых участков объектов, вспомогательные WinForms-объекты кнопки со стрелками
                                                  В статье создадим функционал сокрытия участков объектов, выходящих за пределы своего контейнера, создадим вспомогательные объекты-кнопки со стрелками для использования их в составе других WinForms-объектов.
                                                  Разработка торговой системы на основе осциллятора Чайкина Разработка торговой системы на основе осциллятора Чайкина
                                                  Это новая статья из серии, в которой мы изучаем популярные технические индикаторы и учимся создавать на их основе торговые системы. В этой статье будем работать с индикатором Chaikin Oscillator — Осциллятор Чайкина.