Это количественная стратегия торговли, которая сочетает в себе индикаторы triple supertrend, EMA и ADX. Она генерирует торговые сигналы с использованием системы triple supertrend и применяет EMA и ADX в качестве фильтров для контроля частоты торговли и улучшения качества сигнала.
Используйте три системы супертенденции с различными параметрами и генерируйте торговые сигналы, когда все три супертенденции согласны с направлением.
Применять EMA как трендовый фильтр, идти длинным только когда закрытие выше EMA и идти коротким, когда закрытие ниже EMA.
Применять ADX в качестве фильтра силы тренда, торговать только тогда, когда ADX превышает порог.
Разрешить опцию реинтеграции для корректировки рентабельности и контроля рисков.
В частности, условием длинного входа является то, что все три супертенденции становятся бычьими, закрытие находится выше EMA, а ADX выше порога. Условие короткого входа - это то, что все три супертенденции становятся медвежими, закрытие находится ниже EMA, а ADX выше порога. Выход происходит, когда любой из супертенденций переворачивается.
В стратегии также отображаются линии поддержки и сопротивления супертенденции, чтобы помочь визуальному определению тренда.
Система тройного супертендента фильтрует ложные прорывы и улучшает точность входа.
Двойные фильтры EMA и ADX уменьшают убытки и улучшают управление рисками.
Опция реинтеграции позволяет корректировать рентабельность на основе предпочтения риска.
Визуальные линии супертенденции помогают определить направление тренда.
Супертенд и другие индикаторы имеют задержку и могут привести к позднему вхождению или раннему выходу.
Слишком строгие фильтры могут упустить возможности.
Ушибки могут привести к потерям на рынках с ограниченным диапазоном.
Разрешение на повторный вход увеличивает частоту торговли и расходы на сдвиг.
Эти риски могут быть уменьшены путем оптимизации параметров, фильтров и использования динамических остановок.
Эта стратегия может быть оптимизирована в нескольких аспектах:
Испытывать различные комбинации параметров для поиска оптимальных настроек супертенденции и EMA.
Оптимизировать порог ADX для уменьшения ложных сигналов.
Добавьте другие фильтры, такие как волатильность, объем и т. д.
Оптимизировать параметры отдельно для различных продуктов.
Создать динамические механизмы остановки потерь для лучшего контроля рисков.
Используйте машинное обучение для поиска лучших правил входа и выхода.
Эта стратегия использует сильные стороны трех систем супертенденций и дополняет их двойными фильтрами EMA и ADX для эффективного улучшения качества сигнала и контроля рисков. Дальнейшие улучшения параметров, фильтров, динамических остановок могут улучшить его надежность и адаптивность. В сочетании с анализом трендов, он обеспечивает эффективные сигналы входа и выхода для количественной торговли.
/*backtest start: 2023-08-18 00:00:00 end: 2023-09-17 00:00:00 period: 2h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // ©kunjandetroja //@version=5 strategy('Triple Supertrend with EMA and ADX', overlay=true) m1 = input.float(1,"ATR Multi",minval = 1,maxval= 6,step=0.5,group='ST 1') m2 = input.float(2,"ATR Multi",minval = 1,maxval= 6,step=0.5,group='ST 2') m3 = input.float(3,"ATR Multi",minval = 1,maxval= 6,step=0.5,group='ST 3') p1 = input.int(10,"ATR Multi",minval = 5,maxval= 25,step=1,group='ST 1') p2 = input.int(15,"ATR Multi",minval = 5,maxval= 25,step=1,group='ST 2') p3 = input.int(20,"ATR Multi",minval = 5,maxval= 25,step=1,group='ST 3') len_EMA = input.int(200,"EMA Len",minval = 5,maxval= 250,step=1) len_ADX = input.int(14,"ADX Len",minval = 1,maxval= 25,step=1) len_Di = input.int(14,"Di Len",minval = 1,maxval= 25,step=1) adx_above = input.float(25,"adx filter",minval = 1,maxval= 50,step=0.5) var bool long_position = false adx_filter = input.bool(false, "Add Adx & EMA filter") renetry = input.bool(true, "Allow Reentry") f_getColor_Resistance(_dir, _color) => _dir == 1 and _dir == _dir[1] ? _color : na f_getColor_Support(_dir, _color) => _dir == -1 and _dir == _dir[1] ? _color : na [superTrend1, dir1] = ta.supertrend(m1, p1) [superTrend2, dir2] = ta.supertrend(m2, p2) [superTrend3, dir3] = ta.supertrend(m3, p3) EMA = ta.ema(close, len_EMA) [diplus,diminus,adx] = ta.dmi(len_Di,len_ADX) // ADX Filter adxup = adx > adx_above and close > EMA adxdown = adx > adx_above and close < EMA sum_dir = dir1 + dir2 + dir3 dir_long = if(adx_filter == false) sum_dir == -3 else sum_dir == -3 and adxup dir_short = if(adx_filter == false) sum_dir == 3 else sum_dir == 3 and adxdown Exit_long = dir1 == 1 and dir1 != dir1[1] Exit_short = dir1 == -1 and dir1 != dir1[1] // BuySignal = dir_long and dir_long != dir_long[1] // SellSignal = dir_short and dir_short != dir_short[1] // if BuySignal // label.new(bar_index, low, 'Long', style=label.style_label_up) // if SellSignal // label.new(bar_index, high, 'Short', style=label.style_label_down) longenter = if(renetry == false) dir_long and long_position == false else dir_long shortenter = if(renetry == false) dir_short and long_position == true else dir_short if longenter long_position := true if shortenter long_position := false strategy.entry('BUY', strategy.long, when=longenter) strategy.entry('SELL', strategy.short, when=shortenter) strategy.close('BUY', Exit_long) strategy.close('SELL', Exit_short) buy1 = ta.barssince(dir_long) sell1 = ta.barssince(dir_short) colR1 = f_getColor_Resistance(dir1, color.red) colS1 = f_getColor_Support(dir1, color.green) colR2 = f_getColor_Resistance(dir2, color.orange) colS2 = f_getColor_Support(dir2, color.yellow) colR3 = f_getColor_Resistance(dir3, color.blue) colS3 = f_getColor_Support(dir3, color.maroon) plot(superTrend1, 'R1', colR1, linewidth=2) plot(superTrend1, 'S1', colS1, linewidth=2) plot(superTrend2, 'R1', colR2, linewidth=2) plot(superTrend2, 'S1', colS2, linewidth=2) plot(superTrend3, 'R1', colR3, linewidth=2) plot(superTrend3, 'S1', colS3, linewidth=2) // // Intraday only // var int new_day = na // var int new_month = na // var int new_year = na // var int close_trades_after_time_of_day = na // if dayofmonth != dayofmonth[1] // new_day := dayofmonth // if month != month[1] // new_month := month // if year != year[1] // new_year := year // close_trades_after_time_of_day := timestamp(new_year,new_month,new_day,15,15) // strategy.close_all(time > close_trades_after_time_of_day)