You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 10:48:22