该策略结合了关键支撑阻力位反转策略和相对强弱指数(RSI)指标,在支撑阻力位形成时检查看RSI指标信号,以发现潜在趋势反转机会。
该策略首先计算得到关键的支撑阻力位,即通过查看左右两端若干K线,得到最高价的支撑位和最低价的阻力位。在支撑阻力位形成时,进一步检查RSI指标值是否符合超买超卖的条件。具体来说,如果在阻力位时RSI低于超卖线,认为处于超卖状态,可以做多;如果在支撑位时RSI高于超买线,认为处于超买状态,可以做空。这样可以利用RSI指标过滤假突破的情况,在趋势反转点把握较好的入场时机。
代码细节如下:
计算支撑阻力位
计算RSI指标
结合支撑阻力位和RSI信号
入场设置止损止盈
该策略主要有以下优势:
趋势验证:RSI指标可以过滤假突破,避免在暂时性调整中错误入场
风险控制:止损设置在关键支撑阻力附近,有利于风险控制
通用性强:适用于不同品种和时间周期
实施简单:指标和参数设置较少,易于实施
数据需求低:只需要OHLC即可,对数据品质要求不高
该策略也存在以下风险:
支撑阻力位失效风险:市场处于剧烈变动时,原有支撑阻力可能被突破导致策略失败。可以通过调整参看数适当拉宽支撑阻力位的范围来降低该风险。
RSI发散风险:在震荡行情中,RSI可能发散,超买超卖判定失效。可以适当调整RSI参数或添加附加条件来验证RSI信号。
止损被套风险:在趋势运行中,止损有可能被突破导致亏损扩大。可以适当放宽止损距离。但需要权衡趋势获利和风险控制。
回撤风险:该策略为逐笔执行,在趋势反转不顺时可能出现一定回撤。可以通过风险管理来控制回撤。
该策略可以从以下几个方面进行优化:
优化支撑阻力位计算参数,改进定位准确性。可以测试不同的左右看数或增加条件过滤等。
优化RSI参数,改进超买超卖判定的准确率。可以测试不同RSI长度,以及超买超卖线的位置。
添加额外验证条件,避免在震荡行情下被套。例如结合波动率指标等。
优化止损止盈策略,在追求利润和控制风险间取得平衡。可以引入trailing stop等动态止损方式。
引入基于统计分析的止损,通过根据历史数据计算确定止损范围。
结合多个时间周期进行验证,利用多周期互证提高胜率。
该顺势而为RSI策略综合运用了支撑阻力位和RSI指标来识别潜在的趋势反转点,在关键点位找到较优入场时机。相比单一使用支撑阻力或RSI等技术指标,该策略可以提高系统性和稳定性。通过不断优化参数和过滤条件,该策略可以进一步提升胜率和收益回撤比。总体来说,该策略是一个实用性强的短期跟踪趋势反转系统。
/*backtest
start: 2023-09-30 00:00:00
end: 2023-10-07 00:00:00
period: 45m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy("Pivot Point Reversal + RSI Strategy", shorttitle = 'PP + RSI Strategy', overlay=true)
////////////
// Inputs //
leftBars = input(3, title = 'PP - Left Bars')
rightBars = input(3, title = 'PP - Right Bars')
rsi_length = input(14, title = "RSI - Length")
rsi_long = input(70, title = "RSI - Overbought level")
rsi_short = input(30, title = "RSI - Overold level")
//////////////////
// Calculations //
// Pivot Points
swh = pivothigh(leftBars, rightBars)
swl = pivotlow(leftBars, rightBars)
// Pivot High
swh_cond = not na(swh)
hprice = 0.0
hprice := swh_cond ? swh : hprice[1]
le = false
le := swh_cond ? true : (le[1] and high > hprice ? false : le[1])
// Pivot Low
swl_cond = not na(swl)
lprice = 0.0
lprice := swl_cond ? swl : lprice[1]
se = false
se := swl_cond ? true : (se[1] and low < lprice ? false : se[1])
// RSI
rsi = rsi(close, 14)
//////////////
// STRATEGY //
if (le and rsi[rightBars] < rsi_long )
strategy.entry("PivRevLE", strategy.long, comment = "PivRSI Long", stop = hprice + syminfo.mintick)
if (se and rsi[rightBars] > rsi_short)
strategy.entry("PivRevSE", strategy.short, comment = "PivRSI Short", stop = lprice - syminfo.mintick)