Стратегия адаптивного тренда - это количественная стратегия торговли, которая сочетает в себе полосы Боллинджера и показатели скользящей средней для динамической корректировки фактора силы тренда и достижения следующего тренда и остановки потери. Эта стратегия использует полосы Боллинджера для расчета волатильности цен и, таким образом, динамически рассчитывает разумную силу тренда. Затем она использует индикатор ATR для составления адаптивного канала тренда для определения и следования бычьим и медвежьим тенденциям. В то же время стратегия имеет встроенный механизм остановки потери для эффективного контроля рисков.
Основным показателем этой стратегии являются полосы Боллинджера. Полосы Боллинджера состоят из средней полосы, верхней полосы и нижней полосы. Средняя полоса представляет собой n-дневную простую скользящую среднюю, верхняя полоса представляет собой среднюю полосу + k раз стандартное отклонение n-днев, а нижняя полоса представляет собой среднюю полосу - k раз стандартное отклонение n-днев. Здесь мы выбираем 20-дневную среднюю полосу и 2 раз стандартное отклонение для построения полос Боллинджера.
Затем мы рассчитываем пропускную способность (верхний диапазон - нижний диапазон) над соотношением среднего диапазона, называемым
При разумном коэффициенте прочности в сочетании с индикатором ATR верхняя и нижняя полосы движутся вверх и вниз на расстояние коэффициента прочности ATR * соответственно, образуя адаптивный трендовый канал.
Кроме того, стратегия также устанавливает механизм стоп-лосса. После формирования длинной позиции, если цена падает ниже самой низкой точки, когда позиция была открыта, выход стоп-лосса; то же самое для коротких позиций.
Эта стратегия имеет следующие преимущества:
Высокая адаптивность. Способ расчета коэффициента прочности позволяет стратегии динамически регулировать ширину канала на основе волатильности рынка, расширяя канал в бычьем тренде рынка и сужая канал на колеблющемся рынке для достижения самоприспособления к различным типам рынков.
По сравнению с простыми стратегиями скользящих средних, стратегии Bollinger Bands регулируют каналы реже, избегая ненужного частого открытия и закрытия позиций.
Точное время входа. Прорыв верхних и нижних рельсов может эффективно фильтровать рыночный шум и обеспечить высокую вероятность обнаружения открытия тенденций.
Механизм остановки убытков. Встроенный метод остановки убытков может эффективно контролировать одиночные убытки, что является основным преимуществом этой стратегии.
Эта стратегия также сопряжена с некоторыми рисками:
Высокая чувствительность параметров. Период n и множитель k полос Боллинджера оказывают большое влияние на результаты, требуя повторного тестирования для поиска оптимальной комбинации параметров.
Невозможность отслеживать тенденции, когда полосы Боллинджера расходятся. Когда цены сильно колеблются, рельсы полос Боллинджера быстро расширяются, в результате чего невозможно отслеживать тенденции. Стратегия должна быть остановлена, ожидая, когда рельсы сходятся, прежде чем снова ее запустить.
Стратегии Bollinger Bands не идеальны, будет также определенное количество ложных сигналов, что требует понести соответствующие убытки.
Относительно простой метод стоп-лосса. Стоп-лосс этой стратегии рассматривает только самые высокие и самые низкие цены после открытия позиции, не включая более сложные методы стоп-лосса, основанные на волатильности и т. д., которые могут быть слишком агрессивными или консервативными, требующими оптимизации.
Эта стратегия должна быть оптимизирована в следующих аспектах:
Проверка эффектов различных валют и параметров цикла. Параметры стратегии могут быть оптимизированы для различных валют и циклов для повышения адаптивности стратегии.
Оптимизировать механизм стоп-лосса. Можно ввести движущийся стоп-лосс, колеблющийся стоп-лосс, отслеживающий стоп-лосс и т.д., чтобы сделать метод стоп-лосса более интеллектуальным.
Включите другие индикаторы для фильтрации сигналов входа. Индикаторы, такие как MACD, KDJ и т. Д., Могут быть добавлены, чтобы избежать ложных сигналов от полос Боллинджера на боковых колеблющихся рынках.
Добавить механизмы управления позициями. Внедрить отслеживание стоп-прибыли, пирамида торговли, фиксированной пропорции позиции и т. д. методы управления для повышения рентабельности стратегий.
Провести оптимизацию бэкстеста. Всесторонне изучить результаты стратегии путем расширения временных рамок бэкстеста, корректировки параметров, анализа отчетов бэкстеста и т. Д. Чтобы найти оптимальные параметры.
В целом, адаптивная стратегия последовательности трендов является довольно зрелой количественной стратегией. Она использует полосы Боллинджера для динамического захвата тенденций, в сочетании с индикатором ATR для создания адаптивного канала для оценки длинных и коротких трендов. Между тем, она имеет встроенный механизм остановки потери для контроля рисков. Преимущества этой стратегии - соответствующая частота работы, точное время входа и хорошее управление рисками. Однако есть некоторые вопросы, которые требуют оптимизации в таких областях, как выбор параметров, метод остановки потери, фильтрация сигналов, чтобы сделать стратегию более надежной и интеллектуальной.
/*backtest start: 2023-12-15 00:00:00 end: 2024-01-14 00:00:00 period: 4h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=2 strategy("[Th] Adaptive Trend v1", shorttitle="[TH] Adaptive Trend", overlay=true) Pd=input(2, minval=1,maxval = 100, title="Period") Bw=input(50, minval=1,maxval = 100, title="Bandwidth") minFactor = input(0.5, minval=0.1, maxval=1.0, step=0.1, title="Minimum Factor") maxFactor = input(3.00, minval=0.2, maxval=5.0, step=0.1, title="Maximum Factor") plot_trend=input(true, title="Plot trend") plot_losscut = input(true, title="Plot losscut") /////////////// Calculate the BB's /////////////// basisBB = ema(close, 20) devBB = 2 * stdev(close, 20) upperBB = basisBB + devBB lowerBB = basisBB - devBB //plot(upperBB) //plot(lowerBB) ///////////// Trend //////////////////////////// rawFactor = ((upperBB-lowerBB)/basisBB)*Bw Factor = rawFactor > minFactor ? (rawFactor > maxFactor ? maxFactor : rawFactor) : minFactor Up=hl2-(Factor*atr(Pd)) Dn=hl2+(Factor*atr(Pd)) TrendUp=close[1]>TrendUp[1]? max(Up,TrendUp[1]) : Up TrendDown=close[1]<TrendDown[1]? min(Dn,TrendDown[1]) : Dn TrendUpPlot=plot(plot_trend?TrendUp:na, style=line, color=green, linewidth=1) TrendDownPlot=plot(plot_trend?TrendDown:na, style=line, color=red, linewidth=1) Trend = close > TrendDown[1] ? 1: close< TrendUp[1]? -1: nz(Trend[1],1) fill(TrendUpPlot,TrendDownPlot, color=Trend == 1 ? green : red, transp=80) sig_trend_long = Trend[1] == -1 and Trend == 1 sig_trend_short = Trend[1] == 1 and Trend == -1 ///////////// Loss Cut //////////////////////////// price_cut = sig_trend_long[1] or sig_trend_short[1] or sig_reentry_long[1] or sig_reentry_short[1] ? open : price_cut[1] current_trend = sig_trend_long[1] ? 1 : (sig_trend_short[1] ? -1 : current_trend[1]) sig_loss_cut = sig_trend_long or sig_trend_short ? false : ( current_trend == 1 ? (price_cut > low) : (current_trend == -1 ? (price_cut < high) : false) ) has_position = sig_loss_cut ? false : ((sig_trend_long[1] or sig_trend_short[1] or sig_reentry_long[1] or sig_reentry_short[1]) ? true : has_position[1]) sig_reentry_long = not has_position and current_trend == 1 and low > price_cut sig_reentry_short = not has_position and current_trend == -1 and high < price_cut bgcolor(plot_losscut and ( not has_position or sig_loss_cut ) ? silver : white, transp=70) plotshape(plot_losscut and sig_loss_cut and current_trend == 1? 1 : na, color=green, style=shape.xcross, location=location.belowbar ,size=size.tiny) plotshape(plot_losscut and sig_loss_cut and current_trend == -1? 1 : na, color=red, style=shape.xcross, location=location.abovebar ,size=size.tiny) LossCutPlot = plot(plot_losscut ? price_cut : na, linewidth=4, color=black, transp=60) fill(TrendDownPlot, LossCutPlot, color=silver, transp=90) plotshape(sig_trend_long or sig_reentry_long ? Trend : na, title="Up Entry Arrow", color=green, style=shape.triangleup, location=location.belowbar, size=size.tiny) plotshape(sig_trend_short or sig_reentry_short ? Trend : na, title="Down Entry Arrow",color=red, style=shape.triangledown, size=size.tiny) ///////////// Strategy //////////////////////////// if true strategy.entry('long', long=strategy.long, comment='Long', when=sig_trend_long or sig_reentry_long) strategy.entry('short', long=strategy.short, comment='Short', when=sig_trend_short or sig_reentry_short) if(current_trend == 1) strategy.close('long', when=sig_loss_cut == true) //strategy.exit('lc',from_entry='long', stop=price_cut) if( current_trend == -1 ) strategy.close('short', when=sig_loss_cut == true) //strategy.exit('sc',from_entry='short', stop=price_cut)