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

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

MetaTrader 5Трейдинг | 26 августа 2022, 07:59
1 578 3
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

Введение

Представляю вашему вниманию новую статью из серии, в которой мы учимся создавать торговые системы на основе популярных технических индикаторов. На этот раз мы изучим новый технический инструмент, посмотрим, как его можно использовать в торговле и чем он может быть полезен. Для лучшего понимания рассмотрим несколько простых стратегий. Этот инструмент — индикатор стандартного отклонения Standard Deviation. Для детального изучения индикатора работу снова разобьем на несколько подразделов:

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

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

В этой статье будем использовать MetaTrader 5 и встроенный редактор MetaEditor для написания кода на MQL5. Если не знаете, как установить MetaTrader 5 или использовать MetaEditor, почитайте раздел "Как написать MQL5-код в редакторе MetaEditor" из одной из моих предыдущих статей.

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

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

Приступим к изучению нового индикатора в нашем арсенале.


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

В первом разделе познакомимся с самой идеей индикатора стандартного отклонения (Standard Deviation), узнаем, что он измеряет и как можно рассчитать его вручную. Затем рассмотрим расчет индикатора на конкретном примере, чтобы лучше понять.

Стандартное отклонение — термин в статистике. Оно измеряет дисперсию вокруг среднего значения. Но что такое дисперсия? Простыми словами, это разница между любым фактическим значением и средним. Чем выше дисперсия, тем выше стандартное отклонение. Чем ниже дисперсия, тем ниже стандартное отклонение. Индикатор стандартного отклонения измеряет волатильность цен.

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

1. Рассчитать среднее значение за желаемый период.

2. Рассчитать отклонение, вычитая каждую цену закрытия из среднего значения.

3. Возвести в квадрат каждое расчетное отклонение.

4. Сложить квадраты отклонений и разделить на количество значений.

5. Рассчитать стандартное отклонение, равное квадратному корню из результата четвертого шага.

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

# Цена закрытия
1 1.05535
2 1.05829
3 1.0518
4 1.04411
5 1.04827
6 1.04261
7 1.04221
8 1.02656
9 1.01810
10 1.01587
11 1.01831

Шаг первый: рассчитаем 10-периодную скользящую среднюю, при этому будем считать, что все МА до десятой — одна и та же скользящая средняя. Итак, получаем вот такой результат расчетов.

Шаг 1

Шаг второй: вычислим отклонение. Получаем такие результаты.

Шаг 2

Шаг третий: рассчитаем квадрат отклонений.

Шаг третий

Шаг четвертый: вычисляем среднее значение квадрата отклонения за 10 периодов.

Шаг 4

Шаг пятый: рассчитаем Стандартное отклонение = Квадратный корень из результата четвертого шага.

Шаг 5

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

В торговой платформе MetaTrader 5 выбираем меню "Вставка" --> Индикаторы --> Трендовые --> Standard Deviation.

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

После этого откроется окно с параметрами индикатора.

 Параметры Std Dev

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

2 - горизонтальный сдвиг линии индикатора, который при желании можно установить

3 - тип скользящей средней

4 - тип цены, используемой в расчетах

5 - цвет линии индикатора

6 - стиль линии индикатора

7 - толщина линии

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

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

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


Стратегия по стандартному отклонению

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

  • Стратегия первая: Стандартное отклонение и волатильность

В этой стратегии мы измеряем волатильность. Для этого сравниваем текущее стандартное отклонение (Std) и среднее значение предыдущих пяти отклонений (AVG). Если текущее стандартное отклонение больше 5-периодного среднего, это будет сигналом высокой волатильности. Если текущее стандартное отклонение меньше 5-периодного среднего, это низкая волатильность.

Текущее Std > Std AVG --> высокая волатильность

Текущее Std < Std AVG --> низкая волатильность

  • Стратегия вторая: Стандартное отклонение и скользящая средняя

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

Текущее Std > Предыдущее Std и Ask > MA --> Сигнал на покупку

Текущее Std > Предыдущее Std и Bid < MA --> Сигнал на продажу

  • Стратегия третья: Стандартное отклонение, волатильность и скользящая средняя

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

Текущее Std > Std Avg и Ask > MA --> Сигнал на покупку

Текущее Std > Std Avg и Bid < MA --> Сигнал на продажу

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


Схема разработки стратегии по стандартному отклонению

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

  • Стратегия первая: Стандартное отклонение и волатильность

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

  • High Volatility (высокая волатильность)
  • Текущее значение стандартного отклонения
  • Среднее стандартное отклонение за 5 периодов.

Если текущее Std Dev ниже 5-периодного среднего, нужно вывести на график комментарий о низкой волатильности и значения:

  • Low Volatility (низкая волатильность).
  • Текущее значение стандартного отклонения
  • Среднее стандартное отклонение за 5 периодов.
На следующем рисунке показан пошаговый план простой стратегии "Стандартное отклонение и волатильность".

Схема стратегии: Стандартное отклонение и волатильность

  • Стратегия вторая: Стандартное отклонение и скользящая средняя

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

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

  • Сигнал на покупку
  • Текущее значение стандартного отклонения
  • Предыдущее значение стандартного отклонения
  • Значение Ask
  • Значение скользящей средней

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

  • Сигнал на продажу
  • Текущее значение стандартного отклонения
  • Предыдущее значение стандартного отклонения
  • Значение цены Bid
  • Значение скользящей средней
На следующем рисунке показан пошаговый план простой стратегии "Стандартное отклонение и скользящая средняя".

 Схема стратегии Simple Std Dev - Std _ MA

  • Стратегия третья: Стандартное отклонение, волатильность и скользящая средняя

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

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

  • Сигнал на покупку
  • Текущее значение стандартного отклонения
  • Среднее стандартных отклонений
  • Значение Ask
  • Значение скользящей средней

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

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

Схема стратегии Simple Std Dev - Std Dev _ AVG _ MA

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


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

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

  • Создаем массив с помощью double-функции, которая представляет значения с плавающей точкой. Тип double — это один из дробных типов данных.
double StdDevArray[];
  • Сортируем созданный массив, начиная с текущих данных, для этого будем использовать функцию ArraySetAsSeries — она возвращает true в случае успеха или false в случае неудачи (bool). Параметры функции ArraySetAsSeries:
    • Массив[]
    • Флаг
ArraySetAsSeries(StdDevArray,true);
  • Создаем переменную типа integer StdDevDef для определения стандартного отклонения с помощью функции iStdDev, которая возвращает дескриптор индикатора Standard Deviation. Параметры этой функции:
    • symbol — имя символа; если указать "_Symbol", то индикатор будет рассчитываться по символу текущего графика.
    • period — таймфрейм для расчета; значение "_Period" означает, что индикатор будет рассчитываться на текущем таймфрейме.
    • ma_period — период скользящей средней, будем использовать значение по умолчанию 20.
    • ma_shift — при необходимости можно задать горизонтальный сдвиг, установим в значение 0.
    • ma_method — тип сглаживания скользящей средней; мы будем использовать простое (MODE_SMA).
    • applied_price — определяет тип цены, используемой для расчета; используем цену закрытия (PRICE_CLOSE).
int StdDevDef = iStdDev(_Symbol,_Period,20,0,MODE_SMA,PRICE_CLOSE);
  • Копируем ценовые данные в массив StdDev, используя функцию CopyBuffer. Она возвращает количество скопированных данных или -1 в случае ошибки. Параметры этой функции:
    • indicator_handle — хэндл индикатора StdDevDef.
    • buffer_num — номер индикаторного буфера, установим 0.
    • start_pos — установим позицию начала расчета, укажем 0.
    • count — количество данных для копирования, укажем 3.
    • buffer[] — определяем ценовой массив для копирования, у нас это StdDevArray.
CopyBuffer(StdDevDef,0,0,3,StdDevArray);
  • Получаем значение StdDev с помощью функции типа double NormalizeDouble. Для этого создаем переменную типа double StdDevVal. Параметры функции Normalizedouble:
    • value — нормализуемой число, укажем тут StdDevArray[0]
    • digits — количество знаков после запятой, установим 6.
double StdDevVal = NormalizeDouble(StdDevArray[0],6);
  • Добавим вывод комментария на график с помощью функции Comment. У нее нет возвращаемого значения, она просто выводит комментарий на график инструмента.
Comment("StdDev Value is",StdDevVal);

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

Std Dev в Навигаторе 1

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

Окно программы Simple Std Dev

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

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

Как видите, в правом верхнем углу графика появилась индикация, что на графике работает советник.

Ниже показаны примеры комментариев, сгенерированных при тестировании этой стратегии.

Комментарии от Simple Std Dev

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

 Одинаковые значения Simple Std Dev

 

  • Стратегия первая: Стандартное отклонение и волатильность

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

//+------------------------------------------------------------------+
//|                                  Simple Std Dev - Volatility.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 StdDevArray[];

   ArraySetAsSeries(StdDevArray,true);

   int StdDevDef = iStdDev(_Symbol,_Period,20,0,MODE_SMA,PRICE_CLOSE);

   CopyBuffer(StdDevDef,0,0,6,StdDevArray);

   double StdDevVal = NormalizeDouble(StdDevArray[0],6);
   double StdDevVal1 = NormalizeDouble(StdDevArray[1],6);
   double StdDevVal2 = NormalizeDouble(StdDevArray[2],6);
   double StdDevVal3 = NormalizeDouble(StdDevArray[3],6);
   double StdDevVal4 = NormalizeDouble(StdDevArray[4],6);
   double StdDevVal5 = NormalizeDouble(StdDevArray[5],6);
   double StdDevAVGVal = ((StdDevVal1+StdDevVal2+StdDevVal3+StdDevVal4+StdDevVal5)/5);

   if(StdDevVal>StdDevAVGVal)
     {
      Comment("High volatility","\n",
              "Current Std Dev value is ",StdDevVal,"\n",
              "Std Dev Avg value is ",StdDevAVGVal);
     }

   if(StdDevVal<StdDevAVGVal)
     {
      Comment("Low volatility","\n",
              "Current Std Dev value is ",StdDevVal,"\n",
              "Std Dev Avg value is ",StdDevAVGVal);
     }

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

В этом коде к имеющимся функциям добавились новые части.

Здесь мы определяем не только текущее значение Std Dev, но и предыдущие пять значений, используя ту же функцию определения стандартного отклонения. Но параметр в NormalizeDouble будет другим.

double StdDevVal1 = NormalizeDouble(StdDevArray[1],6);
double StdDevVal2 = NormalizeDouble(StdDevArray[2],6);
double StdDevVal3 = NormalizeDouble(StdDevArray[3],6);
double StdDevVal4 = NormalizeDouble(StdDevArray[4],6);
double StdDevVal5 = NormalizeDouble(StdDevArray[5],6);

Далее нужно рассчитать среднее значение от предыдущих пяти.

double StdDevAVGVal = ((StdDevVal1+StdDevVal2+StdDevVal3+StdDevVal4+StdDevVal5)/5);

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

В случае высокой волатильности

   if(StdDevVal>StdDevAVGVal)
     {
      Comment("High volatility","\n",
              "Current Std Dev value is ",StdDevVal,"\n",
              "Std Dev Avg value is ",StdDevAVGVal);
     }

В случае низкой волатильности

   if(StdDevVal<StdDevAVGVal)
     {
      Comment("Low volatility","\n",
              "Current Std Dev value is ",StdDevVal,"\n",
              "Std Dev Avg value is ",StdDevAVGVal);
     }

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

 Std Dev в Навигаторе 2

Запускаем двойным кликом на файле или перетаскиваем на график. После этого снова появится окно советника.

 Окно стратегии Simple Std Dev - Volatility

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

Стратегия Simple Std Dev - Volatility на графике

Снова видно, что советник запустился на графике — в правом верхнем углу графика появился соответствующий значок.

Вот такие примеры сгенерированных сигналов мы получили при тестировании торговой системы:

Пример сигнала при высокой волатильности

 Simple Std Dev - Volatility - высокая волатильность

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

  • Сигнал о высокой волатильности
  • Текущее значение стандартного отклонения
  • Среднее пяти предыдущих значений стандартного отклонения

Пример сигнала при низкой волатильности

Simple Std Dev - Volatility - низкая волатильность

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

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

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

//+------------------------------------------------------------------+
//|                                    Simple Std Dev - Std & MA.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 Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
   double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);

   double StdDevArray[];
   double PArray[];

   ArraySetAsSeries(StdDevArray,true);
   ArraySetAsSeries(PArray,true);

   int StdDevDef = iStdDev(_Symbol,_Period,20,0,MODE_SMA,PRICE_CLOSE);
   int MADef = iMA(_Symbol,_Period,10,0,MODE_SMA,PRICE_CLOSE);

   CopyBuffer(StdDevDef,0,0,3,StdDevArray);
   CopyBuffer(MADef,0,0,10,PArray);

   double StdDevVal = NormalizeDouble(StdDevArray[0],6);
   double StdDevVal1 = NormalizeDouble(StdDevArray[1],6);

   double MAValue = NormalizeDouble(PArray[0],6);


   if(StdDevVal>StdDevVal1&&Ask>MAValue)
     {
      Comment("Buy signal","\n",
              "Current Std Dev value is ",StdDevVal,"\n",
              "Previous Std Dev value is ",StdDevVal1,"\n",
              "Ask value is ",Ask,"\n",
              "MA value is ",MAValue);
     }

   if(StdDevVal>StdDevVal1&&Bid<MAValue)
     {
      Comment("Sell signal","\n",
              "Current Std Dev value is ",StdDevVal,"\n",
              "Previous Std Dev value is ",StdDevVal1,"\n",
              "Bid value is ",Bid,"\n",
              "MA value is ",MAValue);
     }

  }

//+------------------------------------------------------------------+

Какие отличия появились в этом коде:

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

  • symbol — имя символа; у нас это "_Symbol", то есть рассчитываем индикатор по символу текущего графика.
  • prop_id — определяем свойство. В нашем случае это SYMBOL_ASK.
double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);

Создаем еще один массив цен.

double PArray[];

Сортируем массив от текущих данных.

ArraySetAsSeries(PArray,true);

Определяем скользящую среднюю с помощью функции iMA. Для этого создаем целочисленную переменную MADef.

int MADef = iMA(_Symbol,_Period,10,0,MODE_SMA,PRICE_CLOSE);

Копируем ценовые данные в созданный массив.

CopyBuffer(MADef,0,0,10,PArray);

Определяем предыдущее значение Std Dev.

double StdDevVal1 = NormalizeDouble(StdDevArray[1],6);

Определяем значение скользящей средней.

double MAValue = NormalizeDouble(PArray[0],6);

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

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

   if(StdDevVal>StdDevVal1&&Ask>MAValue)
     {
      Comment("Buy signal","\n",
              "Current Std Dev value is ",StdDevVal,"\n",
              "Previous Std Dev value is ",StdDevVal1,"\n",
              "Ask value is ",Ask,"\n",
              "MA value is ",MAValue);
     }

В случае сигнала на продажу:

   if(StdDevVal>StdDevVal1&&Bid<MAValue)
     {
      Comment("Sell signal","\n",
              "Current Std Dev value is ",StdDevVal,"\n",
              "Previous Std Dev value is ",StdDevVal1,"\n",
              "Bid value is ",Bid,"\n",
              "MA value is ",MAValue);
     }

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

 Std Dev в Навигаторе 3

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

Окно программы Simple Std Dev MA

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

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

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

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

 Simple Std Dev - Std _ MA - сигнал на покупку

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

  • Сигнал на покупку
  • Текущее значение стандартного отклонения
  • Предыдущее значение стандартного отклонения
  • Значение Ask
  • Значение MA

В случае сигнала на продажу:

 Simple Std Dev - Std _ MA - сигнал на продажу

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

  • Сигнал на продажу
  • Текущее значение стандартного отклонения
  • Предыдущее значение стандартного отклонения
  • Значение цены Bid
  • Значение MA

Это был код стратегии, которая измеряет волатильность по стандартному отклонению, а также проверяет положение цен Ask и Bid относительно скользящей средней и формирует соответствующий сигнал - на покупку или продажу.

  • Стратегия третья: Стандартное отклонение, волатильность и скользящая средняя

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

//+------------------------------------------------------------------+
//|                  Simple Std Dev - Std Dev & AVG Std Dev & MA.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 Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
   double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
   
   double StdDevArray[];
   double PArray[];

   ArraySetAsSeries(StdDevArray,true);
   ArraySetAsSeries(PArray,true);

   int StdDevDef = iStdDev(_Symbol,_Period,20,0,MODE_SMA,PRICE_CLOSE);
   int MADef = iMA(_Symbol,_Period,10,0,MODE_SMA,PRICE_CLOSE);

   CopyBuffer(StdDevDef,0,0,6,StdDevArray);
   CopyBuffer(MADef,0,0,10,PArray);

   double StdDevVal = NormalizeDouble(StdDevArray[0],6);
   double StdDevVal1 = NormalizeDouble(StdDevArray[1],6);
   double StdDevVal2 = NormalizeDouble(StdDevArray[2],6);
   double StdDevVal3 = NormalizeDouble(StdDevArray[3],6);
   double StdDevVal4 = NormalizeDouble(StdDevArray[4],6);
   double StdDevVal5 = NormalizeDouble(StdDevArray[5],6);
   double StdDevAVGVal = ((StdDevVal1+StdDevVal2+StdDevVal3+StdDevVal4+StdDevVal5)/5);
   double MAValue = NormalizeDouble(PArray[0],6);

   if(StdDevVal>StdDevAVGVal&&Ask>MAValue)
     {
      Comment("Buy signal","\n",
              "Current Std Dev value is ",StdDevVal,"\n",
              "Std Dev Avg value is ",StdDevAVGVal,"\n",
              "Ask value is ",Ask,"\n",
              "MA value is ",MAValue);
     }

   if(StdDevVal>StdDevAVGVal&&Bid<MAValue)
     {
      Comment("Sell signal","\n",
              "Current Std Dev value is ",StdDevVal,"\n",
              "Std Dev Avg value is ",StdDevAVGVal,"\n",
              "Bid value is ",Bid,"\n",
              "MA value is ",MAValue);
     }

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

Что изменилось в коде по сравнению с предыдущим:

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

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

   if(StdDevVal>StdDevAVGVal&&Ask>MAValue)
     {
      Comment("Buy signal","\n",
              "Current Std Dev value is ",StdDevVal,"\n",
              "Std Dev Avg value is ",StdDevAVGVal,"\n",
              "Ask value is ",Ask,"\n",
              "MA value is ",MAValue);
     }

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

   if(StdDevVal>StdDevAVGVal&&Bid<MAValue)
     {
      Comment("Sell signal","\n",
              "Current Std Dev value is ",StdDevVal,"\n",
              "Std Dev Avg value is ",StdDevAVGVal,"\n",
              "Bid value is ",Bid,"\n",
              "MA value is ",MAValue);
     }

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

 Std Dev в Навигаторе 4

Запускаем двойным кликом на файле или перетаскиваем на график. После этого появится окно советника (в окне всегда для советника разрешаем автоматическую торговлю):

Окно программы Simple Std Dev - Std Dev _ AVG _ MA

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

 Программа Simple Std Dev - Std Dev _ AVG _ MA на графике

Как видите, в правом верхнем углу графика появилась индикация, что на графике работает советник.

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

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

Simple Std Dev - Std Dev _ AVG _ MA - сигнал на покупку

На скриншоте выше в левом верхнем углу графика отображается комментарий из пяти строк:

  • Сигнал на покупку
  • Текущее значение стандартного отклонения
  • Среднее стандартных отклонений
  • Значение Ask
  • Значение MA

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

 Simple Std Dev - Std Dev _ AVG _ MA - сигнал на продажу

Снова комментарий на графике - на этот раз с сигналом на продажу и значениями индикаторов:

  • Сигнал на продажу
  • Текущее значение стандартного отклонения
  • Среднее стандартных отклонений
  • Значение цены Bid
  • Значение MA

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


Заключение

Эта статья была посвящена индикатору стандартного отклонения Standard Deviation. Мы узнали, что он измеряет, для чего используется и как рассчитывается, также посмотрели пример расчета с использованием реальных данных. На примере простых стратегий мы посмотрели, как можно использовать стандартное отклонение в торговле. Так, мы рассмотрели стратегию, которая измеряет волатильность по значению стандартного отклонения. Также мы увидели, что в сочетании с дополнительными индикаторами (MA) и значениями индикатор можно использовать для генерации сигналов на покупку и продажу. Мы разработали пошаговые схемы для каждой рассмотренной стратегии, которые используются в разработке торговых систем на их основе. И наконец, мы создали торговые системы на MQL5 на основе этих рассмотренных стратегий. Они предназначены для использования в платформе MetaTrader 5 для автоматической генерации сигналов. Они помогут сэкономить время, получать более точные сигналы, при этом исключить эмоции и субъективизм — в этом и заключается преимущество программирования.

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

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

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

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

Последние комментарии | Перейти к обсуждению на форуме трейдеров (3)
vladavd
vladavd | 26 авг. 2022 в 08:48

Дальше видимо будет цикл статей "Разработка торговой системы на основе Стохастика с периодом 10", "... с периодом 11", "... с периодом 12" и так далее.

Уж лучше вообще никаких статей, чем такой уг публиковать.

Denis Glaz
Denis Glaz | 26 авг. 2022 в 12:07
Не совсем согласен с предыдущим комментатором, данные темы очень полезны для общего понимания стандартных индикаторов, однако я вижу тут один жирный минус: это отсутствие эксперта и тестов. Очень хочется в заключении увидеть табличку с разными параметрами и результатами торговли на истории, а также отдельно скрины из тестера. Не знаю как другие, но я с удовольствием почитаю такое, особенно если помимо стандартных стратегий будут применены интересные идеи от себя 
Dmitry Fedoseev
Dmitry Fedoseev | 26 авг. 2022 в 13:51
Denis Glaz #:
Не совсем согласен с предыдущим комментатором, данные темы очень полезны для общего понимания стандартных индикаторов, однако я вижу тут один жирный минус: это отсутствие эксперта и тестов. Очень хочется в заключении увидеть табличку с разными параметрами и результатами торговли на истории, а также отдельно скрины из тестера. Не знаю как другие, но я с удовольствием почитаю такое, особенно если помимо стандартных стратегий будут применены интересные идеи от себя 

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

DoEasy. Элементы управления (Часть 16): WinForms-объект TabControl — несколько рядов заголовков вкладок, режим растягивания заголовков под размеры контейнера DoEasy. Элементы управления (Часть 16): WinForms-объект TabControl — несколько рядов заголовков вкладок, режим растягивания заголовков под размеры контейнера
В статье продолжим разработку элемента управления TabControl, и реализуем расположение заголовков вкладок со всех четырёх сторон элемента для всех режимов задания размера заголовков: "Normal", "Fixed" и "Fill To Right".
Технический индикатор своими руками Технический индикатор своими руками
В этой статье мы рассмотрим алгоритмы, следуя которым можно создать свой собственный технический индикатор. Мы увидим, как с помощью очень простых начальных предположений можно получить довольно сложные и интересные результаты.
Машинное обучение и Data Science (Часть 06): Градиентный спуск Машинное обучение и Data Science (Часть 06): Градиентный спуск
Градиентный спуск играет важную роль в обучении нейронных сетей и различных алгоритмов машинного обучения — это быстрый и умный алгоритм. Однако несмотря на его впечатляющую работу, многие специалисты по данным все еще неправильно его понимают. Давайте в этой статье посмотрим, о чем идет речь.
Нейросети — это просто (Часть 26): Обучение с подкреплением Нейросети — это просто (Часть 26): Обучение с подкреплением
Продолжаем изучение методов машинного обучения. Данной статьей мы начинаем еще одну большую тему "Обучение с подкреплением". Данный подход позволяет моделям выстаивать определенные стратегии для решения поставленных задач. И мы рассчитываем, что это свойство обучения с подкреплением откроет перед нами новые горизонты построения торговых стратегий.