Сравнительный анализ 10 трендовых стратегий
Содержание
- Введение
- Постановка задачи при создании трендовой стратегии
- Трендовые стратегии
- Стратегия №1. Индикатор ADXCloud с подтверждающим RSI в виде гистограммы.
- Стратегия №2. Трендовый индикатор Standard Deviation в виде гистограммы с подтверждением RVI.
- Стратегия №3. Облачная интерпретация AC Б.Уильямса и совмещенный индикатор Bears Power и Bulls Power.
- Стратегия №4. Центр гравитации Эллерса, подтверждаемый индикатором средней скорости цены.
- Стратегия №5. Комплексный индикатор Бинарная волна.
- Стратегия №6. Комплексный индикатор Weight Oscillator в связке с LeMan Objective.
- Стратегия №7. Канал Дончиана в комплекте с MACD, в котором ценовой ряд заменен на значения AO Б.Уильямса.
- Стратегия №8. Циклический осциллятор Шаффа с подтверждением по трем уровням Тироне.
- Стратегия №9. Канал Келтнера в виде гистограммы и индикатор iTrend в облачном виде.
- Стратегия №10. Импульс цены Average Change и веер скользящих средних FigurelliSeries.
- Тестирование
- Выводы
- Заключение
Введение
Стратегии торговли по тренду очень популярны при работе на валютных рынках. Суть их состоит в том, чтобы точно определить сильное однонаправленное движение, найти благоприятные точки для входа в рынок и, что не менее важно, — правильно определить момент выхода. Для этой статьи я отобрал несколько технических инструментов для прямого или косвенного определения тренда. Из них составлены 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 рабочий таймфрейм — H1. Поэтому можно принять для них одинаковые цели прибыли и убытков. Установим Тейк-профит в 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
//--- Параметры индикатора 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
Рис.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 |
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Александр, а сможете вспомнить сколько раз вы хвалили ребёнка, надеюсь у вас есть дети, за то что он вернулся с прогулки чистый и не в порванной одежде? И сколько раз вы его ругали за испачканные штаны... Или сколько раз восхваляли жену, маму за обычный обед. И сколько раз высказывали недовольство за пересоленный, например, суп.
Алексей, позволю ответить вам на примере ваших сравнений. Тем не менее, мы всегда понимаем пользу похвалить ребенка и вполне очевидно, что его мотивирует больше не рвать штаны/убрать самому игрушки/завязать шнурки похвала, что он это сделал, а не указка при первой же возможности, когда он ошибся. За обычный обед может не восхваляем каждый раз, но благодарность произносим.
Человеку вообще свойственно не замечать хорошее и всегда бросаются в глаза мельчайшие недостатки. Самая хорошая похвала это отсутствие критики. Равно как и отсутствие новостей это самая хорошая новость. Если чего-то случиться мы обязательно получим эту неприятную новость.
Скорее эта особенность современного человека. Не облили, да и на том спасибо.
Так-что не надо принимать критику как наезд.
Какой то странный вывод получился "Поэтому главное, что мы выяснили, — нет большой разницы, каким образом определять текущий тренд. Достоинства и недостатки всех трендовых стратегий будут одними и теми же." - этот вывод противоречит приведенным результатам тестирования - разброс результатов очень разный - особенно у вариантов 3, 4, 9. А значит, всё ж таки момент определения входа и выхода в рынок существенно влияет на результат при прочих равных.
Для объективно восприятия не хватает графика с результатами оптимизации - без него нельзя сделать предварительное представление об АТС.
Можно ли эти советники применять в реальной торговле, без внесения правок - корректно ли обрабатываются ордера и ошибки со стороны сервера ("рынок закрыт" и прочее)?
Интересная статья. Спасибо автору за проделанную работу!
Думаю в индикаторе i-klprice есть ошибка: должно быть Length1