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

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

MetaTrader 5Трейдинг | 11 июля 2022, 08:45
1 256 1
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

Введение

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

Работу над индикатором снова разобьем на несколько тем:

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

В теме определения ADX мы подробно обсудим, что представляет из себя индикатор ADX и что он измеряет, а также как его можно рассчитать вручную. Все это нужно, чтобы понять суть индикатора и научиться использовать его с прибылью. Затем перейдем к изучению простой стратегии, которую можно использовать в торговле. Это будем делать в разделе "Стратегия по индикатору ADX". Далее, в теме "Схема торговой стратегии по ADX" мы разработаем план, который поможет запрограммировать рассмотренные стратегии виде кода для торговой системы. И, наконец, изучим код торговой системы, построенной на основе этих простых стратегий — это будет в разделе "Торговая система по ADX".

Как и в предыдущих статьях мы будем работать с торговой платформой MetaTrader 5 и с редактором кода на MQL5 MetaQuotes Language Editor, встроенным в саму платформу MetaTrader 5. Платформу можно скачать по ссылке: https://www.metatrader5.com/ru/download

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

MetaTrader 5 

Я рекомендую самостоятельно повторять все, о чем говорится в этой статье. Так вы быстрее разовьете ваши навыки и лучше поймете тему. Практика — важный ключ к любому развитию. Лучше пробовать применять каждую концепцию и самостоятельно тестировать ее, ведь в этой статье мы будем учиться проектировать торговую систему с помощью технического инструмента, и делать это будем с помощью MQL5 — на нем мы будем писать коды для создания торгового советника. Также важно иметь демо-счет для тестирования приложения. Если у вас еще нет такого счета, откройте его в прямо платформе MetaTrader 5: выберите меню "Файл" в терминале MetaTrader 5 --> Открыть счет --> далее можете ввести название своего брокера, чтобы открыть демо-счет через на его сервере, или выбрать MetaQuotes --> выберите Открыть демо-счет для торговли виртуальными деньгами без риска --> введите свои данные и определите необходимые настройки. Далее нужно согласиться с условиями. После этого для вас будет создан счет, и вы получите его данные.

Теперь вы можете использовать этот счет для виртуальной торговли. Чтобы войти в аккаунт, выберите меню "Файл" в терминале -> "Войти в торговый счет" -> введите данные своего демо-счета и нажмите ОК.

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

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


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

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

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

  • Увеличение или снижение активности (положительное или отрицательное направленное движение).
  • Отсутствие увеличения и снижения активности.
  • Увеличение и снижение активности.

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

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

+DM

И наоборот, если есть отрицательное направленное движение, это означает, что минимум периода оказался ниже минимума предыдущего периода — это ситуация -DM.

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

-DM

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

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

Нет на графике +DM-DM

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

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

 +DM-DM

Теперь давайте посмотрим, как же рассчитывается индикатор ADX. Шаги расчета приведены ниже. Обратите внимание, что все значения должны быть абсолютными:

1. Расчет +DM и -DM:

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

  • +DM — положительное направленное движение, если есть движение вверх. 
Рассчитывается так: +DM = текущий максимум - предыдущий максимум
  • -DM — отрицательное направленное движение, означает наличие движения вниз. 
Рассчитывается так: -DM = текущий минимум - предыдущий минимум

Итак, проверяем каждый расчетный период и определяем, образовались ли у нас +DM, -DM или что-то еще.

  • Если есть +DM, то:
+DM = n
-DM = 0
  • Если -DM, то:

-DM = n

+DM = 0

В некоторых случаях можно встретить другие сценарии, в которых у нас не получились ни +DM, ни -DM или наоборот, образовались и +DM и -DM. В таких случаях получается следующее:

  • Если нет ни +DM, ни -DM, то:

+DM = 0

-DM = 0

Нет DM

  • Если же есть оба значения (+DM и -DM), то будем сравнивать +DM и -DM и учитывать наибольшее значение из них. В противном случае, если значения равны друг другу, игнорируем их:
+DM>-DM = используем только +DM

 +DM больше

+DM<-DM = используем только -DM

-DM больше

+DM=-DM = игнорируем оба значения

+DM равен -DM

2. Считаем истинный диапазон (True Range, TR):

На этом этапе после расчета DM мы рассчитаем TR. Это наибольшее значение из следующих:

  • Разница текущего High и текущего Low;
  • Разница текущего High и предыдущего Close;
  • Разница текущего Low и предыдущего Close;
3. Считаем сумму рассчитанных 14 периодов (+DM, -DM, и TR)

После расчета для первых 14 расчетных периодов (+DM, -DM и TR) мы будем использовать следующие формулы для расчета следующих значений после 14:

+DM 15 = (предыдущее +DM - (предыдущее +DM/14)) + текущее +DM

-DM 15 = (предыдущее -DM - (предыдущее -DM/14)) + текущее -DM

TR 15 = (предыдущее TR - (предыдущее TR/14)) + текущее TR

4. Рассчитываем 14-периодные +DI и-DI
+DI 14 = 100*(+DM14/TR14)
-DI 14 = 100*(-DM14/TR14)

5. Находим разность +DI и -DI (абсолютные значения)

DI 14 Diff = (+DI 14) - (-DI 14)

6. Находим сумму +DI и -DI

DI 14 Sum = (+DI 14) + (-DI 14)

7. Считаем DX

DX = 100*((разница между +DI и -DI)/(сумма +DI и -DI))
8. Рассчитываем ADX
ADX = среднее DX за 14 периодов

Это были шаги расчета индикатора ADX. Теперь давайте посмотрим, как рассчитать индикатор ADX, на примере конкретного набора данных. Допустим, у нас есть такие данные:

День Максимум Минимум Закрытие
1 110 90 100
2 140 120 130
3 160 120 140
4 150 110 130
5 140 100 130
6 150 130 140
7 170 150 160
8 180 160 170
9 170 150 155
10 170 130 140
11 180 155 160
12 190 175 180
13 220 190 190
14 230 200 200
15 215 205 210
16 200 190 200
17 195 180 190
18 195 180 185
19 210 185 195
20 220 190 200
21 233 195 208
22 246 200 216
23 258 205 223
24 271 210 231
25 283 215 238
26 296 220 246
27 308 225 253
28 321 230 261
29 333 235 268
30 346 240 276

Итак, рассчитаем ADX по этим данным:

1. Расчет +DM и -DM:

+DM = текущий максимум - предыдущий максимум

-DM = текущий минимум - предыдущий минимум

Пример - DM

2. Рассчитываем TR:

Это будет наибольшее значение из следующих:

  • Разница текущего High и текущего Low;
  • Разница текущего High и предыдущего Close;
  • Разница текущего Low и предыдущего Close;

В таблице ниже показаны TR для каждого дня:

Пример - TR

3. Считаем сумму рассчитанных 14 периодов (+DM, -DM, и TR)

+DM 14 = Сумма +DM 1(день 2: день 15)

-DM 14 = Сумма -DM 1(день 2: день 15)

TR 14 = Сума TR (день 2: день 15)

Пример - 14 DM-TR

4. Рассчитываем 14-периодные +DI и-DI. Первый расчет будет с 15 дня, так как нам нужны данные за предыдущие 14 дней для расчета DI:

+DI14 = 100*(+DM14/TR14)

-DI14 = 100*(-DM14/TR14)


5. Находим разность +DI и -DI (абсолютные значения)

DI 14 Diff = (+DI 14) - (-DI 14)

6. Находим сумму +DI и -DI

DI 14 Sum = (+DI 14) + (-DI 14)

DI14 - разница и сумма

7. Расчет DX:

DX = 100*((разница между +DI и -DI)/(сумма +DI и -DI))


DX

8. Рассчитываем ADX. Первое значение получим на 28 день, так как нужно еще 14 дней для расчета ADX:

ADX = среднее значение DX за 14 периодов --> среднее значение DI (день 15: день 28)


ADX

Мы рассчитали индикатор ADX вручную. Но на самом деле делать этого не придется, поскольку индикатор встроен в MetaTrader 5. А все эти шаги мы изучили, только чтобы лучше понять, как работает индикатор ADX. Фактически, чтобы увидеть значения индикатора на графике, нужно просто выбрать его из списка доступных индикаторов в торговом терминале. Выбираем меню "Вставка" --> Индикаторы --> Трендовые --> Average Directional Movement Index. Вот как это выглядит в терминале:

Вставляем ADX на график

После выбора Average Directional Movement Index появится следующее окно:

Окно ADX

В этом окне представлены параметры индикатора ADX. Вот что они означают:
  1. период расчета индикатора
  2. цвет линии ADX
  3. тип линии ADX
  4. толщина линии ADX
  5. цвет линии +DI
  6. тип линии +DI
  7. толщина линии +DI
  8. цвет линии -DI
  9. тип линии -DI
  10. толщина линии -DI

Настраиваем желаемые параметры индикатора, нажимаем OK, и индикатор запустится на графике. Выглядеть это будет примерно как показано ниже:

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

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

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

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

Определение тренда:

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

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

Формирование этого рыночного направления показано на следующей картинке:

Формирование восходящего тренда

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

Пример восходящего тренда

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

Формирование этого рыночного направления показано на следующей картинке:

Формирование нисходящего тренда

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

Пример нисходящего тренда

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

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

Боковое движение 1

Боковое движение 2

Боковое движение 3

Боковое движение 4

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

Пример бокового движения

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

  • Стратегия первая: простая система ADX - движение ADX:

Стратегия основана на движении кривой ADX:

текущее значение ADX > предыдущее значение ADX = ADX растет

текущее значение ADX < предыдущее значение ADX = ADX падает

  • Стратегия вторая: простая система ADX — восходящий тренд:

Согласно этой стратегии, во время восходящего тренда

Значение ADX > 25 и текущее значение ADX > предыдущее значение ADX --> если значение +DI > значение -DI = сигнал на покупку

  • Стратегия третья: простая система ADX — нисходящий тренд:

Согласно этой стратегии, во время нисходящего тренда

Значение ADX > 25 и текущее значение ADX > предыдущего значения ADX --> когда значение +DI < значение -DI = сигнал на продажу


Схема торговой системы по ADX

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

  • Стратегия первая: простая система ADX - движение ADX:

Согласно этой стратегии, программа должна на каждом тике проверять текущее и предыдущее значение ADX. Она должна определять, больше ли текущее значение ADX, чем предыдущее, или нет. Если текущее значение ADX больше предыдущего, программа должна вывести на график комментарий "ADX is rising" (ADX растет), следующей строкой — "ADX Value is (n)" (Значение ADX равно (n)), и еще на одной строке — "ADX Value last is (n)" (Последнее значение ADX равно (n)). Если текущее значение ADX меньше предыдущего, то система должна выводить на график комментарий "ADX is falling" (ADX падает). Если текущий ADX равен предыдущему, система не должна ничего делать.

На следующем рисунке показана схема этой стратегии:

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

  • Стратегия вторая: простая система ADX — восходящий тренд:

Согласно этой стратегии, система должна на каждом тике проверять текущее и предыдущее значение ADX, а также значения +DI и -DI. Далее система должна определить, значение ADX выше 25 и предыдущего значения или нет. Если оно не больше этих двух значений, система не должна ничего делать. Если больше обоих значений, система должна проверить значения +DI и -DI: +DI больше -DI или нет. Если +DI больше -DI, система должна вывести на график комментарий с сигналом на покупку, + "ADX Value is (n)" (значение ADX), ADX Value last is (n) (последнее значение ADX), +DI Value is (n) (значение +DI) и -DI Value is (n) (значение -DI). Если же +DI не больше -DI, система не будет делать ничего.

На следующем рисунке показан план этой стратегии:

ADX - Схема сигнала на покупку

  • Стратегия третья: простая система ADX — нисходящий тренд:

Согласно этой стратегии, система должна на каждом тике проверять текущее и предыдущее значение ADX, а также значения +DI и -DI. Далее система должна определить, значение ADX меньше 25 и предыдущего значения или нет. Если оно не меньше этих двух значений, система не должна ничего делать. Если меньше обоих значений, система должна проверить значения +DI и -DI: +DI меньше -DI или нет. Если +DI меньше -DI, система должна вывести на график комментарий с сигналом на продажу, + "ADX Value is (n)" (значение ADX), ADX Value last is (n) (последнее значение ADX), +DI Value is (n) (значение +DI) и -DI Value is (n) (значение -DI). Если же +DI не меньше -DI, система не будет делать ничего.

На следующем рисунке показан план этой стратегии:

ADX - Sell signal blueprint

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

В этой интересной части мы узнаем, как создать торговую систему на основе рассмотренных простых стратегий, чтобы использовать их в торговом терминале MetaTrader 5. Для написания кода торговой системы будем использовать встроенный редактор языка MetaQuotes Language Editor (MQL5). Чтобы открыть редактор языка, при открытом торговом терминале MetaTrader 5 нажмите F4, или выберите "Инструменты" в MetaTrader 5 -->, затем выберите "Редактор языка MetaQuotes".

Ниже показано, как это сделать.

MetaEditor способ 1

Также можно нажать на кнопку IDE в панели инструментов:

MetaEditor способ 2

После этого откроется следующее окно редактора:

Окно редактора MetaEditor

Чтобы создать новый файл, в котором будем писать код торговой системы, нажмите New:

Окно редактора MetaEditor 2

После этого откроется окно редактора:

MetaEditor - новый файл

Варианты создания типов файлов:

  1. Торговый советник — это программа, работающая в терминале, которая позволяет автоматизировать анализ котировок и торговлю в соответствии с заданными параметрами.
  2. Пользовательский индикатор — программа, позволяющая графически отобразить некие рассчитанные числовые зависимости.
  3. Скрипт — программа, предназначенная для одноразового выполнения каких-либо действий.

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

Сначала создадим программу, которая будет отображать на графике комментарий с текущим значением ADX. Рассмотрим по шагам, как это сделать:

  • Создаем массив цен, будем использовать double-функцию, которая представляет значения с дробной частью:
double PriceArray[];
  • Отсортируем созданный массив цен начиная с текущих данных, для этого будем использовать функцию ArraySetAsSeries — она возвращает true в случае успеха или false в случае неудачи (bool). Обязательные параметры:
array[] по ссылке и флаг

ArraySetAsSeries(PriceArray,true);

  • Для определения индикатора ADX будем использовать функцию iADX — она возвращает дескриптор технического индикатора ADX, и его параметры:
символ в виде строки, таймфрейм и период расчета ADX:
  • _Symbol — текущий символ
  • _Period — текущий таймфрейм
  • 14 — период расчета
int ADXDef = iADX(_Symbol,_Period,14);
  • Заполняем данные по созданному индикатору ADX и воспользуемся функцией CopyBuffer, которая возвращает количество скопированных данных или -1 в случае ошибки. Параметры такие:
дескриптор индикатора, buffer_num (номер буфера индикатора), start_time (дата и время начала), stop_time (дата и время окончания) и buffer[] (целевой массив).
CopyBuffer(ADXDef,0,0,3,PriceArray);
  • Получаем значение ADX после создания переменной для ADXValue с помощью double-функции, затем используем функцию NormalizeDouble — она возвращает значение типа double с заданной точностью, ее параметры: 
значение в виде double (нормализованное число) и количество знаков после десятичной точки
double ADXValue=NormalizeDouble(PriceArray[0],2);
  • Чтобы отобразить комментарий с текущим значением ADX будем использовать функцию comment. Параметры функции будут такими:
Вводим переменные, представляющие значения, разделяя их запятыми. Чтобы информация отображалась на новой строке, используем символ переноса строки "\n" 
Comment("ADX Value is ", ADXValue);

Полны код программы, выводящей значение ADX на графике, будет таким:

//+------------------------------------------------------------------+
//|                                            Simple ADX System.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
void OnTick()
  {
//создание массива цен
   double PriceArray[];

//сортировка ценового массива от текущих данных
   ArraySetAsSeries(PriceArray,true);

//определение ADX
   int ADXDef = iADX(_Symbol,_Period,14);

//Заполняем данных в соответствии с созданным ADX
   CopyBuffer(ADXDef,0,0,3,PriceArray);

//Получаем значения текущих данных
   double ADXValue=NormalizeDouble(PriceArray[0],2);

//Выводим комментарий со значением ADX
   Comment("ADX Value is ", ADXValue);
  }
//+------------------------------------------------------------------+

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

Навигатор

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

Окно простого ADX

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

Simple ADX на графике

Результат работы индикатора и отображение комментариев на графике показаны на следующем скриншоте:

Простой ADX

Мы создали программу, которая отображает значение текущего значения ADX. Дальше будем создавать программу, для которой мы ранее разработали схему — она будет отображать все значения индикатора ADX (значение +DI и -DI). Посмотрим, как написать такой код:

  • Создадим массива цен для каждого значения (значение ADX, +DI и -DI), а также создадим переменные для них с помощью функции double:
    • ADXArray — значения ADX
    • PDIArray — значения +DI индикатора
    • NDIArray — значения -DI индикатора
double ADXArray[];
double PDIArray[];
double NDIArray[];
  • Сортируем каждый массив цен начиная с текущих данных. Для этого используем функцию ArraySetAsSeries:
ArraySetAsSeries(ADXArray,true);
ArraySetAsSeries(PDIArray,true);
ArraySetAsSeries(NDIArray,true);

  • Определяем индикатор ADX с помощью функции iADX:
int ADXDef = iADX(_Symbol,_Period,14);
  • Заполняем данные по нашему индикатору ADX с помощью функции CopyBuffer:
CopyBuffer(ADXDef,0,0,3,ADXArray);
CopyBuffer(ADXDef,1,0,3,PDIArray);
CopyBuffer(ADXDef,2,0,3,NDIArray);
  • Получаем значения текущих данных после создания переменных для каждого значения с помощью функции double. Для этого будем использовать функцию NormalizeDouble:
double ADXValue=NormalizeDouble(ADXArray[0],2);
double PDIValue=NormalizeDouble(PDIArray[0],2);
double NDIValue=NormalizeDouble(NDIArray[0],2);
  • Добавляем вывод комментариев со всеми значениями индикатора на графике с помощью функции comment:
Comment("ADX Value is ", ADXValue,"\n""+DI Value is ", 
PDIValue,"\n""-DI Value is ", NDIValue);

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

//+------------------------------------------------------------------+
//|                                  Simple ADX System - 3 lines.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
void OnTick()
  {
   //создание массива цен
   double ADXArray[];
   double PDIArray[];
   double NDIArray[];
   
   //сортировка ценового массива от текущих данных
   ArraySetAsSeries(ADXArray,true);
   ArraySetAsSeries(PDIArray,true);
   ArraySetAsSeries(NDIArray,true);

   //определение ADX
   int ADXDef = iADX(_Symbol,_Period,14);
   
   
   //Заполняем данных в соответствии с созданным ADX
   CopyBuffer(ADXDef,0,0,3,ADXArray);
   CopyBuffer(ADXDef,1,0,3,PDIArray);
   CopyBuffer(ADXDef,2,0,3,NDIArray);
   
   //Получаем значения текущих данных
   double ADXValue=NormalizeDouble(ADXArray[0],2);
   double PDIValue=NormalizeDouble(PDIArray[0],2);
   double NDIValue=NormalizeDouble(NDIArray[0],2);
   
   //Выводим комментарий со значением ADX
   Comment("ADX Value is ", ADXValue,"\n""+DI Value is ", 
   PDIValue,"\n""-DI Value is ", NDIValue);
  }
//+------------------------------------------------------------------+

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

 Навигатор 2

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

Simple ADX - окно с тремя линиями комментариев

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

Simple ADX - три линии нар графике

Затем созданный советник отобразится на графике:

Simple ADX - 3 lines

Теперь перейдем к созданию системы по рассмотренным ранее стратегиям (ADX movement, Uptrend и Downtrend).

  • Стратегия первая: простая система ADX - движение ADX:

Текущее значение ADX > Предыдущее значение ADX = ADX растет

Текущее значение ADX < Предыдущее значение ADX = ADX падает

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

  • Создание ценового массива для значений ADX (текущее, предыдущее):
    • ADXArray0 — текущее значение ADX
    • ADXArray1 — предыдущее значение ADX
double ADXArray0[];
double ADXArray1[];

  • Сортировка ценового массива от текущих данных:
ArraySetAsSeries(ADXArray0,true);
ArraySetAsSeries(ADXArray1,true);

  • Определение ADX
int ADXDef = iADX(_Symbol,_Period,14);
  • Заполняем данных в соответствии с созданным ADX
CopyBuffer(ADXDef,0,0,3,ADXArray0);
CopyBuffer(ADXDef,0,0,2,ADXArray1);
  • Получение значений после создания для них переменных:
double ADXValue=NormalizeDouble(ADXArray0[0],2);
double ADXValuelast=NormalizeDouble(ADXArray1[1],2);
  • Настройка условий движения ADX по значению ADX:
if (ADXValue>ADXValuelast)
      {
       Comment("ADX is rising","\n""ADX Value is ", ADXValue,"\n""ADX Value last is ", 
   ADXValuelast);
      }
   
if (ADXValue<ADXValuelast)
     {
      Comment("ADX is falling","\n""ADX Value is ", ADXValue,"\n""ADX Value last is ", 
   ADXValuelast);
      }

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

//+------------------------------------------------------------------+
//|                             Simple ADX System - ADX Movement.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
void OnTick()
  {
   //создание массива цен
   double ADXArray0[];
   double ADXArray1[];

   //сортировка ценового массива от текущих данных
   ArraySetAsSeries(ADXArray0,true);
   ArraySetAsSeries(ADXArray1,true);
      
   //определение ADX
   int ADXDef = iADX(_Symbol,_Period,14);
   
   //Заполняем данных в соответствии с созданным ADX
   CopyBuffer(ADXDef,0,0,3,ADXArray0);
   CopyBuffer(ADXDef,0,0,2,ADXArray1);
   
   //Получаем значения текущих данных
   double ADXValue=NormalizeDouble(ADXArray0[0],2);
   double ADXValuelast=NormalizeDouble(ADXArray1[1],2);
   
   //Сигнал движения ADX
   if (ADXValue>ADXValuelast)
      {
         Comment("ADX is rising","\n""ADX Value is ", ADXValue,"\n""ADX Value last is ", 
   ADXValuelast);
      }
   
   if (ADXValue<ADXValuelast)
     {
         Comment("ADX is falling","\n""ADX Value is ", ADXValue,"\n""ADX Value last is ", 
   ADXValuelast);
      }
  }
//+------------------------------------------------------------------+

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

Навигатор - ADX 3

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

Окно системы ADX movement 

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

Система ADX movement на графике

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

  • Когда ADX растет, можно видеть, как значения советника отображаются в виде комментариев, как на следующем рисунке:

Система ADX movement — рост 


  • Когда ADX падает, советник также отображает соответствующие значения в виде комментариев, как на следующем рисунке:

ADX movement - система 2.png

  • Стратегия вторая: простая система ADX — восходящий тренд:

Значение ADX > 25 и текущее значение ADX > предыдущее значение ADX --> если значение +DI > значение -DI = сигнал на покупку

Код торговой системы по этой стратегии будет таким:

  • Создаем переменную signal с пустым присваиванием. Значение переменной рассчитывается далее по коду. Используем функцию "string":
string signal="";
  • Создание массивов для текущего значения ADX, предыдущего значения ADX, значения +DI и значения -DI:
    • ADXArray0 — текущее значение ADX
    • ADXArray1 — предыдущее значение ADX
    • PDIArray — значения +DI индикатора
    • NDIArray — значения -DI индикатора 
double ADXArray0[];
double ADXArray1[];
double PDIArray[];
double NDIArray[];
  • Сортировка ценовых массивов от текущих данных:
ArraySetAsSeries(ADXArray0,true);
ArraySetAsSeries(ADXArray1,true);
ArraySetAsSeries(PDIArray,true);
ArraySetAsSeries(NDIArray,true);
  • Определение индикатора ADX
int ADXDef = iADX(_Symbol,_Period,14);
  • Заполняем данных в соответствии с созданным ADX
CopyBuffer(ADXDef,0,0,3,ADXArray0);
CopyBuffer(ADXDef,0,0,2,ADXArray1);
CopyBuffer(ADXDef,1,0,3,PDIArray);
CopyBuffer(ADXDef,2,0,3,NDIArray);
  • Получение значений текущих данных:
double ADXValue=NormalizeDouble(ADXArray0[0],2);
double ADXValueLast=NormalizeDouble(ADXArray1[1],2);
double PDIValue=NormalizeDouble(PDIArray[0],2);
double NDIValue=NormalizeDouble(NDIArray[0],2);
  • Установка условий для стратегии восходящего тренда:
if (ADXValue>25&&ADXValue>ADXValueLast)
   if(PDIValue>NDIValue)
   {
    signal = "BUY";
   }
  • Комментарий с сигналом на покупку и значениями, каждое на новой строке:
Comment("Simple ADX System - Signal is ",signal,"\n""ADX Value is ", ADXValue,
"\n""ADX Value Last is ", ADXValueLast, "\n""+DI Value is ", PDIValue,
"\n""-DI Value is ", NDIValue);

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

//+------------------------------------------------------------------+
//|                     Simple ADX System - Uptrend - Buy Signal.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()
  {
  
   // создание переменной для сигнала
   string signal="";
   
   //создание массива цен
   double ADXArray0[];
   double ADXArray1[];
   double PDIArray[];
   double NDIArray[];
   
   //определяем ADX, положительный DI, отрицательный DI
   int ADXDef = iADX(_Symbol,_Period,14);
   
   
   //сортировка ценового массива от текущих данных
   ArraySetAsSeries(ADXArray0,true);
   ArraySetAsSeries(ADXArray1,true);
   ArraySetAsSeries(PDIArray,true);
   ArraySetAsSeries(NDIArray,true);
   
   //Заполняем данных в соответствии с созданным ADX
   CopyBuffer(ADXDef,0,0,3,ADXArray0);
   CopyBuffer(ADXDef,0,0,2,ADXArray1);
   CopyBuffer(ADXDef,1,0,3,PDIArray);
   CopyBuffer(ADXDef,2,0,3,NDIArray);
   
   //Получаем значения текущих данных
   double ADXValue=NormalizeDouble(ADXArray0[0],2);
   double ADXValueLast=NormalizeDouble(ADXArray1[1],2);
   double PDIValue=NormalizeDouble(PDIArray[0],2);
   double NDIValue=NormalizeDouble(NDIArray[0],2);
   
   //Комментарий с сигналом на покупку согласно стратегии покупки
    if (ADXValue>25&&ADXValue>ADXValueLast)
      if(PDIValue>NDIValue)
      {
         signal = "BUY";
      }
      
   Comment("Simple ADX System - Signal is ",signal,"\n""ADX Value is ", ADXValue,
   "\n""ADX Value Last is ", ADXValueLast, "\n""+DI Value is ", PDIValue,
   "\n""-DI Value is ", NDIValue);
  }
//+------------------------------------------------------------------+

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

Навигатор - ADX 4

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

Окно системы ADX uptrend

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

Система ADX uptrend на графике

После этого на графике начнут отображаться сигналы в соответствие с нашей стратегией:

  • Сигнал на покупку.
  • Новая строка с текущим значением ADX.
  • Новая строка с предыдущим значением ADX.
  • Новая строка со значением +DI.
  • Новая строка со значением -DI.
На следующем рисунке показан пример сигнала от созданного нами торгового советника:


ADX - сигнал на покупку

  • Стратегия третья: простая система ADX — нисходящий тренд:

Значение ADX > 25 и текущее значение ADX > предыдущего значения ADX --> когда значение +DI < значение -DI = сигнал на продажу

Код торговой системы по этой стратегии будет таким:

//+------------------------------------------------------------------+
//|                Simple ADX System - Downtrend - Sell Strategy.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()
  {
  
   // создание переменной для сигнала
   string signal="";
   
   //создание массива цен
   double ADXArray0[];
   double ADXArray1[];
   double PDIArray[];
   double NDIArray[];
   
   //определяем ADX, положительный DI, отрицательный DI
   int ADXDef = iADX(_Symbol,_Period,14);
   
   
   //сортировка ценового массива от текущих данных
   ArraySetAsSeries(ADXArray0,true);
   ArraySetAsSeries(ADXArray1,true);
   ArraySetAsSeries(PDIArray,true);
   ArraySetAsSeries(NDIArray,true);
   
   //Заполняем данных в соответствии с созданным ADX
   CopyBuffer(ADXDef,0,0,3,ADXArray0);
   CopyBuffer(ADXDef,0,0,2,ADXArray1);
   CopyBuffer(ADXDef,1,0,3,PDIArray);
   CopyBuffer(ADXDef,2,0,3,NDIArray);
   
   //Получаем значения текущих данных
   double ADXValue=NormalizeDouble(ADXArray0[0],2);
   double ADXValueLast=NormalizeDouble(ADXArray1[1],2);
   double PDIValue=NormalizeDouble(PDIArray[0],2);
   double NDIValue=NormalizeDouble(NDIArray[0],2);
   
   //Комментарий с сигналом на покупку согласно стратегии покупки
    if (ADXValue>25&&ADXValue>ADXValueLast)
      if(PDIValue<NDIValue)
      {
         signal = "SELL";
      }
      
   Comment("Simple ADX System - Signal is ",signal,"\n""ADX Value is ", ADXValue,
   "\n""ADX Value Last is ", ADXValueLast, "\n""+DI Value is ", PDIValue,
   "\n""-DI Value is ", NDIValue);
  }
//+------------------------------------------------------------------+

Это те же шаги стратегии, как и для восходящего тренда, со следующими отличиями:

  • Условия нисходящей стратегии:
    if (ADXValue>25&&ADXValue>ADXValueLast)
      if(PDIValue<NDIValue)
      {
         signal = "SELL";
      }
  • Комментарий по сигналу:
   Comment("Simple ADX System - Signal is ",signal,"\n""ADX Value is ", ADXValue,
   "\n""ADX Value Last is ", ADXValueLast, "\n""+DI Value is ", PDIValue,
   "\n""-DI Value is ", NDIValue);

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

Навигатор - ADX 5

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

Окно системы ADX downtrend 

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

Система ADX downtrend на графике

После этого на графике начнут отображаться сигналы в соответствие с нашей стратегией:

  • Сигнал на продажу.
  • Новая строка с текущим значением ADX.
  • Новая строка с предыдущим значением ADX.
  • Новая строка со значением +DI.
  • Новая строка со значением -DI.

На следующем рисунке показан пример сигнала от созданного нами торгового советника:

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

Заключение

Надеюсь, эта статья дала много полезных знаний. Она подробно рассказала об одном из популярных и полезных индикаторов — Индексе среднего направленного движения ADX, и о том, как разработать торговую систему с его использованием. Мы узнали, что такое ADX, что он измеряет и как его можно вычислить его вручную. Мы познакомились с простыми стратегиями, основанными на индикаторе ADX, во время восходящего и нисходящего тренда, затем мы разработали план этих стратегий, который должен был помочь нам шаг за шагом разработать торговую систему, а именно понять, что нужно сделать, чтобы сообщить программе, чтобы она делала точно. Кроме того, мы увидели, как спроектировать торговую систему для автоматической работы на основе этих стратегий ADX, а также написали код для этих торговых стратегий на языке MQL5 (MetaQuotes Language).

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

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

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

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


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

Последние комментарии | Перейти к обсуждению на форуме трейдеров (1)
Vadzim Lepekha
Vadzim Lepekha | 31 июл 2022 в 10:00
Добрый День, уважаемый Мохаммед А.. Все очень интересно, но может быть пора, что- то сделать в области: " Стрелочного индикатора". Как Вы думаете? До свидания.
Нейросети — это просто (Часть 20): Автоэнкодеры Нейросети — это просто (Часть 20): Автоэнкодеры
Мы продолжаем изучение алгоритмов обучения без учителя. Возможно, у читателя может возникнуть вопрос об соответствии последних публикаций теме нейронных сетей. В новой статье мы возвращаемся к использованию нейронных сетей.
Разработка торговой системы на основе Стохастика Разработка торговой системы на основе Стохастика
Это очередная статья из обучающей серии, в которой мы знакомимся с различными индикаторами. В этот раз мы обратимся к другому популярному индикатору — Stochastic Oscillator. Изучим его, рассмотрим стратегии на его основе и создадим торговую систему.
Разработка торгового советника с нуля (Часть 18): Новая система ордеров (I) Разработка торгового советника с нуля (Часть 18): Новая система ордеров (I)
Это первая часть новой системы ордеров. С тех пор, как мы начали создавать документацию данного советника в наших статьях, он претерпел различные изменения и улучшения, сохраняя при этом ту же модель системы ордеров на графике.
Разработка торгового советника с нуля (Часть 17): Доступ к данным в Интернете (III) Разработка торгового советника с нуля (Часть 17): Доступ к данным в Интернете (III)
В этой статье мы продолжим с просмотром того, как получать данные из Интернета для их использования в советнике. Давайте приступим к работе, а точнее к кодированию альтернативной системы.