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

1 августа 2022, 08:09
Mohamed Abdelmaaboud
0
863

Введение

Представляю вашему вниманию новую статью из серии, в которой мы учимся создавать торговые системы на основе популярных технических индикаторов. Здесь мы знакомимся с еще одним важным техническим индикатором, который дает нам представление о другой перспективе рынке — индикатором объемов Volumes. Работу над индикатором снова разобьем на несколько тем:

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

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

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

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

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


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

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

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

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

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

На рынке Форекс:

Объем = количество изменений цены за определенный период времени.

На фондовом рынке:

Объем = торговый объем * цена

Например, объем для определенной акции составляет 1000 акций по цене $10. Индикатор Volume тогда будет таким:

Volume = 1000 * $10 = $10,000

Разница в расчетах связана с тем, что рынок форекс децентрализованный, в отличие от фондового рынка.

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

Меню "Вставка" --> Индикаторы --> Объема --> Volumes

Запуск индикатора Volumes

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

Параметры индикатора Volumes

1. Цвет бара при растущем объеме.

2. Цвет бара при падающем объеме.

3. Тип объемов, используемый в расчетах (тиковый или реальный).

4. Толщина бара. 

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

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

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


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

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

  • Стратегия первая: Volume - движение

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

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

Текущий объем > Предыдущий объем --> Объемы растут

Текущий объем < Предыдущий объем --> Объемы падают

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

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

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

Текущий объем > Среднее --> сильный объем

Текущий объем < Среднее --> слабый объем

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

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

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

  • Стратегия четвертая: Цена и Volume — нисходящий тренд

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

Текущий минимум < предыдущий минимум && текущий объем > предыдущий объем --> Короткий сигнал во время нисходящего тренда

  • Стратегия пятая: MA и Volumes

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

Короткая MA < Длинная MA, а потом затем Short MA > Long MA && Текущий объем > Предыдущий объем --> Сигнал на покупку

Короткая MA > Длинная MA, а потом затем Short MA < Long MA && Текущий объем > Предыдущий объем --> Сигнал на продажу


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

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

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

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


  • Стратегия первая: Volume - движение

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

Схема стратегии Volume - движение


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

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

Схема стратегии Volume - сила


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

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

Схема стратегии Price и Vol - Uptrend

  • Стратегия четвертая: Цена и Volume — нисходящий тренд

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

Схема стратегии Price и Vol - Downtrend


  • Стратегия пятая: MA и Volumes

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

Схема стратегии MA_Vol


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

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

  • Создаем массив объемов с помощью функции double.
double VolArray[];
  • Сортируем массив в обратном порядке, начиная с текущих данных, с помощью функции ArraySetAsSeries, она возвращает true или false:
ArraySetAsSeries(VolArray,true);
  • Определяем Volumes с помощью функции iVolumes — для этого создали переменную VolDef. Функция iVolumes возвращает хэндл индикатора Volumes и его параметры (символ, период, примененный объем). Параметры функции — _Symbol (текущий символ) и period (текущий таймфрейм).
int VolDef=iVolumes(_Symbol,_Period,VOLUME_TICK);
  • Заполняем массив с помощью функции CopyBuffer данными от индикатора Volumes.
CopyBuffer(VolDef,0,0,3,VolArray);
  • Рассчитываем значение объемов с помощью функции NormalizeDouble — для этого создали переменную VolValue. Функция NormalizeDouble возвращает значение типа double.
int VolValue=NormalizeDouble(VolArray[0],5);
  • Вывод значения индикатора Volumes на график с помощью функции Comment.
Comment("Volumes Value is: ",VolValue);

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

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

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

//определяем Volume
   int VolDef=iVolumes(_Symbol,_Period,VOLUME_TICK);

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

//расчет текущего значения Volume
   int VolValue=NormalizeDouble(VolArray[0],5);

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

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

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

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

Окно системы Simple Volume

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

 Система Simple Volume на графике

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

Сигналы от Simple Volume

  • Стратегия первая: Volume - движение

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

//+------------------------------------------------------------------+
//|                                               Vol - 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()
  {
//Создаем массив для Volume
   double VolArray[];

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

//определяем Volume
   int VolDef=iVolumes(_Symbol,_Period,VOLUME_TICK);

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

//расчет текущего значения Volume
   double VolCurrentValue=NormalizeDouble(VolArray[0],5);
   double VolPrevValue=NormalizeDouble(VolArray[1],5);

//Условия движения объема
//Объем растет
   if(VolCurrentValue>VolPrevValue)
     {
      Comment("Volumes increased","\n","Volumes current value is: ",VolCurrentValue,
              "\n","Volumes previous value is: ",VolPrevValue);
     }

//Объем падает
   if(VolCurrentValue<VolPrevValue)
     {
      Comment("Volumes decreased","\n","Volumes current value is: ",VolCurrentValue,
              "\n","Volumes previous value is: ",VolPrevValue);
     }
  }
//+------------------------------------------------------------------+

Что добавилось в этом коде:

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

   double VolCurrentValue=NormalizeDouble(VolArray[0],5);
   double VolPrevValue=NormalizeDouble(VolArray[1],5);

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

Индикатор Volumes растет:

   if(VolCurrentValue>VolPrevValue)
     {
      Comment("Volumes increased","\n","Volumes current value is: ",VolCurrentValue,
              "\n","Volumes previous value is: ",VolPrevValue);
     }

Индикатор Volumes падает:

   if(VolCurrentValue<VolPrevValue)
     {
      Comment("Volumes decreased","\n","Volumes current value is: ",VolCurrentValue,
              "\n","Volumes previous value is: ",VolPrevValue);
     }

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

Индикатор Volumes в Навигаторе 2

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

Окно системы Volume - движение

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

 Система Volume - движение - на графике

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

Увеличение объемов:

Текущее окно данных:

 Volume - движение - сигнал роста - текущее значение

Предыдущие данные в окне:

 Volume - движение - сигнал роста - предыдущее значение

Уменьшение объемов:

Текущее окно данных:

Volume - движение - сигнал падения - текущее значение

Предыдущие данные в окне:

 Volume - движение - сигнал падения - предыдущее значение

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

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

//+------------------------------------------------------------------+
//|                                               Vol - Strength.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()
  {
//Создаем массив для Volume
   double VolArray[];

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

//определяем Volume
   int VolDef=iVolumes(_Symbol,_Period,VOLUME_TICK);

//заполнение массива
   CopyBuffer(VolDef,0,0,11,VolArray);

//вычисление текущего объема && пяти предыдущих значений
   double VolCurrentValue=NormalizeDouble(VolArray[0],5);
   double VolPrevValue1=NormalizeDouble(VolArray[1],5);
   double VolPrevValue2=NormalizeDouble(VolArray[2],5);
   double VolPrevValue3=NormalizeDouble(VolArray[3],5);
   double VolPrevValue4=NormalizeDouble(VolArray[4],5);
   double VolPrevValue5=NormalizeDouble(VolArray[5],5);


//расчет среднего значения 5 предыдущих объемов
   double VolAVGVal=((VolPrevValue1+VolPrevValue2+VolPrevValue3+VolPrevValue4+VolPrevValue5)/5);

//условия силы объема, основанные на сравнении текущего объема со средним
//сильный объем
   if(VolCurrentValue>VolAVGVal)
     {
      Comment("Strong volume","\n","Current volume is : ",VolCurrentValue,"\n",
              "Volume prev 1 is : ",VolPrevValue1,"\n",
              "Volume prev 2 is : ",VolPrevValue2,"\n",
              "Volume prev 3 is : ",VolPrevValue3,"\n",
              "Volume prev 4 is : ",VolPrevValue4,"\n",
              "Volume prev 5 is : ",VolPrevValue5,"\n",
              "AVG volume is : ",VolAVGVal);
     }

//слабый объем
   if(VolCurrentValue<VolAVGVal)
     {
      Comment("Weak volume","\n","Current volume is : ",VolCurrentValue,"\n",
              "Volume prev 1 is : ",VolPrevValue1,"\n",
              "Volume prev 2 is : ",VolPrevValue2,"\n",
              "Volume prev 3 is : ",VolPrevValue3,"\n",
              "Volume prev 4 is : ",VolPrevValue4,"\n",
              "Volume prev 5 is : ",VolPrevValue5,"\n",
              "AVG volume is : ",VolAVGVal);
     }
  }
//+------------------------------------------------------------------+

Что добавилось в этом коде:

Расчет текущего и пяти предыдущих значений индикатора Volumes:

   double VolCurrentValue=NormalizeDouble(VolArray[0],5);
   double VolPrevValue1=NormalizeDouble(VolArray[1],5);
   double VolPrevValue2=NormalizeDouble(VolArray[2],5);
   double VolPrevValue3=NormalizeDouble(VolArray[3],5);
   double VolPrevValue4=NormalizeDouble(VolArray[4],5);
   double VolPrevValue5=NormalizeDouble(VolArray[5],5);

 Расчет среднего значения предыдущих пяти объемов:

double VolAVGVal=((VolPrevValue1+VolPrevValue2+VolPrevValue3+VolPrevValue4+VolPrevValue5)/5);

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

Сильный объем:

   if(VolCurrentValue>VolAVGVal)
     {
      Comment("Strong volume","\n","Current volume is : ",VolCurrentValue,"\n",
              "Volume prev 1 is : ",VolPrevValue1,"\n",
              "Volume prev 2 is : ",VolPrevValue2,"\n",
              "Volume prev 3 is : ",VolPrevValue3,"\n",
              "Volume prev 4 is : ",VolPrevValue4,"\n",
              "Volume prev 5 is : ",VolPrevValue5,"\n",
              "AVG volume is : ",VolAVGVal);
     }

Слабый объем:

   if(VolCurrentValue<VolAVGVal)
     {
      Comment("Weak volume","\n","Current volume is : ",VolCurrentValue,"\n",
              "Volume prev 1 is : ",VolPrevValue1,"\n",
              "Volume prev 2 is : ",VolPrevValue2,"\n",
              "Volume prev 3 is : ",VolPrevValue3,"\n",
              "Volume prev 4 is : ",VolPrevValue4,"\n",
              "Volume prev 5 is : ",VolPrevValue5,"\n",
              "AVG volume is : ",VolAVGVal);
     }

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

 Индикатор Volumes в Навигаторе 3

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

 Окно системы Volume - сила

After clicking OK, it will be attached to the chart:

Система Volume - сила - на графике

Ниже приведен пример сигналов, сгенерированных на основе силы объема:

Сильный объем:

Система Volume - сила - сильный сигнал

Слабый объем:

Система Volume - сила - слабый сигнал

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

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

//+------------------------------------------------------------------+
//|                                          Price&Vol - 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()
  {
//Создаем массивы для цен и объемов
   MqlRates PriceArray[];
   double VolArray[];

//заполнение ценового массива данными
   int Data=CopyRates(_Symbol,_Period,0,3,PriceArray);

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

//определяем Volume
   int VolDef=iVolumes(_Symbol,_Period,VOLUME_TICK);

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

//расчет текущих и предыдущих значений максимумов и объема
   double CurrentHighValue=NormalizeDouble(PriceArray[2].high,5);
   double PrevHighValue=NormalizeDouble(PriceArray[1].high,5);
   double VolCurrentValue=NormalizeDouble(VolArray[0],5);
   double VolPrevValue=NormalizeDouble(VolArray[1],5);

//Условия сигнала на покупку
//Сигнал на покупку
   if(CurrentHighValue>PrevHighValue&&VolCurrentValue>VolPrevValue)
     {
      Comment("Buy Signal during uptrend",
              "\n","Current high is: ",CurrentHighValue,"\n","Previous high is: ",PrevHighValue,
              "\n","Volume current value is: ",VolCurrentValue,"\n","Volumes previous value is: ",VolPrevValue);
     }

//нет сигнала
   if(CurrentHighValue>PrevHighValue&&VolCurrentValue<VolPrevValue)
     {
      Comment("Current high is: ",CurrentHighValue,"\n","Previous high is: ",PrevHighValue,
              "\n","Volume current value is: ",VolCurrentValue,"\n","Volumes previous value is: ",VolPrevValue);
     }
  }
//+------------------------------------------------------------------+

Что добавилось в этом коде:

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

   MqlRates PriceArray[];
   double VolArray[];

Заполняем массив цен с помощью функции CopyRates после создания целочисленной переменной для данных:

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

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

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

Условия стратегии в соответствии со значениями максимумов и объемов:

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

   if(CurrentHighValue>PrevHighValue&&VolCurrentValue>VolPrevValue)
     {
      Comment("Buy Signal during uptrend",
              "\n","Current high is: ",CurrentHighValue,"\n","Previous high is: ",PrevHighValue,
              "\n","Volume current value is: ",VolCurrentValue,"\n","Volumes previous value is: ",VolPrevValue);
     }

Нет сигнала

   if(CurrentHighValue>PrevHighValue&&VolCurrentValue<VolPrevValue)
     {
      Comment("Current high is: ",CurrentHighValue,"\n","Previous high is: ",PrevHighValue,
              "\n","Volume current value is: ",VolCurrentValue,"\n","Volumes previous value is: ",VolPrevValue);
     }

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

Индикатор Volumes в Навигаторе 4

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

Окно системы Price и Vol - Uptrend

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

Система Price и Vol - Uptrend на графике

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

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

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

Price_Vol - Uptrend покупка - текущие значения

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

Price_Vol - Uptrend покупка - предыдущие значения

Нет сигнала

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

Price_Vol - Uptrend - нет сигнала и текущие значения

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

Price_Vol - Uptrend - нет сигнала и предыдущие значения

  • Стратегия четвертая: Цена и Volume — нисходящий тренд

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

//+------------------------------------------------------------------+
//|                                        Price&Vol - 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()
  {
//Создаем массивы для цен и объемов
   MqlRates PriceArray[];
   double VolArray[];

//заполнение ценового массива данными
   int Data=CopyRates(_Symbol,_Period,0,3,PriceArray);

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

//определяем Volume
   int VolDef=iVolumes(_Symbol,_Period,VOLUME_TICK);

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

//расчет текущих и предыдущих значений минимумов и объема
   double CurrentLowValue=NormalizeDouble(PriceArray[2].low,5);
   double PrevLowValue=NormalizeDouble(PriceArray[1].low,5);
   double VolCurrentValue=NormalizeDouble(VolArray[0],5);
   double VolPrevValue=NormalizeDouble(VolArray[1],5);

//Условия для короткого сигнала
//сигнал на открытие короткой сделки
   if(CurrentLowValue<PrevLowValue&&VolCurrentValue>VolPrevValue)
     {
      Comment("Short Signal during downtrend",
              "\n","Current low is: ",CurrentLowValue,"\n","Previous low is: ",PrevLowValue,
              "\n","Volume current value is: ",VolCurrentValue,"\n","Volumes previous value is: ",VolPrevValue);
     }

//нет сигнала
   if(CurrentLowValue<PrevLowValue&&VolCurrentValue<VolPrevValue)
     {
      Comment("Current low is: ",CurrentLowValue,"\n","Previous low is: ",PrevLowValue,
              "\n","Volume current value is: ",VolCurrentValue,"\n","Volumes previous value is: ",VolPrevValue);
     }
  }
//+------------------------------------------------------------------+

Что изменилось в коде:

Условия для генерации сигналов на основе стратегии Price & Vol - downtrend:

Короткий сигнал:

   if(CurrentLowValue<PrevLowValue&&VolCurrentValue>VolPrevValue)
     {
      Comment("Short Signal during downtrend",
              "\n","Current low is: ",CurrentLowValue,"\n","Previous low is: ",PrevLowValue,
              "\n","Volume current value is: ",VolCurrentValue,"\n","Volumes previous value is: ",VolPrevValue);
     }

 Нет сигнала

   if(CurrentLowValue<PrevLowValue&&VolCurrentValue<VolPrevValue)
     {
      Comment("Current low is: ",CurrentLowValue,"\n","Previous low is: ",PrevLowValue,
              "\n","Volume current value is: ",VolCurrentValue,"\n","Volumes previous value is: ",VolPrevValue);
     }

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

Индикатор Volumes в Навигаторе 5

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

Окно системы Price_Vol - Downtrend

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

Система Price и Vol - Downtrend на графике

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

Короткий сигнал:

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

Price_Vol - Downtrend - сигнал короткой сделки и текущие значения

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

Price_Vol - Downtrend - сигнал короткой сделки и предыдущие значения

Нет сигнала

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

Price_Vol - Downtrend - нет сигнала и текущие значения

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

Price_Vol - Downtrend - нет сигнала и предыдущие значения

  • Стратегия пятая: MA и Volumes

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

//+------------------------------------------------------------------+
//|                                              MA&Vol 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()
  {
//Создаем массивы для скользящих средних и значений Volume
   double MAShortArray[],MALongArray[];
   double VolArray[];

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

//определяем MA и Volume
   int MAShortDef = iMA(_Symbol, _Period, 10, 0, MODE_SMA, PRICE_CLOSE);
   int MALongDef = iMA(_Symbol, _Period, 24, 0, MODE_SMA, PRICE_CLOSE);
   int VolDef=iVolumes(_Symbol,_Period,VOLUME_TICK);

//заполняем массивы
   CopyBuffer(MAShortDef,0,0,3,MAShortArray);
   CopyBuffer(MALongDef,0,0,3,MALongArray);
   CopyBuffer(VolDef,0,0,3,VolArray);

//рассчитываем MA и текущие значения объема
   double MAShortCurrentValue=NormalizeDouble(MAShortArray[0],6);
   double MAShortPrevValue=NormalizeDouble(MAShortArray[1],6);
   double MALongCurrentValue=NormalizeDouble(MALongArray[0],6);
   double MALongPrevValue=NormalizeDouble(MALongArray[1],6);
   double VolCurrentValue=NormalizeDouble(VolArray[0],5);
   double VolPrevValue=NormalizeDouble(VolArray[1],5);

//условия сигналов на открытие длинной и короткой сделки
//сигнал на покупку
   if(MAShortCurrentValue>MALongCurrentValue&&MAShortPrevValue<MALongPrevValue
      &&VolCurrentValue>VolPrevValue)
     {
      Comment("Buy signal");
     }

//сигнал на открытие короткой сделки
   if(MAShortCurrentValue<MALongCurrentValue&&MAShortPrevValue>MALongPrevValue
      &&VolCurrentValue>VolPrevValue)
     {
      Comment("Short signal");
     }
  }
//+------------------------------------------------------------------+

Что изменилось в коде:

Создаем массивы для короткой скользящей средней, длинной скользящей средней и объема:

   double MAShortArray[],MALongArray[];
   double VolArray[];

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

   ArraySetAsSeries(MAShortArray,true);
   ArraySetAsSeries(MALongArray,true);
   ArraySetAsSeries(VolArray,true);

Определяем короткую и длинную скользящую среднюю (MA) с помощью функции iMA, которая возвращает хэндл индикатора MA, его параметры (символ, период, средний период, сдвиг по горизонтали, тип сглаживания, который является типом MA, цена расчета), а также определяем объем с помощью функции iVolumes, как уже делали ранее:

   int MAShortDef = iMA(_Symbol, _Period, 10, 0, MODE_SMA, PRICE_CLOSE);
   int MALongDef = iMA(_Symbol, _Period, 24, 0, MODE_SMA, PRICE_CLOSE);
   int VolDef=iVolumes(_Symbol,_Period,VOLUME_TICK);

Заполняем массивы:

   CopyBuffer(MAShortDef,0,0,3,MAShortArray);
   CopyBuffer(MALongDef,0,0,3,MALongArray);
   CopyBuffer(VolDef,0,0,3,VolArray);

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

   double MAShortCurrentValue=NormalizeDouble(MAShortArray[0],6);
   double MAShortPrevValue=NormalizeDouble(MAShortArray[1],6);
   double MALongCurrentValue=NormalizeDouble(MALongArray[0],6);
   double MALongPrevValue=NormalizeDouble(MALongArray[1],6);
   double VolCurrentValue=NormalizeDouble(VolArray[0],5);
   double VolPrevValue=NormalizeDouble(VolArray[1],5);

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

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

   if(MAShortCurrentValue>MALongCurrentValue&&MAShortPrevValue<MALongPrevValue
      &&VolCurrentValue>VolPrevValue)
     {
      Comment("Buy signal");
     }

Короткий сигнал:

   if(MAShortCurrentValue<MALongCurrentValue&&MAShortPrevValue>MALongPrevValue
      &&VolCurrentValue>VolPrevValue)
     {
      Comment("Short signal");
     }

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

Индикатор Volumes в Навигаторе 6

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

Система по стратегии MA_Vol на графике

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

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

MA_Vol сигнал на покупку

Короткий сигнал:

 MA_Vol сигнал на открытие короткой сделки

 


Заключение

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

  • Движение по Volumes — информация об изменениях объемов, растут они или снижаются.
  • Сила по Volumes — информация о силе текущего движения объемов по сравнению со средним значением.
  • Цена и Volumes при восходящем тренде — получение сигнала на покупку во время восходящего тренда на основе движения цены и сопровождающего его объема.
  • Цена и Volumes при нисходящем тренде — получение сигнала на продажу во время нисходящего тренда на основе движения цены и сопровождающего его объема.
  • Стратегия по MA и Volumes — генерация сигналов на покупку и продажу на основе пересечения скользящей средней и соответствующего объема.

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

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

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

Прикрепленные файлы |
Simple_Volumes.mq5 (1.08 KB)
Vol_-_Movement.mq5 (1.54 KB)
Vol_-_Strength.mq5 (2.45 KB)
Нейросети — это просто (Часть 23): Создаём инструмент для Transfer Learning Нейросети — это просто (Часть 23): Создаём инструмент для Transfer Learning
В данной серии статей мы уже не один раз упоминали о Transfer Learning. Но дальше упоминаний пока дело не шло. Я предлагаю заполнить этот пробел. И посмотреть поближе на Transfer Learning.
Разработка торговой системы на основе индикатора MFI Разработка торговой системы на основе индикатора MFI
Это новая статья из серии, в которой мы учимся создавать торговые системы на основе популярных технических индикаторов. На этот раз она посвящена Индексу денежного потока MFI. Мы подробно изучим этот индикатор и разработаем простые торговые системы на MQL5 для исполнения в MetaTrader 5.
DoEasy. Элементы управления (Часть 14): Новый алгоритм именования графических элементов. Продолжаем работу над WinForms-объектом TabControl DoEasy. Элементы управления (Часть 14): Новый алгоритм именования графических элементов. Продолжаем работу над WinForms-объектом TabControl
В статье создадим новый алгоритм именования всех графических элементов для построения пользовательской графики и продолжим разработку WinForms-объекта TabControl.
DoEasy. Элементы управления (Часть 13): Оптимизация взаимодействия WinForms-объектов с мышкой, начало разработки WinForms-объекта TabControl DoEasy. Элементы управления (Часть 13): Оптимизация взаимодействия WinForms-объектов с мышкой, начало разработки WinForms-объекта TabControl
В статье исправим и оптимизируем обработку внешнего вида WinForms-объектов после увода курсора мышки с объекта и начнём разработку WinForms-объекта TabControl.