Скачать MetaTrader 5

Сравнительный анализ 10 трендовых стратегий

22 марта 2017, 14:29
Alexander Fedosov
21
10 286

Содержание

Введение

Стратегии торговли по тренду очень популярны при работе на валютных рынках. Суть их состоит в том, чтобы точно определить сильное однонаправленное движение, найти благоприятные точки для входа в рынок и, что не менее важно, — правильно определить момент выхода. Для этой статьи я отобрал несколько технических инструментов для прямого или косвенного определения тренда. Из них составлены 10 трендовых стратегий, реализованные в виде торговых советников для MetaTrader 5.  По результатам их работы я проанализировал плюсы и минусы каждой стратегии, провел их совокупное сравнение. Цель этой статьи — дать читателю максимально широкое представление о сильных и слабых сторонах трендовой торговли. Некоторые другие трендовые стратегии описаны также в статье  Несколько способов определения тренда на MQL5.

П‌остановка задачи при создании трендовой стратегии

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

Р‌ис.1 Зоны определения тренда и флэта.

‌Задача №1. Определение наличия тренда.

К‌ак правило, определение и подтверждение тренда требует времени. Поэтому идеального, максимально достоверного входа на самом зарождении тренда не получится. Посмотрите на рисунок 1. Определить вход как точку на графике невозможно — мы видим лишь некую область, благоприятную для входа в рынок. Определение в виде области оправдано тем, что при анализе возникают запаздывания в появлении сигнала, а для подтверждения тренда нужно выждать определенное время. Пример — торговые системы, где один индикатор подает сигнал на наличие тренда, а другой через некоторое время либо подтверждает его, либо нет. Такой подход "съедает" время. А время — деньги, или в нашем случае — недополученная прибыль.

Задача №2. Цели открытой позиции.

Итак, мы определили тренд и подтвердили его признаки. Теперь нужно войти в рынок. Но перед этим надо определиться с целями прибыли. Целевую прибыль можно зафиксировать в пунктах либо оставить динамической, в зависимости от прогноза силы тренда. Здесь можно работать и с уровнями поддержки/сопротивления. Но суть остается одна — перед тем, как входить в рынок, нужно четко знать, когда мы будем из него выходить. Из этого вытекает следующая задача.

Задача №3. Определение завершения тренда. 

‌Снова обратимся к рисунку 1.  На нем наглядно представлена ситуация: мы входим в позицию в зеленой области, потом тренд продолжается до области флэта.‌ И вот тут нужно определить: временное это состояние или нам пора выходить из рынка? В данном случае флэт был недолгим, и тренд продолжился. Оговорим сразу: в стратегиях с фиксированными целями прибыли длительность и размер движения в пунктах прогнозируется на основе оценки уже подтвержденного тренда в задаче №2. 

‌‌Трендовые стратегии

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

‌С‌тратегия №1: Индикатор ADXCloud с подтверждающим RSI в виде гистограммы.

‌Первая стратегия, которую мы рассмотрим, основана на модифицированном индикаторе ADX — ADXCloud. Подтверждать сигнал будем с помощью осциллятора RSI с уровнями перекупленности/перепроданности. Он представлен в виде гистограммы, где зеленые столбцы значений RSI относятся к зоне перекупленности, а красные — к зоне перепроданности.

Параметр Описание
Используемый индикатор ADXCloud
Используемый индикатор RSIColor
Таймфрейм H1
Условия на покупку Смена цвета облака с красного на зеленое, гистограмма RSIColor зеленого цвета.
Условия на продажу Смена цвета облака с зеленого на красное, гистограмма RSIColor красного цвета.
Условия выхода   Тейк-профит/Стоп-лосс

‌На рис.2 эта стратегия представлена графически. Отметим, что на таймфрейме H1 участки, определяемые как трендовые, длятся несколько баров, поэтому в условиях выхода выбирать большие значения Тейк-профита и Стоп-лосса нецелесообразно.

Р‌ис.2 Условия входа по трендовой стратегии №1

‌Р‌еализация эксперта по этой стратегии в коде выглядит так:

void OnTick()
  {
//--- Проверка ранее открытых экcпертом ордеров
   if(!Trade.IsOpened(Inp_MagicNum))
     {
      //--- Получение данных для расчета

      if(!GetIndValue())
         return;
      //--- Открытие ордера при наличии сигнала на покупку

      if(BuySignal())
         Trade.BuyPositionOpen(true,Symbol(),Inp_Lot,Inp_MMode,Inp_Deviation,Inp_StopLoss,Inp_TakeProfit,Inp_MagicNum,Inp_EaComment);
      //--- Открытие ордера при наличии сигнала на продажу

      if(SellSignal())
         Trade.SellPositionOpen(true,Symbol(),Inp_Lot,Inp_MMode,Inp_Deviation,Inp_StopLoss,Inp_TakeProfit,Inp_MagicNum,Inp_EaComment);
     }
  }
//+------------------------------------------------------------------+
//| Условия на покупку                                               |
//+------------------------------------------------------------------+
bool BuySignal()
  {
   return(adx[0]>0 && adx[1]<0 && rsi1[0]==1)?true:false;
  }
//+------------------------------------------------------------------+
//| Условия на продажу                                               |
//+------------------------------------------------------------------+
bool SellSignal()
  {
   return(adx[0]<0 && adx[1]>0 && rsi2[0]==1)?true:false;
  }
//+------------------------------------------------------------------+
//| Получение текущих значений индикаторов                           |
//+------------------------------------------------------------------+
bool GetIndValue()
  {
   return(CopyBuffer(InpInd_Handle1,0,0,2,rsi1)<=0 ||
          CopyBuffer(InpInd_Handle1,1,0,2,rsi2)<=0 ||
          CopyBuffer(InpInd_Handle2,0,0,2,adx)<=0
          )?false:true;
  }


С‌тратегия №2: Трендовый индикатор Standard Deviation в виде гистограммы с подтверждением RVI.

‌В основе этой стратегии — модификации трендового индикатора Standard Deviation и осциллятора RVI.‌ Подробнее узнать о принципах их работы можно по ссылкам в таблице.

Параметр Описание
Используемый индикатор ColorStdDev
Используемый индикатор ColorZerolagRVI
Таймфрейм H1
Условия на покупку Гистограмма ColorStdDev красного цвета (сильный тренд), облако ColorZerolagRVI зеленого цвета.
Условия на продажу Гистограмма ColorStdDev красного цвета (сильный тренд), облако ColorZerolagRVI красного цвета.
Условия выхода   Тейк-профит/Стоп-лосс

Стратегия визуально представлена на рис.3. Участки сильного движения в ней определяются с помощью Standard Deviation. Тренд подтверждается модификацией осциллятора RVI, построенной на базе четырех стандартных RVI с разными периодами и весовыми коэффициентами.

Р‌ис.3 Условия входа по трендовой стратегии №2

Обратите внимание, что при программной реализации этой стратегии в настройках ColorStDev предлагается эмпирически определить значение сильного тренда, среднего и флэта. Оставим эти значения по умолчанию, но для удобства введем опцию Used Trend, которая позволяет выбирать, на какой тип тренда стоит опираться — Средний или Сильный. Таким образом, не нужно каждый раз переопределять три показателя: достаточно переключать один. Использование сигнала сильного тренда больше подходит для текущей стратегии, потому что мы выбрали таймфрейм 1H. Опция среднего тренда больше подойдет для тестирования на старших таймфремах. При этом надо держать в уме, что сигналов на вход с использованием среднего тренда будет больше, поэтому, чтобы отфильтровать ложные сигналы и выходить в плюс в сделках, нужно всегда учитывать цели прибыли и текущий таймфрейм.

//--- Параметры индикатора ColorStDev

input int                  period = 12;                               //Smoothing period StDev
input ENUM_MA_METHOD       MA_Method=MODE_EMA;                        //Histogram smoothing method
input ENUM_APPLIED_PRICE   applied_price=PRICE_CLOSE;                 //Applied price
input int                  MaxTrendLevel=100;                         //Maximum trend level
input int                  MiddLeTrendLevel=40;                       //Middle trend level
input int                  FlatLevel=10;                              //Flat level
input Trend                TrendLevel=Maximum;                                //Used trend

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

void OnTick()
  {
//--- Проверка ранее открытых экcпертом ордеров
   if(!Trade.IsOpened(Inp_MagicNum))
     {
      //--- Получение данных для расчета

      if(!GetIndValue())
         return;
      //--- Открытие ордера при наличии сигнала на покупку

      if(BuySignal())
         Trade.BuyPositionOpen(true,Symbol(),Inp_Lot,Inp_MMode,Inp_Deviation,Inp_StopLoss,Inp_TakeProfit,Inp_MagicNum,Inp_EaComment);
      //--- Открытие ордера при наличии сигнала на продажу

      if(SellSignal())
         Trade.SellPositionOpen(true,Symbol(),Inp_Lot,Inp_MMode,Inp_Deviation,Inp_StopLoss,Inp_TakeProfit,Inp_MagicNum,Inp_EaComment);
     }
  }
//+------------------------------------------------------------------+
//| Условия на покупку                                               |
//+------------------------------------------------------------------+
bool BuySignal()
  {
   return(stdev[0]>trend && rvi_fast[0]>rvi_slow[0])?true:false;
  }
//+------------------------------------------------------------------+
//| Условия на продажу                                               |
//+------------------------------------------------------------------+
bool SellSignal()
  {
   return(stdev[0]>trend && rvi_fast[0]<rvi_slow[0])?true:false;
  }
//+------------------------------------------------------------------+
//| Получение текущих значений индикаторов                           |
//+------------------------------------------------------------------+
bool GetIndValue()
  {
   return(CopyBuffer(InpInd_Handle1,0,0,2,stdev)<=0 ||
          CopyBuffer(InpInd_Handle2,0,0,2,rvi_fast)<=0 ||
          CopyBuffer(InpInd_Handle2,1,0,2,rvi_slow)<=0
          )?false:true;
  }

Стратегия №3: Облачная интерпретация AC Уильямса и совмещенный индикатор Bears Power и Bulls Power.
В‌ следующей стратегии я решил попробовать связку из облачной интерпретации Accelerator Oscillator(AC) Билла Уильямса и осцилляторов Bears Power и Bulls Power, совмещенных в один. ‌

Параметр Описание
Используемый индикатор Bear_Bulls_Power
Используемый индикатор CronexAC
Таймфрейм H1
Условия на покупку Гистограмма показывает рост (меняет цвет с розового на синий, при этом значение индикатора меньше нуля), облако CroneAC синего цвета.
Условия на продажу Гистограмма показывает падение (меняет цвет с синего на розовый, при этом значение индикатора больше нуля), облако CroneAC оранжевого цвета.
Условия выхода   Тейк-профит/Стоп-лосс

Стратегия графически представлена на рис.4. Задача при поиске сигналов на вход состоит в том, чтобы отслеживать ранний рост гистограммы. Иными словами, мы должны находить момент, когда быков сменяют медведи или наоборот, а потом подтверждать сигнал осциллятором.

Р‌ис.4 Условия входа по трендовой стратегии №3

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

void OnTick()
  {
//--- Проверка ранее открытых экcпертом ордеров
   if(!Trade.IsOpened(Inp_MagicNum))
     {
      //--- Получение данных для расчета

      if(!GetIndValue())
         return;
      //--- Открытие ордера при наличии сигнала на покупку

      if(BuySignal())
         Trade.BuyPositionOpen(true,Symbol(),Inp_Lot,Inp_MMode,Inp_Deviation,Inp_StopLoss,Inp_TakeProfit,Inp_MagicNum,Inp_EaComment);
      //--- Открытие ордера при наличии сигнала на продажу

      if(SellSignal())
         Trade.SellPositionOpen(true,Symbol(),Inp_Lot,Inp_MMode,Inp_Deviation,Inp_StopLoss,Inp_TakeProfit,Inp_MagicNum,Inp_EaComment);
     }
  }
//+------------------------------------------------------------------+
//| Условия на покупку                                               |
//+------------------------------------------------------------------+
bool BuySignal()
  {
   return(ac_fast[0]>ac_slow[0] && bb_power[0]>bb_power[1] && (bb_power[0]<0 && bb_power[1]<0))?true:false;
  }
//+------------------------------------------------------------------+
//| Условия на продажу                                               |
//+------------------------------------------------------------------+
bool SellSignal()
  {
   return(ac_fast[0]<ac_slow[0] && bb_power[0]<bb_power[1] && (bb_power[0]>0 && bb_power[1]>0))?true:false;
  }
//+------------------------------------------------------------------+
//| Получение текущих значений индикаторов                           |
//+------------------------------------------------------------------+
bool GetIndValue()
  {
   return(CopyBuffer(InpInd_Handle1,0,0,2,bb_power)<=0 ||
          CopyBuffer(InpInd_Handle2,0,0,2,ac_fast)<=0 ||
          CopyBuffer(InpInd_Handle2,1,0,2,ac_slow)<=0
          )?false:true;
  }

С‌тратегия №4: Центр гравитации Эллерса, подтверждаемый индикатором средней скорости цены.

Стратегия использует индикатор Центр гравитации Эллерса, представленный в виде гистограммы OSMA — CenterOfGravityOSMA. Его сигнал подтверждается индикатором, вычисляющим среднюю скорость цены.

Параметр Описание
Используемый индикатор CenterOfGravityOSMA
Используемый индикатор Average Speed
Таймфрейм H1
Условия на покупку Гистограмма Центра гравитации показывает рост (при этом значение индикатора меньше нуля), а значение Average Speed выше порогового (изначально заданного в настройках)
Условия на продажу Гистограмма Центра гравитации показывает падение (при этом значение индикатора больше нуля), а значение Average Speed выше порогового (изначально заданного в настройках)
Условия выхода   Тейк-профит/Стоп-лосс

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

Р‌ис.5 Условия входа по трендовой стратегии №4‌

Реализация стратегии:

void OnTick()
  {
//--- Проверка ранее открытых экcпертом ордеров
   if(!Trade.IsOpened(Inp_MagicNum))
     {
      //--- Получение данных для расчета

      if(!GetIndValue())
         return;
      //--- Открытие ордера при наличии сигнала на покупку

      if(BuySignal())
         Trade.BuyPositionOpen(true,Symbol(),Inp_Lot,Inp_MMode,Inp_Deviation,Inp_StopLoss,Inp_TakeProfit,Inp_MagicNum,Inp_EaComment);
      //--- Открытие ордера при наличии сигнала на продажу

      if(SellSignal())
         Trade.SellPositionOpen(true,Symbol(),Inp_Lot,Inp_MMode,Inp_Deviation,Inp_StopLoss,Inp_TakeProfit,Inp_MagicNum,Inp_EaComment);
     }
  }
//+------------------------------------------------------------------+
//| Условия на покупку                                               |
//+------------------------------------------------------------------+
bool BuySignal()
  {
   return(avr_speed[0]>Trend_lev && cog[1]<cog[0] &&(cog[1]<0 && cog[0]<0))?true:false;
  }
//+------------------------------------------------------------------+
//| Условия на продажу                                               |
//+------------------------------------------------------------------+
bool SellSignal()
  {
   return(avr_speed[0]>Trend_lev && cog[1]>cog[0] &&(cog[1]>0 && cog[0]>0))?true:false;
  }
//+------------------------------------------------------------------+
//| Получение текущих значений индикаторов                           |
//+------------------------------------------------------------------+
bool GetIndValue()
  {
   return(CopyBuffer(InpInd_Handle1,0,0,2,cog)<=0 ||
          CopyBuffer(InpInd_Handle2,0,0,2,avr_speed)<=0
          )?false:true;
  }

‌Стратегия №5. Комплексный индикатор Бинарная волна.

В предыдущих четырех стратегиях я придерживался модели выбора связки основного индикатора, который бы показывал тренд, и дополнительного сигнала для его проверки. Теперь же я решил отойти от этой схемы и взял только один индикатор: это Бинарная волна. Выглядит он как осциллятор, но по сути результирует и визуально представляет сигналы семи индикаторов — MA, MACD, OsM, CCI, Momentum, RSI и ADX. Он сам по себе уже является самодостаточной торговой стратегией с гибкой системой настроек. Помимо стандартных наборов параметров для выбранных индикаторов, сюда добавлены весовые коэффициенты — система влияния того или иного компонента.

Параметр Описание
Используемый индикатор Binary_Wave
Таймфрейм H1
Условия на покупку Переход осциллятора через ноль вверх
Условия на продажу Переход осциллятора через ноль вниз
Условия выхода   Тейк-профит/Стоп-лосс

Примеры входа по этой стратегии представлены на рис.6. Обратите внимание: в программной реализации, чтобы оптимизировать стратегию под H1, были изменены настройки периодов MA_Period, CCIPeriod, MOMPeriod, RSIPeriod и ADX_Period с 14 по умолчанию на более быстрые 10. Для тестирования с классическими периодами можно повысить таймфрейм до H3 или H4.

Р‌ис.6 Условия входа по трендовой стратегии №5

‌Результат реализации:‌‌

void OnTick()
  {
//--- Проверка ранее открытых экcпертом ордеров
   if(!Trade.IsOpened(Inp_MagicNum))
     {
      //--- Получение данных для расчета

      if(!GetIndValue())
         return;
      //--- Открытие ордера при наличии сигнала на покупку

      if(BuySignal())
         Trade.BuyPositionOpen(true,Symbol(),Inp_Lot,Inp_MMode,Inp_Deviation,Inp_StopLoss,Inp_TakeProfit,Inp_MagicNum,Inp_EaComment);
      //--- Открытие ордера при наличии сигнала на продажу

      if(SellSignal())
         Trade.SellPositionOpen(true,Symbol(),Inp_Lot,Inp_MMode,Inp_Deviation,Inp_StopLoss,Inp_TakeProfit,Inp_MagicNum,Inp_EaComment);
     }
  }
//+------------------------------------------------------------------+
//| Условия на покупку                                               |
//+------------------------------------------------------------------+
bool BuySignal()
  {
   return(wave[0]>0 && wave[1]<0)?true:false;
  }
//+------------------------------------------------------------------+
//| Условия на продажу                                               |
//+------------------------------------------------------------------+
bool SellSignal()
  {
   return(wave[0]<0 && wave[1]>0)?true:false;
  }
//+------------------------------------------------------------------+
//| Получение текущих значений индикаторов                           |
//+------------------------------------------------------------------+
bool GetIndValue()
  {
   return(CopyBuffer(InpInd_Handle,0,0,2,wave)<=0)?false:true;
  }

Стратегия №6: Комплексный индикатор Weight Oscillator в связке с LeMan Objective.

Здесь совмещены принципы построения стратегий, использованные в пяти предыдущих примерах. Мы совмещаем готовую систему и добавляем к ней индикатор, подтверждающий сигнал. В роли готовой системы выступит Weight Oscillator, представляющий собой взвешенную сглаженную сумму четырёх индикаторов: RSI, MFI, WPR и DeMarker с весовыми коэффициентами. Подтверждать сигнал будет LeMan Objective, который рассчитывает расстояние от цены открытия до максимумов и минимумов и выводит квартили отклонений. Также на заданном количестве баров он дает скользящую среднюю сводной статистики изменения цены в 75, 50, 25 % случаев, а также показывает максимальное отклонение. Мы же будем отслеживать рост гистограммы Weight Oscillator для покупки, при этом в качестве подтверждения возьмем пробитие ценой квартиля отклонения с 75% значением.

Параметр Описание
Используемый индикатор Weight Oscillator
Используемый индикатор LeMan Objective
Таймфрейм H1
Условия на покупку Растет Weight Oscillator, и цена пробивает верхний уровень 75% значения квартиля отклонения.
Условия на продажу Падает Weight Oscillator, и цена пробивает нижний уровень 75% значения квартиля отклонения.
Условия выхода   Тейк-профит/Стоп-лосс

Наглядно точки входа можно увидеть на рис.7, где 75% уровни выделены жирными линиями. Мы видим, что цены закрытия пробивают эти уровни, и условия роста/падения Weight Oscillator выполняются.

Р‌ис.7 Условия входа по трендовой стратегии №6

‌Индикатор LeMan Objective для построения своих уровней использует 8 индикаторных буферов:

  • Quartile 1 соответствует среднему значению снижения цены по отношению к выборке в 25% случаев.
  • Quartile 2 соответствует среднему значению снижения цены по отношению к выборке в 50% случаев.
  • Quartile 3 соответствует среднему значению снижения цены по отношению к выборке в 75% случаев. Это мы используем в стратегии.
  • Quartile 4 соответствует максимальному отклонению среднего значения цены. 
  • Quartile 5 соответствует среднему значению подъема цены по отношению к выборке в 25% случаев.
  • Quartile 6 соответствует среднему значению подъема цены по отношению к выборке в 50% случаев.
  • Quartile 7 соответствует среднему значению подъема цены по отношению к выборке в 75% случаев. Это мы используем в стратегии.
  • Quartile 8 соответствует максимальному отклонению среднего значения цены.

Поэтому в программной реализации нам будут нужны, помимо Weight Oscillator и значения цены закрытия, буферы 2 и 6. 

void OnTick()
  {
//--- Проверка ранее открытых экcпертом ордеров
   if(!Trade.IsOpened(Inp_MagicNum))
     {
      //--- Получение данных для расчета

      if(!GetIndValue())
         return;
      //--- Открытие ордера при наличии сигнала на покупку

      if(BuySignal())
         Trade.BuyPositionOpen(true,Symbol(),Inp_Lot,Inp_MMode,Inp_Deviation,Inp_StopLoss,Inp_TakeProfit,Inp_MagicNum,Inp_EaComment);
      //--- Открытие ордера при наличии сигнала на продажу

      if(SellSignal())
         Trade.SellPositionOpen(true,Symbol(),Inp_Lot,Inp_MMode,Inp_Deviation,Inp_StopLoss,Inp_TakeProfit,Inp_MagicNum,Inp_EaComment);
     }
  }
//+------------------------------------------------------------------+
//| Условия на покупку                                               |
//+------------------------------------------------------------------+
bool BuySignal()
  {
   return(wo[0]>wo[1] && close[0]>obj_q3_b[0])?true:false;
  }
//+------------------------------------------------------------------+
//| Условия на продажу                                               |
//+------------------------------------------------------------------+
bool SellSignal()
  {
   return(wo[0]<wo[1] && close[0]<obj_q3_s[0])?true:false;
  }
//+------------------------------------------------------------------+
//| Получение текущих значений индикаторов                           |
//+------------------------------------------------------------------+
bool GetIndValue()
  {
   return(CopyBuffer(InpInd_Handle1,6,0,2,obj_q3_b)<=0 ||
         CopyBuffer(InpInd_Handle1,2,0,2,obj_q3_s)<=0 ||
         CopyBuffer(InpInd_Handle2,0,0,2,wo)<=0 || 
         CopyClose(Symbol(),PERIOD_CURRENT,0,2,close)<=0
          )?false:true;
  }

Стратегия №7: Канал Дончиана в комплекте с MACD, в котором ценовой ряд заменен на значения AO Уильямса.

Для определения сильного однонаправленного движения здесь используется канал Дончиана. Пробой канала примем за признак тренда. Для подтверждения тренда используем модифицированный MACD, в котором ценовой ряд заменен на значения индикатора AO Билла Уильямса.

Параметр Описание
Используемый индикатор Donchian Channel System
Используемый индикатор CronexAO
Таймфрейм H1
Условия на покупку Пробой верхней границы канала Дончиана и синий цвет облака CronexAO
Условия на продажу Пробой нижней границы канала Дончиана и розовый цвет облака CronexAO
Условия выхода   Тейк-профит/Стоп-лосс

На рис.8 эта трендовая стратегия отображена графически. Для удобства отображения и наглядности был выбран вариант индикатора со сменой цвета свечи, если она пробивает верхнюю или нижнюю границу канала Дончиана. При этом и цвета CronexAO подобраны соответственно цветам свечей, пробивающих границы канала.

Р‌ис.8 Условия входа по трендовой стратегии №7

При реализации этой стратегии важно, что в индикаторе Donchian Channel System за экстремумы берутся значения High и Low свечей. Тем не менее, если для инструмента характерны частые выбросы цены в одну или другую сторону (длинные тени свечей) с последующим возвратом к средним значениям, то есть смысл использовать в качестве экстремумов значения Open или Close свечей, либо в связке Open+High/Open+Low. Так влияние длинных теней будет уменьшено. 

void OnTick()
  {
//--- Проверка ранее открытых экcпертом ордеров
   if(!Trade.IsOpened(Inp_MagicNum))
     {
      //--- Получение данных для расчета

      if(!GetIndValue())
         return;

      //--- Открытие ордера при наличии сигнала на покупку

      if(BuySignal())
         Trade.BuyPositionOpen(true,Symbol(),Inp_Lot,Inp_MMode,Inp_Deviation,Inp_StopLoss,Inp_TakeProfit,Inp_MagicNum,Inp_EaComment);
      //--- Открытие ордера при наличии сигнала на продажу

      if(SellSignal())
         Trade.SellPositionOpen(true,Symbol(),Inp_Lot,Inp_MMode,Inp_Deviation,Inp_StopLoss,Inp_TakeProfit,Inp_MagicNum,Inp_EaComment);
     }
  }
//+------------------------------------------------------------------+
//| Условия на покупку                                               |
//+------------------------------------------------------------------+
bool BuySignal()
  {
   return(cao_fast[0]>cao_slow[0] && close[0]>dcs_up[0])?true:false;
  }
//+------------------------------------------------------------------+
//| Условия на продажу                                               |
//+------------------------------------------------------------------+
bool SellSignal()
  {
   return(cao_fast[0]<cao_slow[0] && close[0]<dcs_low[0])?true:false;
  }
//+------------------------------------------------------------------+
//| Получение текущих значений индикаторов                           |
//+------------------------------------------------------------------+
bool GetIndValue()
  {
   return(CopyBuffer(InpInd_Handle1,0,0,2,dcs_up)<=0 ||
          CopyBuffer(InpInd_Handle1,1,0,2,dcs_low)<=0 || 
          CopyBuffer(InpInd_Handle2,0,0,2,cao_fast)<=0 ||
          CopyBuffer(InpInd_Handle2,1,0,2,cao_slow)<=0 ||
          CopyClose(Symbol(),PERIOD_CURRENT,0,2,close)<=0
          )?false:true;
  }

‌Стратегия №8: Циклический осциллятор Шаффа с подтверждением по трем уровням Тироне.

В этой трендовой стратегии применяется циклический осциллятор Шаффа в моменты его выхода из зон перепроданности/перекупленности. Для проверки используются три уровня Тироне. Интересные результаты были получены на старших базовых таймфреймах. Для тестирования был выбран H4.

Параметр Описание
Используемый индикатор Schaff Trend Cycle
Используемый индикатор Три уровня Тироне
Таймфрейм H4
Условия на покупку Выход из зоны перепроданности, при этом текущая цена должна быть выше верхнего уровня Тироне.
Условия на продажу Выход из зоны перекупленности, при этом текущая цена должна быть ниже нижнего уровня Тироне.
Условия выхода   Тейк-профит/Стоп-лосс

Графическое представление этой трендовой стратегии можно увидеть на рис.9.

Р‌ис.9 Условия входа по трендовой стратегии №8

Обсуждая реализацию этой стратегии, отмечу, что помимо основных параметров двух индикаторов, необходимо было добавить числовые значения уровней перекупленности/перепроданности.Их я изменять не стал, оставив по умолчанию 20 и 80. Зато настройки сглаживания и периоды я изменил (на рисунке это можно увидеть в верхнем левом углу индикатора Шаффа). Эти настройки не обязательны, можете применить либо настройки по умолчанию, либо свои собственные.

//+------------------------------------------------------------------+
//| Входные параметры эксперта                                       |
//+------------------------------------------------------------------+
input string               Inp_EaComment="Strategy #8";                  //EA Comment
input double               Inp_Lot=0.01;                                 //Lot
input MarginMode           Inp_MMode=LOT;                                //MM
input int                  Inp_MagicNum=1111;                            //Magic number
input int                  Inp_StopLoss=400;                             //Stop Loss(points)
input int                  Inp_TakeProfit=600;                           //Take Profit(points)
input int                  Inp_Deviation = 20;                           //Deviation(points)

input double               Overbuying=80;                                //Overbuying zone
input double               Overselling=20;                               //Overselling zone
//--- Параметры индикатора Schaff Trend Cycle

input Smooth_Method        MA_SMethod=MODE_SMMA_;                        //Histogram smoothing method
input int                  Fast_XMA = 20;                                //Fast moving average period
input int                  Slow_XMA = 30;                                //Slow moving average period
input int                  SmPhase= 100;                                 //Moving averages smoothing parameter
input Applied_price_       AppliedPrice=PRICE_CLOSE_;                    //Price constant
input int                  Cycle=10;                                     //Stochastic oscillator period

Суть стратегии:

void OnTick()
  {
//--- Проверка ранее открытых экcпертом ордеров
   if(!Trade.IsOpened(Inp_MagicNum))
     {
      //--- Получение данных для расчета

      if(!GetIndValue())
         return;
      //--- Открытие ордера при наличии сигнала на покупку

      if(BuySignal())
         Trade.BuyPositionOpen(true,Symbol(),Inp_Lot,Inp_MMode,Inp_Deviation,Inp_StopLoss,Inp_TakeProfit,Inp_MagicNum,Inp_EaComment);
      //--- Открытие ордера при наличии сигнала на продажу

      if(SellSignal())
         Trade.SellPositionOpen(true,Symbol(),Inp_Lot,Inp_MMode,Inp_Deviation,Inp_StopLoss,Inp_TakeProfit,Inp_MagicNum,Inp_EaComment);
     }
  }
//+------------------------------------------------------------------+
//| Условия на покупку                                               |
//+------------------------------------------------------------------+
bool BuySignal()
  {
   return(schaff[1]<Overselling && schaff[0]>Overselling && close[0]>tirone_b[0])?true:false;
  }
//+------------------------------------------------------------------+
//| Условия на продажу                                               |
//+------------------------------------------------------------------+
bool SellSignal()
  {
   return(schaff[1]>Overbuying && schaff[0]<Overbuying && close[0]<tirone_s[0])?true:false;
  }
//+------------------------------------------------------------------+
//| Получение текущих значений индикаторов                           |
//+------------------------------------------------------------------+
bool GetIndValue()
  {
   return(CopyBuffer(InpInd_Handle1,0,0,2,schaff)<=0 ||
          CopyBuffer(InpInd_Handle2,0,0,2,tirone_b)<=0 ||
          CopyBuffer(InpInd_Handle2,2,0,2,tirone_s)<=0 ||
          CopyClose(Symbol(),PERIOD_CURRENT,0,2,close)<=0
          )?false:true;
  }

Стратегия №9: Канал Келтнера в виде гистограммы и индикатор iTrend в облачном виде.

Идентификатор тренда здесь — i-KlPrice на основе канала Келтнера в виде гистограммы. Подтверждать тренд будем индикатором iTrend в облачном виде, где цвет и ширина облака характеризует текущий тренд. Как и в предыдущей стратегии, мы имеем дело с типом сигнала на переходе через некий уровень. Для i-KlPrice это значения 50 и -50, стоящие по умолчанию. Поэтому также есть смысл в настройки будущего эксперта добавить параметры BuyLevel и SellLevel, переход через которые будет означать сигнал на покупку или продажу.

Подтверждением сигнала займется индикатор iTrend. В нем мы будем отслеживать цвет облака, который определяется значениями двух линий. Верхняя из них — разница сглаженного значения цен и выбранной в настройках одной из полос Боллинджера. Нижняя — разница суммы (High + Low) и значения скользящего среднего текущей свечи, умноженная на -1.‌

Параметр Описание
Используемый индикатор i-KlPrice
Используемый индикатор iTrend
Таймфрейм H1
Условия на покупку Значение гистограммы i-KlPrice выше BuyLevel, и облако iTend зеленого цвета.
Условия на продажу Значение гистограммы i-KlPrice ниже SellLevel, и облако iTend розового цвета.
Условия выхода   Тейк-профит/Стоп-лосс

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

Р‌ис.10 Условия входа по трендовой стратегии №9

‌‌

Я реализовал эту стратегию в коде так:

void OnTick()
  {
//--- Проверка ранее открытых экcпертом ордеров
   if(!Trade.IsOpened(Inp_MagicNum))
     {
      //--- Получение данных для расчета

      if(!GetIndValue())
         return;
      //--- Открытие ордера при наличии сигнала на покупку

      if(BuySignal())
         Trade.BuyPositionOpen(true,Symbol(),Inp_Lot,Inp_MMode,Inp_Deviation,Inp_StopLoss,Inp_TakeProfit,Inp_MagicNum,Inp_EaComment);
      //--- Открытие ордера при наличии сигнала на продажу

      if(SellSignal())
         Trade.SellPositionOpen(true,Symbol(),Inp_Lot,Inp_MMode,Inp_Deviation,Inp_StopLoss,Inp_TakeProfit,Inp_MagicNum,Inp_EaComment);
     }
  }
//+------------------------------------------------------------------+
//| Условия на покупку                                               |
//+------------------------------------------------------------------+
bool BuySignal()
  {
   return(klprice[0]>BuyLevel && itrend_h[0]>itrend_l[0])?true:false;
  }
//+------------------------------------------------------------------+
//| Условия на продажу                                               |
//+------------------------------------------------------------------+
bool SellSignal()
  {
   return(klprice[0]<SellLevel && itrend_h[0]<itrend_l[0])?true:false;
  }
//+------------------------------------------------------------------+
//| Получение текущих значений индикаторов                           |
//+------------------------------------------------------------------+
bool GetIndValue()
  {
   return(CopyBuffer(InpInd_Handle1,0,0,2,klprice)<=0 ||
          CopyBuffer(InpInd_Handle2,0,0,2,itrend_h)<=0 ||
          CopyBuffer(InpInd_Handle2,1,0,2,itrend_l)<=0
          )?false:true;
  }

С‌тратегия №10: Импульс цены Average Change и веер скользящих средних FigurelliSeries.

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

//+----------------------------------------------+
//| Indicator input parameters                   |
//+----------------------------------------------+
input uint StartPeriod=6;                              // initial period
input uint Step=6;                                     // periods calculation step
input uint Total=36;                                   // number of Moving Averages
input  ENUM_MA_METHOD   MAType=MODE_EMA;               // Moving Averages smoothing type
input ENUM_APPLIED_PRICE   MAPrice=PRICE_CLOSE;        // price timeseries of Moving Averages
input int Shift=0;                                     // Horizontal shift of the indicator in bars 

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

//---- main cycle of calculation of the indicator
   for(bar=limit; bar>=0 && !IsStopped(); bar--)
     {
      double tot_Ask=0;
      double tot_Bid=0;

      for(int count=0; count<int(Total); count++)
        {
         //---- copy newly appeared data into the arrays
         if(CopyBuffer(MA_Handle[count],0,bar,1,MA)<=0) return(RESET);

         if(close[bar]<MA[0]) tot_Ask++;
         if(close[bar]>MA[0]) tot_Bid++;
        }

      IndBuffer[bar]=tot_Bid-tot_Ask;
     }

Резюмируя принципы работы обоих индикаторов, составим правила входа:

Параметр Описание
Используемый индикатор Average Change
Используемый индикатор Figurelli Series
Таймфрейм H4
Условия на покупку Average Change пересекает пороговое значение снизу вверх, и значение гистограммы Figurelli Series выше нуля.
Условия на продажу Average Change пересекает пороговое значение сверху вниз, и значение гистограммы Figurelli Series ниже нуля.
Условия выхода   Тейк-профит/Стоп-лосс

На рис.11 представлены примеры входа в рынок по рассматриваемой стратегии:

Р‌ис.11 Условия входа по трендовой стратегии №10

Программный код стратегии:

void OnTick()
  {
//--- Проверка ранее открытых экcпертом ордеров
   if(!Trade.IsOpened(Inp_MagicNum))
     {
      //--- Получение данных для расчета

      if(!GetIndValue())
         return;
      //--- Открытие ордера при наличии сигнала на покупку

      if(BuySignal())
         Trade.BuyPositionOpen(true,Symbol(),Inp_Lot,Inp_MMode,Inp_Deviation,Inp_StopLoss,Inp_TakeProfit,Inp_MagicNum,Inp_EaComment);
      //--- Открытие ордера при наличии сигнала на продажу

      if(SellSignal())
         Trade.SellPositionOpen(true,Symbol(),Inp_Lot,Inp_MMode,Inp_Deviation,Inp_StopLoss,Inp_TakeProfit,Inp_MagicNum,Inp_EaComment);
     }
  }
//+------------------------------------------------------------------+
//| Условия на покупку                                               |
//+------------------------------------------------------------------+
bool BuySignal()
  {
   return(avr_change[1]<1 && avr_change[0]>1 && fig_series[0]>0)?true:false;
  }
//+------------------------------------------------------------------+
//| Условия на продажу                                               |
//+------------------------------------------------------------------+
bool SellSignal()
  {
   return(avr_change[1]>1 && avr_change[0]<1 && fig_series[0]<0)?true:false;
  }
//+------------------------------------------------------------------+
//| Получение текущих значений индикаторов                           |
//+------------------------------------------------------------------+
bool GetIndValue()
  {
   return(CopyBuffer(InpInd_Handle1,0,0,2,avr_change)<=0 ||
          CopyBuffer(InpInd_Handle2,0,0,2,fig_series)<=0
          )?false:true;
  }

Тестирование

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

  • Интервал: 01.01.2016 — 01.03.2017 .
  • Валютная пара: EURUSD.
  • Режим торговли: Без задержки. Представленные стратегии не относятся к высокочастотным, поэтому влияние задержек было бы очень мало.
  • Тестирование: OHLC на М1. Предварительное тестирование на реальных тиках оказалось почти неотличимо от этого режима.
  • Начальный депозит: 1000 USD.
  • Плечо: 1:500.
  • Сервер: MetaQuotes-Demo.
  • Котировки: 5-значные.

Практически у всех стратегий условиями выхода из рынка является Тейк-профит/Стоп-лосс, и у 8 из 10 рабочий таймфрейм — 1H. Поэтому можно принять для них одинаковые цели прибыли и убытков. Установим Тейк-профит в 600 (5-значные котировки), а Стоп-лосс — 400.‌ Д‌ля большей наглядности, помимо условий, оговоренных выше, укажем в рамках тестирования предустановки параметров индикаторов, которые используются в стратегиях.

Т‌ест Стратегии №1 (Индикатор ADXCloud с подтверждающим RSI в виде гистограммы).

Предустановка:

//--- Параметры индикатора RSI_Color

input int                  Inp_RSIPeriod=11;                            //RSI Period
input double               Inp_Overbuying=70;                           //Overuying zone
input double               Inp_Overselling=30;                          //Overselling zone
//--- Параметры индикатора ADX_Cloud

input int                  Inp_ADXPeriod=8;                             //ADX Period
input double               Inp_alpha1 = 0.25;                           //alpha1
input double               Inp_alpha2 = 0.25;                           //alpha2

Результат тестирования:

Рис.12 Результаты тестирования трендовой стратегии №1

Т‌ест Стратегии №2 (Трендовый индикатор Standard Deviation в виде гистограммы с подтверждением RVI).

П‌редустановка:‌

//--- Параметры индикатора ColorStDev

input int                  period = 12;                                  //Smoothing period StDev
input ENUM_MA_METHOD       MA_Method=MODE_EMA;                           //Histogram smoothing method
input ENUM_APPLIED_PRICE   applied_price=PRICE_CLOSE;                    //Applied price
input int                  MaxTrendLevel=90;                             //Maximum trend level
input int                  MiddLeTrendLevel=50;                          //Middle trend level
input int                  FlatLevel=20;                                 //Flat level
input Trend                TrendLevel=Maximum;                           //Used trend
//--- Параметры индикатора ColorZerolagRVI

input uint                 smoothing=15;                                 //Smoothing period RVI
input double               Factor1=0.05;                                 //Weight coef.1
input int                  RVI_period1=14;                               //RVI Period 1
input double               Factor2=0.10;                                 //Weight coef.2
input int                  RVI_period2=28;                               //RVI Period 2
input double               Factor3=0.16;                                 //Weight coef.3
input int                  RVI_period3=45;                               //RVI Period 3
input double               Factor4=0.26;                                 //Weight coef.4
input int                  RVI_period4=65;                               //RVI Period 4
input double               Factor5=0.43;                                 //Weight coef.5
input int                  RVI_period5=75;                               //RVI Period 5

Результат тестирования:

Рис.13 Результаты тестирования трендовой стратегии №2‌

Т‌ест Стратегии №3 (Облачная интерпретация AC Б.Уильямса и совмещенный в один Bears Power и Bulls Power).

П‌редустановка:‌

//--- Параметры индикатора Bears_Bull_power

input Smooth_Method        MA_Method1=MODE_AMA;                         //Averaging method
input uint                 Length1=12;                                  //Averaging depth                  
input int                  Phase1=15;                                   //Averaging parameter
input Smooth_Method        MA_Method2=MODE_ParMA;                       //Smoothing period
input uint                 Length2=5;                                   //Smoothing depth
input int                  Phase2=15;                                   //Smoothing parameter
input Applied_price_       IPC=PRICE_WEIGHTED_;                         //Applied price
input int                  Shift=0;                                     //Shift
//--- Параметры индикатора CronexAC

input Smooth_Method        XMA_Method=MODE_SMMA_;                       //Smoothing Method
input uint                 FastPeriod=9;                                //Fast smoothing period
input uint                 SlowPeriod=21;                               //Slow smoothing period
input int                  XPhase=15;                                   //Smoothing parameter

‌Результат тестирования:

Рис.14 Результаты тестирования трендовой стратегии №3‌

Т‌ест Стратегии №4 (Центр гравитации Эллерса, подтверждаемый индикатором средней скорости цены).

П‌редустановка:‌

//--- Параметры индикатора CenterOfGravityOSMA

input uint                 Period_=9;                                   //Averaging period
input uint                 SmoothPeriod1=3;                             //Smoothing period1
input ENUM_MA_METHOD       MA_Method_1=MODE_SMA;                        //Averaging method1
input uint                 SmoothPeriod2=3;                             //Smoothing period2
input ENUM_MA_METHOD       MA_Method_2=MODE_SMA;                        //Averaging method2
input Applied_price_       AppliedPrice=PRICE_OPEN_;                    //Applied price
//--- Параметры индикатора Average Speed

input int                  Inp_Bars=1;                                  //Days
input ENUM_APPLIED_PRICE   Price=PRICE_CLOSE;                           //Applied price
input double               Trend_lev=2;                                 //Trend Level

‌Результат тестирования:

Рис.15 Результаты тестирования трендовой стратегии №4‌

Т‌ест Стратегии №5 (Комплексный индикатор Бинарная волна).

Предустановка:

//--- Параметры индикатора Binary_Wave

input double               WeightMA    = 1.0;
input double               WeightMACD  = 1.0;
input double               WeightOsMA  = 1.0;
input double               WeightCCI   = 1.0;
input double               WeightMOM   = 1.0;
input double               WeightRSI   = 1.0;
input double               WeightADX   = 1.0;
//---- Moving Average

input int                  MAPeriod=10;
input ENUM_MA_METHOD       MAType=MODE_EMA;
input ENUM_APPLIED_PRICE   MAPrice=PRICE_CLOSE;
//---- MACD

input int                  FastMACD     = 12;
input int                  SlowMACD     = 26;
input int                  SignalMACD   = 9;
input ENUM_APPLIED_PRICE   PriceMACD=PRICE_CLOSE;
//---- OsMA

input int                  FastPeriod   = 12;
input int                  SlowPeriod   = 26;
input int                  SignalPeriod = 9;
input ENUM_APPLIED_PRICE   OsMAPrice=PRICE_CLOSE;
//---- CCI

input int                  CCIPeriod=10;
input ENUM_APPLIED_PRICE   CCIPrice=PRICE_MEDIAN;
//---- Momentum

input int                  MOMPeriod=14;
input ENUM_APPLIED_PRICE   MOMPrice=PRICE_CLOSE;
//---- RSI

input int                  RSIPeriod=14;
input ENUM_APPLIED_PRICE   RSIPrice=PRICE_CLOSE;
//---- ADX

input int                  ADXPeriod=10;

‌Результат тестирования:

Рис.16 Результаты тестирования трендовой стратегии №5

Тест стратегии №6 (Комплексный индикатор Weight Oscillator в связке с LeMan Objective).

Предустановка:

//--- Параметры индикатора LeMan Objective

input int                  Sample=20;
input int                  Quartile_1 = 25;
input int                  Quartile_2 = 50;
input int                  Quartile_3 = 75;
input int                  Shift=0;
//--- Параметры индикатора Weight Oscillator
//---- RSI
input double               RSIWeight=1.0;
input uint                 RSIPeriod=14;
input ENUM_APPLIED_PRICE   RSIPrice=PRICE_CLOSE;
//---- MFI
input double               MFIWeight=1.0;
input uint                 MFIPeriod=14;
input ENUM_APPLIED_VOLUME  MFIVolumeType=VOLUME_TICK;
//---- WPR
input double               WPRWeight=1.0;
input uint                 WPRPeriod=12;
//---- DeMarker
input double               DeMarkerWeight=1.0;
input uint                 DeMarkerPeriod=10;
//----
input Smooth_Method        bMA_Method=MODE_SMMA_;
input uint                 bLength=5;
input int                  bPhase=100;

Результат тестирования:

Рис.17 Результаты тестирования трендовой стратегии №6

Тест стратегии №7 (Канал Дончиана в тандеме с  модификацией MACD с замененным ценовым рядом на значения AO Б.Уильямса).

Предустановка:

input string               Inp_EaComment="Strategy #7";                 //EA Comment
input double               Inp_Lot=0.01;                                //Lot
input MarginMode           Inp_MMode=LOT;                               //MM
input int                  Inp_MagicNum=1111;                           //Magic number
input int                  Inp_StopLoss=400;                            //Stop Loss(points)
input int                  Inp_TakeProfit=600;                          //Take Profit(points)
input int                  Inp_Deviation = 20;                          //Deviation(points)
//--- Параметры индикатора Donchian Channel System

input uint                 DonchianPeriod=12;                           //Period of Averaging
input Applied_Extrem       Extremes=HIGH_LOW_CLOSE;                     //Type of Extremum

//--- Параметры индикатора CronexAO

input Smooth_Method        XMA_Method=MODE_ParMA;                        //Method of Averaging
input uint                 FastPeriod=14;                               //Period of Fast averaging
input uint                 SlowPeriod=25;                               //Period of Flow averaging
input int                  XPhase=15;                                   //Smoothing parameter

Результат тестирования:

Рис.18 Результаты тестирования трендовой стратегии №7


Тест стратегии №8 (Циклический осциллятор Шаффа с подтверждением в виде трех уровней Тироне).

Предустановка:

input string               Inp_EaComment="Strategy #8";                 //EA Comment
input double               Inp_Lot=0.01;                                //Lot
input MarginMode           Inp_MMode=LOT;                               //MM
input int                  Inp_MagicNum=1111;                           //Magic number
input int                  Inp_StopLoss=400;                            //Stop Loss(points)
input int                  Inp_TakeProfit=600;                          //Take Profit(points)
input int                  Inp_Deviation = 20;                          //Deviation(points)

input double               Overbuying=90;                               //Overbuying zone
input double               Overselling=15;                              //Overselling zone
//--- Параметры индикатора Schaff Trend Cycle

input Smooth_Method        MA_SMethod=MODE_SMMA_;                        //Histogram smoothing method
input int                  Fast_XMA = 20;                               //Fast moving average period
input int                  Slow_XMA = 30;                               //Slow moving average period
input int                  SmPhase= 100;                                //Moving averages smoothing parameter
input Applied_price_       AppliedPrice=PRICE_CLOSE_;                   //Price constant
input int                  Cycle=10;                                    //Stochastic oscillator period

//--- Параметры индикатора Tirone Levels

input int                  TirPeriod=13;                                //Period of the indicator
input int                  Shift=0;                                     //Horizontal shift of the indicator in bars

Результат тестирования:

Рис.19 Результаты тестирования трендовой стратегии №8

Тест стратегии №9 (Канал Келтнера в виде гистограммы и индикатор iTrend в облачном виде).

Предустановка:

input string               Inp_EaComment="Strategy #9";                 //EA Comment
input double               Inp_Lot=0.01;                                //Lot
input MarginMode           Inp_MMode=LOT;                               //MM
input int                  Inp_MagicNum=1111;                           //Magic number
input int                  Inp_StopLoss=400;                            //Stop Loss(points)
input int                  Inp_TakeProfit=600;                          //Take Profit(points)
input int                  Inp_Deviation = 20;                          //Deviation(points)

input uint                 BuyLevel=50;                                 //Overbuying zone
input double               SellLevel=-50;                               //Overselling zone
//--- Параметры индикатора i-KlPrice

input Smooth_Method        MA_Method1=MODE_ParMA;                       //smoothing method of moving average
input uint                 Length1=100;                                 //smoothing depth of moving average                  
input int                  Phase1=15;                                   //moving average smoothing parameter

input Smooth_Method        MA_Method2=MODE_SMMA_;                        //candles size smoothing method
input uint                 Length2=20;                                  //smoothing depth of candles size 
input int                  Phase2=100;                                  //candles size smoothing parameter

input double               Deviation=2.0;                               //channel expansion ratio
input uint                 Smooth=20;                                   //indicator smoothing period

input Applied_price_       IPC=PRICE_TYPICAL_;                          //price constant
input int                  Shift=0;                                     //horizontal shift of the indicator in bars

//--- Параметры индикатора iTrend

input Applied_price_       Price_Type=PRICE_TYPICAL_;
//--- Moving Average parameters
input uint                 MAPeriod=14;
input ENUM_MA_METHOD        MAType=MODE_EMA;
input ENUM_APPLIED_PRICE     MAPrice=PRICE_CLOSE;
//--- Bollinger parameters
input uint                 BBPeriod=14;
input double               deviation_=2.0;
input ENUM_APPLIED_PRICE    BBPrice=PRICE_CLOSE;
input Mode                BBMode=Mode_1;

Результат тестирования:

Рис.20 Результаты тестирования трендовой стратегии №9

Тест стратегии №10 (Импульс цены Average Change и веер скользящих средних FigurelliSeries).

Предустановка:

//--- Параметры индикатора Average Change
input Smooth_Method        MA_Method1=MODE_SMMA_;                       //smoothing method of moving average
input int                  Length1=12;                                  //smoothing depth of moving average                    
input int                  Phase1=15;                                   //moving average smoothing parameter
input Applied_price_       IPC1=PRICE_CLOSE_;                           //moving average price constant

input Smooth_Method        MA_Method2=MODE_EMA_;                        //indicator smoothing method
input int                  Length2 = 5;                                 //indicator smoothing depth
input int                  Phase2=100;                                  //indicator smoothing parameter
input Applied_price_       IPC2=PRICE_CLOSE_;                           //price constant for smoothing

input double               Pow=5;                                       //power
input int                  Shift=0;                                     //horizontal shift of the indicator in bars

//--- Параметры индикатора
input uint                 StartPeriod=6;                               //initial period
input uint                 Step_=6;                                     //periods calculation step
input uint                 Total=36;                                    //number of Moving Averages
input ENUM_MA_METHOD        MAType=MODE_EMA;                            //Moving Averages smoothing type
input ENUM_APPLIED_PRICE     MAPrice=PRICE_CLOSE;                       //price timeseries of Moving Averages
input int                  Shift1=0;                                    //Horizontal shift of the indicator in bars  

Результат тестирования:

Рис.21 Результаты тестирования трендовой стратегии №10


Выводы

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

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

Заключение

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

Программы, используемые в статье:

#
 Имя
Тип
Описание
1
Strategy_1.mq5
Эксперт
 Стратегия №1. Индикатор ADXCloud с подтверждающим RSI в виде гистограммы. 
2
Strategy_2.mql5
Эксперт
 Стратегия №2. Трендовый индикатор Standart Deviation в виде гистограммы с подтверждением RVI.
3
Strategy_3.mq5
Эксперт  Стратегия №3. Облачная интерпретация AC Б.Уильямса и совмещенный в один Bears Power и Bulls Power. 
4
Strategy_4.mq5
Эксперт
 Стратегия №4. Центр гравитации Эллерса, подтверждаемый индикатором средней скорости цены.
5
Strategy_5.mq5 Эксперт  Стратегия №5. Комплексный индикатор Бинарная волна.
6
Strategy_6.mq5
Эксперт
 Стратегия №6. Комплексный индикатор Weight Oscillator в связке с LeMan Objective.
7 Strategy_7.mq5 
Эксперт
 Стратегия №7. Канал Дончиана, подтверждаемый MACD, в котором ценовой ряд заменен на значения AO Уильямса.
 8  Strategy_8.mq5 Эксперт  Стратегия №8. Циклический осциллятор Шаффа с подтверждением в виде трех уровней Тироне.
 9 Strategy_9.mq5 Эксперт  Стратегия №9. Канал Келтнера в виде гистограммы и индикатор iTrend в облачном виде.
 10 Strategy_10.mq5 Эксперт  Стратегия №10. Импульс цены Average Change и веер скользящих средних FigurelliSeries.
 11 TradeFunctions.mqh Библиотека  Класс торговых функций.
 12 smoothalgorithms.mqh  Библиотека  Классы с алгоритмами сглаживания, используемые в индикаторах.
 13 adxcloud.mq5 Индикатор  Используется в Стратегии №1.
 14 rsi_сolor.mq5 Индикатор  Используется в Стратегии №1.
 15 colorstddev.mq5 Индикатор  Используется в Стратегии №2.
 16 colorzerolagrvi.mq5  Индикатор  Используется в Стратегии №2.
 17 Bear_Bulls_Power.mq5 Индикатор  Используется в Стратегии №3.
 18 cronexao.mq5 Индикатор  Используется в Стратегии №3.
 19 centerofgravityosma.mq5 Индикатор  Используется в Стратегии №4.
 20 average_speed.mq5 Индикатор  Используется в Стратегии №4.
 21 binarywave.mq5 Индикатор  Используется в Стратегии №5.
 22 objective.mq5 Индикатор  Используется в Стратегии №6.
 23 WeightOscillator.mq5 Индикатор   Используется в Стратегии №6.
 24 donchian_channels_system.mq5 Индикатор  Используется в Стратегии №7
 25 cronexao.mq5 Индикатор  Используется в Стратегии №7
 26 schafftrendcycle.mq5 Индикатор  Используется в Стратегии №8
 27 tirone_levels_x3.mq5 Индикатор  Используется в Стратегии №8
 28 i-klprice.mq5 Индикатор  Используется в Стратегии №9
 29 i_trend.mq5 Индикатор  Используется в Стратегии №9
 30 averagechange.mq5 Индикатор  Используется в Стратегии №10
 31 figurelliseries.mq5 Индикатор  Используется в Стратегии №10




Прикрепленные файлы |
10Trend.zip (1404 KB)
Последние комментарии | Перейти к обсуждению на форуме трейдеров (21)
Andrey F. Zelinsky
Andrey F. Zelinsky | 17 апр 2017 в 10:59

Прочитав название "Сравнительный анализ 10 трендовых стратегий" -- что я ожидал прочитать в статье и что в статье отсутствует напрочь:

1. Теоретические выкладки:

-- определение тренда/флета -- в чём разница

-- особенности/проблемы/подходы идентификации тренда, начала тренда, завершения тренда

2. Практические аспекты -- на примере общеизвестных стратегий (индикаторы есть в терминале):

-- описание стратегии, обоснование что стратегия трендовая

-- механизмы идентификации начала/завершения тренда

-- тестирование, анализ -- на нескольких таймфреймах

-- пути улучшения, в каком направлении можно попытаться развить стратегию

-- сравнение с предыдущей стратегией

3. Выводы

Alexey Viktorov
Alexey Viktorov | 18 апр 2017 в 07:54
Alexander Fedosov:

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

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

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

Так-что не надо принимать критику как наезд.

Alexander Fedosov
Alexander Fedosov | 18 апр 2017 в 09:04
Alexey Viktorov:

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

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

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

Скорее эта особенность современного человека. Не облили, да и на том спасибо.

Так-что не надо принимать критику как наезд.

Да нет, пусть. Чего лукавить, неприятно, но это же какая возможность иногда. Зашел человек - хорошая статья, спасибо. Чем хороша? За что понравилась? Но уж если не понравилась - супер детальный разбор обеспечен. Как пример, моя первая статья, там тоже было много замечаний, по коду в большинстве своем, вняли, поняли, исправили/дополнили.
Aleksey Vyazmikin
Aleksey Vyazmikin | 20 апр 2017 в 01:30

Какой то странный вывод получился "Поэтому главное, что мы выяснили, — нет большой разницы, каким образом определять текущий тренд. Достоинства и недостатки всех трендовых стратегий будут одними и теми же.‌‌" - этот вывод противоречит приведенным результатам тестирования - разброс результатов очень разный - особенно у вариантов 3, 4, 9. А значит, всё ж таки момент определения входа и выхода в рынок существенно влияет на результат при прочих равных.

Для объективно восприятия не хватает графика с результатами оптимизации - без него нельзя сделать предварительное представление об АТС.

Можно ли эти советники применять в реальной торговле, без внесения правок - корректно ли обрабатываются ордера и ошибки со стороны сервера ("рынок закрыт" и прочее)?

Vitalii Lemus
Vitalii Lemus | 7 авг 2017 в 13:16
Отличное исследование. Искать погрешности в статистике нет смысла, я бы лучше подумал над вопросом как оптимизировать более стабильные из представленных. И почему одни работают лучше а другие хуже.
Графические интерфейсы X: Сортировка, реконструкция таблицы и элементы управления в ячейках (build 11) Графические интерфейсы X: Сортировка, реконструкция таблицы и элементы управления в ячейках (build 11)

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

Готовые советники из Мастера MQL5 работают в MetaTrader 4 Готовые советники из Мастера MQL5 работают в MetaTrader 4

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

Секвента ДеМарка (TD SEQUENTIAL) с использованием искусственного интеллекта Секвента ДеМарка (TD SEQUENTIAL) с использованием искусственного интеллекта

В этой статье я расскажу, как с помощью "скрещивания" одной очень известной стратегии и нейронной сети можно успешно заниматься трейдингом. Речь пойдет о стратегии Томаса Демарка "Секвента" с применением системы искусственного интеллекта. Работать будем ТОЛЬКО по первой части стратегии, используя сигналы "Установка" и "Пересечение".

Торговля по каналам Дончиана Торговля по каналам Дончиана

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