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

Разработка торговой системы на основе Индекса относительной бодрости Relative Vigor Index

MetaTrader 5Трейдинг | 21 ноября 2022, 08:35
1 536 1
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

Введение

Представляю вашему вниманию новую статью из серии, в которой мы изучаем популярные технические инструменты и учимся создавать на их основе торговые системы. Познакомимся с индикатором Индекса относительной бодрости (Relative Vigor Index, RVI). Тема разбита на несколько разделов:

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

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

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

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


Определение индикатора Relative Vigor Index

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

RVI = (CLOSE - OPEN) / (HIGH - LOW)

где:

CLOSE — цена закрытия;

OPEN — цена открытия;

HIGH — максимум;

LOW — минимум.

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

Расчет первой линии

  • Расчет числителя:

MovAverage = (CLOSE-OPEN) + 2 * (CLOSE-1 - OPEN-1) + 2 * (CLOSE-2 - OPEN-2) + (CLOSE-3 - OPEN-3)

где:

CLOSE — текущая цена закрытия

CLOSE 1, CLOSE 2, CLOSE 3 — цены закрытия 1, 2 и 3 периода назад

OPEN — текущая цена открытия

OPEN 1, OPEN 2, OPEN 3 — цены открытия 1, 2 и 3 периода назад

  • Расчет знаменателя:

RangeAverage = (HIGH-LOW) + 2 x (HIGH-1 - LOW-1) + 2 x (HIGH-2 - LOW-2) + (HIGH-3 - LOW-3)

где:

HIGH — последняя цена максимума

HIGH, HIGH 2, HIGH 3 — цена максимума 1, 2 и 3 периода назад

LOW — последний минимум

LOW 1, LOW 2, LOW 3 — цена минимума 1, 2 и 3 периода назад

  • Рассчитываем сумму этих средних значений:

Средняя RVI

Расчет второй линии

RVIsignal = (RVIaverage + 2 * RVIaverage-1 + 2 * RVIaverage-2 + RVIaverage-3)/6

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

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

Вставка RVI

После выбора индикатора Relative Vigor Index откроется окно с его параметрами:

Параметры RVI

1 - период индикатора

2 - цвет линии RVI

3 - стиль линии RVI

4 - толщина линии RVI

5 - цвет сигнальной линии

6 - стиль сигнальной линии

7 - толщина сигнальной линии

Выбираем подходящие параметры индикатора, нажимаем кнопку OK, и индикатор запустится на графике, как показано ниже:

RVI на графике

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


Стратегии по Relative Vigor Index

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

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

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

Схематично:

RVI > 0 и RVI сигнал > 0 при этом RVI > RVI сигнал --> Покупка

RVI < 0 и RVI сигнал < 0 при этом RVI < RVI сигнал --> Закрытие

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

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

Схематично:

RVI < 0 и RVI сигнал < 0 при этом RVI < RVI сигнал --> Открытие короткой позиции

RVI > 0 и RVI сигнал > 0 при этом RVI > RVI сигнал --> Закрытие 

  • Стратегия третья: пересечение RVI и MA

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

Схематично:

Цена закрытия > 100-периодной скользящей средней и значение RVI > сигнального RVI --> Покупка

Цена закрытия < 100-периодной скользящей средней и значение RVI < сигнального RVI --> Продажа


Схемы стратегий по Relative Vigor Index

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

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

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

  • Текущее значение RVI
  • Текущее значение сигнальной линии RVI
  • Уровень нуля

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

  • Сигнал на покупку
  • Значение Relative Vigor Index
  • Сигнальный RVI

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

  • Сигнал на закрытие
  • Значение Relative Vigor Index
  • Сигнальный RVI

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

Схема стратегии по пересечению RVI при росте

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

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

  • Текущее значение RVI
  • Текущее значение сигнальной линии RVI
  • Уровень нуля

Условия будут немного отличаться. Если текущее значение RVI ниже нуля, сигнальная линия RVI ниже нуля и текущее значение RVI ниже сигнальной линии, торговая система должна вернуть комментарий со следующими значениями:

  • Сигнал на открытие короткой сделки
  • Значение Relative Vigor Index
  • Сигнальный RVI

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

  • Закрыть
  • Значение Relative Vigor Index
  • Сигнальный RVI

Пошаговая схема для разработки торговой системы по этой стратегии:

Схема стратегии по пересечению RVI при тренде вниз

  • Стратегия третья: пересечение RVI и MA

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

  • Цена закрытия
  • 100-периодная скользящая средняя (MA)
  • Текущее значение RVI
  • Текущее значение сигнальной линии RVI

Если цена закрытия выше 100-периодной MA, а текущее значение RVI выше сигнальной линии RVI, нам нужно, чтобы торговая система возвращала следующие значения в качестве комментария к графику:

  • Сигнал на покупку
  • Цена закрытия
  • Значение скользящей средней
  • Значение Relative Vigor Index
  • Сигнальный RVI

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

  • Сигнал на продажу
  • Цена закрытия
  • Значение скользящей средней
  • Значение Relative Vigor Index
  • Сигнальный RVI

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

 Схема стратегии RVI, MA crossover

Торговые системы по Relative Vigor Index

Итак, мы рассмотрели несколько простых стратегий по индикатору RVI и составили схемы разработки. Теперь перейдем непосредственно к написанию кодов торговых систем. Для начала напишем простую систему, возвращающую текущее значение RVI в виде комментария на графике. Рассмотрим все шаги создания кода такой системы.

Создаем два массива для RVI и сигнального RVI с помощью функции double:

   double rviArray[];
   double rviSignalArray[];

Установим флаг сортировки как в таймсерии AS_SERIES с помощью функции ArraySetAsSeries, которая возвращает true или false:

   ArraySetAsSeries(rviArray,true);
   ArraySetAsSeries(rviSignalArray,true);

Определяем Индекс относительной бодрости с помощью функции iRVI, которая возвращает хэндл индикатора. Параметры функции:

  • symbol — имя символа; у нас это "_Symbol", то есть рассчитываем индикатор по символу текущего графика. 
  • period — таймфрейм для расчета; значение "_Period" означает, что индикатор будет рассчитываться на текущем таймфрейме. 
  •  ma_period — период усреднения, мы будем использовать 10.
int rviDef = iRVI(_Symbol,_Period,10);

Получаем данные из буфера индикатора RVI с помощью функции CopyBuffer. Параметры функции: 

  • indicator_handle — стандартный хэндл индикатора rviDef, rviDef
  • buffer_num — номер индикаторного буфера, установим 0, 1
  • start_pos — установим позицию начала расчета, укажем 0, 0
  • count — количество данных для копирования, укажем 3, 3
  • buffer[] — определяем ценовой массив для копирования, у нас это rviArray, rviSignalArray
   CopyBuffer(rviDef,0,0,3,rviArray);
   CopyBuffer(rviDef,1,0,3,rviSignalArray);

Определяем значения RVI и сигнального RVI с помощью функции NormalizeDouble, которая возвращает значение типа double. Параметры функции:

  • value — нормализуемое число: rviArray[0], rviSignalArray[0].
  • digits — количество знаков после запятой: 3.
   double rviVal = NormalizeDouble(rviArray[0],3);
   double rviSignalVal = NormalizeDouble(rviSignalArray[0],3);

С помощью функции Comment выводим на график комментарий с текущим значением индикатора RVI.

   Comment("Relative Vigor Index Value is ",rviVal,"\n",
           "RVI Signal Value is ",rviSignalVal);

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

//+------------------------------------------------------------------+
//|                                                   Simple RVI.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 rviArray[];
   double rviSignalArray[];

   ArraySetAsSeries(rviArray,true);
   ArraySetAsSeries(rviSignalArray,true);

   int rviDef = iRVI(_Symbol,_Period,10);

   CopyBuffer(rviDef,0,0,3,rviArray);
   CopyBuffer(rviDef,1,0,3,rviSignalArray);

   double rviVal = NormalizeDouble(rviArray[0],3);
   double rviSignalVal = NormalizeDouble(rviSignalArray[0],3);

   Comment("Relative Vigor Index Value is ",rviVal,"\n",
           "RVI Signal Value is ",rviSignalVal);

  }
//+------------------------------------------------------------------+

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

 RVI в навигаторе

Двойным кликом запускаем систему на исполнение в терминале, откроется окно настроек советника:

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

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

 Программа Simple RVI на графике

Программа работает и генерирует сигналы. Пример сигнала на графике:

Сигнал от советника Simple RVI

Как видите, в верхнем левом углу графика у нас есть комментарий с текущим значением RVI.

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

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

//+------------------------------------------------------------------+
//|                                      RVI Crossover - 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()
  {
   double rviArray[];
   double rviSignalArray[];

   ArraySetAsSeries(rviArray,true);
   ArraySetAsSeries(rviSignalArray,true);

   int rviDef = iRVI(_Symbol,_Period,10);

   CopyBuffer(rviDef,0,0,3,rviArray);
   CopyBuffer(rviDef,1,0,3,rviSignalArray);

   double rviVal = NormalizeDouble(rviArray[0],3);
   double rviSignalVal = NormalizeDouble(rviSignalArray[0],3);

   if(rviVal>0 && rviSignalVal>0 && rviVal>rviSignalVal)
     {
      Comment("Buy Signal","\n",
              "Relative Vigor Index Value is ",rviVal,"\n",
              "RVI Signal Value is ",rviSignalVal);
     }
   if(rviVal<0 && rviSignalVal<0 && rviVal<rviSignalVal)
     {
      Comment("Close","\n",
              "Relative Vigor Index Value is ",rviVal,"\n",
              "RVI Signal Value is ",rviSignalVal);
     }


  }
//+------------------------------------------------------------------+

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

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

С сигналом на покупку

   if(rviVal>0 && rviSignalVal>0 && rviVal>rviSignalVal)
     {
      Comment("Buy Signal","\n",
              "Relative Vigor Index Value is ",rviVal,"\n",
              "RVI Signal Value is ",rviSignalVal);
     }

Сигнал на закрытие

   if(rviVal<0 && rviSignalVal<0 && rviVal<rviSignalVal)
     {
      Comment("Close","\n",
              "Relative Vigor Index Value is ",rviVal,"\n",
              "RVI Signal Value is ",rviSignalVal);
     }

Снова компилируем код, находим в Навигаторе и запускаем на графике. Эксперт прикреплен к графику так же, как показано ниже:

Система по пересечению RVI при росте на графике

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

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

 RVI crossover - U - сигнал на покупку

В верхнем левом углу графика отображается комментарий с сигналом и следующими значениями:

  • Сигнал на покупку
  • Значение Relative Vigor Index
  • Значение сигнальной линии RVI

В случае сигнала на закрытие:

 RVI crossover - U - сигнал на закрытие

В верхнем левом углу графика отображается комментарий с сигналом и следующими значениями:

  • Закрытие
  • Значение Relative Vigor Index
  • Значение сигнальной линии RVI

Это были сигналы от торговой системы по рассмотренной ранее стратегии, которая работает на восходящем тренде.

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

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

//+------------------------------------------------------------------+
//|                                    RVI Crossover - 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()
  {
   double rviArray[];
   double rviSignalArray[];

   ArraySetAsSeries(rviArray,true);
   ArraySetAsSeries(rviSignalArray,true);

   int rviDef = iRVI(_Symbol,_Period,10);

   CopyBuffer(rviDef,0,0,3,rviArray);
   CopyBuffer(rviDef,1,0,3,rviSignalArray);

   double rviVal = NormalizeDouble(rviArray[0],3);
   double rviSignalVal = NormalizeDouble(rviSignalArray[0],3);

   if(rviVal<0 && rviSignalVal<0 && rviVal<rviSignalVal)
     {
      Comment("Short Signal","\n",
              "Relative Vigor Index Value is ",rviVal,"\n",
              "RVI Signal Value is ",rviSignalVal);
     }
   if(rviVal>0 && rviSignalVal>0 && rviVal>rviSignalVal)
     {
      Comment("Cover","\n",
              "Relative Vigor Index Value is ",rviVal,"\n",
              "RVI Signal Value is ",rviSignalVal);
     }
  }
//+------------------------------------------------------------------+  

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

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

С коротким сигналом

   if(rviVal<0 && rviSignalVal<0 && rviVal<rviSignalVal)
     {
      Comment("Short Signal","\n",
              "Relative Vigor Index Value is ",rviVal,"\n",
              "RVI Signal Value is ",rviSignalVal);
     }

Сигнал на закрытие

   if(rviVal>0 && rviSignalVal>0 && rviVal>rviSignalVal)
     {
      Comment("Cover","\n",
              "Relative Vigor Index Value is ",rviVal,"\n",
              "RVI Signal Value is ",rviSignalVal);
     }

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

 Система по стратегии RVI crossover - D на графике

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

В случае короткого сигнала:

 RVI crossover - D - короткий

В верхнем левом углу графика отображается комментарий с сигналом и следующими значениями:

  • Короткая сделка
  • Значение Relative Vigor Index
  • Значение сигнальной линии RVI 

Сигнал на закрытие

RVI crossover - D - сигнал на закрытие

Как видим, у нас есть сигнал и следующие значения:

  • Закрыть
  • Значение Relative Vigor Index
  • Значение сигнальной линии RVI

Итак, мы создали торговую систему на основе стратегии RVI Crossover - Downtrend для работы в нисходящем тренде.

  • Стратегия третья: пересечение RVI и MA

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

//+------------------------------------------------------------------+
//|                                           RVI & MA Crossover.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 pArray[];
   double maArray[];
   double rviArray[];
   double rviSignalArray[];

   int Data=CopyRates(_Symbol,_Period,0,1,pArray);
   ArraySetAsSeries(maArray,true);
   ArraySetAsSeries(rviArray,true);
   ArraySetAsSeries(rviSignalArray,true);

   int rviDef = iRVI(_Symbol,_Period,10);
   int maDef = iMA(_Symbol,_Period,100,0,MODE_EMA,PRICE_CLOSE);

   CopyBuffer(rviDef,0,0,3,rviArray);
   CopyBuffer(rviDef,1,0,3,rviSignalArray);
   CopyBuffer(maDef,0,0,3,maArray);

   double rviVal = NormalizeDouble(rviArray[0],3);
   double rviSignalVal = NormalizeDouble(rviSignalArray[0],3);
   double maVal = NormalizeDouble(maArray[0],3);

   if(pArray[0].close>maVal && rviVal>rviSignalVal)
     {
      Comment("Buy Signal","\n",
              "Closing price is ",pArray[0].close,"\n",
              "MA Value is ",maVal,"\n",
              "Relative Vigor Index Value is ",rviVal,"\n",
              "RVI Signal Value is ",rviSignalVal);
     }
   if(pArray[0].close<maVal && rviVal<rviSignalVal)
     {
      Comment("Sell Signal","\n",
              "Closing price is ",pArray[0].close,"\n",
              "MA Value is ",maVal,"\n",
              "Relative Vigor Index Value is ",rviVal,"\n",
              "RVI Signal Value is ",rviSignalVal);
     }


  }
//+------------------------------------------------------------------+

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

Создаем четыре массива (pArray, maArray, rviArray, rviSignalArray). Будем использовать функцию double, но вместо pArray используем функцию MqlRates, которая хранит информацию о цене, объеме и спреде.

   MqlRates pArray[];
   double maArray[];
   double rviArray[];
   double rviSignalArray[];

Установим флаг сортировки как в таймсерии AS_SERIES с помощью функции ArraySetAsSeries, которая возвращает true или false. Для заполнения массива используем функцию CopyRates, чтобы получить исторические данные MqlRates. Параметры функции:

  • symbol — имя символа; у нас это "_Symbol", то есть рассчитываем индикатор по символу текущего графика.
  • period — таймфрейм для расчета; значение _Period означает, что индикатор будет рассчитываться на текущем таймфрейме
  • start_pos — установим позицию начала расчета, укажем 0 
  • count — количество данных для копирования, укажем 1
  • rates_array[] — массив, в который копируем данные
   int Data=CopyRates(_Symbol,_Period,0,1,pArray);
   ArraySetAsSeries(maArray,true);
   ArraySetAsSeries(rviArray,true);
   ArraySetAsSeries(rviSignalArray,true);

Для определения индикатора RVI используем функцию iRVI, а для скользящего среднего используем iMA, которая возвращает хэндл индикатора MA. Параметры функции iMA:

  • symbol — имя символа, _Symbol 
  • period — таймфрейм расчета среднего (_period)
  • ma_period — период расчета среднего, у нас это будет 100 
  • ma_shift — горизонтальный сдвиг, установим в значение 0 
  • ma_method — тип сглаживания скользящей средней; мы будем использовать экспоненциальное. 
  • applied_price — определяет тип цены, используемой для расчета; используем цену закрытия 
   int rviDef = iRVI(_Symbol,_Period,10);
   int maDef = iMA(_Symbol,_Period,100,0,MODE_EMA,PRICE_CLOSE);

Получаем данных из буфера индикаторов RVI и MA с помощью функции "CopyBuffer".

   CopyBuffer(rviDef,0,0,3,rviArray);
   CopyBuffer(rviDef,1,0,3,rviSignalArray);
   CopyBuffer(maDef,0,0,3,maArray);

Определяем значения RVI, сигнального RVI и средней с помощью функции NormalizeDouble.

   double rviVal = NormalizeDouble(rviArray[0],3);
   double rviSignalVal = NormalizeDouble(rviSignalArray[0],3);
   double maVal = NormalizeDouble(maArray[0],3);

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

С сигналом на покупку

   if(pArray[0].close>maVal && rviVal>rviSignalVal)
     {
      Comment("Buy Signal","\n",
              "Closing price is ",pArray[0].close,"\n",
              "MA Value is ",maVal,"\n",
              "Relative Vigor Index Value is ",rviVal,"\n",
              "RVI Signal Value is ",rviSignalVal);
     }

С сигналом на продажу

   if(pArray[0].close<maVal && rviVal<rviSignalVal)
     {
      Comment("Sell Signal","\n",
              "Closing price is ",pArray[0].close,"\n",
              "MA Value is ",maVal,"\n",
              "Relative Vigor Index Value is ",rviVal,"\n",
              "RVI Signal Value is ",rviSignalVal);
     }

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

 Система RVI, MA на графике

Торговая система работает и генерирует сигналы в соответствии с заложенной стратегией, и выглядят они вот так.

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

 RVI, MA crossover - сигнал на покупку

В верхнем левом углу графика отображается комментарий с сигналом и следующими значениями:

  • Сигнал на покупку
  • Цена закрытия
  • Значение скользящей средней
  • Значение Relative Vigor Index
  • Сигнальный RVI

Сигнал на продажу

RVI, MA crossover - сигнал на продажу

У нас есть сигнал со следующими значениями:

  • Сигнал на продажу
  • Цена закрытия
  • Значение скользящей средней
  • Значение Relative Vigor Index
  • Сигнальный RVI

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


Заключение

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

  • RVI Crossover - Uptrend: формирование сигналов на покупку и закрытие при растущем тренде.
  • RVI Crossover - Downtrend: генерирует короткие сигналы и сигналы на закрытие во время нисходящего тренда.
  • RVI & MA Crossover: сигналы на покупку и продажу на основе пересечений двух индикаторов.

Мы разработали пошаговые схемы для каждой рассмотренной стратегии, которые помогают при написании кода торговых систем. Также мы создали автоматические системы на основе каждой из рассмотренных стратегий. Они предназначены для работы в терминале MetaTrader 5.

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

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

Прикрепленные файлы |
Simple_RVI.mq5 (1.12 KB)
Последние комментарии | Перейти к обсуждению на форуме трейдеров (1)
[Удален] | 23 нояб. 2022 в 07:13
Всё очень красиво, прекрасно, великолепно. Кроме одного - гарантия слива депозита
Нелинейные индикаторы Нелинейные индикаторы
В этой статье мы сделаем попытку рассмотреть некоторые способы построения нелинейных индикаторов и их использование в трейдинге. В торговой платформе MetaTrader довольно много индикаторов, которые используют нелинейные подходы.
DoEasy. Элементы управления (Часть 27): Продолжаем работу над WinForms-объектом "ProgressBar" DoEasy. Элементы управления (Часть 27): Продолжаем работу над WinForms-объектом "ProgressBar"
В статье продолжим разработку элемента управления ProgressBar. Создадим функционал для управления полосой прогресса и визуальными эффектами.
Популяционные алгоритмы оптимизации: Искуственная Пчелиная Колония (Artificial Bee Colony - ABC) Популяционные алгоритмы оптимизации: Искуственная Пчелиная Колония (Artificial Bee Colony - ABC)
Сегодня изучим алгоритм искусственной пчелиной колонии. Дополним наши знания новыми принципами исследования функциональных пространств. В данной статье я расскажу о моей интерпретации классического варианта алгоритма.
Нейросети — это просто (Часть 33): Квантильная регрессия в распределенном Q-обучении Нейросети — это просто (Часть 33): Квантильная регрессия в распределенном Q-обучении
Продолжаем изучение распределенного Q-обучение. И сегодня мы посмотрим на данный подход с другой стороны. О возможности использования квантильной регрессии в решение вопрос прогнозирования ценовых движений.