该策略利用均线系统判断趋势方向,并结合波动率指标避免低波动的震荡市场,采用震荡止损进行交易管理。
该策略通过比较快速均线和慢速均线的位置关系来判断趋势方向。当快速均线上穿慢速均线时看多,下穿看空。为了避免震荡市场,策略还引入了布林带指标。通过计算布林带的宽度变化率,当变化率超过设定阈值时产生交易信号。最后,策略采用Chande利空策略的通道作为震荡止损,避免被困于震荡市场。
具体来说,策略的交易逻辑如下:
计算快速均线(默认20日)和慢速均线(默认50日)。
计算布林带(默认40日,2倍标准差)的宽度变化率。
当快速均线上穿慢速均线,并且布林带宽度变化率超过设定阈值(默认9%),产生多头信号。
当快速均线下穿慢速均线,并且布林带宽度变化率超过设定阈值(默认9%),产生空头信号。
计算Chande利空通道作为止损位。
多头止损为最高价-ATR*倍数,空头止损为最低价+ATR*倍数。
使用均线系统判断趋势方向,可以有效跟踪趋势。
引入布林带宽度变化率避免震荡市场,可以减少不必要的交易。
采用震荡止损,可以及时止损离场,避免被困于震荡。
多种参数可调,可以针对不同市场进行优化。
策略逻辑清晰易理解,便于学习运用。
均线系统存在延迟,可能错过快速反转的机会。
布林带参数设置不当可能过滤掉有效交易信号。
震荡止损过于敏感可能造成过频交易。
参数优化不到位可能导致持仓风险。
无法适应突发重大事件造成的市场剧烈变化。
可以测试不同参数的均线组合,寻找最佳参数。
可以测试不同周期的布林带参数,找到最佳波动过滤效果。
可以结合其他指标进行入场确认,提高信号质量。
可以引入动态止损策略,让止损更好地跟踪市场。
可以结合机器学习技术自动优化参数,适应市场变化。
该策略整合均线系统、布林带指标和震荡止损技术,形成了一个相对稳定的趋势跟踪系统。通过参数优化可以获得不错的策略效果。但仍需警惕趋势反转和市场震荡的风险,此外机器学习等技术可以进一步提升策略的稳健性。总体来说,该策略作为学习练手的策略还是非常适合的。
/*backtest start: 2022-10-11 00:00:00 end: 2023-10-17 00:00:00 period: 1d basePeriod: 1h 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/ // © juanchez //@version=4 strategy("CHI", overlay = true, close_entries_rule = "ANY") n = input(title= "highest high o lowest low period", defval= 22) f= input(title= "multiplicador", defval= 4) long = highest(high, n) - atr(n)*f short= lowest(low, n) + atr(n)*f plot(long, color= color.red) plot(short, color= color.green) //moving averages period= input(title= "moving averages period", defval= 50) period2= input(title= "moving averages period2", defval= 20) type= input(title= "moving averages type", options= ["sma", "ema"], defval= "ema") //moving average function mo(p, t) => if t == "sma" sma(close[barstate.islast ? 1: 0], p) else if t== "ema" ema(close[barstate.islast ? 1: 0], p) m= mo(period, type) m2= mo(period2, type) trend= m2 > m plot(m, color = color.maroon, linewidth = 3) plot(m2, linewidth= 3) //BOLLINGER BANDS ENTRIES bb1_period= input(title= "Bollinger bands 1 period", defval=40, minval=1) bb1_source=input(title="Bollinger band 1 source", defval=close) bb1_multi=input(title="Bollinger Bands 1 factor", defval=2, minval=1, step=0.1) show_bb1= input(title="Show Bollinger bands 1", defval=false) //BOLLINGER BANDS _bb(src, lenght, multi)=> float moving_avg= sma(src[barstate.islast? 1: 0], lenght) float deviation= stdev(src[barstate.islast? 1: 0], lenght) float lowerband = moving_avg - deviation*multi float upperband = moving_avg + deviation*multi [moving_avg, lowerband, upperband] [bb1, lowerband1, upperband1]= _bb(bb1_source, bb1_period, bb1_multi) //FIRST BAND plot(show_bb1? bb1 : na, title="BB1 Moving average", linewidth= 3, color= color.fuchsia) plot(show_bb1? upperband1 : na, title="BB1 Upper Band", linewidth= 3, color= color.green) plot(show_bb1? lowerband1 : na, title="BB1 Lower Band", linewidth= 3, color= color.red) //BB's Width threshold thresh= input(title= "widen %", defval= 9, minval = 0, step = 1, maxval= 100) widht= (upperband1 - lowerband1)/bb1 roc= change(widht)/widht[1]*100 cross=crossover(roc, thresh) // entry //long elong= input(true, title= "enable long") longcondition= m2 > m and cross and elong //short eshort= input(true, title= "enable short") shortcondition= m2 < m and cross and eshort plotshape(longcondition? true: false , location= location.belowbar, style= shape.labelup, size= size.small, color= color.green, text= "Buy", textcolor= color.white) plotshape(shortcondition? true: false , location= location.abovebar, style= shape.labeldown, size= size.small, color= color.red, text= "Sell", textcolor= color.white) out= crossunder(close, long) outt= crossover(close, short) strategy.entry("long", strategy.long, when = longcondition) strategy.close("long", when = out) strategy.entry("short", strategy.short, when = shortcondition) strategy.close("short", when = outt)