Комбинируем трендовую и флетовую стратегии
Содержание
- Введение
- 1. Принципы объединения стратегий
- 2. Программируем советник
- 2.1. Метод 1
- 2.2. Метод 2
- 2.3. Метод 3
- 3. Тестирование советников
- 3.1. Тестирование метода 1
- 3.2. Тестирование метода 2
- 3.1. Тестирование метода 3
- 4. Оптимизация стратегий
- 4.1. Оптимизация "Метод 1"
- 4.2. Оптимизация "Метод 2"
- Заключение
Введение
Существуют различные стратегии торговли. Одни ищут направленное движение и торгуют по тренду. Другие определяют диапазоны ценовых колебаний и торгуют внутри таких коридоров. Рынок изменчив, между трендовыми движениями наблюдаются флетовые движения. Это и позволяет зарабатывать на рынке и первым, и вторым. Но когда одни зарабатывают, вторые либо теряют, либо ждут подходящего момента. А потом наоборот.
И возникает вопрос, можно ли объединить два подхода для увеличения прибыльности торговли? Могут ли две стратегии дополнять друг друга? Давайте попробуем совместить, казалось бы, абсолютно разные модели торговли и посмотрим результат такого комбинирования стратегий.
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
Первый же тест показал прибыль. Общая прибыль и фактор восстановления были выше любого из исходных советников. В сравнении с флетовой стратегией визуально линия баланса стала более ровной, увеличилось количество сделок и снизилась максимальная просадка по балансу и по средствам. В то же время, немного снизился профит-фактор и сумма общей прибыли была все же меньше суммарной прибыли исходных стратегий.
3.2. Тест метода 2
Применение второго метода позволило еще увеличить общую прибыль по сравнению с методом 1 при том же количестве сделок, хотя она по-прежнему ниже суммарной прибыли исходных советников. Рост прибыли позволил увеличить фактор восстановления, профит-фактор (стал равным флетовой стратегии) и долю прибыльных сделок. Одновременно с этим снизилась максимальная просадка по балансу.
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. В свою очередь, схожесть результатов оптимизации и форвард-тестирования свидетельствуют об устойчивости работы советника на неоптимизированном временном интервале.
Оптимизация периода индикатора WPR показала схожие результаты. Максимальная устойчивость работы советника на оптимизируемом участке достигается при периоде индикатора, равном 7. В то же время при росте периода индикатора ADX возможно и получение прибыли в диапазоне от 3 до 5. Ниже представлен график зависимости прибыли советника от изменения периодов WPR и ARX на оптимизируемом временном интервале.
Форвад-тестирование подтвердило указанные зоны. Но при этом наблюдается рост прибыли в диапазоне 3-4 периода индикатора WPR, а при WPR, равном 7, наблюдается снижение прибыльности советника при росте значений индикатора ADX. Это может быть связано с более коротким временным интервалом тестирования и его спецификой.
Оптимизация периода индикатора RSI подтвердила все вышесказанное. На оптимизируемом временном интервале выделяется прибыльностью и устойчивостью к изменениям других индикаторов диапазон от 27 до 32. Ниже приведен график зависимости прибыли советника от изменения периодов RSI и ADX на оптимизируемом временном интервале.
На форвард-тестировании диапазон прибыльности периодов индикатора RSI был сужен до 30-32.
Попытки оптимизации значений тейк-профита и стоп-лосса не позволили увеличить прибыльность советника и подтвердили ранее выбранные параметры.
По результатам оптимизации в качестве оптимальных параметров были выбраны период ADX, равный 13, RSI — 30, WPR — 7. С такими параметрами советник на оптимизируемом периоде получил 202.33 USD прибыли, а на форвард-периоде — 46.10 USD при прочих равных параметрах. Такая доходность превышает доходность, полученную при объединении советников по методу 3 на том же периоде, который был протестирован выше. Следует отметить, что использование аналогичных параметров в советнике, скомбинированном по методу 3, также дает худшие результаты, 166.29 USD и 60.27 USD соответственно.
Хочется отметить, что подтверждение результатов оптимизации форвард-тестированием является хорошим знаком и свидетельствует об устойчивости работы советника на неоптимизированном временном участке.
4.2. Оптимизация "Метода 2"
Интересен тот факт, что оптимизация советника, скомбинированного по методу 2, дала схожие результаты с предыдущей оптимизацией, что может свидетельствовать о стабильности работы торговой системы. И в результате оптимизации были выбраны те же периоды индикаторов, что и в предыдущем разделе. Только при прочих равных условиях советник по методу 2 показал меньшую доходность за счет снижения количества сделок. Графики оптимизации представлены ниже.
В то же время, повышение качества сигналов трендовой стратегии позволило оптимизировать уровни стоп-лосса и тейкп-профита. В результате оптимизациии стоп-лосс для трендовой стратегии был уменьшен с 25 до 20 пунктов, а тейк-профит увеличен с 90 до 110 пунктов. Это позволило увеличило доходность работы советника. Графики оптимизации уровней стоп-лосса и тейк-профита представлены ниже.
По результатам оптимизации доходность советника, скомбинированного по методу 2, стала максимальной из трех рассмотренных вариантов. Применение параметров, полученных в ходе этой оптимизации, на других советниках дало худшую доходность. Скриншоты тестирования оптимизированного советника представлены ниже.
Заключение
В статье предложены три варианта комбинирования двух стратегий в один советник, показано, как такое объединение организовать в советнике, а также проведено тестирование советников без изменения параметров и после их оптимизации.
В таблице ниже приведены сводные результаты тестирования всех стратегий. Оптимизация комбинированных советников показала доходность выше использования двух отдельных советников.
Хотелось бы добавить — в своих советниках вы можете объединить и более двух стратегий, используя различную комбинацию из предложенных методов или дополнив своими методами. При этом нельзя однозначно сказать, какой из методов будем лучшим. В каждом случае нужно подходить творчески к выбору метода комбинирования стратегий, исходя из самих стратегий и их логики работы.
Параметр | Трендовая стратегия | Флетовая стратегия | Метод 1 | Метод 2 | Метод 3 | Метод 1 опт. Бек./Фор. | Метод 2 опт. Бек./Фор. |
---|---|---|---|---|---|---|---|
Общая прибыль | 51.56 | 158.96 | 160.52 | 166.12 | 210.40 | 202.33 / 46.10 | 206.40 / 43,10 |
Профит-фактор | 2.39 | 1.25 | 1.24 | 1.25 | 1.31 | 1.25 / 1.58 | 1.25 /1.54 |
Фактор восстановления | 3.65 | 3.55 | 3.73 | 3.86 | 4.90 | 4.08 / 1.94 | 4.17 / 1.82 |
Максимальная просадка по балансу | 8.49 | 41.30 | 36.41 | 35.67 | 39.23 | 44.98 / 19.75 | 44.98 /19.75 |
Максимальная просадка по средствам | 14.14 | 44.76 | 43.04 | 43.04 | 42.96 | 49.53 / 23.72 | 49.53 / 23.72 |
Количество сделок | 24 | 290 | 295 | 295 | 315 | 371 / 41 | 373 / 40 |
Доля прибыльных сделок | 41.67% | 55.52% | 53.22% | 53.90% | 54.29% | 53.64 / 60.98 | 53.62 / 60 |
Ссылки
- Сравнительный анализ 10 трендовых стратегий
- Сравнительный анализ 10 флетовых стратегий
- Сколько длится тренд?
Программы, используемые в статье:
# | Имя | Тип | Описание |
---|---|---|---|
1 | Trade.mqh | Библиотека класса | Класс торговых операций |
2 | Combination1.mq5 | Советник | Советник объединений стратегий по методу 1 |
3 | Combination2.mq5 | Советник | Советник объединений стратегий по методу 2 |
4 | Combination3.mq5 | Советник | Советник объединений стратегий по методу 3 |
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
никакого :) Но кто-то еще этого не понял и ему надо самому разобраться
MQ либо не разобрались, либо продвигают миф из-за соображений конкуренции с другими оптимизаторами.
MQ либо не разобрались, либо продвигают миф из-за соображений конкуренции с другими оптимизаторами.
Ну хотя бы что-то, можно 3-й контрольный участок делать после выбора приемлемого бэка и форварда
но тем кто перешел на нейросети это уже не интересно (и по скорости оптимизации не сравнимо )
Чтобы торговать по тренду надо определить куда он идет. Для этого подойдет FX5 Macd Divergence. Пунктирными линиями там показана скрытая дивергенция, говорящая о том куда направлен тренд и в какой точке надо входить в рынок
Спасибо сенсей. А мы думали о нейросетях, все оказалось гораздо проще.