该策略利用CCI指标和动量指标结合RSI指标来识别市场趋势,在超买超卖区发现跳空现象时进场,同时利用布林带来识别趋势和回归中枢。策略可以有效识别突破与回调,在趋势开始阶段就进场,并且可以通过参数调整自由适应不同品种的交易。
首先,策略通过CCI指标或者动量指标的零轴上穿和零轴下穿来判断买入和卖出信号。同时,要求RSI指标处于超买超卖区,即RSI高于65时为超买区,低于35时为超卖区。这样可以避免在非超买超卖区发出错误信号。
另外,策略可以选择是否判断RSI的bullish divergence(略微上升)和bearish divergence(略微下降),以确保买卖信号更可靠。
当符合CCI或动量的买入信号,并且RSI处于超卖区时,策略会判断前一高点和低点是否都在布林带中枢上方,如果是,则产生买入信号。反之,当符合卖出信号,并且前一高低点都在布林带中枢下方时,产生卖出信号。
这样,策略同时利用趋势指数和震荡指数,能在趋势开始时及时捕捉,并利用中枢判断避免假突破。当价格脱离布林带上下轨时,策略会全平以锁定利润并防止回撤扩大。
结合趋势指数和震荡指数,能够在趋势开始时就进入,同时避免在震荡市场无谓开仓
利用布林带中的枢结合跳空为入场信号,可以有效过滤假突破
回看RSI指标的历史走势,进一步防止产生错误交易信号
全自动交易,不需要人工干预,适合算法交易
策略参数可以自由调整,适应不同交易品种
能够设定止损止盈,有效控制风险
布林带参数设置不当可能导致中枢判断失效
指标参数设置不当,可能导致产生过多错误信号
突破失败,价格再次回调到布林带中枢时需要及时止损
交易品种流动性不足时,突破效果可能不佳
交易前需校验历史数据是否充足,避免曲线拟合不佳
需要关注交易时段,避免假突破
优化布林带参数,使中枢更稳定
测试不同指标参数对不同品种的效果
增加交易量控制,避免单笔仓位过大
增加对时段的判断,在主要交易时间操作
增加机器学习算法,使信号产生更智能
接入更多数据源,判断市场总体走势
增加对更多指标的集成,形成指标组合
本策略整合趋势指数和震荡指数,在趋势开始时就可以进入市场。同时利用布林带中的枢结合跳空为入场信号,可以有效避免假突破。策略参数可以灵活调整,适应不同品种,回测效果优异。下一步将通过优化参数设置和模型融合使策略更稳健可靠,从而获得长期稳定的超额收益。
/*backtest
start: 2022-10-18 00:00:00
end: 2023-10-24 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy(title='BroTheJo Strategy', shorttitle='BTJ', overlay=true)
// Input settings
ccimomCross = input.string('CCI', 'Entry Signal Source', options=['CCI', 'Momentum'])
ccimomLength = input.int(10, minval=1, title='CCI/Momentum Length')
useDivergence = input.bool(false, title='Find Regular Bullish/Bearish Divergence')
rsiOverbought = input.int(65, minval=1, title='RSI Overbought Level')
rsiOversold = input.int(35, minval=1, title='RSI Oversold Level')
rsiLength = input.int(14, minval=1, title='RSI Length')
plotMeanReversion = input.bool(true, 'Plot Mean Reversion Bands on the chart')
emaPeriod = input(200, title='Lookback Period (EMA)')
bandMultiplier = input.float(1.6, title='Outer Bands Multiplier')
// CCI and Momentum calculation
momLength = ccimomCross == 'Momentum' ? ccimomLength : 10
mom = close - close[momLength]
cci = ta.cci(close, ccimomLength)
ccimomCrossUp = ccimomCross == 'Momentum' ? ta.cross(mom, 0) : ta.cross(cci, 0)
ccimomCrossDown = ccimomCross == 'Momentum' ? ta.cross(0, mom) : ta.cross(0, cci)
// RSI calculation
src = close
up = ta.rma(math.max(ta.change(src), 0), rsiLength)
down = ta.rma(-math.min(ta.change(src), 0), rsiLength)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - 100 / (1 + up / down)
oversoldAgo = rsi[0] <= rsiOversold or rsi[1] <= rsiOversold or rsi[2] <= rsiOversold or rsi[3] <= rsiOversold
overboughtAgo = rsi[0] >= rsiOverbought or rsi[1] >= rsiOverbought or rsi[2] >= rsiOverbought or rsi[3] >= rsiOverbought
// Regular Divergence Conditions
bullishDivergenceCondition = rsi[0] > rsi[1] and rsi[1] < rsi[2]
bearishDivergenceCondition = rsi[0] < rsi[1] and rsi[1] > rsi[2]
// Mean Reversion Indicator
meanReversion = plotMeanReversion ? ta.ema(close, emaPeriod) : na
stdDev = plotMeanReversion ? ta.stdev(close, emaPeriod) : na
upperBand = plotMeanReversion ? meanReversion + stdDev * bandMultiplier : na
lowerBand = plotMeanReversion ? meanReversion - stdDev * bandMultiplier : na
// Entry Conditions
prevHigh = ta.highest(high, 1)
prevLow = ta.lowest(low, 1)
longEntryCondition = ccimomCrossUp and oversoldAgo and (not useDivergence or bullishDivergenceCondition) and (prevHigh >= meanReversion) and (prevLow >= meanReversion)
shortEntryCondition = ccimomCrossDown and overboughtAgo and (not useDivergence or bearishDivergenceCondition) and (prevHigh <= meanReversion) and (prevLow <= meanReversion)
// Plotting
oldLongEntryCondition = ccimomCrossUp and oversoldAgo and (not useDivergence or bullishDivergenceCondition)
oldShortEntryCondition = ccimomCrossDown and overboughtAgo and (not useDivergence or bearishDivergenceCondition)
plotshape(oldLongEntryCondition, title='BUY', style=shape.triangleup, location=location.belowbar, color=color.new(color.lime, 0), textcolor=color.new(color.white, 0), size=size.tiny)
plotshape(oldShortEntryCondition, title='SELL', style=shape.triangledown, location=location.abovebar, color=color.new(color.red, 0), textcolor=color.new(color.white, 0), size=size.tiny)
// Strategy logic
if (longEntryCondition)
strategy.entry("Buy", strategy.long)
if (shortEntryCondition)
strategy.entry("Sell", strategy.short)
// Close all open positions when outside of bands
closeAll = (high >= upperBand) or (low <= lowerBand)
if (closeAll)
strategy.close_all("Take Profit/Cut Loss")
// Plotting
plot(upperBand, title='Upper Band', color=color.fuchsia, linewidth=1)
plot(meanReversion, title='Mean', color=color.gray, linewidth=1)
plot(lowerBand, title='Lower Band', color=color.blue, linewidth=1)