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

1 августа 2022, 08:06
Mohamed Abdelmaaboud
0
423

Введение

Эта статья является продолжением серии, в которой мы изучаем, как создавать простые торговые системы на основе самых популярных технических индикаторов. Более обширная цель — научиться программировать на MQL5. В этой новой статье мы рассмотрим новый технический индикатор — Индекс денежного потока (MFI). Мы подробно изучим этот индикатор и узнаем, как написать простые торговые системы на основе его концепции. Как и в предыдущих статьях, работу над индикатором разобьем на несколько тем:

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

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

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

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

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

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

Теперь давайте приступим к изучению новой темы и расширим арсенал доступных нам торговых инструментов.


Определение Индекса денежного потока MFI

В этом разделе мы познакомимся с описанием Индекса денежного потока (MFI) и рассмотрим концепцию этого индикатора, который является одним из индикаторов объемов. Мы узнаем, что это такое, что он измеряет, затем мы узнаем, как его рассчитать вручную, проанализируем пример.

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

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

Индикатор Money Flow Index (MFI) создали Джин Куонг и Аврум Судак. Это индикатор, основанный на объеме, он использует цену и объем в расчетах для измерения давления покупателей и продавцов. Показатели колеблются между нулем и 100. Рост индекса MFI означает, что есть давление покупателей, и наоборот, снижение MFI означает давление продавцов. Индекс может подтверждать тренд или предупреждать о разворотах. Если хотите больше узнать о тренде, рекомендую почитать раздел "Определение тренда" в моей ранее опубликованной статье.

Расчет MFI вручную состоит из нескольких этапов:

  • Расчет типичной цены (TP) = (Максимум + Минимум + Закрытие)/3
  • Расчет исходного денежного потока = объем * TP
  • Определение движения TP: вверх или вниз. Если текущая TP > предыдущая TP = вверх; если текущая TP < предыдущая TP = вниз.
  • Расчет 1+MF = исходный поток MF растущих периодов
  • Расчет 1-MF = исходный поток снижающихся периодов
  • Расчет 14 +MF = сумма 14 (1+MF)
  • Расчет 14 -MF = сумма 14 (1-MF)
  • Вычисление соотношения 14 MF = 14+MF / 14-MF
  • Расчет MFI = 100-100/(соотношение 1+MF)

Посмотрим расчет всех этих шагов на основе примера. Предположим, у нас есть следующие данные по инструменту:

День Максимум Минимум Закрытие Объем
1 55 53 54 12000
2 56 54 55 10000
3 61 59 60 15000
4 67 64 65 20000
5 63 58 60 10000
6 58 52 55 5000
7 64 58 60 7000
8 52 47 50 7500
9 52 48 48 8000
10 50 48 49 5000
11 49 47 48 6000
12 48 47 47 7500
13 50 46 48 9000
14 52 45 47 10000
15 55 46 49 7000
16 53 45 47 7500
17 51 43 46 6000
18 50 42 44 5000
19 50 43 45 15000

Чтобы рассчитать индикатор MFI на основе этих данных, выполним следующие шаги:

Рассчитаем типичную цену (TP) = (Максимум + Минимум + Закрытие)/3

После расчета получаем такие значения типичной цены:

 Расчет MFI 2

Посчитаем исходный денежный поток = объем * TP

Расчет MFI 3

Определим движение TP: вверх или вниз.

Расчет MFI 4

Найдем 1+MF = исходный поток MF растущих периодов

Найдем 1-MF = исходный поток снижающихся периодов

 Расчет MFI 5

Считаем 14+MF = сумма 14 (1+MF)

14-MF = сумма 14 (1-MF)

Расчет MFI 6

Вычислим соотношение 14 MF = 14+MF / 14-MF

 Расчет MFI 7

Наконец, считаем MFI = 100-100/(1+MF ratio)

Расчет MFI 8

Это были шаги для расчета индикатора MFI вручную. К счастью, сейчас этого делать не нужно. Знание того, как рассчитывается индикатор, позволяет лучше понять концепцию. И теперь мы можем использовать готовый индикатор, встроенный в MetaTrader 5. Все, что нужно сделать, — это выбрать нужный индикатор из списка инструментов в платформе:

В MetaTrader 5 открываем меню "Вставка" --> "Индикаторы" --> "Индикаторы объема" --> Money Flow Index

Вставка MFI

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

Окно параметров MFI

1. Период расчета индикатора.

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

3. Цвет линии MFI.

4. Тип линии.

5. Толщина линии MFI.

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

 MFI на графике


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

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

  • Стратегия первая: MFI - зоны перекупленности и перепроданности

В этой стратегии будем определять зоны перекупленности и перепроданности на основе показателей индикатора. Когда MFI приближается к уровню 20, это зона перепроданности. Уровень 80 — зона перекупленности. Зоны перепроданности увеличивают потенциал роста, а зоны перепроданности, наоборот, увеличивают потенциал снижения.

Итак, схематично: 

MFI <= 20 --> Перепроданность

MFI >= 80 --> Перекупленность

  • Стратегия вторая: MFI – восходящий тренд – Buy

В соответствии с этой стратегией будем ждать, когда MFI достигнет или опустится ниже уровня 50 — в этот момент сработает сигнал на покупку. Далее достижение уровня 70 будет служить сигналом тейк-профита. Смысл этой стратегии в том, что при восходящем тренде MFI большую часть времени колеблется между уровнями 50 и 70.

Таким образом,

MFI <= 50 --> Сигнал на покупку

MFI >= 70 --> Сигнал тейк-профита

  • Стратегия третья: MFI – нисходящий тренд – Short

Эта стратегия противоположна предыдущей (для растущего тренда). Ждем, когда MFI достигнет уровня 50 или поднимется выше его — это будет сигналом на продажу. Сигнал для фиксирования прибыли сформируется, когда MFI опустится ниже уровня 30. Получается, что при нисходящем тренде показатели MFI колеблются между уровнями 50 и 30.

Таким образом,

MFI >=50 --> Сигнал на продажу

MFI <= 30 --> Тейк-профит

  • Стратегия четвертая: MFI - восходящий тренд или расхождение

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

Таким образом,

Текущий MFI > предыдущий MFI и текущий максимум > предыдущий максимум --> сильное движение вверх

Текущий MFI < предыдущий MFI и текущий максимум > предыдущий максимум --> медвежья дивергенция

  • Стратегия пятая: MFI - нисходящий тренд или расхождение

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

Проще говоря:

Текущий MFI < предыдущий MFI и текущий минимум < предыдущий минимум --> сильное движение вниз

Текущий MFI > предыдущий MFI и текущий минимум < предыдущий минимум --> бычье расхождение


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

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

Схема простой системы MFI

Теперь перейдем к нашим стратегиям:

  • Стратегия первая: MFI - зоны перекупленности и перепроданности

В соответствии с этой стратегией торговая система должна на каждом тике проверять значение MFI и сравнивать его с определенными уровнями (20 и 80). Затем она проверит соответствие условиям и вернет нужный результат. Если значение MFI меньше или равно уровню 20, возвращается сигнал перепроданности и текущее значение MFI в виде многострочного комментария на графике. Если MFI больше или равно уровню 80, система вернет сигнал перекупленности и текущее значение MFI — каждый показатель на отдельной строке. Если MFI выше 20 и ниже 80, возвращается только текущее значение MFI. Схема этой торговой системы выглядит так:

Схема стратегии по индикатору MFI - перекупленность и перепроданность

  • Стратегия вторая: MFI – восходящий тренд – Buy

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

 Схема стратегии MFI - Тренд вверх - Buy

  • Стратегия третья: MFI – нисходящий тренд – Short

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

Схема стратегии MFI - Тренд вниз - Sell

  • Стратегия четвертая: MFI - восходящий тренд или расхождение

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

Текущий MFI > предыдущий MFI и текущий максимум > предыдущий максимум --> сигнал сильного движения вверх

Текущий MFI < предыдущий MFI и текущий максимум > предыдущий максимум --> медвежья дивергенция

Схема разработки будет такой:

 Схема стратегии MFI - Тренд вверх или расхождение

 

  • Стратегия пятая: MFI - нисходящий тренд или расхождение

Эта стратегия противоположна предыдущей. Торговая система будет на каждом тике проверять четыре значения (текущий MFI, предыдущий MFI, текущий Low и предыдущий Low) и генерировать соответствующий сигнал.

Текущий MFI < предыдущий MFI и текущий минимум < предыдущий минимум --> сигнал сильного движения вниз

Текущий MFI > предыдущий MFI и текущий минимум < предыдущий минимум --> бычье расхождение

Схема разработки будет такой:

Схема стратегии MFI - Тренд вниз или расхождение


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

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

  • Создаем массив для значений MFI с помощью функции double, которая используется для значений с плавающей точкой.
double MFIArray[];
  • Сортируем созданный массив MFI в прошлое, начиная с текущих данных, для этого будем использовать функцию ArraySetAsSeries — она возвращает true в случае успеха или false в случае неудачи (bool) (параметры array[] и flag).
ArraySetAsSeries(MFIArray,true);
  • Определяем MFI с помощью функции iMFI — для этого предварительно создали целочисленную переменную MFIDef. Функция iMFI возвращает хэндл индикатора MFI, ее параметры символ, период, период средней и тип объема).
int MFIDef=iMFI(_Symbol,_Period,24,VOLUME_TICK);
  • Заполняем массив с помощью функции CopyBuffer данными от индикатора MFI.
CopyBuffer(MFIDef,0,0,3,MFIArray);
  • Вычисляем текущее значение MFI, используя функцию NormalizeDouble, которая возвращает значение типа double. Для этого создали double-переменную MFIValue.
double MFIValue=NormalizeDouble(MFIArray[0],5);
  • Выводим сгенерированный сигнал на график с помощью функции Comment:
Comment("MFI Value is: ",MFIValue);

Полный код этой системы будет таким:

//+------------------------------------------------------------------+
//|                                                   Simple MFI.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()
  {
//Создание массива для MFI
   double MFIArray[];

//сортировка массива по текущим данным
   ArraySetAsSeries(MFIArray,true);

//определение MFI
   int MFIDef=iMFI(_Symbol,_Period,24,VOLUME_TICK);

//заполнение массива
   CopyBuffer(MFIDef,0,0,3,MFIArray);

//расчет текущих значений MFI
   double MFIValue=NormalizeDouble(MFIArray[0],5);

//вывод комментария со значением MFI
   Comment("MFI Value is: ",MFIValue);
  }
//+------------------------------------------------------------------+

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

MFI в Навигаторе 1

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

Окно стратегии Simple MFI

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

Стратегия Simple MFI на графике

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

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

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

Стратегия Simple MFI - одинаковый сигналы

  • Стратегия первая: MFI - зоны перекупленности и перепроданности

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

//+------------------------------------------------------------------+
//|                                                  MFI - OB&OS.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()
  {
   //Создание массива для MFI
   double MFIArray[];
   
   //сортировка массива по текущим данным
   ArraySetAsSeries(MFIArray,true);
   
   //определение MFI
   int MFIDef=iMFI(_Symbol,_Period,24,VOLUME_TICK);
   
   //заполнение массива
   CopyBuffer(MFIDef,0,0,3,MFIArray);
   
   //расчет текущих значений MFI
   double MFIValue=NormalizeDouble(MFIArray[0],5);
   
   
   //Условия перепроданности и перекупленности
   //Перепроданность
   if(MFIValue<=20)
   {
   Comment("Oversold","\n","MFI value is : ",MFIValue);
   }
   
   //Перекупленность
   if(MFIValue>=80)
   {
   Comment("Overbought","\n","MFI value is : ",MFIValue);
   }
   
   //нет сигнала
   if(MFIValue>20 && MFIValue<80 )
   {
   Comment("MFI value is : ",MFIValue);
   }   
  }
//+------------------------------------------------------------------+

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

Добавились условия перепроданности и перекупленности:
   //Условия перепроданности и перекупленности
   //Перепроданность
   if(MFIValue<=20)
   {
   Comment("Oversold","\n","MFI value is : ",MFIValue);
   }
   
   //Перекупленность
   if(MFIValue>=80)
   {
   Comment("Overbought","\n","MFI value is : ",MFIValue);
   }
   
   //нет сигнала
   if(MFIValue>20 && MFIValue<80 )
   {
   Comment("MFI value is : ",MFIValue);
   } 

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

MFI в Навигаторе 2

Перетаскиваем нашу программу из Навигатора на график. При этом откроется вот такое окно:

 Окно стратегии MFI - OB_OS

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

 MFI - OB_OS на графике

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

Сигнал перепроданности:

Стратегия MFI - OB_OS - перепроданность

Сигнал перекупленности:

Стратегия MFI - OB_OS - перекупленность

Нет сигнала

Simple MFI - OB_OS - нет сигнала

  • Стратегия вторая: MFI – восходящий тренд – Buy

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

//+------------------------------------------------------------------+
//|                                          MFI - Uptrend - Buy.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()
  {
   //Создание массива для MFI
   double MFIArray[];
   
   //сортировка массива по текущим данным
   ArraySetAsSeries(MFIArray,true);
   
   //определение MFI
   int MFIDef=iMFI(_Symbol,_Period,24,VOLUME_TICK);
   
   //заполнение массива
   CopyBuffer(MFIDef,0,0,3,MFIArray);
   
   //расчет текущих значений MFI
   double MFIValue=NormalizeDouble(MFIArray[0],5);
   
   
   //Сигнал на покупку
   if(MFIValue<=50)
   {
   Comment("Buy signal");
   }
   
   //Тейк-профит
   if(MFIValue>=70)
   {
   Comment("Take profit");
   }
  }
//+------------------------------------------------------------------+

Отличия в коде

Условия сигналов

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

//Сигнал на покупку
   if(MFIValue<=50)
   {
   Comment("Buy signal");
   }

Сигнал тейк-профита:

//Тейк-профит
   if(MFIValue>=70)
     {
      Comment("Take profit");
     }

После компиляции сгенерированный файл появится в окне Навигатора:

MFI в Навигаторе 3

При выборе советника откроется такое окно:

Окно стратегии MFI - Uptrend - Buy

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

 Торговая система MFI - Uptrend - Buy на графике

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

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

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

Сигнал тейк-профита:

Стратегия MFI - Uptrend - сигнал тейк-профита

  • Стратегия третья: MFI – нисходящий тренд – Short

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

//+------------------------------------------------------------------+
//|                                      MFI - Downtrend - Short.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()
  {
//Создание массива для MFI
   double MFIArray[];

//сортировка массива по текущим данным
   ArraySetAsSeries(MFIArray,true);

//определение MFI
   int MFIDef=iMFI(_Symbol,_Period,24,VOLUME_TICK);

//заполнение массива
   CopyBuffer(MFIDef,0,0,3,MFIArray);

//расчет текущих значений MFI
   double MFIValue=NormalizeDouble(MFIArray[0],5);


//Сигнал на продажу
   if(MFIValue>=50)
     {
      Comment("Sell signal");
     }

//Тейк-профит
   if(MFIValue<=30)
     {
      Comment("Take profit");
     }
  }
//+------------------------------------------------------------------+

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

Условия сигналов

Сигнал для Sell:

//Сигнал на продажу
   if(MFIValue>=50)
     {
      Comment("Sell signal");
     }

Сигнал тейк-профита:

//Тейк-профит
   if(MFIValue<=30)
     {
      Comment("Take profit");
     }

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


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

 Окно стратегии MFI - Downtrend - Short

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

Стратегия MFI - Downtrend - Short на графике

На рисунке ниже показан пример сигналов, сгенерированных на основе стратегии MFI - Downtrend - Short.

Сигнал для Sell:

MFI - Downtrend - сигнал на продажу

Сигнал тейк-профита:

Стратегия MFI - Downtrend - сигнал тейк-профита

  • Стратегия четвертая: MFI - восходящий тренд или расхождение

Полный код четвертой стратегии (подтверждение тренда или расхождение) выглядит так:

//+------------------------------------------------------------------+
//|                                  MFI - Uptrend 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()
  {
//Создание массива для MFI и цен
   double MFIArray[];
   MqlRates PriceArray[];

//сортировка массивов по текущим данным
   ArraySetAsSeries(MFIArray,true);
   int Data=CopyRates(_Symbol,_Period,0,3,PriceArray);

//определение MFI
   int MFIDef=iMFI(_Symbol,_Period,24,VOLUME_TICK);

//заполнение массива MFI
   CopyBuffer(MFIDef,0,0,3,MFIArray);

//расчет текущего и предыдущего значения MFI
   double MFICurrentValue=NormalizeDouble(MFIArray[0],5);
   double MFIPrevValue=NormalizeDouble(MFIArray[1],5);

//рассчитываем текущий и предыдущий максимумы
   double CurrentHighValue=NormalizeDouble(PriceArray[2].high,5);
   double PrevHighValue=NormalizeDouble(PriceArray[1].high,5);

//условия сильного движения или дивергенции
//сильное движение вверх
   if(MFICurrentValue>MFIPrevValue&&CurrentHighValue>PrevHighValue)
     {
      Comment("Strong up move");
     }

//медвежье расхождение
   if(MFICurrentValue<MFIPrevValue&&CurrentHighValue>PrevHighValue)
     {
      Comment("Bearish divergence");
     }
  }
//+------------------------------------------------------------------+

Что нового в этом коде:

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

   double MFIArray[];
   MqlRates PriceArray[];

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

Для массива MFI используем, как и прежде, функцию ArraySetAsSeries.

Для цен используется функция CopyRates для получения исторических данных MqlRates. Ее параметры: имя символа, таймфрейм, время начала, время остановки и массив цен.

   ArraySetAsSeries(MFIArray,true);
   int Data=CopyRates(_Symbol,_Period,0,3,PriceArray);

Рассчитываем текущее и предыдущее значения MFI

   double MFICurrentValue=NormalizeDouble(MFIArray[0],5);
   double MFIPrevValue=NormalizeDouble(MFIArray[1],5);

Рассчитываем текущий и предыдущий максимумы

   double CurrentHighValue=NormalizeDouble(PriceArray[2].high,5);
   double PrevHighValue=NormalizeDouble(PriceArray[1].high,5);

Условия стратегии "MFI - подтверждение тренда вверх или расхождение":

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

   if(MFICurrentValue>MFIPrevValue&&CurrentHighValue>PrevHighValue)
     {
      Comment("Strong up move");
     }

Дивергенции:

   if(MFICurrentValue<MFIPrevValue&&CurrentHighValue>PrevHighValue)
     {
      Comment("Bearish divergence");
     }

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

 MFI в Навигаторе 5

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

 Окно стратегии MFI - Uptrend or divergence

После нажатия "ОК" программа появится на графике:

Советник MFI - Uptrend or divergence на графике

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

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

Окно стратегии MFI - Uptrend or divergence - сильный тренд, текущие значения

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

Окно стратегии MFI - Uptrend or divergence - сильный тренд, предыдущие значения

Сигнал расхождения с окном данных и текущими данными:

Окно стратегии MFI - Uptrend or divergence - Медвежье расхождение, текущие значения

Сигнал расхождения с окном данных и предыдущими данными:


  • Стратегия пятая: MFI - нисходящий тренд или расхождение

А ниже код этой стратегии.

//+------------------------------------------------------------------+
//|                                MFI - Downtrend 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()
  {
//Создание массива для MFI и цен
   double MFIArray[];
   MqlRates PriceArray[];

//сортировка массивов по текущим данным
   ArraySetAsSeries(MFIArray,true);
   int Data=CopyRates(_Symbol,_Period,0,3,PriceArray);

//определение MFI
   int MFIDef=iMFI(_Symbol,_Period,24,VOLUME_TICK);

//заполнение массива
   CopyBuffer(MFIDef,0,0,3,MFIArray);

//расчет текущего и предыдущего значения MFI
   double MFICurrentValue=NormalizeDouble(MFIArray[0],5);
   double MFIPrevValue=NormalizeDouble(MFIArray[1],5);

//рассчитываем текущий и предыдущий максимумы
   double CurrentLowValue=NormalizeDouble(PriceArray[2].low,5);
   double PrevLowValue=NormalizeDouble(PriceArray[1].low,5);

//условия сильного движения или дивергенции
//Сильное движение вниз
   if(MFICurrentValue<MFIPrevValue&&CurrentLowValue<PrevLowValue)
     {
      Comment("Strong down move");
     }

//бычье расхождение
   if(MFICurrentValue>MFIPrevValue&&CurrentLowValue<PrevLowValue)
     {
      Comment("Bullish divergence");
     }
  }
//+------------------------------------------------------------------+

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

Условия генерируемых сигналов по данной стратегии.

Сигнал сильного движения вниз:

   if(MFICurrentValue<MFIPrevValue&&CurrentLowValue<PrevLowValue)
     {
      Comment("Strong down move");
     }

Бычье расхождение:

   if(MFICurrentValue>MFIPrevValue&&CurrentLowValue<PrevLowValue)
     {
      Comment("Bullish divergence");
     }

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

MFI в Навигаторе 6

После запуска появится такое окно:

Окно стратегии MFI - Downtrend or divergence

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

Стратегия MFI - Downtrend or divergence на графике

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

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

Окно стратегии MFI - Downtrend or divergence - сильный тренд, текущие значения

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

Окно стратегии MFI - Downtrend or divergence - сильный тренд, предыдущие значения

Сигнал бычьего расхождения с окном данных и текущими данными:

Окно стратегии MFI - Downtrend or divergence - Бычье расхождение, текущие значения

Сигнал бычьего расхождения с окном данных и предыдущими данными:

Окно стратегии MFI - Downtrend or divergence - Бычье расхождение, предыдущие значения

Заключение

в этой статье мы затронули тему индикатора индекса денежного потока (MFI), рассмотрели новую информацию, которая может улучшить торговые результаты. Мы узнали, что такое объем, почему он очень важен в торговле, что такое индикатор MFI и что он измеряет. Также мы узнали, как можно рассчитать его вручную и как использовать уже готовый встроенный индикатор MFI в MetaTrader 5. Изучив основы индикатора MFI и поняв основную его концепцию, стоящую за ним, мы познакомились с несколькими простыми стратегиями: это стратегии перекупленности и перепроданности, стратегия восходящего тренда, которую можно использовать для нахождения сигналов на покупку и фиксирования прибыли во время восходящего тренда, аналогичную стратегию для генерации сигналов на продажу и фиксирование прибыли во время нисходящего тренда на основе индикатора MFI. Также рассмотрели стратегии, которые могут подтвердить восходящий или нисходящий тренд или показывать дивергенцию — медвежье или бычье расхождение.

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

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

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

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

Разработка торговой системы на основе индикатора объемов Volumes Разработка торговой системы на основе индикатора объемов Volumes
Представляю вашему вниманию новую статью из серии, в которой мы учимся создавать торговые системы на основе популярных технических индикаторов. Данная статья будет посвящена индикатору Volumes. Объем как понятие является важным факторов в торговле на финансовых рынках, и поэтому обязательно надо его учитывать. В этой статье узнаем, как разработать торговую систему на основе показателей от индикатора объемов Volumes.
DoEasy. Элементы управления (Часть 13): Оптимизация взаимодействия WinForms-объектов с мышкой, начало разработки WinForms-объекта TabControl DoEasy. Элементы управления (Часть 13): Оптимизация взаимодействия WinForms-объектов с мышкой, начало разработки WinForms-объекта TabControl
В статье исправим и оптимизируем обработку внешнего вида WinForms-объектов после увода курсора мышки с объекта и начнём разработку WinForms-объекта TabControl.
Нейросети — это просто (Часть 23): Создаём инструмент для Transfer Learning Нейросети — это просто (Часть 23): Создаём инструмент для Transfer Learning
В данной серии статей мы уже не один раз упоминали о Transfer Learning. Но дальше упоминаний пока дело не шло. Я предлагаю заполнить этот пробел. И посмотреть поближе на Transfer Learning.
Индикатор CCI. Три шага трансформации Индикатор CCI. Три шага трансформации
В этой статье мы попробуем внести дополнительные изменения в CCI. Эти изменения коснутся самой логики работы этого индикатора. Вплоть до того, что мы сможем увидеть этот индикатор в главном окне графика.