该策略基于布林带(Bollinger Band)和相对强弱指数(RSI)两个技术指标,用于在上升趋势中进行多头摆动交易。策略逻辑简单但有效:当价格跌破布林带下轨且RSI低于35时开多,当RSI上穿69时平多。同时设置了止盈止损。
计算RSI:使用RMA(Relative Moving Average)分别计算价格上涨和下跌的平均幅度,然后用上涨幅度除以总幅度得到RSI。RSI反映了一段时间内价格的强弱。
计算布林带:使用SMA(Simple Moving Average)计算价格均线,再加减标准差得到上下轨。布林带能够动态反映价格的波动区间。
开多:当价格跌破布林带下轨且RSI小于35时,判断为超卖,此时开多。这两个条件能捕捉到向上反转的时机。
平多:当RSI上穿69时,判断为超买,此时平掉多头仓位,锁定利润。
止盈止损:开仓后,根据用户设置的百分比计算止盈价和止损价。触及止盈价或止损价时平仓。这能够控制每笔交易的风险和回报。
布林带能够客观反映价格运行的区间,与价格走势同步调整,不受固定阈值的限制。
RSI能够比较直观地反映多空力量对比,也相对客观,经常被用于判断超买超卖。
在上升趋势中使用,更加适合摆动交易。通过布林带下轨和低RSI捕捉价格反弹,通过高RSI及时平仓,能够有效把握波段行情。
止盈止损的设置使得策略风险可控,投资者可以根据自己的风险偏好灵活设置参数。
策略逻辑和代码都相对简单,容易理解和实现,回测效果也比较稳定。
对于震荡行情,布林带和RSI可能会发出较多的交易信号,导致交易频率过高,手续费成本增加。
RSI等单一指标容易受到短期价格波动的影响,产生误导性信号。因此RSI信号最好结合价格走势等进行分析。
布林带和RSI参数的选择对策略表现有较大影响,不同市场和品种可能需要不同的参数。使用者需要根据具体情况进行适当的调整。
在突发事件等异常行情下,布林带和RSI可能失效。此时如果没有其他风控手段,可能给策略带来较大回撤。
可以考虑引入移动平均线等其他技术指标作为过滤,例如只在MA多头排列时才开仓,提高信号的可靠性。
可以对RSI的上下阈值、布林带的参数等进行优化,找出在各个品种、各个周期表现最佳的参数组合。
可以在回测的基础上进行前向测试,并做好模拟交易,实盘前充分验证策略的有效性和稳定性。
可以通过仓位管理、动态止盈止损等方法,进一步控制策略回撤,提高风险调整后收益。
可以将该策略纳入投资组合,配合其他策略进行对冲,而不是孤立地使用,以提高投资组合的稳定性。
本文介绍了一个基于布林带和RSI两个技术指标的多头摆动交易策略。该策略适用于捕捉上升趋势中的波段行情,逻辑和实现都相对简单。通过布林带下轨和低RSI开多,高RSI平多,同时设置了止盈止损。策略优点是能够客观反映价格的波动区间和多空力量对比,风险也相对可控。但是在具体使用中需要注意控制交易频率、结合更多指标过滤信号、做好参数优化以及仓位管理等。此外,策略在异常行情下可能失效,需要有其他风控手段作为补充。通过引入其他过滤指标、动态止盈止损、资金管理、投资组合配置等方法,可以进一步提升该策略的稳定性和盈利能力。总的来说,该策略可以作为趋势投资者的一个有益补充,但需要根据自身特点审慎使用。
/*backtest start: 2023-03-05 00:00:00 end: 2024-03-10 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy(title="Bollinger Band with RSI", shorttitle="BB&RSI") len = input(14, minval=1, title="Length") src = input(close, "Source", type = input.source) up = rma(max(change(src), 0), len) down = rma(-min(change(src), 0), len) rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down)) plot(rsi, "RSI", color=#8E1599) band1 = hline(69, "Upper Band", color=#C0C0C0) band0 = hline(31, "Lower Band", color=#C0C0C0) fill(band1, band0, color=#9915FF, transp=90, title="Background") length_bb = input(20,title="BB Length", minval=1) mult = input(2.0, minval=0.001, maxval=50, title="BB StdDev") basis = sma(src, length_bb) dev = mult * stdev(src, length_bb) upper = basis + dev lower = basis - dev offset = input(0, "BB Offset", type = input.integer, minval = -500, maxval = 500) Plot_PnL = input(title="Plot Cummulative PnL", type=input.bool, defval=false) Plot_Pos = input(title="Plot Current Position Size", type=input.bool, defval=false) long_tp_inp = input(10, title='Long Take Profit %', step=0.1)/100 long_sl_inp = input(25, title='Long Stop Loss %', step=0.1)/100 // Take profit/stop loss long_take_level = strategy.position_avg_price * (1 + long_tp_inp) long_stop_level = strategy.position_avg_price * (1 - long_sl_inp) entry_long = rsi < 35.58 and src < lower exit_long = rsi > 69 plotshape(entry_long, style=shape.labelup, color=color.green, location=location.bottom, text="L", textcolor=color.white, title="LONG_ORDER") plotshape(exit_long, style=shape.labeldown, color=color.red, location=location.top, text="S", textcolor=color.white, title="SHORT_ORDER") strategy.entry("Long",true,when=entry_long) strategy.exit("TP/SL","Long", limit=long_take_level, stop=long_stop_level) strategy.close("Long", when=exit_long, comment="Exit") plot(Plot_PnL ? strategy.equity-strategy.initial_capital : na, title="PnL", color=color.red) plot(Plot_Pos ? strategy.position_size : na, title="open_position", color=color.fuchsia)