Как разрабатывать системы на основе скользящих средних

Mohamed Abdelmaaboud | 16 марта, 2022

Введение

Думаю, независимо от опыта многие из вас наверняка слышали фразу "Тренд — твой друг" (Trend is your friend). Если еще нет, я объясню. На рынке могут образовываться различные направления движения цены, или тренды.

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

Восходящий тренд

Нисходящий тренд

Мы разобрали, что такое тренд. Но почему же этот тренд — друг?

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

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

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

В статье мы рассмотрим следующие темы:

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

Все коды мы будем писать на MQL5, а тестировать будем в платформе MetaTrader 5.

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


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


Индикатор скользящего среднего очень распространен в техническом анализе. Он рассчитывается как среднее значение цены за определенный период времени. Индикатор сглаживает ценовые данные и уменьшает влияние случайных краткосрочных движений и флуктуаций на графике.

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

Скользящая средняя — трендовый индикатор, основанный на анализе цен. То есть если цена движется в определенном направлении, скользящая средняя будет следовать за ценой в том же направлении.

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

По характеру скользящей среднее можно определить, что этот индикатор:


Типы скользящих средних


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

Основное различие между ними заключается в способах расчета.

Далее, рассмотрим каждую из них, а также узнаем, как их использовать в MQL5.

Простая скользящая средняя:

Это самый простой тип скользящей средней, часто для ее обозначения используется аббревиатура SMA (Simple Moving Average).

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

SMA

Для примера, возьмем пять торговых дней. Цены закрытия этих пяти дней были такими:

Значение SMA для этих пяти дней рассчитывается так:


SMA example

Взвешенная скользящая средняя

Взвешенная скользящая средняя (Weighted Moving Average, WMA) также отображает среднее значение цены за выбранный период, но большее значение придается более свежим данным. То есть если мы рассчитываем WMA за 10 дней, веса всем этим ценовым данным будут назначены разные, и больший вес будут иметь более поздние данные.

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

WMA


Пример:

Возьмем те же 5 торговых дней с теми же ценами закрытия:

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

Пример WMA


Пример WMA


Экспоненциальная скользящая средняя

Экспоненциальная скользящая средняя — Exponential Moving Average или EMA. Особенностью этого типа является то, что расчет учитывает так же и период, предшествующий периоду расчета. То есть при расчете среднего значения за 10 дней более ранний период будет также учитываться.

Рассчитывается WMA по следующей формуле:

Сначала рассчитываем K — экспонента для расчета веса интервала, и n — количество интервалов:

EMA

Затем,

EMA

Пример:

Возьмем те же 5 торговых дней с теми же ценами закрытия:

Средняя EMA за пять дней рассчитывается так:

Пример EMA


Пример EMA

Обратите внимание, что первым днем расчета экспоненциальной скользящей средней является День 6, а за предыдущие пять дней рассчитывалась простая средняя (22).


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


Стратегия 1: пересечение с одной скользящей средней

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

В этой стратегии на каждом тике будем проверять пересечение цены и SMA:

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

1MA Blueprint


Код стратегии будет таким:

//+------------------------------------------------------------------+
//|                                            One SMA 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()
  {
   //создаем массив цен
   double myMovingAverageArray1[];
   
   //определим Ask, Bid
   double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
   double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
   
   //определим свойства скользящих - простая MA с периодом 24
   int movingAverage1 = iMA(_Symbol, _Period, 24, 0, MODE_SMA, PRICE_CLOSE);
   
   //установим сортировку цен в массиве от текущей свечи
   ArraySetAsSeries(myMovingAverageArray1,true);
   
   //Параметры MA - линия - текущая свеча, 3 свечи - сохраним результат
   CopyBuffer(movingAverage1,0,0,3,myMovingAverageArray1);
   
   //Проверка наличия сигнала на вход в покупку
   if (
      (Ask>myMovingAverageArray1[0])
      )
         {
         Comment("BUY");
         }
    
   //Проверка наличия сигнала на вход в продажу      
   if (
      (Bid<myMovingAverageArray1[0])
      )
         {
         Comment("SELL");
         }          
  }
//+------------------------------------------------------------------+

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

1MA - сигнал на покупку

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

Стратегия 2: пересечение двух скользящих средних

В этой стратегии будем использовать две скользящие средние. Период короткой скользящей средней будет 24, длинной — 50.

Согласно этой стратегии, на каждом тике будем проверять положение двух скользящих средних:

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

2MA Blueprint


Код стратегии будет таким:

//+------------------------------------------------------------------+
//|                                            Two SMA 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()
  {
   //создаем массив цен
   double myMovingAverageArray1[], myMovingAverageArray2[];
   
   //определим свойства скользящих - простые MA с периодами 24 и 50
   int movingAverage1 = iMA(_Symbol, _Period, 24, 0, MODE_SMA, PRICE_CLOSE);
   int movingAverage2 = iMA(_Symbol,_Period,50,0,MODE_SMA,PRICE_CLOSE);
   
   //sort the price arrays 1, 2 from current candle
   ArraySetAsSeries(myMovingAverageArray1,true);
   ArraySetAsSeries(myMovingAverageArray2,true);
   
   //Параметры MA1, MA2 - линия - текущая свеча, 3 свечи - сохраним результат
   CopyBuffer(movingAverage1,0,0,3,myMovingAverageArray1);
   CopyBuffer(movingAverage2,0,0,3,myMovingAverageArray2);
   
   //Проверка наличия сигнала на вход в покупку
   if (
      (myMovingAverageArray1[0]>myMovingAverageArray2[0])
   && (myMovingAverageArray1[1]<myMovingAverageArray2[1])
      )
         {
         Comment("BUY");
         }
    
   //Проверка наличия сигнала на вход в продажу      
   if (
      (myMovingAverageArray1[0]<myMovingAverageArray2[0])
   && (myMovingAverageArray1[1]>myMovingAverageArray2[1])
      )
         {
         Comment("SELL");
         }          
  }
//+------------------------------------------------------------------+

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

2MA - сигнал на покупку


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


Стратегия 3: пересечение трех скользящих средних

В этой стратегии будем использовать три скользящие средние: короткая с периодом 10, средняя с периодом 24, и длинная с периодом 48.

Согласно этой стратегии, на каждом тике будем проверять положение трех скользящих средних:

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

3MA Blueprint


Код стратегии будет таким:

//+------------------------------------------------------------------+
//|                                          Three SMA 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()
  {
   //создаем массив цен
   double myMovingAverageArray1[], myMovingAverageArray2[],myMovingAverageArray3[];
   
   //определим свойства средних - simple MA, 10 / 24 / 48
   int movingAverage1 = iMA(_Symbol, _Period, 10, 0, MODE_SMA, PRICE_CLOSE);
   int movingAverage2 = iMA(_Symbol,_Period,24,0,MODE_SMA,PRICE_CLOSE);
   int movingAverage3 = iMA(_Symbol,_Period,48,0,MODE_SMA,PRICE_CLOSE);
   
   //сортируем массивы - начало на текущей свече
   ArraySetAsSeries(myMovingAverageArray1,true);
   ArraySetAsSeries(myMovingAverageArray2,true);
   ArraySetAsSeries(myMovingAverageArray3,true);
   
   //Параметры MA1, MA2, MA3 - линия - текущая свеча, 3 свечи - сохраним результат
   CopyBuffer(movingAverage1,0,0,3,myMovingAverageArray1);
   CopyBuffer(movingAverage2,0,0,3,myMovingAverageArray2);
   CopyBuffer(movingAverage3,0,0,3,myMovingAverageArray3);
   
   //Проверка наличия сигнала на вход в покупку
   if (
      (myMovingAverageArray1[0]>myMovingAverageArray2[0])
   && (myMovingAverageArray1[1]<myMovingAverageArray2[1])
   && (myMovingAverageArray1[0]>myMovingAverageArray3[0])
   && (myMovingAverageArray1[1]<myMovingAverageArray3[1])
   && (myMovingAverageArray2[0]>myMovingAverageArray3[0])
   && (myMovingAverageArray2[1]<myMovingAverageArray3[1])
      )
         {
         Comment("BUY");
         }
    
   //Проверка наличия сигнала на вход в продажу      
   if (
      (myMovingAverageArray1[0]<myMovingAverageArray2[0])
   && (myMovingAverageArray1[1]>myMovingAverageArray2[1])
   && (myMovingAverageArray1[0]<myMovingAverageArray3[0])
   && (myMovingAverageArray1[1]>myMovingAverageArray3[1])
   && (myMovingAverageArray2[0]<myMovingAverageArray3[0])
   && (myMovingAverageArray2[1]>myMovingAverageArray3[1])
      )
         {
         Comment("SELL");
         }          
  }
//+------------------------------------------------------------------+

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

3MA - сигнал на покупку


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


Заключение

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