基于RSI信号的策略入场延迟问题及代码修正请求
问题解决:RSI信号入场延迟修正
问题概述
RSI指标的信号线条显示完全正确,但strategy.entry入场指令严重延迟3-4根K线,即使取消plotshape的offset设置,入场操作仍滞后,希望在信号线条结束时立即触发入场。
延迟原因
- 条件确认滞后:
pivot_low_true是在当前K线确认pivot_right根之前的枢轴低点,而入场条件bullCond/bearCond还叠加了confirm_range(pivot_low_true[1]),要求上次枢轴低点已过去3-30根K线,这进一步推迟了入场时机。 - 视觉与实际触发错位:绘图时用
offset=-pivot_right把信号提前显示到枢轴低点的位置,但实际入场条件是在确认后的K线才会触发,导致视觉上信号出现后,入场却晚了多根K线。
修正后的代码
RSI_PER = 14 pivot_right = 3 pivot_left = 3 max_range=30 min_range=3 rsi_value = ta.rsi(close, RSI_PER) rsi_valueH = request.security(syminfo.tickerid, '60', rsi_value) plot(rsi_value, title="RSI", linewidth=2, color=color.rgb(255, 255, 255)) hline(50, linestyle=hline.style_dotted) rsi_ob = hline(70, linestyle=hline.style_dotted) rsi_os = hline(30, linestyle=hline.style_dotted) fill(rsi_ob, rsi_os, color=color.rgb(223, 64, 251, 80)) // 检测RSI的枢轴低点,返回枢轴低点的RSI值(非NaN即存在) pivot_low_rsi = ta.pivotlow(rsi_value, pivot_left, pivot_right) pivot_low_true = not na(pivot_low_rsi) // 获取上一次枢轴低点的相关数据 last_pivot_low_rsi = ta.valuewhen(pivot_low_true, pivot_low_rsi, 1) last_pivot_low_price = ta.valuewhen(pivot_low_true, low[pivot_right], 1) bars_since_last_pivot = ta.barssince(pivot_low_true[1]) //------------------------------------------------------------------------------ // 多头条件:在确认枢轴低点的当前K线,检查RSI更高低、价格更低低,且上次枢轴低点在范围内 bullCond = pivot_low_true and (pivot_low_rsi > last_pivot_low_rsi) and (low[pivot_right] < last_pivot_low_price) and (min_range <= bars_since_last_pivot and bars_since_last_pivot <= max_range) // 绘制多头信号(保持offset对齐枢轴低点位置) plot(pivot_low_true ? pivot_low_rsi : na, offset=-pivot_right, linewidth=3, color=(bullCond ? color.green : color.new(color.white, 100))) plotshape( bullCond ? pivot_low_rsi : na, offset=-pivot_right, text=" BUY ", style=shape.labelup, location=location.absolute, color=color.green, textcolor=color.white ) //------------------------------------------------------------------------------ // 空头条件:在确认枢轴低点的当前K线,检查RSI更低高、价格更高低,且上次枢轴低点在范围内 bearCond = pivot_low_true and (pivot_low_rsi < last_pivot_low_rsi) and (low[pivot_right] > last_pivot_low_price) and (min_range <= bars_since_last_pivot and bars_since_last_pivot <= max_range) // 绘制空头信号(保持offset对齐枢轴低点位置) plot(pivot_low_true ? pivot_low_rsi : na, offset=-pivot_right, linewidth=3, color=(bearCond ? color.red : color.new(color.white, 100))) plotshape( bearCond ? pivot_low_rsi : na, offset=-pivot_right, text=" SELL ", style=shape.labeldown, location=location.absolute, color=color.red, textcolor=color.white ) // 入场指令:在确认枢轴低点的当前K线立即触发 strategy.entry("BUY", strategy.long, when = bullCond) strategy.entry("SELL", strategy.short, when = bearCond)
关键修改说明
- 合并条件判断时机:将
bullCond/bearCond的所有判断逻辑移到pivot_low_true为true的当前K线,确保在确认枢轴低点的瞬间就触发入场,不再等待额外的K线。 - 简化数据获取:直接用
ta.valuewhen获取上一次枢轴低点的RSI和价格,避免confirm_range函数带来的延迟。 - 保持视觉对齐:保留
offset=-pivot_right让信号显示在枢轴低点的位置,同时让入场指令和信号视觉位置同步触发。
内容的提问来源于stack exchange,提问作者nocodingskillz
相关产品推荐
相关产品推荐

