Комбинируем трендовую и флетовую стратегии

Dmitriy Gizlyk | 18 августа, 2018

Содержание

Введение

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

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

1. Принципы объединения стратегий

На ценовом графике происходит постоянная смена трендов и тенденций. Сильные трендовые движения сменяются флетовыми (боковыми) движениями, когда цена "замирает" в узком диапазоне. В то же время, трейдер выбирает себе стратегию исходя из текущих рыночных условий. Но как определить, какую именно стратегию выбрать в данный момент? Трендовую или флетовую? 

График

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

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

2. Программируем советник

Для демонстрации принципов объединения стратегий были выбраны стратегия 1 из статьи [1] и стратегия 6 из статьи [2]. Обе выбранные стратегии используют индикатор ADX для определения тренда. Предварительно была проведена оптимизация работы советников на периоде с 1.01.2017 г. по 1.08.2018 г. По результатам оптимизации указанных стратегий были подобраны следующие параметры.

Трендовая стратегия 1.

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

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

Параметры флетовой стратегии

Результаты одиночной торговли советников с оптимизированными параметрами представлены на скриншотах.

Трендовая стратегия 1.

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

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

Результаты тестирования флетовой стратегииРезультаты тестирования флетовой стратегии

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

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

2.1. Метод 1

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

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

Для реализации метода скопируем код обоих советников в один файл, объединив код по идентичным функциям. Для исключения дублирования имен к переменным и функциям трендовой стратегии добавим приставку Trend, а к переменным и функциям флетовой стратегии — приставку Flat.

//--- Общие параметры
input double               Inp_Lot=0.01;                          //Lot
input MarginMode           Inp_MMode=LOT;                         //MM
input int                  Inp_MagicNum=1111;                     //Magic number
input int                  Inp_Deviation = 2;                     //Deviation(points)
//---
input string               Trend_EaComment="Trend Strategy";      //Strategy Comment
input int                  Trend_StopLoss=25;                     //Stop Loss(points)
input int                  Trend_TakeProfit=90;                   //Take Profit(points)
//--- Параметры индикатора RSI_Color
input int                  Trend_RSIPeriod=28;                    //RSI Period
input double               Trend_Overbuying=70;                   //Overbuying zone
input double               Trend_Overselling=30;                  //Overselling zone
//--- Параметры индикатора ADX_Cloud
input int                  Trend_ADXPeriod=11;                    //ADX Period
input double               Trend_alpha1 = 0.25;                   //alpha1
input double               Trend_alpha2 = 0.25;                   //alpha2
//---
input string               Flat_EaComment="Flat Strategy";        //Strategy Comment
input int                  Flat_StopLoss=50;                      //Stop Loss(points)
input int                  Flat_TakeProfit=50;                    //Take Profit(points)
//--- Параметры индикатора WPR
input int                  Flat_WPRPeriod=7;                      //Period WPR
//--- Параметры индикатора ADX
input int                  Flat_ADXPeriod=11;                     //Period ADX
input int                  Flat_FlatLevel=40;                     //Flat Level ADX

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

void OnTick()
  {
//--- Проверка ранее открытых экcпертом ордеров
   if(!Trade.IsOpenedBySymbol(_Symbol,Inp_MagicNum))
     {
      //--- Получение данных для расчета
      if(!GetIndValue())
         return;
      //--- Открытие ордеров по трендовому алгоритму
      //--- Открытие ордера при наличии сигнала на покупку
      if(TrendBuySignal())
         Trade.BuyPositionOpen(Symbol(),Inp_Lot,Trend_StopLoss,Trend_TakeProfit,Inp_MagicNum,Trend_EaComment);
      else
      //--- Открытие ордера при наличии сигнала на продажу
      if(TrendSellSignal())
         Trade.SellPositionOpen(Symbol(),Inp_Lot,Trend_StopLoss,Trend_TakeProfit,Inp_MagicNum,Trend_EaComment);
      else
      //--- Открытие ордеров по флетовому алгоритму
      //--- Открытие ордера при наличии сигнала на покупку
      if(FlatBuySignal())
         Trade.BuyPositionOpen(Symbol(),Inp_Lot,Flat_StopLoss,Flat_TakeProfit,Inp_MagicNum,Flat_EaComment);
      else
      //--- Открытие ордера при наличии сигнала на продажу
      if(FlatSellSignal())
         Trade.SellPositionOpen(Symbol(),Inp_Lot,Flat_StopLoss,Flat_TakeProfit,Inp_MagicNum,Flat_EaComment);
     }
  }

С полным кодом советника можно ознакомиться во вложении (проект Combination1).

2.2. Метод 2

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

В приведенном примере трендовой стратегии для определения тренда используется индикатор ADX cloud, который демонстрирует приведенную разницу между линиями DI+ и DI-, при этом не проверяется сила тренда. В то же время, флетовая стратегия перед открытием позиции проверяет силу тренда по пороговому значению ADX. Следовательно, мы можем ввести дополнительный фильтр для открытия сделки по трендовой стратегии с учетом силы тренда.

bool TrendBuySignal()
  {
   return(trend_adx[0]>trend_adx[1] && trend_rsi1[0]==1 && trend_rsi1[1]==1 &&  flat_adx[0]>=Flat_FlatLevel)?true:false;
  }

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

bool FlatBuySignal()
  {
   return(flat_wpr[0]<-80 && flat_adx[0]<Flat_FlatLevel && trend_rsi2[0]!=1)?true:false;
  }

С полным кодом советника можно ознакомиться во вложении проект (Combination2).

2.3. Метод 3

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

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

//--- Общие параметры
input double               Inp_Lot=0.01;                             //Lot
input MarginMode           Inp_MMode=LOT;                            //MM
input int                  Inp_Deviation = 2;                        //Deviation(points)
//---
input string               Trend_EaComment="Trend Strategy";         //Strategy Comment
input int                  Trend_StopLoss=25;                        //Stop Loss(points)
input int                  Trend_TakeProfit=90;                      //Take Profit(points)
input int                  Trend_MagicNum=1111;                      //Magic number
//--- Параметры индикатора RSI_Color
input int                  Trend_RSIPeriod=28;                       //RSI Period
input double               Trend_Overbuying=70;                      //Overbuying zone
input double               Trend_Overselling=30;                     //Overselling zone
//--- Параметры индикатора ADX_Cloud
input int                  Trend_ADXPeriod=11;                       //ADX Period
input double               Trend_alpha1 = 0.25;                      //alpha1
input double               Trend_alpha2 = 0.25;                      //alpha2
//---
input string               Flat_EaComment="Flat Strategy";           //Strategy Comment
input int                  Flat_StopLoss=50;                         //Stop Loss(points)
input int                  Flat_TakeProfit=50;                       //Take Profit(points)
input int                  Flat_MagicNum=1112;                       //Magic number
//--- Параметры индикатора WPR
input int                  Flat_WPRPeriod=7;                         //Period WPR
//--- Параметры индикатора ADX
input int                  Flat_ADXPeriod=11;                        //Period ADX
input int                  Flat_FlatLevel=40;                        //Flat Level ADX

В функции OnTick отдельно проверяем открытые позиции с трендовым магическим числом, и отдельно — с флетовым.

void OnTick()
  {
//--- Проверка ранее открытых экcпертом ордеров по трендовой стратегии
   if(!Trade.IsOpenedBySymbol(_Symbol,Trend_MagicNum))
     {
      //--- Получение данных для расчета
      if(!GetIndValue())
         return;
      //--- Открытие ордера при наличии сигнала на покупку
      if(TrendBuySignal())
         Trade.BuyPositionOpen(Symbol(),Inp_Lot,Trend_StopLoss,Trend_TakeProfit,Trend_MagicNum,Trend_EaComment);
      else
      //--- Открытие ордера при наличии сигнала на продажу
      if(TrendSellSignal())
         Trade.SellPositionOpen(Symbol(),Inp_Lot,Trend_StopLoss,Trend_TakeProfit,Trend_MagicNum,Trend_EaComment);
     }
//--- Проверка ранее открытых экcпертом ордеров по флетовой стратегии
   if(!Trade.IsOpenedBySymbol(_Symbol,Flat_MagicNum))
     {
      //--- Получение данных для расчета
      if(!GetIndValue())
         return;
      //--- Открытие ордера при наличии сигнала на покупку
      if(FlatBuySignal())
         Trade.BuyPositionOpen(Symbol(),Inp_Lot,Flat_StopLoss,Flat_TakeProfit,Flat_MagicNum,Flat_EaComment);
      else
      //--- Открытие ордера при наличии сигнала на продажу
      if(FlatSellSignal())
         Trade.SellPositionOpen(Symbol(),Inp_Lot,Flat_StopLoss,Flat_TakeProfit,Flat_MagicNum,Flat_EaComment);
     }
  }

С полным кодом советника можно ознакомиться во вложении (проект Combination3).

3. Тестирование советников

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

3.1. Тест метода 1

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

Результаты тестирования "Метод 1"Результаты тестирования "Метод 1"

3.2. Тест метода 2

Применение второго метода позволило еще увеличить общую прибыль по сравнению с методом 1 при том же количестве сделок, хотя она по-прежнему ниже суммарной прибыли исходных советников. Рост прибыли позволил увеличить фактор восстановления, профит-фактор (стал равным флетовой стратегии) и долю прибыльных сделок. Одновременно с этим снизилась максимальная просадка по балансу.

Результаты тестирования "Метод 2"Результаты тестирования "Метод 2"

3.3. Тест метода 3

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

Результаты тестирования "Метод 3"Результаты тестирования "Метод 3"

4. Оптимизация стратегий

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

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

При этом не будем забывать, что сама идея построения электронных советников заключается в зарабатывании на рынке, а не в демонстрации их возможностей на исторических данных. Поэтому я предлагаю вам разделить период тестирования на два участка. Ранее мы проводили тестирование за период с 1.01.2017 г. по 1.08.2018 г. Сейчас же я предлагаю провести оптимизацию на временном интервале с 1.01.2017 г. по 1.06.2018 г., а на оставшемся временном отрезке провести форвард-тестирование.

Период оптимизации

4.1. Оптимизация "Метода 1"

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

Оптимизация периода индикатора ADX показала максимальную прибыль и устойчивость к изменению других параметров при периоде индикатора в промежутке от 12 до 14. Ниже приведен график зависимости прибыли советника от изменения периодов ADX и RSI на оптимизируемом временном интервале.

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

Форвард-тест ADX

Оптимизация периода индикатора WPR показала схожие результаты. Максимальная устойчивость работы советника на оптимизируемом участке достигается при периоде индикатора, равном 7. В то же время при росте периода индикатора ADX возможно и получение прибыли в диапазоне от 3 до 5. Ниже представлен график зависимости прибыли советника от изменения периодов WPR и ARX на оптимизируемом временном интервале.

Оптимизация WPR

Форвад-тестирование подтвердило указанные зоны. Но при этом наблюдается рост прибыли в диапазоне 3-4 периода индикатора WPR, а при WPR, равном 7, наблюдается снижение прибыльности советника при росте значений индикатора ADX. Это может быть связано с более коротким временным интервалом тестирования и его спецификой.

Форвард-тестирование WPR

Оптимизация периода индикатора RSI подтвердила все вышесказанное. На оптимизируемом временном интервале выделяется прибыльностью и устойчивостью к изменениям других индикаторов диапазон от 27 до 32. Ниже приведен график зависимости прибыли советника от изменения периодов RSI и ADX на оптимизируемом временном интервале.

Оптимизация RSI

На форвард-тестировании диапазон прибыльности периодов индикатора RSI был сужен до 30-32.

Форвард-тестирование RSI

Попытки оптимизации значений тейк-профита и стоп-лосса не позволили увеличить прибыльность советника и подтвердили ранее выбранные параметры.

По результатам оптимизации в качестве оптимальных параметров были выбраны период ADX, равный 13, RSI — 30, WPR — 7. С такими параметрами советник на оптимизируемом периоде получил 202.33 USD прибыли, а на форвард-периоде — 46.10 USD при прочих равных параметрах. Такая доходность превышает доходность, полученную при объединении советников по методу 3 на том же периоде, который был протестирован выше. Следует отметить, что использование аналогичных параметров в советнике, скомбинированном по методу 3, также дает худшие результаты, 166.29 USD и 60.27 USD соответственно.

Оптимизация "Метод 1"Оптимизация "Метод 1"Оптимизация "Метод 1"

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

4.2. Оптимизация "Метода 2"

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

Метод 2. Оптимизация ADXМетод 2. Форвард тестирование ADXМетод 2. Оптимизация WPRМетод 2. Форвард тестирование WPRМетод 2. Оптимизация RSIМетод 2. Форвард тестирование RSI

В то же время, повышение качества сигналов трендовой стратегии позволило оптимизировать уровни стоп-лосса и тейкп-профита. В результате оптимизациии стоп-лосс для трендовой стратегии был уменьшен с 25 до 20 пунктов, а тейк-профит увеличен с 90 до 110 пунктов. Это позволило увеличило доходность работы советника. Графики оптимизации уровней стоп-лосса и тейк-профита представлены ниже.

Метод 2. Оптимизация SLМетод 2. Форвард тестирование SLМетод 2. Оптимизация TPМетод 2. Форвард тестирование TP

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

Оптимизация "Метод 2"

Заключение

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

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

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

ПараметрТрендовая
стратегия
Флетовая
стратегия
Метод 1Метод 2Метод 3Метод 1 опт.
Бек./Фор. 
Метод 2 опт.
Бек./Фор. 
Общая прибыль51.56158.96160.52166.12210.40 202.33 / 46.10 206.40 / 43,10
Профит-фактор2.391.251.241.251.31 1.25 / 1.58 1.25 /1.54
Фактор восстановления3.653.553.733.864.904.08 / 1.94 4.17 / 1.82
Максимальная просадка по балансу8.4941.3036.4135.6739.2344.98 / 19.75 44.98 /19.75
Максимальная просадка по средствам14.1444.7643.0443.0442.9649.53 / 23.72 49.53 / 23.72
Количество сделок24290295295315
 371 / 41 373 / 40
Доля прибыльных сделок41.67%55.52%53.22%53.90%54.29%53.64 / 60.98 53.62 / 60

Ссылки

  1. Сравнительный анализ 10 трендовых стратегий
  2. Сравнительный анализ 10 флетовых стратегий
  3. Сколько длится тренд?

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

#
 Имя
Тип 
Описание 
1 Trade.mqh Библиотека класса Класс торговых операций
2 Combination1.mq5 Советник Советник объединений стратегий по методу 1
3 Combination2.mq5 Советник Советник объединений стратегий по методу 2
4 Combination3.mq5 Советник Советник объединений стратегий по методу 3