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。
我想用一个"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。