Pine Script无法绘制多条线 仅显示2条绘图线问题排查
问题描述
使用Pine Script为TradingView开发自定义主图指标时出现绘图异常:
- 预期效果:绘制R1-R8共8条蓝色阻力线、S1-S8共8条红色支撑线,合计16条水平价位线
- 实际效果:仅2条线正常显示,其余线条完全无法渲染
运行效果截图:
问题完整代码如下:
//@version=5 indicator("Levels by tintin",overlay=true) pc = request.security(syminfo.tickerid, "D" , close[2], gaps = barmerge.gaps_off, lookahead=barmerge.lookahead_on) R= pc + 0.25 S= pc - 0.25 R1=math.pow(R,2) R2=math.pow(R1,2) R3=math.pow(R2,2) R4=math.pow(R3,2) R5=math.pow(R4,2) R6=math.pow(R5,2) R7=math.pow(R6,2) R8=math.pow(R7,2) S1=math.pow(S,2) S2=math.pow(S1,2) S3=math.pow(S2,2) S4=math.pow(S3,2) S5=math.pow(S4,2) S6=math.pow(S5,2) S7=math.pow(S6,2) S8=math.pow(S7,2) plot (R1, color = color.blue) plot (R2, color = color.blue) plot (R3, color = color.blue) plot (R4, color = color.blue) plot (R5, color = color.blue) plot (R6, color = color.blue) plot (R7, color = color.blue) plot (R8, color = color.blue) plot (S1, color=color.red) plot (S2, color=color.red) plot (S3, color=color.red) plot (S4, color=color.red) plot (S5, color=color.red) plot (S6, color=color.red) plot (S7, color=color.red) plot (S8, color=color.red)
故障原因
- 数值指数级溢出:代码中对R、S值做连续嵌套平方运算,数值会以2的指数级速度爆炸增长。以常规品种价格pc=100为例:
- R = 100.25,R1≈10050,R2≈1e8,R3≈1e16,R4直接达到1e32
R3之后的数值已经超出Pine Script 64位浮点数的有效精度范围,会被自动转为na空值,plot()函数遇到空值不会执行绘制。
- R = 100.25,R1≈10050,R2≈1e8,R3≈1e16,R4直接达到1e32
- 可视范围超出:即使未溢出为na,R2、S2及更高阶的数值已经和标的实际价格差了4个以上数量级,TradingView主图坐标会自动适配当前K线的实际价格区间,远在可视区域外的线条不会显示在屏幕内。
- 支撑位逻辑错误:对S值(pc-0.25)做平方运算后,结果为远大于pc的正数,完全不符合“支撑位低于基准价”的设计预期。
修复方案
如果需求是按0.25的固定步长生成等差分布的支撑、阻力水平位,直接删除连续平方的错误逻辑,改用步长累加/累减计算价位即可,修复后代码如下:
//@version=5 indicator("Levels by tintin",overlay=true) pc = request.security(syminfo.tickerid, "D" , close[2], gaps = barmerge.gaps_off, lookahead=barmerge.lookahead_on) // 生成8个间隔0.25的阻力位(高于基准价pc) R1 = pc + 0.25 R2 = pc + 0.5 R3 = pc + 0.75 R4 = pc + 1.0 R5 = pc + 1.25 R6 = pc + 1.5 R7 = pc + 1.75 R8 = pc + 2.0 // 生成8个间隔0.25的支撑位(低于基准价pc) S1 = pc - 0.25 S2 = pc - 0.5 S3 = pc - 0.75 S4 = pc - 1.0 S5 = pc - 1.25 S6 = pc - 1.5 S7 = pc - 1.75 S8 = pc - 2.0 // 绘制所有价位线 plot(R1, color = color.blue) plot(R2, color = color.blue) plot(R3, color = color.blue) plot(R4, color = color.blue) plot(R5, color = color.blue) plot(R6, color = color.blue) plot(R7, color = color.blue) plot(R8, color = color.blue) plot(S1, color=color.red) plot(S2, color=color.red) plot(S3, color=color.red) plot(S4, color=color.red) plot(S5, color=color.red) plot(S6, color=color.red) plot(S7, color=color.red) plot(S8, color=color.red)
补充说明:如果确实需要计算幂次级别的价位,需要手动调整图表坐标范围,或为plot函数添加
display = display.data_window参数强制线条纳入坐标适配范围,同时注意控制幂次避免数值溢出。
内容的提问来源于stack exchange,提问作者Constant
相关产品推荐
相关产品推荐

