Разработка торговой системы на основе индикатора Накопления/Распределения - Accumulation/Distribution

25 июля 2022, 08:40
Mohamed Abdelmaaboud
0
442

Введение

Эта серия статей посвящена подробному изучению самых популярных технических индикаторов и их применению в виде простых стратегий. Торговые системы на основе этих стратегий разработаны с использованием языка программирования MQL5 для исполнения в торговой платформе MetaTrader 5. В текущей статье мы узнаем об индикаторе Накопления/Распределения (Accumulation/Distribution, AD). Этот технический индикатор основан на объеме, который помогает взглянуть на финансовый инструмент с иной точки зрения. Работу над индикатором снова разобьем на несколько тем:

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

Сначала мы подробно изучим теорию об этом техническом индикаторе, что он измеряет, а также о том, как его можно рассчитать вручную (исключительно для того, чтобы понять его основную концепцию). Затем мы разработаем торговую систему на его основе. Рассмотрим расчет индикатора на конкретном примере, чтобы лучше понять. Подробно изучив основы индикатора AD, перейдем к рассмотрению его возможного использования на примере простых стратегий. Затем разработаем план для каждой рассмотренной стратегии, который поможет написать код торговой системы на основе каждой из них. После разработки схем для написания кода каждой из стратегий, перейдем к самой интересной части статьи — будем программировать торговые системы на основе рассмотренных стратегий на языке MQL5, а полученная программа будет исполняться в торговой платформе.

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

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

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

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

Здесь мы подробно поговорим об индикаторе Accumulation/Distribution (AD), познакомимся с его определением, узнаем, что он измеряет и как его можно рассчитать вручную. Индикатор AD был разработан Марком Чайкиным. Это индикатор, основанный на объеме, т.е. рассчитывается он по объемам. В целом понятие объема является важной составляющей торговли в целом, поскольку он измеряет совокупный поток денег, входящий в инструмент и исходящий из него. Кроме того, он использует объем для подтверждения тренда или предупреждения о развороте. Если вы хотите больше узнать о тренде, рекомендую почитать раздел "Определение тренда" в моей ранее опубликованной статье.

Как и любой кумулятивный индикатор, линия AD представляет собой промежуточную сумму объема денежного потока за каждый период. Это особенно видно из способа расчета индикатора. Линия Накопления/Распределения рассчитывается в несколько шагов.

Итак, эти три шага такие:

  1. Расчет множителя денежного потока = ((закрытие - минимум) - (максимум - закрытие))/(максимум - минимум)
  2. Расчет объема денежного потока = множитель денежного потока * объем за период
  3. Линия AD = предыдущее значение AD + текущий объем денежного потока

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

День Максимум Минимум Закрытие Объем
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

Рассчитаем на основе этой таблицы данных значения индикатора AD. Итак, пройдем по всем шагам:

Сначала рассчитываем множитель денежного потока = ((Close - Low) - (High-Close))/(High-Low). Получим вот такую таблицу данных:

Расчет AD

Затем рассчитаем объем денежного потока = множитель денежного потока * объем за период. Получим вот такие данные:

Расчет AD 1

Третьим шагом рассчитаем линию AD = предыдущее значение строки AD + текущий объем денежного потока. Получаем такие данные:

Расчет AD 2

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

Для этого в окне терминала MetaTrader 5 выбираем меню "Вставка" --> Индикаторы --> Индикаторы объема --> Accumulation/Distribution

Запуск AD в платформе

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

Окно параметров индикатора AD

1. Типы объемов: тиковый или реальный.

2. Цвет линии AD.

3. Тип линии AD.

4. Толщина линии AD.

Настройте нужные параметры, нажмите ОК, и индикатор отобразится на графике, как показано ниже:

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

Теперь давайте посмотрим, как модно использовать индикатор AD.


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

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

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

Давайте теперь посмотрим несколько простых стратегий на основе индикатора AD.

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

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

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

Текущее AD > Предыдущее AD --> линия AD растет

Текущее AD < Предыдущее AD --> линия AD падает

  • Стратегия вторая: сила AD

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

То есть:

Текущее AD > максимальное значение из предыдущих 10 --> текущее значение AD сильное

Текущее AD < минимальное значение из предыдущих 10 --> текущее значение AD слабое

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

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

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

То есть:

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

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

  • Стратегия четыре: простая стратегия по AD — нисходящий тренд

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

Ничего сложного:

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

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


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

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

Начнем с разработки простой программы по индикатору AD, которая будет выводить на график комментарий с текущим значением AD. Она станет основой для всех следующих стратегий. Назовем ее Simple AD (потому что стратегия действительно максимально проста — вывод комментария). Схема для создания такой стратегии будет такой:

Схема стратегии Simple AD

 

Дальше разработаем схемы для каждой из рассмотренных стратегий.

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

Система должна будет постоянно на каждом тике проверять текущее и предыдущее значение AD. Далее система должна определить, текущее значение AD выше предыдущего или нет. Программа должна отобразить на графике комментарий: растущая линия AD, текущее значение AD и предыдущее. Каждое значение будет отображаться отдельной строкой. В обратной ситуации, если текущее значение меньше предыдущего, на графике нужно отобразить комментарий: падающая линия AD, текущее значение AD и предыдущее. Значения опять же отображаются отдельной строкой. Схема создания такой торговой системы будет такой:

Схема AD - Простое движение

  • Стратегия вторая: сила AD

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

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

Схема AD - Простая сила

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

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

Вот такая пошаговая схема поможет разработать торговую систему по этой стратегии:

Схема AD - восходящий тренд — план

  • Стратегия четыре: простая стратегия по AD — нисходящий тренд

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

Вот такая пошаговая схема поможет разработать торговую систему по этой стратегии:

Схема AD - нисходящий тренд — план


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

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

  • Создаем массив для значений AD с использованием функции double для представления значения в дробной части.
double ADArray[];
  • Сортируем массив цен начиная с текущих данных. Для этого используем функцию ArraySetAsSeries:
ArraySetAsSeries(ADArray,true);
  • Определяем AD с помощью функции iAD 1 для этого создаем целочисленную переменную ADDef. Функция iAD возвращает хэндл индикатора Accumulation/Distribution и его параметры (символ, период и объем, используемый в расчетах).
int ADDef=iAD(_Symbol,_Period,VOLUME_TICK);
  • Заполняем массив ADArray, используя функцию CopyBuffer, которая возвращает количество скопированных данных. Параметры функции: хэндл индикатора, номер буфера, время начала, время окончания, буфер:
CopyBuffer(ADDef,0,0,3,ADArray);
  • Вычисляем текущее значение AD с помощью функции NormalizeDouble, которая возвращает значение типа double. Для этого также создаем целочисленную переменную ADValue. 
int ADValue=NormalizeDouble(ADArray[0],5);
  • Выводим сгенерированный сигнал на график с помощью функции Comment:
Comment("AD Value is: ",ADValue);

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

//+------------------------------------------------------------------+
//|                                                    Simple AD.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()
  {
   //создаем массив для AD
   double ADArray[];
   
   //сортировка массива по текущим данным
   ArraySetAsSeries(ADArray,true);
   
   //определение AD
   int ADDef=iAD(_Symbol,_Period,VOLUME_TICK);
   
   //заполняем ADArray с помощью ADDef
   CopyBuffer(ADDef,0,0,3,ADArray);
   
   //рассчитываем текущее значение AD
   int ADValue=NormalizeDouble(ADArray[0],5);
   
   //вывод комментария со значением AD
   Comment("AD Value is: ",ADValue);  
  }
//+------------------------------------------------------------------+

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

AD в Навигаторе

Программу можно запустить перетаскиванием (drag and drop) на график. Откроется следующее окно:

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

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

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

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

Тестовый сигнал стратегии Simple AD

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

Simple AD - одинаковые сигналы

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

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

//+------------------------------------------------------------------+
//|                                           Simple AD 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()
  {
   //создаем массив для AD
   double ADArray[];
   
   //сортируем массив по текущим данным
   ArraySetAsSeries(ADArray,true);
   
   //определение AD
   int ADDef=iAD(_Symbol,_Period,VOLUME_TICK);
   
   //заполняем ADArray с помощью ADDef
   CopyBuffer(ADDef,0,0,3,ADArray);
   
   //рассчитываем текущее значение AD и предыдущие
   int ADCurrrentValue=NormalizeDouble(ADArray[0],5);
   int ADPrevValue=NormalizeDouble(ADArray[1],5);
   
   //сравниваем два значения и выдаем сигнал
   //Растущее AD
   if(ADCurrrentValue>ADPrevValue)
   {
      Comment("AD line is rising","\n","AD current value is: ",ADCurrrentValue,
      "\n","AD previous value is: ",ADPrevValue);
   }
   
   //Снижающееся AD
   if(ADCurrrentValue<ADPrevValue)
   {
      Comment("AD line is declining","\n","AD current value is: ",ADCurrrentValue,
      "\n","AD previous value is: ",ADPrevValue);
   }  
  }
//+------------------------------------------------------------------+

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

  • Вычисление двух значений текущего и предыдущего AD:
int ADCurrrentValue=NormalizeDouble(ADArray[0],5);
int ADPrevValue=NormalizeDouble(ADArray[1],5);
  • Настройка условий и сгенерированных комментариев по этой стратегии:
    • Восходящая линия AD:
if(ADCurrrentValue>ADPrevValue)
{
 Comment("AD line is rising","\n","AD current value is: ",ADCurrrentValue,
 "\n","AD previous value is: ",ADPrevValue);
}
    • Нисходящая линия AD:
if(ADCurrrentValue<ADPrevValue)
{
 Comment("AD line is declining","\n","AD current value is: ",ADCurrrentValue,
 "\n","AD previous value is: ",ADPrevValue);
} 

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

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

Дважды щелкаем, открывается такое окно:

Окно программы AD - Простое движение

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

AD - Простое движение - на графике

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

Восходящая линия AD

Текущие данные: 

Простое движение AD - рост AD - текущие данные

 

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

Простое движение AD - рост AD - предыдущие данные

Снижающееся AD

Текущие данные:

Простое движение AD - снижение AD - текущие данные

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

 Простое движение AD - снижение AD - предыдущие данные

  • Стратегия вторая: сила AD

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

//+------------------------------------------------------------------+
//|                                           Simple AD strength.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
void OnTick()
  {
   //создаем массив для AD
   double ADArray[];
   
   //сортировка массива по текущим данным
   ArraySetAsSeries(ADArray,true);
  
   //определение AD
   int ADDef=iAD(_Symbol,_Period,VOLUME_TICK);
   
   //заполняем ADArray с помощью ADDef
   CopyBuffer(ADDef,0,0,10,ADArray);
 
   //рассчитываем текущее значение AD и предыдущие
   int ADCurrrentValue=NormalizeDouble(ADArray[0],5);
  
   //Определяем значения максимума и минимума за предыдущие 10 значений AD
   int ADMax =ArrayMaximum(ADArray,1,10);
   int ADMin =ArrayMinimum(ADArray,1,10);
   
   //Расчет максимального и минимального значений
   int ADMaxValue=ADArray[ADMax];
   int ADMinValue=ADArray[ADMin];

   //сравниваем два значения и выдаем сигнал
   //Текущее AD сильное
   if(ADCurrrentValue>ADMaxValue)
   {
      Comment("AD Current value is strong","\n","AD current value is: ,",ADCurrrentValue,
   "\n","AD Max is: ",ADMaxValue,"\n","AD Min is: ",ADMinValue);
   }
   
   //Текущее AD слабое
   if(ADCurrrentValue<ADMinValue)
   {
      Comment("AD Current value is weak","\n","AD current value is: ,",ADCurrrentValue,
   "\n","AD Max is: ",ADMaxValue,"\n","AD Min is: ",ADMinValue);
   }
  }
//+------------------------------------------------------------------+

Здесь много отличий от предыдущего кода. Давайте посмотрим на эти отличия:

  • Определяем максимальное и минимальное значение AD с помощью функций ArrayMaximum и ArrayMinimum. Для этого создаем целочисленные переменные ADMaxValue и ADMinValue. ArrayMaximum возвращает индекс найденного элемента массива и ищет самый большой элемент. Его параметры: числовой массив, индекс начала и количество элементов для поиска. ArrayMinimum аналогичен ArrayMaximum, но ищет самый маленький элемент.
int ADMax =ArrayMaximum(ADArray,1,10);
int ADMin =ArrayMinimum(ADArray,1,10);
  • Вычисляем ADMaxValue и ADMinValue — для этого создаем целочисленные переменные:
int ADMaxValue=ADArray[ADMax];
int ADMinValue=ADArray[ADMin];
  • Настройка условий стратегии и комментариев по каждому условию.
    • Сильное значение AD:
if(ADCurrrentValue>ADMaxValue)
{
 Comment("AD Current value is strong","\n","AD current value is: ,",ADCurrrentValue,
 "\n","AD Max is: ",ADMaxValue,"\n","AD Min is: ",ADMinValue);
}
    • Слабое значение AD:
if(ADCurrrentValue<ADMinValue)
{
 Comment("AD Current value is weak","\n","AD current value is: ,",ADCurrrentValue,
 "\n","AD Max is: ",ADMaxValue,"\n","AD Min is: ",ADMinValue);
}

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

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

 

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

Окно программы AD Strength

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

Программа AD Strength на графике

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

Сильное AD:

Simple AD Strength - сигнал силы

Слабое AD:

Simple AD Strength - слабое

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

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

//+------------------------------------------------------------------+
//|                                          Simple AD - uptrend.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()
  {
   //Создаем два массива для AD и цены
   double ADArray[];
   MqlRates PriceArray[];
   
   //сортируем два массива
   ArraySetAsSeries(ADArray,true);
   int Data=CopyRates(_Symbol,_Period,0,3,PriceArray);
   
   //определение AD
   int ADDef=iAD(_Symbol,_Period,VOLUME_TICK);
   
   //заполняем ADArray с помощью ADDef
   CopyBuffer(ADDef,0,0,3,ADArray);
   
   //рассчитываем текущее значение AD и предыдущие
   int ADCurrrentValue=NormalizeDouble(ADArray[0],5);
   int ADPrevValue=NormalizeDouble(ADArray[1],5);
   
   //рассчитываем текущий и предыдущий максимумы
   double CurrentHighValue=NormalizeDouble(PriceArray[2].high,5);         
   double PrevHighValue=NormalizeDouble(PriceArray[1].high,5); 
   
   //сравниваем два значения и выдаем сигнал
   //Сильное движение вверх
   if(ADCurrrentValue > ADPrevValue && CurrentHighValue>PrevHighValue)
   {
      Comment("Strong Up Move During The Uptrend","\n","AD current value is: ",ADCurrrentValue,
      "\n","AD previous value is: ",ADPrevValue,
      "\n","Current high value is: ",CurrentHighValue,
      "\n","Previous high value is: ",PrevHighValue);    
   }   
   
   //в случае расхождения
   if(ADCurrrentValue < ADPrevValue && CurrentHighValue>PrevHighValue)
   {
      Comment("Bearish Divergence","\n","AD current value is: ",ADCurrrentValue,
      "\n","AD previous value is: ",ADPrevValue,
      "\n","Current low value is: ",CurrentHighValue,
      "\n","Previous low value is: ",PrevHighValue);      
   }   
  }
//+------------------------------------------------------------------+

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

  • Создаем два массива для значений AD с помощью функции double и два массива цен с помощью функции MqlRates, хранящей информацию о ценах:
double ADArray[];
MqlRates PriceArray[];

  • Сортировка двух массивов, одного для значений AD с помощью функции ArraySetAsSeries и другого для цен с помощью функции CopyRates для получения исторических данных структуры MqlRates (также для этого создаем целочисленную переменную Data).
ArraySetAsSeries(ADArray,true);
int Data=CopyRates(_Symbol,_Period,0,3,PriceArray);
  • Определение AD, заполнение массива AD:
int ADDef=iAD(_Symbol,_Period,VOLUME_TICK);

CopyBuffer(ADDef,0,0,3,ADArray);
  • Расчет текущего AD, предыдущего AD, текущего максимума и предыдущего максимума:
int ADCurrrentValue=NormalizeDouble(ADArray[0],5);
int ADPrevValue=NormalizeDouble(ADArray[1],5);

double CurrentHighValue=NormalizeDouble(PriceArray[2].high,5);         
double PrevHighValue=NormalizeDouble(PriceArray[1].high,5); 
  • Настройка условий стратегии и желаемых комментариев:
    • Сильное движение вверх
if(ADCurrrentValue > ADPrevValue && CurrentHighValue>PrevHighValue)
{
 Comment("Strong Up Move During The Uptrend","\n","AD current value is: ",ADCurrrentValue,
 "\n","AD previous value is: ",ADPrevValue,
 "\n","Current high value is: ",CurrentHighValue,
 "\n","Previous high value is: ",PrevHighValue);    
} 
    • Медвежье расхождение:
if(ADCurrrentValue < ADPrevValue && CurrentHighValue>PrevHighValue)
{
 Comment("Bearish Divergence","\n","AD current value is: ",ADCurrrentValue,
 "\n","AD previous value is: ",ADPrevValue,
 "\n","Current low value is: ",CurrentHighValue,
 "\n","Previous low value is: ",PrevHighValue);      
} 

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

AD в Навигаторе 4

Запускаем двойным кликом, после этого появится вот такое окно:

Окно AD - восходящий тренд

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

AD - восходящий тренд — на графике

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

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

Текущие данные:

 Стратегия AD uptrend - сигнал сильного движения вверх, текущие данные

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

Стратегия AD uptrend - сигнал сильного движения вверх, предыдущие данные

Медвежье расхождение

Текущие данные:

Стратегия AD uptrend - медвежий сигнал, текущие данные

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

Стратегия AD uptrend - медвежий сигнал, предыдущие данные

  • Стратегия четыре: простая стратегия по AD — нисходящий тренд

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

//+------------------------------------------------------------------+
//|                                        Simple AD - downtrend.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="";
   
   //Создаем два массива для AD и цены
   double ADArray[];
   MqlRates PriceArray[];
   
   //сортируем два массива
   ArraySetAsSeries(ADArray,true);
   int Data=CopyRates(_Symbol,_Period,0,3,PriceArray);
   
   //определение AD
   int ADDef=iAD(_Symbol,_Period,VOLUME_TICK);
   
   //заполняем ADArray с помощью ADDef
   CopyBuffer(ADDef,0,0,3,ADArray);
   
   //рассчитываем текущее значение AD и предыдущие
   int ADCurrrentValue=NormalizeDouble(ADArray[0],5);
   int ADPrevValue=NormalizeDouble(ADArray[1],5);
   
   double CurrentLowValue=NormalizeDouble(PriceArray[2].low,5);         
   double PrevLowValue=NormalizeDouble(PriceArray[1].low,5); 
   
   //сравниваем два значения и выдаем сигнал
   //Сильное движение вниз
   if(ADCurrrentValue < ADPrevValue && CurrentLowValue<PrevLowValue)
   {
      Comment("Strong Down Move During The Downtrend","\n","AD current value is: ",ADCurrrentValue,
      "\n","AD previous value is: ",ADPrevValue,
      "\n","Current low value is: ",CurrentLowValue,
      "\n","Previous low value is: ",PrevLowValue);      
   }
   
   //в случае расхождения
   if(ADCurrrentValue > ADPrevValue && CurrentLowValue<PrevLowValue)
   {
      Comment("Bullish Divergence","\n","AD current value is: ",ADCurrrentValue,
      "\n","AD previous value is: ",ADPrevValue,
      "\n","Current low value is: ",CurrentLowValue,
      "\n","Previous low value is: ",PrevLowValue);      
   }  
  }
//+------------------------------------------------------------------+

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

  • Условия стратегии, на основе которых выводятся комментарии:
    • Сильное движение вниз:
if(ADCurrrentValue < ADPrevValue && CurrentLowValue<PrevLowValue)
{
 Comment("Strong Down Move During The Downtrend","\n","AD current value is: ",ADCurrrentValue,
 "\n","AD previous value is: ",ADPrevValue,
 "\n","Current low value is: ",CurrentLowValue,
 "\n","Previous low value is: ",PrevLowValue);      
}
    • Бычье расхождение:
if(ADCurrrentValue > ADPrevValue && CurrentLowValue<PrevLowValue)
{
 Comment("Bullish Divergence","\n","AD current value is: ",ADCurrrentValue,
 "\n","AD previous value is: ",ADPrevValue,
 "\n","Current low value is: ",CurrentLowValue,
 "\n","Previous low value is: ",PrevLowValue);      
} 

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

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

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

Окно программы AD - Downtrend

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

Система AD - нисходящий тренд — на графике

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

Сильное движение вниз

Текущие данные:

Стратегия AD downtrend - сигнал сильного движения вниз, текущие данные

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

Стратегия AD downtrend - сигнал сильного движения вниз, предыдущие данные

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

Текущие данные:

Стратегия AD downtrend - сигнал бычьего расхождения, текущие данные

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

Стратегия AD downtrend - сигнал бычьего расхождения, предыдущие данные

\


Заключение

В этой статье мы поговорили об индикаторе Накопления/Распределения (Accumulation/Distribution, AD), который является одним из индикаторов на основе объемов. Мы узнали, что такое индикатор AD, что он измеряет и как можно рассчитать его вручную. Рассмотрели, как можно использовать этот индикатор, с помощью простых стратегий. Стратегии основаны на движении AD, силе AD, а также показателях во время восходящего и нисходящего тренда. Затем разработали план для каждой рассмотренной стратегии, который помогает написать код торговой системы на основе каждой из них. После этого, собственно, посмотрели на разработку торговых систем — создали советник на MQL5 по каждой стратегии, получили программу, которая может работать в торговой платформе MetaTrader 5, увидели примеры сгенерированных сигналов. Терминал позволяет автоматизировать такие стратегии для генерации сигналов. Это великолепная функция, поскольку компьютер работает за нас или, по крайней мере, дает четкую, точную и быструю информацию, которая помогает улучшать торговые решения и избегать эмоции, которые порой могут навредить.

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

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

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

Прикрепленные файлы |
Simple_AD.mq5 (1.09 KB)
Разработка торгового советника с нуля (Часть 21): Новая система ордеров (IV) Разработка торгового советника с нуля (Часть 21): Новая система ордеров (IV)
Наконец-то визуальная система заработает... хотя пока не до конца. Здесь мы закончим вносить основные изменения, которых будет не мало, но они все необходимы, и вся работа будет достаточно интересной.
Разработка торговой системы на основе индикатора OBV Разработка торговой системы на основе индикатора OBV
Это новая статья, продолжающая нашу серию для начинающих MQL5-программистов, в которой мы учимся строить торговые системы с использованием самых популярных индикаторов. На этот раз мы будем изучать индикатор балансового объема On Balance Volume (OBV) — узнаем, как его использовать и как создать торговую систему на его основе.
Нейросети — это просто (Часть 22): Обучение без учителя рекуррентных моделей Нейросети — это просто (Часть 22): Обучение без учителя рекуррентных моделей
Мы продолжаем рассмотрение алгоритмов обучения без учителя. И сейчас я предлагаю обсудить особенности использования автоэнкодеров для обучения рекуррентных моделей.
DoEasy. Элементы управления (Часть 12): Базовый объект-список, WinForms-объекты ListBox и ButtonListBox DoEasy. Элементы управления (Часть 12): Базовый объект-список, WinForms-объекты ListBox и ButtonListBox
В статье создадим базовый объект списков WinForms-объектов и два новых объекта: ListBox и ButtonListBox.