Pine Script如何回溯历史指标值及避免实时K线重绘?
Pine Script 问题解决方案
1. 避免实时K线指标重绘的实现方法
你的推测是正确的,仅使用已收盘确认的K线计算指标即可避免重绘,具体实现逻辑如下:
- 调用
barstate.isconfirmed变量判断当前K线是否收盘,仅在K线收盘确认时执行指标计算逻辑 ta.pivothigh/ta.pivotlow这类指标本身需要等到rightLen参数对应数量的K线走完后才会返回有效值,仅基于确认后的K线计算即可完全避免重绘
2. 回溯历史pivot高低点数值的方法
你当前直接用ph[1]的写法无法取到上一个pivot高点点位,因为ph变量仅在pivot高出现的K线上返回对应价格,其余K线返回值为na,偏移K线索引的方式不能直接定位到历史pivot点位。
正确的实现需要用ta.valuewhen()函数,该函数可以按事件发生的次序回溯对应指标值,语法为:ta.valuewhen(事件触发条件, 要提取的数值, 回溯第N次事件, 从0开始计数)
示例:
- 取最近一次pivot high的数值:
ta.valuewhen(ph, ph, 0) - 取上一次(倒数第二次)pivot high的数值:
ta.valuewhen(ph, ph, 1) - 调整最后一个参数即可提取更早的pivot值,pivot low的取值逻辑完全一致
修正后的完整代码
gr="LENGTH LEFT / RIGHT" leftLenH = input.int(title="Pivot High", defval=10, minval=1, inline="Pivot High",group=gr) rightLenH = input.int(title="/", defval=10, minval=1, inline="Pivot High",group=gr) colorH = input(title="", defval=#E3EFFD, inline="Pivot High",group=gr) leftLenL = input.int(title="Pivot Low", defval=10, minval=1, inline="Pivot Low", group=gr) rightLenL = input.int(title="/", defval=10, minval=1, inline="Pivot Low",group=gr) colorL = input(title="", defval=#E3EFFD, inline="Pivot Low",group=gr) // 仅在K线收盘确认时计算pivot值,避免重绘 ph = barstate.isconfirmed ? ta.pivothigh(leftLenH, rightLenH) : na pl = barstate.isconfirmed ? ta.pivotlow(leftLenL, rightLenL) : na // 用ta.valuewhen回溯历史pivot值 last_ph = ta.valuewhen(ph, ph, 0) prev_ph = ta.valuewhen(ph, ph, 1) last_pl = ta.valuewhen(pl, pl, 0) prev_pl = ta.valuewhen(pl, pl, 1) // 正确对比相邻pivot高低点 pivotTrendHH = last_ph > prev_ph ? "Bullish" : "Bearish" pivotTrendLL = last_pl > prev_pl ? "Bullish" : "Bearish"
内容的提问来源于stack exchange,提问作者Pitt
相关产品推荐
相关产品推荐

