Разработка торговой системы на основе индикатора MFI
Введение
Эта статья является продолжением серии, в которой мы изучаем, как создавать простые торговые системы на основе самых популярных технических индикаторов. Более обширная цель — научиться программировать на MQL5. В этой новой статье мы рассмотрим новый технический индикатор — Индекс денежного потока (MFI). Мы подробно изучим этот индикатор и узнаем, как написать простые торговые системы на основе его концепции. Как и в предыдущих статьях, работу над индикатором разобьем на несколько тем:
- Определение Индекса денежного потока MFI
- Стратегия по индикатору MFI
- Схема стратегии по индикатору MFI
- Торговая система по индикатору MFI
- Заключение
Если вы читали другие статьи из этой серии, то наверняка заметили, что информация здесь организована тем же способом. По уже знакомым темам рассмотрим новую информацию, а также разберем новые коды на основе стратегий по индикатору. Основная цель — изучить новые концепции торговли и научиться писать код на 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
После расчета получаем такие значения типичной цены:
Посчитаем исходный денежный поток = объем * 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 ratio)
Это были шаги для расчета индикатора MFI вручную. К счастью, сейчас этого делать не нужно. Знание того, как рассчитывается индикатор, позволяет лучше понять концепцию. И теперь мы можем использовать готовый индикатор, встроенный в MetaTrader 5. Все, что нужно сделать, — это выбрать нужный индикатор из списка инструментов в платформе:
В MetaTrader 5 открываем меню "Вставка" --> "Индикаторы" --> "Индикаторы объема" --> Money Flow Index
После того, как вы выбрали Money Flow Index, откроется окно параметров:
1. Период расчета индикатора.
2. Тип объема (тиковый или реальный).
3. Цвет линии MFI.
4. Тип линии.
5. Толщина линии MFI.
Нажимаем OK, и индикатор 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 и сравнивать его с определенными уровнями (20 и 80). Затем она проверит соответствие условиям и вернет нужный результат. Если значение MFI меньше или равно уровню 20, возвращается сигнал перепроданности и текущее значение MFI в виде многострочного комментария на графике. Если MFI больше или равно уровню 80, система вернет сигнал перекупленности и текущее значение MFI — каждый показатель на отдельной строке. Если MFI выше 20 и ниже 80, возвращается только текущее значение MFI. Схема этой торговой системы выглядит так:
- Стратегия вторая: MFI – восходящий тренд – Buy
В соответствии с условиями этой стратегией торговая система помимо значения MFI должна проверять уровни 50 и 70 на каждом тике. Если значение MFI ниже или на уровне 50, нужно вернуть сигнал на покупку. Если MFI на уровне 70 или выше, система будет возвращать сигнал тейк-профита. Вот как выглядит общая схема:
- Стратегия третья: MFI – нисходящий тренд – Short
В рамках этой стратегии торговая система будет генерировать сигналы на основе сравнения значения MFI с уровнями 50 и 30. Если значение MFI на уровне 50 или выше, возвращаем сигнал на продажу, а если MFI меньше или равно 30, нужно вернуть сигнал для фиксации прибыли. Схема разработки будет такой:
- Стратегия четвертая: MFI - восходящий тренд или расхождение
Торговая система на основе этой стратегии будет на каждом тике проверять четыре значения (текущий MFI, предыдущий MFI, текущий High и предыдущий High) и генерировать соответствующий сигнал.
Текущий MFI > предыдущий MFI и текущий максимум > предыдущий максимум --> сигнал сильного движения вверх
Текущий MFI < предыдущий MFI и текущий максимум > предыдущий максимум --> медвежья дивергенция
Схема разработки будет такой:
- Стратегия пятая: MFI - нисходящий тренд или расхождение
Эта стратегия противоположна предыдущей. Торговая система будет на каждом тике проверять четыре значения (текущий MFI, предыдущий MFI, текущий Low и предыдущий Low) и генерировать соответствующий сигнал.
Текущий 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:
Запускаем двойным кликом на файле или перетаскиваем на график, после чего появится следующее окно:
Нажимаем OK, и советник запустится на графике:
Примеры тестирования сигналов, сгенерированных на основе этой стратегии:
Если хотите убедиться, что советник будет генерировать точно такое же значение, что и исходный индикатор 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:
Перетаскиваем нашу программу из Навигатора на график. При этом откроется вот такое окно:
Нажимаем OK, и советник запустится на графике:
Примеры сигналов, сгенерированных при тестировании этой стратегии.
Сигнал перепроданности:
Сигнал перекупленности:
Нет сигнала
- Стратегия вторая: 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"); }
После компиляции сгенерированный файл появится в окне Навигатора:
При выборе советника откроется такое окно:
Нажимаем OK, и советник запустится на графике:
Примеры сигналов, сгенерированных на основе этой стратегии.
Сигнал на покупку:
Сигнал тейк-профита:
- Стратегия третья: 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"); }
После компиляции можем запустить, дважды щелкнув на программу в Навигаторе:
После этого откроется окно параметров советника:
Нажимаем OK, и советник запустится на графике:
На рисунке ниже показан пример сигналов, сгенерированных на основе стратегии MFI - Downtrend - Short.
Сигнал для Sell:
Сигнал тейк-профита:
- Стратегия четвертая: 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 - нисходящий тренд или расхождение
А ниже код этой стратегии.
//+------------------------------------------------------------------+ //| 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"); }
После компиляции программы она появится в окне Навигатора:
После запуска появится такое окно:
Нажимаем OK, и советник запустится на графике:
Ниже приведен пример сгенерированных сигналов, который были получены при тестировании советника.
Сильный сигнал вниз, окно данных с текущими значениями:
Сильный сигнал вниз, окно данных с предыдущими значениями:
Сигнал бычьего расхождения с окном данных и текущими данными:
Сигнал бычьего расхождения с окном данных и предыдущими данными:
Заключение
в этой статье мы затронули тему индикатора индекса денежного потока (MFI), рассмотрели новую информацию, которая может улучшить торговые результаты. Мы узнали, что такое объем, почему он очень важен в торговле, что такое индикатор MFI и что он измеряет. Также мы узнали, как можно рассчитать его вручную и как использовать уже готовый встроенный индикатор MFI в MetaTrader 5. Изучив основы индикатора MFI и поняв основную его концепцию, стоящую за ним, мы познакомились с несколькими простыми стратегиями: это стратегии перекупленности и перепроданности, стратегия восходящего тренда, которую можно использовать для нахождения сигналов на покупку и фиксирования прибыли во время восходящего тренда, аналогичную стратегию для генерации сигналов на продажу и фиксирование прибыли во время нисходящего тренда на основе индикатора MFI. Также рассмотрели стратегии, которые могут подтвердить восходящий или нисходящий тренд или показывать дивергенцию — медвежье или бычье расхождение.
Кроме того, мы разработали схемы работы всех этих стратегий, которые служат отличной основой для создания торговой системы, которая будет автоматически генерировать сигналы в MetaTrader 5. И затем для каждой стратегии мы создали советник на языке MQL5, который можно запускать в торговой платформе MetaTrader 5 для автоматической и точной генерации сигналов в соответствии с заданными условиями и правилами каждой стратегии.
Очень надеюсь, что вы самим попробуете написать код и применять на практике то, что узнали из этой статьи. Также надеюсь, что статья была полезной для вас, познакомила вас с новыми работающими стратегиями, помогла найти новые идеи, связанные или нет с темой статьи. Еще раз повторюсь: обязательно тестируйте любую стратегию, прежде чем использовать ее на реальном счете, потому что основная цель этой статьи — предоставить информацию для начинающих, чтобы научить самостоятельно программировать простые торговые стратегии. Поэтому рассмотренные стратегии могут нуждаться в оптимизации или настройке. Также может оказаться, что лучше объединить их с каким-нибудь другим техническим инструментом. Вообще, комбинация различных технических инструментов — полезный подход, позволяющий рассмотреть ситуацию с разных точек зрения и иметь возможность принять подходящее решение. Также на основе комбинации этих можно создать торговую систему, которая, как и любая другая, простая или сложная, позволяет преодолеть проблему субъективности, которая может быть препятствием в достижении ваших торговых целей. Программирование — это удивительный инструмент, который помогает выполнять действия проще и точнее. Так мы избавляемся от необходимости повторять одни и те же задачи.
Если вам понравилась эта статья, если вы считаете ее полезной, почитайте мои предыдущие статьи из этой же серии, чтобы узнать, как разработать торговую систему на основе популярных технических индикаторов. Надеюсь, статья будет полезна в торговле.
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/en/articles/11037
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования