用户自定义类型行为逻辑疑问:plot(p.x)与plot(y)表现差异解析
为什么Pine Script v5中自定义类型实例属性修改后plot不生效?
本质原因:变量类型的生命周期差异
普通变量(如
y):
普通变量属于序列变量,Pine Script会在每一根K线的执行周期中更新它的值。y := 6会覆盖当前及后续K线中y的数值,plot(y)会逐K线读取最新值,所以能正常显示6。自定义类型实例属性(如
p.x):
自定义类型的实例属于非序列变量,它的初始化和赋值只在脚本的**第一个K线执行阶段(初始化阶段)**生效。后续K线执行时,对p.x的修改操作不会被保留,plot(p.x)始终读取的是初始化阶段最终确定的p.x值(也就是1)。
执行逻辑补充
Pine Script的运行机制是逐K线循环执行:
脚本会在每一根K线从头执行一遍,但非序列变量(包括自定义类型实例)只会在第一根K线完成初始化,后续K线执行时会跳过它们的初始化流程,且对其属性的修改无法持久化。而序列变量会在每个K线周期更新状态,因此能传递最新值。
修复方案
如果需要让自定义类型的属性支持逐K线更新,只需将属性声明为序列类型(默认用na初始化即可):
//@version=5 indicator("Fixed script") type pp float x = na // 声明为序列变量 p = pp.new(1) p.x :=1 y = 5 plot(p.x) plot(y) p.x:=2 y := 6 plot(p.x) // 现在会正常绘制2 plot(y)
内容的提问来源于stack exchange,提问作者Moebius
相关产品推荐
相关产品推荐

