Разработка торговой системы на основе Awesome Oscillator

Mohamed Abdelmaaboud | 28 ноября, 2022

Введение

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

Для детального изучения индикатора работу как всегда разобьем на несколько подразделов:

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

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

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


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

В этом разделе узнаем в деталях, что из себя представляет индикатор Awesome Oscillator (AO). Индикатор AO разработал Билл Вильямс для измерения импульса, его можно использовать для уточнения силы, контроль какой стороны доминирует на рынке — со стороны покупателей или продавцов. Индикатор измеряет импульс путем сравнения импульса последних пяти баров/свечей с импульсом последних 34 баров/свечей на большем временном интервале, другими словами, он сравнивает недавний импульс с импульсом большего периода времени. С точки зрения технического анализа, полезнее получать подтверждение сигнала АО от другого индикатора или инструмента. Сигналы при совместном использовании нескольких инструментов получаются точнее. Чтобы лучше разобраться в том, что измеряет этот индикатор, посмотрим, из каких компонентов состоит расчет. Для этого рассчитаем значение индикатора вручную.

Индикатор АО представляет собой разницу между 5-периодной простой скользящей средней и 34-периодной простой скользящей средней. При расчете AO используем медианную цену.

MEDIAN PRICE = (HIGH + LOW) / 2 

AO = SMA (MEDIAN PRICE, 5) - SMA (MEDIAN PRICE, 34)

где:

MEDIAN PRICE — медианная цена инструмента

HIGH — цена максимума

LOW — цена минимума

AO — значение Awesome Oscillator

SMA = простое скользящее среднее

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

Посмотрим, как запустить индикатор на графике. Открываем торговый терминал MetaTrader 5, нажимаем на меню "Вставка" --> Индикаторы --> Bill Williams --> Awesome Oscillator

Запуск на графике AO

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

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

где:

1 — цвет для показателей вверх

2 — толщина гистограммы индикатора

3 — цвет для показателей вниз

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

 Индикатор AO на графике символа

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


Стратегии по индикатору Awesome Oscillator

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

Стратегия первая: пересечение нуля AO

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

Схематично:

Текущее значение AO > 0 --> Бычий

Текущее значение AO < 0 --> Медвежий

Стратегия вторая: Сила АО

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

Схематично:

Текущее значение AO > AVG за 5 периодов AO --> AO сильный

Текущее значение AO < AVG за 5 периодов AO --> AO слабый

Стратегия третья: AO и MA

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

Схематично:

Текущее значение AO > уровень нуля И цена закрытия > 50-периодной EMA --> сигнал на покупку

Текущее значение AO < уровень нуля И цена закрытия < 50-периодной EMA --> сигнал на продажу

Схемы стратегий по Awesome Oscillator

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

Стратегия первая: пересечение нуля AO

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

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

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

Схема разработки стратегии 1

Стратегия вторая: Сила АО

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

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

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

 Схема разработки стратегии 2

Стратегия третья: AO и MA

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

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

В противоположном сценарии, если значение АО ниже нуля, а цена закрытия ниже 50-периодной средней, торговая система должна выводить на график комментарий со следующими значениями:

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

Схема разработки стратегии 3

Торговые системы на основе Awesome Oscillator

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

Давайте подробно шаг за шагом рассмотрим создание такой торговой системы.

Создаем массив aoArray с помощью функции "double":

double aoArray[];

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

ArraySetAsSeries(aoArray,true);

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

int aoDef = iAO(_Symbol,_Period);

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

CopyBuffer(aoDef,0,0,3,aoArray);

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

double aoVal = NormalizeDouble(aoArray[0],7);

Генерируем комментарий к графику с текущим значением AO с помощью функции Comment:

Comment("AO Value is ",aoVal);

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

//+------------------------------------------------------------------+
//|                                                    Simple AO.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"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
  void OnTick()
  {
   double aoArray[];
   ArraySetAsSeries(aoArray,true);
   int aoDef = iAO(_Symbol,_Period);
   CopyBuffer(aoDef,0,0,3,aoArray);
   double aoVal = NormalizeDouble(aoArray[0],7);
   Comment("AO Value is ",aoVal);
  }
//+------------------------------------------------------------------+

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

Система Simple AO в Навигаторе

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

Окно советника Simple AO

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

Советник Simple AO на графике

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

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

На графике выше сигнал с текущим значением АО, сгенерированный советником, показан в качестве комментария в верхнем левом углу.

Стратегия первая: пересечение нуля AO

Создадим торговую систему на основе этой стратегии по пересечению значения AO и нулевого уровня. Полный код такой системы показан ниже:

//+------------------------------------------------------------------+
//|                                            AO Zero 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 aoArray[];
   ArraySetAsSeries(aoArray,true);
   int aoDef = iAO(_Symbol,_Period);
   CopyBuffer(aoDef,0,0,3,aoArray);
   double aoVal = NormalizeDouble(aoArray[0],7);
   if(aoVal > 0)
     {
      Comment("Bullish","\n"
              "AO Value is ",aoVal);
     }

   if(aoVal < 0)
     {
      Comment("Bearish","\n"
              "AO Value is ",aoVal);
     }
  }
//+------------------------------------------------------------------+

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

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

В случае бычьего сигнала:

   if(aoVal > 0)
     {
      Comment("Bullish","\n"
              "AO Value is ",aoVal);
     }

В случае медвежьего сигнала:

   if(aoVal < 0)
     {
      Comment("Bearish","\n"
              "AO Value is ",aoVal);
     }

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

Советник AO Zero Crossover на графике

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

Пример бычьего сигнала:

Советник AO Zero Crossover - бычий сигнал

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

Пример медвежьего сигнала:

AO Zero Crossover - медвежий сигнал

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

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

Стратегия вторая: Сила АО

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

//+------------------------------------------------------------------+
//|                                                  AO 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()
  {
   double aoArray[];
   ArraySetAsSeries(aoArray,true);
   int aoDef = iAO(_Symbol,_Period);
   CopyBuffer(aoDef,0,0,6,aoArray);


   double aoCurrVal = NormalizeDouble(aoArray[0],6);
   double aoFifthVal = NormalizeDouble(aoArray[1],6);
   double aoFourthVal = NormalizeDouble(aoArray[2],6);
   double aoThirdVal = NormalizeDouble(aoArray[3],6);
   double aoSecondVal = NormalizeDouble(aoArray[4],6);
   double aoFirstVal = NormalizeDouble(aoArray[5],6);

   double aoAvgVal = NormalizeDouble((aoFifthVal+aoFourthVal+aoThirdVal+aoSecondVal+aoFirstVal)/5,6);

   if(aoCurrVal > aoAvgVal)
     {
      Comment("AO Movement is strong","\n",
              "AO CurrVal : ",aoCurrVal,"\n",
              "AO FirstVal : ",aoFifthVal,"\n",
              "AO SecondVal : ",aoFourthVal,"\n",
              "AO ThirdVal : ",aoThirdVal,"\n",
              "AO FourthVal : ",aoSecondVal,"\n",
              "AO FifthVal : ",aoFirstVal,"\n",
              "AO AvgVal : ",aoAvgVal
             );
     }

   if(aoCurrVal < aoAvgVal)
     {
      Comment("AO Movement is Weak","\n",
              "AO CurrVal : ",aoCurrVal,"\n",
              "AO FirstVal : ",aoFifthVal,"\n",
              "AO SecondVal : ",aoFourthVal,"\n",
              "AO ThirdVal : ",aoThirdVal,"\n",
              "AO FourthVal : ",aoSecondVal,"\n",
              "AO FifthVal : ",aoFirstVal,"\n",
              "AO AvgVal : ",aoAvgVal
             );
     }

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

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

Используя функцию NormalizeDouble, определим значения текущего значения AO и пять предыдущих значений:

   double aoCurrVal = NormalizeDouble(aoArray[0],6);
   double aoFifthVal = NormalizeDouble(aoArray[1],6);
   double aoFourthVal = NormalizeDouble(aoArray[2],6);
   double aoThirdVal = NormalizeDouble(aoArray[3],6);
   double aoSecondVal = NormalizeDouble(aoArray[4],6);
   double aoFirstVal = NormalizeDouble(aoArray[5],6);

Находим среднее значение AO за пять периодов:

double aoAvgVal = NormalizeDouble((aoFifthVal+aoFourthVal+aoThirdVal+aoSecondVal+aoFirstVal)/5,6);

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

Пример сильного движения AO:

   if(aoCurrVal > aoAvgVal)
     {
      Comment("AO Movement is strong","\n",
              "AO CurrVal : ",aoCurrVal,"\n",
              "AO FirstVal : ",aoFifthVal,"\n",
              "AO SecondVal : ",aoFourthVal,"\n",
              "AO ThirdVal : ",aoThirdVal,"\n",
              "AO FourthVal : ",aoSecondVal,"\n",
              "AO FifthVal : ",aoFirstVal,"\n",
              "AO AvgVal : ",aoAvgVal
             );
     }

Пример слабого движения AO:

   if(aoCurrVal < aoAvgVal)
     {
      Comment("AO Movement is Weak","\n",
              "AO CurrVal : ",aoCurrVal,"\n",
              "AO FirstVal : ",aoFifthVal,"\n",
              "AO SecondVal : ",aoFourthVal,"\n",
              "AO ThirdVal : ",aoThirdVal,"\n",
              "AO FourthVal : ",aoSecondVal,"\n",
              "AO FifthVal : ",aoFirstVal,"\n",
              "AO AvgVal : ",aoAvgVal
             );
     }

После этого компилируем код советника. Если программа скомпилировалась без ошибок, находим файл советника в окне Навигатора и запускаем на графике. Увидим следующее:

Советник AO Strength на графике

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

Пример сигнала сильного AO:

Советник AO Strength - сильный сигнал

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

Пример сигнала о слабом AO:

Советник AO Strength - слабый сигнал

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

Итак, советник по этой стратегии работает и генерирует соответствующие сигналы.

Стратегия третья: AO и MA

Для этой торговой системы код будет таким:

//+------------------------------------------------------------------+
//|                                             AO & MA 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()
  {
   MqlRates pArray[];
   double aoArray[];
   double maArray[];

   int Data=CopyRates(_Symbol,_Period,0,1,pArray);
   ArraySetAsSeries(aoArray,true);
   ArraySetAsSeries(maArray,true);
   
   int aoDef = iAO(_Symbol,_Period);
   int maDef = iMA(_Symbol,_Period,50,0,MODE_EMA,PRICE_CLOSE);

   CopyBuffer(aoDef,0,0,3,aoArray);
   CopyBuffer(maDef,0,0,3,maArray);

   double closingPrice = pArray[0].close;
   double aoVal = NormalizeDouble(aoArray[0],7);
   double maVal = NormalizeDouble(maArray[0],7);

   if(aoVal > 0 && closingPrice > maVal)
     {
      Comment("Buy","\n"
              "Closing Price is ",closingPrice,"\n",
              "AO Value is ",aoVal,"\n",
              "MA Value is ",maVal);
     }

   if(aoVal < 0 && closingPrice < maVal)
     {
      Comment("Sell","\n"
              "Closing Price is ",closingPrice,"\n",
              "AO Value is ",aoVal,"\n",
              "MA Value is ",maVal);
     }

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

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

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

   MqlRates pArray[];
   double aoArray[];
   double maArray[];

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

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

Определяем AO и MA:

Для индикатора AO используем функцию iOA.

Для скользящей средней MA используем функцию iMA с такими параметрами:

   int aoDef = iAO(_Symbol,_Period);
   int maDef = iMA(_Symbol,_Period,50,0,MODE_EMA,PRICE_CLOSE);

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

   CopyBuffer(aoDef,0,0,3,aoArray);
   CopyBuffer(maDef,0,0,3,maArray);

Определяем цену закрытия, aoArray и maArray.

   double closingPrice = pArray[0].close;
   double aoVal = NormalizeDouble(aoArray[0],7);
   double maVal = NormalizeDouble(maArray[0],7);

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

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

   if(aoVal > 0 && closingPrice > maVal)
     {
      Comment("Buy","\n"
              "Closing Price is ",closingPrice,"\n",
              "AO Value is ",aoVal,"\n",
              "MA Value is ",maVal);
     }

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

   if(aoVal < 0 && closingPrice < maVal)
     {
      Comment("Sell","\n"
              "Closing Price is ",closingPrice,"\n",
              "AO Value is ",aoVal,"\n",
              "MA Value is ",maVal);
     }

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

 Советник AO & MA на графике

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

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

 Советник AO & MA - сигналы на покупку

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

Пример сигнала на продажу:

 Советник AO & MA - сигнал на продажу

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


Заключение

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

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

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

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