Pine Script v5中为何type初始化时生成整数序列?
问题原因与解决方案
问题原因
在Pine Script v5中,通过type定义的自定义对象,其成员变量默认会被识别为序列(series)类型——即便你用var关键字声明对象实例(确保仅初始化一次),对象内部的属性依然保留序列特性。
而ta.rsi()函数的第二个参数length要求传入简单整数(simple int,非序列值),直接读取OBJ_A._test得到的是序列类型的整数,类型不匹配导致了报错。
解决方案
针对这个问题,有两种可行的解决思路:
方法1:提取序列的初始值
利用ta.valuewhen()函数提取对象属性在第一个K线(bar_index == 0)时的值,因为对象仅初始化一次,这个值就是你设置的固定值,提取后会转为简单类型:
var int rsiPeriod = ta.valuewhen(bar_index == 0, OBJ_A._test, 0) var int otherValue = ta.valuewhen(bar_index == 0, OBJ_A._test2, 0)
方法2:将类型成员声明为const(适用于无需动态修改的场景)
如果自定义类型的成员变量不需要在初始化时动态修改,可以在定义type时用const修饰成员,强制其为简单类型:
type objSetted const int _test = 21 const float _test2 = 2.0
注意:用const修饰的成员无法在objSetted.new()时通过传参修改,仅能使用默认值。
修改后的完整代码示例
//@version=5 strategy('Test', overlay = true) type objSetted int _test = 21 float _test2 = 2.0 // Create and set an objSetted var objSetted OBJ_A = objSetted.new(_test=90) // 方法1:提取初始值转为简单整数 var int rsiPeriod = ta.valuewhen(bar_index == 0, OBJ_A._test, 0) var int otherValue = ta.valuewhen(bar_index == 0, OBJ_A._test2, 0) // Do calcul on close values float r = ta.rsi(close, rsiPeriod) // Display plot(r)
内容的提问来源于stack exchange,提问作者Canan
相关产品推荐
相关产品推荐

