顺势而为RSI策略


创建日期: 2023-10-08 11:36:01 最后修改: 2023-10-08 11:36:01
复制: 1 点击次数: 437
avatar of ChaoZhang ChaoZhang
1
关注
1235
关注者

概述

该策略结合了关键支撑阻力位反转策略和相对强弱指数(RSI)指标,在支撑阻力位形成时检查看RSI指标信号,以发现潜在趋势反转机会。

策略原理

该策略首先计算得到关键的支撑阻力位,即通过查看左右两端若干K线,得到最高价的支撑位和最低价的阻力位。在支撑阻力位形成时,进一步检查RSI指标值是否符合超买超卖的条件。具体来说,如果在阻力位时RSI低于超卖线,认为处于超卖状态,可以做多;如果在支撑位时RSI高于超买线,认为处于超买状态,可以做空。这样可以利用RSI指标过滤假突破的情况,在趋势反转点把握较好的入场时机。

代码细节如下:

  1. 计算支撑阻力位

    • 使用pivothigh()和pivotlow()函数基于左右N根K线计算支撑和阻力位
    • 保存支撑阻力位,并设定看涨看跌的条件判断
  2. 计算RSI指标

    • 使用rsi()函数计算RSI指标
    • 设定RSI超买超卖判断条件
  3. 结合支撑阻力位和RSI信号

    • 如果在阻力位看涨,同时RSI低于超卖线,则做多
    • 如果在支撑位看跌,同时RSI高于超买线,则做空
  4. 入场设置止损止盈

    • 多单止损为支撑位下方一个最小Movement
    • 空单止损为阻力位上方一个最小Movement

优势分析

该策略主要有以下优势:

  1. 趋势验证:RSI指标可以过滤假突破,避免在暂时性调整中错误入场

  2. 风险控制:止损设置在关键支撑阻力附近,有利于风险控制

  3. 通用性强:适用于不同品种和时间周期

  4. 实施简单:指标和参数设置较少,易于实施

  5. 数据需求低:只需要OHLC即可,对数据品质要求不高

风险分析

该策略也存在以下风险:

  1. 支撑阻力位失效风险:市场处于剧烈变动时,原有支撑阻力可能被突破导致策略失败。可以通过调整参看数适当拉宽支撑阻力位的范围来降低该风险。

  2. RSI发散风险:在震荡行情中,RSI可能发散,超买超卖判定失效。可以适当调整RSI参数或添加附加条件来验证RSI信号。

  3. 止损被套风险:在趋势运行中,止损有可能被突破导致亏损扩大。可以适当放宽止损距离。但需要权衡趋势获利和风险控制。

  4. 回撤风险:该策略为逐笔执行,在趋势反转不顺时可能出现一定回撤。可以通过风险管理来控制回撤。

优化方向

该策略可以从以下几个方面进行优化:

  1. 优化支撑阻力位计算参数,改进定位准确性。可以测试不同的左右看数或增加条件过滤等。

  2. 优化RSI参数,改进超买超卖判定的准确率。可以测试不同RSI长度,以及超买超卖线的位置。

  3. 添加额外验证条件,避免在震荡行情下被套。例如结合波动率指标等。

  4. 优化止损止盈策略,在追求利润和控制风险间取得平衡。可以引入trailing stop等动态止损方式。

  5. 引入基于统计分析的止损,通过根据历史数据计算确定止损范围。

  6. 结合多个时间周期进行验证,利用多周期互证提高胜率。

总结

该顺势而为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)