English 中文 Español Deutsch 日本語 Português
preview
Разработка торговой системы на основе Индекса облегчения рынка MFI от Билла Вильямса

Разработка торговой системы на основе Индекса облегчения рынка MFI от Билла Вильямса

MetaTrader 5Трейдинг | 18 апреля 2023, 16:19
1 568 0
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

Введение

Представляю вашему вниманию новую статью из серии, в которой мы учимся создавать торговые системы на основе популярных технических индикаторов. В этой статье представлен еще один технический инструмент, который может стать полезным дополнением к вашей торговле, особенно если сочетать его с другими инструментами для получения лучшего понимания процессов, происходящих на рынке. Познакомимся с Индексом облегчения рынка Билла Вильямса (Market Facilitation Index, MFI). При изучении индикатора в статье рассмотрим следующие темы:

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

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

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

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


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

В этом разделе узнаем в деталях, что из себя представляет индикатор Market Facilitation Index (MFI). Это один из технических индикаторов, разработанный известным трейдером и автором Биллом Вильямсом. Он предназначен для измерения направления рынка путем изучения и анализа цены и объема. В чем польза этого индикатора для трейдера — он может подсказать будущее движение рынка и дать представление о силе текущего движения цены. На основе этого можно определить, продолжится движение или же цена может развернуться. Польза такой информации в том, что она помогает торговать с сильной стороной рынка и принимать информированные решения.

Чтобы понять ситуацию, мы анализируем индекс MFI и объем. На основе этого у нас есть следующие варианты:

  • Если показатель индикатора BW MFI растет и объем увеличивается, это свидетельствует об интересе участников рынка к данному финансовому инструменту.
  • Если показатель индикатора BW MFI снижается и объем уменьшаются, это говорит о снижении интереса участники в этом финансовом инструменте.
  • Если показатель индикатора BW MFI растет, но объем уменьшается, это указывает на то, что объем не поддерживает текущее движение.
  • Если показатель индикатора BW MFI снижается, а объем при этом растет, это указывает на то, что на рынке установился баланс между покупателями и продавцами.

Теперь давайте посмотрим, как можно вычислить индикатор BW MFI вручную. Знание того, как рассчитывается индикатор, позволяет лучше понять концепцию, лежащую в его основе. По факту ничего вычислять не нужно, ведь есть готовый к использованию индикатор, встроенный в MetaTrader 5. Чтобы вычислить значение индекса BW MFI, нужно результат разности между максимум и минимумом разделить на объем.

BW MFI = (High - Low) / Volume

где:

High — цена максимума;
Low — цена минимума;
Volume — текущий объем.

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

Открываем торговый терминал MetaTrader 5, нажимаем меню «Вставка» -> «Индикаторы» -> «Билла Вильямса» -> Market Facilitation Index. На рисунке ниже это показано:

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

После того, как мы выбрали MFI в меню, откроется окно параметров индикатора. Выглядит оно так:

Окно индикатора BW MFI

1 — цвет индикатора, когда показатели MFI и объемы растут.

2 — цвет индикатора, когда показатели MFI и объемы снижаются.

3 — цвет индикатора, когда показатели MFI растут, а объемы при этом снижаются.

4 — цвет индикатора, когда показатели MFI снижаются, а объемы при этом растут.

5 — тип объема (тиковый или реальный).

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

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

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

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

  • Зеленый бар означает, что и показатели BW MFI, и объем увеличиваются, указывая на то, что участники рынка заинтересованы в этом инструменте.
  • Бар коричневого цвета означает, что показатель MW MFI и объем снижаются, указывая на отсутствие интереса в финансовом инструменте со стороны участников рынка.
  • Синий бар означает, что индекс BW MFI растет, а объем уменьшается, указывая на то, что движение рынка не поддерживается объемом.
  • Розовый цвет означает, что индекс BW MFI снижается, а объем растет, указывая на баланс между быками и медведями.

Стратегия по индикатору BW MFI

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

Стратегия первая: BW MFI — состояние движения

Эта стратегия будет определять состояние движения индикатора BW MFI. Для этого мы будем анализировать показатели индикатора BW MFI и значения объемов. Итак, всего может быть четыре состояния:

  • Текущий показатель BW MFI больше предыдущего, и при этом текущий объем больше предыдущего. На графике в таком случае отображается бар зеленого цвета. Определим это как "зеленой" состояние.
  • Текущий показатель BW MFI меньше предыдущего, и при этом текущий объем также меньше предыдущего. На графике в таком случае отображается бар коричневого цвета. Определим это как состояние ослабления.
  • Текущий показатель BW MFI выше предыдущего, но при этом текущий объем меньше предыдущего. Бар будет синим и будет сигнализировать о ложном состоянии.
  • Текущий показатель BW MFI меньше предыдущего, и при этом текущий объем также выше предыдущего. Бар будет розовым, а такое состояние называется "Сквот".

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

  • Текущий BW MFI > пред. BW MFI, а текущий объем > пред. объема ==> Зеленое состояние, зеленый бар
  • Текущий BW MFI < пред. BW MFI, а текущий объем < пред. объема ==> Ослабление - коричневый бар
  • Текущий BW MFI > пред. BW MFI, а текущий объем < пред. объема ==> Ложное состояние - синий бар
  • Текущий BW MFI < пред. BW MFI, а текущий объем > пред. объема ==> Сквот - розовый бар

Стратегия вторая: сигналы по BW MFI

Эта стратегия буде формировать сигналы на основе состояния индикатора BW MFI. Для начала нужно определить состояние рынка так же, как определяли в предыдущей стратегии. Затем, на основе состояния, стратегия будет формировать сигнал о благоприятном действии. Согласно этой стратегии у нас будет четыре сигнала в соответствии с состояниями:

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

Стратегия третья: сочетание BW MFI и MA

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

Тогда получается:

  • Состояние зеленое, цена закрытия > MA ==> сигнал на покупку
  • Состояние зеленое, цена закрытия < MA ==> сигнал на продажу

Схема системы по индикатору BW MFI

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

 Стратегия первая: BW MFI — состояние движения

Для этой стратегии создадим торговую систему, с помощью которой можно будет получать сигнал о движении индикатора BW MFI. Для этого будет анализироваться цвет индикатора, который в свою очередь определяется на основе сравнения четырех значения на каждом тик, чтобы определить их положения относительно друг друга. Эти четыре значения представляют собой текущее и предыдущее значения показателя MFI BW, а также текущий и предыдущий объемы. Программа будет проверять эти значения и определять их положение. Первое состояние — когда текущий показатель BW MFI больше предыдущего и при этом текущий объем больше предыдущего. В таком случае торговая система будет выводить на график комментарий "Green State - Green Bar". Второе состояние — когда текущий показатель BW MFI ниже предыдущего и при этом текущий объем меньше предыдущего. В таком случае торговая система будет выводить на график комментарий "Fade State - Brown Bar". Третий случай, когда текущее показатель BW MFI больше предыдущего, а значение текущего объема меньше предыдущего. Система будет выводить на график комментарий о ложном сигнале: "Fake State - Blue Bar". Четвертый и последний случай, когда текущее значение BW MFI ниже предыдущего, а текущий объема больше предыдущего. При таких показателях система будет отображать на графике комментарий "Squat State - Pink Bar".

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

Схема стратегии по состоянию движения

Стратегия вторая: сигналы по BW MFI

В соответствии с этой стратегией на основе определения состояния по барам индикатора, мы создадим торговую систему, которую можно использовать для формирования сигнала на основе этого состояния индикатора BW MFI. Сигнал также будет отображаться в виде комментария на графике. Для этого нужно написать программу, которая на каждом тике будет проверять четыре состояния и возвращать соответствующий сигнал. Если торговая система определила, что индикатор BW MFI показывает зеленое состояние, программа должна вывести на график комментарий с сигналом "Find a good entry". Если система определить второе состояние (затухание), на график будет выводиться комментарий с сигналом "Find a good exit". Если система определит третье состояние индикатора — ложное, комментарий на графике будет говорить о возможном ложном пробое: "False breakout probability". И, наконец, если определили четвертое состояние индикатора — сквот, комментарий на графике будет говорить о сбалансированности сил на рынке: "Market is Balanced".

На рисунке ниже показана схема разработки стратегии, генерирующей такие сигналы:

Схема стратегии с сигналами по BW MFI

Стратегия третья: сочетание BW MFI и MA

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

На рисунке ниже показана схема разработки стратегии по индикаторам BW MFI и MA:

Схема стратегии BW MFI с MA

Торговая система по индикатору BW MFI

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

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

double BWMFIArray[];

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

  • array[] — определяем созданные массивы, BMWFIArray.
  • flag — устанавливаем направление индексирования в массиве, true.
ArraySetAsSeries(BWMFIArray,true);

Создаем переменную типа integer BWMFIDef, определяем индикатор Bill Williams Market Facilitation Index с помощью функции iBWMFI. Функция возвращает хэндл индикатора. Параметры функции:

  • symbol — имя символа; у нас это _SYMBOL, то есть рассчитываем индикатор по символу текущего графика.
  • period — таймфрейм для расчета; используемое значение _PERIOD означает, что индикатор будет рассчитываться на текущем таймфрейме.
  • applied_volume — тип объемов, используемых для расчета индикатора. Будем использовать тиковые объемы (VOLUME_TICK).
int BWMFIDef=iBWMFI(_Symbol,_Period,VOLUME_TICK);

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

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

Получаем текущее значение BWMFI. Для этого предварительно создаем double-переменную BWMFIVal. Затем используем функцию NormalizeDouble для округления.

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

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

Comment("BW MFI Value = ",BWMFIVal);

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

//+------------------------------------------------------------------+
//|                             Simple Market Facilitation Index.mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
void OnTick()
  {
   double BWMFIArray[];
   ArraySetAsSeries(BWMFIArray,true);
   int BWMFIDef=iBWMFI(_Symbol,_Period,VOLUME_TICK);
   CopyBuffer(BWMFIDef,0,0,3,BWMFIArray);
   double BWMFIVal=NormalizeDouble(BWMFIArray[0],5);
   Comment("BW MFI Value = ",BWMFIVal);
  }
//+------------------------------------------------------------------+

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

Программа BW MFI в Навигаторе

Запускаем программу из Навигатора двойным кликом на файле 'Simple Market Facilitation Index' или перетаскиваем на график. После этого появится окно советника:

Окно индикатора BW MFI

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

Программа Simple BW MFI на графике

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

Сигналы от стратегии Simple BW MFI

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

Стратегия первая: BW MFI — состояние движения

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

//+------------------------------------------------------------------+
//|                                     BW MFI - Movement Status.mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
void OnTick()
  {
   double BWMFIArray[];
   double volArray[];
   ArraySetAsSeries(BWMFIArray,true);
   ArraySetAsSeries(volArray,true);
   int BWMFIDef=iBWMFI(_Symbol,_Period,VOLUME_TICK);
   int volDef=iVolumes(_Symbol,_Period,VOLUME_TICK);
   CopyBuffer(BWMFIDef,0,0,3,BWMFIArray);
   CopyBuffer(volDef,0,0,3,volArray);
   double BWMFIVal=NormalizeDouble(BWMFIArray[0],5);
   double BWMFIVal1=NormalizeDouble(BWMFIArray[1],5);
   double volVal=NormalizeDouble(volArray[0],5);
   double volVal1=NormalizeDouble(volArray[1],5);
   if(BWMFIVal>BWMFIVal1&&volVal>volVal1)
     {
      Comment("Green State - Green Bar");
     }
   if(BWMFIVal<BWMFIVal1&&volVal<volVal1)
     {
      Comment("Fade State - Brown Bar");
     }
   if(BWMFIVal>BWMFIVal1&&volVal<volVal1)
     {
      Comment("Fake State - Blue Bar");
     }
   if(BWMFIVal<BWMFIVal1&&volVal>volVal1)
     {
      Comment("Squat State - Pink Bar");
     }
  }
//+------------------------------------------------------------------+

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

Создаем два массива (BWMFIArray) и (volArray) и устанавливаем сортировку данных в этих массивах с помощью функции "ArraySetAsSeries".

   double BWMFIArray[];
   double volArray[];
   ArraySetAsSeries(BWMFIArray,true);
   ArraySetAsSeries(volArray,true);
Создаем целочисленные переменные для BWMFiDef и volDef. Определяем индикатор BW MFI с помощью функции iBWMFI и объемы с помощью функции iVolumes. Функция возвращает хэндлы индикаторов. Параметры:
  • symbol — имя символа; у нас это _SYMBOL, то есть рассчитываем индикатор по символу текущего графика.
  • period — таймфрейм для расчета; используемое значение _PERIOD означает, что индикатор будет рассчитываться на текущем таймфрейме.
  • applied_volume — тип объемов, используемых для расчета индикатора. Будем использовать тиковые объемы (VOLUME_TICK).
   int BWMFIDef=iBWMFI(_Symbol,_Period,VOLUME_TICK);
   int volDef=iVolumes(_Symbol,_Period,VOLUME_TICK);

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

CopyBuffer(volDef,0,0,3,volArray);

Определяем текущие и предыдущие значения индикатора BW MFI и объемов:

   double BWMFIVal=NormalizeDouble(BWMFIArray[0],5);
   double BWMFIVal1=NormalizeDouble(BWMFIArray[1],5);
   double volVal=NormalizeDouble(volArray[0],5);
   double volVal1=NormalizeDouble(volArray[1],5);

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

В случае зеленого бара

   if(BWMFIVal>BWMFIVal1&&volVal>volVal1)
     {
      Comment("Green State - Green Bar");
     }

Если коричневый бар

   if(BWMFIVal<BWMFIVal1&&volVal<volVal1)
     {
      Comment("Fade State - Brown Bar");
     }

Если бар синий

   if(BWMFIVal>BWMFIVal1&&volVal<volVal1)
     {
      Comment("Fake State - Blue Bar");
     }

Если бар розовый

   if(BWMFIVal<BWMFIVal1&&volVal>volVal1)
     {
      Comment("Squat State - Pink Bar");
     }

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

Программа Movement Status на графике

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

В случае сигнала зеленого состояния

Программа Movement Status - зеленый сигнал

 

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

В случае состояния затухания:

Movement Status - сигнал затухания

В левом углу графика отображается комментарий с сигналом Fade.

В случае ложного состояния:

Программа Movement Status - ложный сигнал

Снова комментарий на графике - на этот раз с сигналом о ложном состоянии (Fake):

При состоянии "сквот":

Программа Movement Status - сигнал сквот

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

Стратегия вторая: сигналы по BW MFI

Код второй стратегии, генерирующей сигналы по BW MFI, показан ниже.

//+------------------------------------------------------------------+
//|                                               BW MFI Signals.mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
void OnTick()
  {
   double BWMFIArray[];
   double volArray[];
   ArraySetAsSeries(BWMFIArray,true);
   ArraySetAsSeries(volArray,true);
   int BWMFIDef=iBWMFI(_Symbol,_Period,VOLUME_TICK);
   int volDef=iVolumes(_Symbol,_Period,VOLUME_TICK);
   CopyBuffer(BWMFIDef,0,0,3,BWMFIArray);
   CopyBuffer(volDef,0,0,3,volArray);
   double BWMFIVal=NormalizeDouble(BWMFIArray[0],5);
   double BWMFIVal1=NormalizeDouble(BWMFIArray[1],5);
   double volVal=NormalizeDouble(volArray[0],5);
   double volVal1=NormalizeDouble(volArray[1],5);
   bool greenState = BWMFIVal>BWMFIVal1&&volVal>volVal1;
   bool fadeState = BWMFIVal<BWMFIVal1&&volVal<volVal1;
   bool fakeState = BWMFIVal>BWMFIVal1&&volVal<volVal1;
   bool squatState = BWMFIVal<BWMFIVal1&&volVal>volVal1;
   
   if(greenState)
     {
      Comment("Find a good entry");
     }
   if(fadeState)
     {
      Comment("Find a good exit");
     }
   if(fakeState)
     {
      Comment("False breakout Probability");
     }
   if(squatState)
     {
      Comment("Market is Balanced");
     }
  }
//+------------------------------------------------------------------+

Отличия этого кода:

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

   bool greenState = BWMFIVal>BWMFIVal1&&volVal>volVal1;
   bool fadeState = BWMFIVal<BWMFIVal1&&volVal<volVal1;
   bool fakeState = BWMFIVal>BWMFIVal1&&volVal<volVal1;
   bool squatState = BWMFIVal<BWMFIVal1&&volVal>volVal1;

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

В случае зеленого состояния

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

В случае состояния Fade (затухание)

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

При ложном состоянии

   if(fakeState)
     {
      Comment("False breakout Probability");
     }

При состоянии сквот

   if(squatState)
     {
      Comment("Market is Balanced");
     }

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

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

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

Сигнал о том, что найдена хорошая возможность для входа:

Сигнал Find a good entry

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

Сигнал о том, что найдена хорошая возможность для выхода:

Сигнал Find a good exit

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

Пример сигнала о возможном ложном пробое:

Сигналы BW MFI - сигнал ложного пробоя

На скриншоте выше в левом верхнем углу графика отображается комментарий о вероятности ложного пробоя.

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

Сигналы BW MFI - сигнал сбалансированности

В левом верхнем углу графика есть комментарий с сигналом о сбалансированном рынке.

Стратегия третья: сочетание BW MFI и MA

Давайте посмотрим на полный код этой торговой системы, основанной на стратегии, в которой мы комбинируем показатели индикатора BW MFI и скользящей средней.

//+------------------------------------------------------------------+
//|                                               BW MFI with MA.mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
void OnTick()
  {
   double BWMFIArray[];
   double volArray[];
   double maArray[];
   MqlRates pArray[];
   ArraySetAsSeries(BWMFIArray,true);
   ArraySetAsSeries(volArray,true);
   ArraySetAsSeries(maArray,true);
   int BWMFIDef=iBWMFI(_Symbol,_Period,VOLUME_TICK);
   int volDef=iVolumes(_Symbol,_Period,VOLUME_TICK);
   int maDef=iMA(_Symbol,_Period,10,0,MODE_SMA,PRICE_CLOSE);
   int data=CopyRates(_Symbol,_Period,0,10,pArray);
   CopyBuffer(BWMFIDef,0,0,3,BWMFIArray);
   CopyBuffer(volDef,0,0,3,volArray);
   CopyBuffer(maDef,0,0,3,maArray);
   double BWMFIVal=NormalizeDouble(BWMFIArray[0],5);
   double BWMFIVal1=NormalizeDouble(BWMFIArray[1],5);
   double volVal=NormalizeDouble(volArray[0],5);
   double volVal1=NormalizeDouble(volArray[1],5);
   double maVal=NormalizeDouble(maArray[0],5);
   double closingPrice=pArray[0].close;
   bool greenState = BWMFIVal>BWMFIVal1&&volVal>volVal1;
   bool fadeState = BWMFIVal<BWMFIVal1&&volVal<volVal1;
   bool fakeState = BWMFIVal>BWMFIVal1&&volVal<volVal1;
   bool squatState = BWMFIVal<BWMFIVal1&&volVal>volVal1;
   if(closingPrice>maVal&&greenState)
     {
      Comment("Buy Signal");
     }
   else
      if(closingPrice<maVal&&greenState)
        {
         Comment("Sell signal");
        }
      else
         Comment("");
  }
//+------------------------------------------------------------------+

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

Создаем еще два массива для maArray с помощью функции double и pArray с помощью функции MqlRates.

   double maArray[];
   MqlRates pArray[];

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

ArraySetAsSeries(maArray,true);

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

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

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

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

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

   int data=CopyRates(_Symbol,_Period,0,10,pArray);
   CopyBuffer(BWMFIDef,0,0,3,BWMFIArray);
   CopyBuffer(volDef,0,0,3,volArray);
   CopyBuffer(maDef,0,0,3,maArray);

Получаем текущие значения индикатора BW MFI, объемов, простой скользящей средней и цены закрытия в дополнение к предыдущим значениям BW MFI и объемов.

   double BWMFIVal=NormalizeDouble(BWMFIArray[0],5);
   double BWMFIVal1=NormalizeDouble(BWMFIArray[1],5);
   double volVal=NormalizeDouble(volArray[0],5);
   double volVal1=NormalizeDouble(volArray[1],5);
   double maVal=NormalizeDouble(maArray[0],5);
   double closingPrice=pArray[0].close;

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

   bool greenState = BWMFIVal>BWMFIVal1&&volVal>volVal1;
   bool fadeState = BWMFIVal<BWMFIVal1&&volVal<volVal1;
   bool fakeState = BWMFIVal>BWMFIVal1&&volVal<volVal1;
   bool squatState = BWMFIVal<BWMFIVal1&&volVal>volVal1;

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

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

   if(closingPrice>maVal&&greenState)
     {
      Comment("Buy Signal");
     }

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

   else
      if(closingPrice<maVal&&greenState)
        {
         Comment("Sell signal");
        }

В противном случае

      else
         Comment("");

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

 Программа по стратегии BW MFI with MA на графике

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

Стратегия BW MFI with MA - сигнал на покупку

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

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

Стратегия BW MFI with MA - сигнал на продажу

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

Заключение

Предполагается, что после прочтения этой статьи вы хорошо понимаете основную концепцию технического индикатора Market Facilitation Index, который был разработан Биллом Вильямсом. Мы с вами рассмотрели, как рассчитать индикатор вручную и как запустить его на график в торговой платформе MetaTrader 5, а также как интерпретировать его показания. Мы также увидели, как его можно использовать. Для этого мы рассмотрели несколько простых стратегий на основе индикатора BW MFI:

  • Стратегия "BW MFI - Movement Status": ее можно использовать для получения автоматических сигналов о состоянии рынка на основе цвета баров индикатора (зеленое состояние, ослабление момента, ложные состояния и сквот).
  • Стратегия "Сигналы по индикатору BW MFI": для получения сигналов о возможности принятия решения (поиск хорошей возможности входа или выхода, сигнал о возможном ложном пробое или об установлении баланса на рынке) на основе показателей индикатора BW MFI.
  • Стратегия "MFI и MA": для генерации сигналов на покупку и продажу на основе показателей индикатора BW MFI и простой скользящей средней.

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

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

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

Прикрепленные файлы |
BW_MFI_Signals.mq5 (1.81 KB)
BW_MFI_with_MA.mq5 (2.05 KB)
Теория категорий в MQL5 (Часть 3) Теория категорий в MQL5 (Часть 3)
Теория категорий представляет собой разнообразный и расширяющийся раздел математики, который пока относительно не освещен в MQL5-сообществе. Эта серия статей призвана осветить некоторые из ее концепций для создания открытой библиотеки и дальнейшему использованию этого замечательного раздела в создании торговых стратегий.
Машинное обучение и Data Science (Часть 11): Наивный байесовский классификатор и теория вероятностей в трейдинге Машинное обучение и Data Science (Часть 11): Наивный байесовский классификатор и теория вероятностей в трейдинге
Торговлю по вероятностям можно сравнить с ходьбой по канату — она требует точности, баланса и четкого понимания риска. В мире трейдинга вероятность решает все. Именно от нее зависит результат — успех или неудача, прибыль или убыток. Используя возможности вероятности, трейдеры могут принимать более обоснованные решения, эффективнее управлять рисками и достигать своих финансовых целей. Неважно, опытный вы инвестор или начинающий трейдер, понимание вероятности может стать ключом к раскрытию вашего торгового потенциала. В этой статье мы познакомимся с увлекательным миром вероятностного трейдинга и покажем, как вывести игру в торговлю на новый уровень.
Нейросети — это просто (Часть 38): Исследование с самоконтролем через несогласие (Self-Supervised Exploration via Disagreement) Нейросети — это просто (Часть 38): Исследование с самоконтролем через несогласие (Self-Supervised Exploration via Disagreement)
Одной из основных проблем обучения с подкреплением является исследование окружающей среды. Ранее мы уже познакомились с методом исследования на базе внутреннего любопытства. Сегодня я предлагаю посмотреть на ещё один алгоритм — исследование через несогласие.
Понимание и эффективное использование OpenCL API путем воссоздания встроенной поддержки в виде DLL в Linux (Часть 1): Мотивация и проверка Понимание и эффективное использование OpenCL API путем воссоздания встроенной поддержки в виде DLL в Linux (Часть 1): Мотивация и проверка
Встроенная поддержка OpenCL в MetaTrader 5 по-прежнему имеет серьезную проблему, особенно связанную с ошибкой выбора устройства 5114, возникающей из-за невозможности создать контекст OpenCL с использованием CL_USE_GPU_ONLY или CL_USE_GPU_DOUBLE_ONLY, хотя GPU определяется правильно. Программа отлично работает с прямым использованием порядкового номера устройства GPU, который можно найти на вкладке "Журнал", однако пользователям не следует жестко кодировать устройство. Мы решим эту проблему, воссоздав поддержку OpenCL в виде DLL с помощью C++ в Linux. По пути мы познакомимся с OpenCL, от концепции до лучших практик в использовании его API, ровно настолько, чтобы мы могли широко использовать его позже, когда будем иметь дело с реализацией DLL на C++ и использовать его с MQL5.