Pine 脚本中的 RSI 乒乓指标

RSI Ping-Pong Indicator in Pine Script

我想用一个"RSI-Ping-Pong-Indicator"作为回测的先决条件和其他条件。 为此,我定义了一个 RSI 和一个 RSI 多空区域,例如rsi(25) = 多头和 rsi(75) = 空头。

rsiShortLevel = input(75, title="RSI Short Level")
rsiLongLevel = input(25, title="RSI Long Level")

如果 RSI 跌至 (crossunder()) 多头区域 (rsi < 25) 以下,指标应切换至 "long"。指标保持 "long" 直到 RSI 达到 (crossover()) 下一次短区域 (rsi > 75),然后指标切换到 "short"。反之亦然,如 "RSI Ping-Pong"。在一个多头交叉和下一个空头交叉之间,RSI可以多次重新穿越多头水平,并且可以在这个"between-zone"中移动很长时间,但它会保持"long"直到RSI穿越空头级别。

然后我可以用 pingpong 条件绘制交叉条件作为蓝线。为了在 Tradingview 中获得更好的视觉理解,以下多空条件显示了 "long" 的多头级别 (rsiLongLevel = 25) 的值和空头级别的值 (rsiShortLevel = 75) 对于 "short":

///RSI Crossings
rsiLongCondition = crossunder(rsi, rsiLongLevel)
rsiShortCondition = crossover(rsi, rsiShortLevel)

///RSI Ping-Pong
pingpong = if(rsiLongCondition)
    rsiLongLevel
else
    if(rsiShortCondition)
        rsiShortLevel

plot(showPingpong ? pingpong : na, color=color.blue, style=plot.style_line, linewidth=2, title='RSI Ping-Pong')

但是很明显,25或者75的值只是在实际的路口输出,而路口之间没有:在路口之间,值为na

现在我想实现长穿越后的值继续输出值(这里:25又名"long")直到越过短区并且该值变为75(又名"short").

如果我使用技巧并使 "strategy.entry" 和 "strategy.position_size" 发挥作用并将它们 link 置于 iff 条件下,我可以显示此行为:

if(rsiLongCondition)
    strategy.entry(id="LE-RSI-Cross", long=true, qty=1)
if(rsiShortCondition)
    strategy.entry(id="SE-RSI-Cross", long=false, qty=1)

pingpongPositionSize = iff(strategy.position_size > 0, rsiLongLevel, iff(strategy.position_size < 0, rsiShortLevel, na))

如果我绘制变量 pingpongPositionSize(黑线)并设置背景颜色条件(红色 = 短,绿色 = 长),指标会正确显示相应的值和背景颜色:

plot(showPingpongSize ? pingpongPositionSize : na, color=color.black, style=plot.style_line, linewidth=4, title='RSI-Position-Size Ping-Pong')
bgcolor(showBGSize and strategy.position_size > 0 ? color.green : showBGSize and strategy.position_size < 0 ? color.red : na, transp=70)



我的问题:如何构建我想要的指标,使其表现与 "strategy.position_size" 技巧相同?

完整脚本

/@version=4
strategy("RSI Ping-Pong", overlay=false)

// GENERAL SETTINGS

rsiLenght = input(14, title="RSI Lenght")
rsiShortLevel = input(75, title="RSI Short Level")
rsiLongLevel = input(25, title="RSI Long Level")
showBGCrossings = input(false, title="Show RSI-Crossings with bgcolor?")
showPingpong = input(true, title="Show RSI Ping-Pong?")
showPingpongSize = input(true, title="Show RSI-Position-Size Ping-Pong?")
showBGSize = input(true, title="Show RSI Position Size Changes with bgcolor?")


// CALCULATIONS
rsi = rsi(close, rsiLenght)

///RSI Crossings
rsiLongCondition = crossunder(rsi, rsiLongLevel)
rsiShortCondition = crossover(rsi, rsiShortLevel)

///RSI Ping-Pong
pingpong = if(rsiLongCondition)
    rsiLongLevel
else
    if(rsiShortCondition)
        rsiShortLevel

/// RSI Ping-Pong with Strategy Position Size
if(rsiLongCondition)
    strategy.entry(id="LE-RSI-Cross", long=true, qty=1)
if(rsiShortCondition)
    strategy.entry(id="SE-RSI-Cross", long=false, qty=1)

pingpongPositionSize = iff(strategy.position_size > 0, rsiLongLevel, iff(strategy.position_size < 0, rsiShortLevel, na))

// PLOTTING
plot(rsi, color=color.purple, style=plot.style_line, linewidth=2, title='RSI')
plot(showPingpong ? pingpong : na, color=color.blue, style=plot.style_line, linewidth=2, title='RSI Ping-Pong')
bgcolor(showBGCrossings and rsiLongCondition ? color.green : rsiShortCondition ? color.red : na, transp=0)
plot(showPingpongSize ? pingpongPositionSize : na, color=color.black, style=plot.style_line, linewidth=4, title='RSI-Position-Size Ping-Pong')
bgcolor(showBGSize and strategy.position_size > 0  ? color.green : showBGSize and strategy.position_size < 0 ? color.red : na, transp=70)
hlong = hline(rsiLongLevel, title="RSI Long Level")
hshort = hline(rsiShortLevel, title="RSI Short Level")

使用:

///RSI Ping-Pong
var pingpong = 0.
if(rsiLongCondition)
    pingpong := rsiLongLevel
else
    if(rsiShortCondition)
        pingpong := rsiShortLevel

var 初始化只在第一个柱上初始化变量,它的值只在交叉时改变,所以它的值在变化后传播到柱上。 参见 the usrman on the subject