Pine Script:对象是否均为Series类型?如何创建常量自定义对象?
问题重现
测试代码
//@version=5 indicator("tickerid", overlay = true) closevalue(tickerid) => sec = request.security(tickerid, '60', close) type security_type string ticker var security_type mysecurity = security_type.new(syminfo.tickerid) plot(closevalue(syminfo.tickerid)) plot(closevalue(mysecurity.ticker))
报错信息
Cannot call '#f0' with argument 'tickerid'='mysecurity.ticker'. An argument of 'series string' type was used but a 'simple string' is expected.
问题解答
1. 所有对象(类型)是否均为Series?
不是,但自定义对象的属性默认都是Series类型。Pine Script里用type定义的自定义对象,不管初始化属性时用的是简单值还是Series,最终属性都会被处理成Series。哪怕对象本身是用var声明的常量,属性依然和K线序列绑定,属于Series类型。
2. 自定义对象能否为常量?
可以,但这里的“常量”指的是对象实例只会在脚本启动时初始化一次(靠var实现),后续每根K线都不会重新创建这个对象。但对象的属性还是Series类型,没法变成非序列的简单常量——这是Pine Script自定义对象的设计逻辑决定的。
3. 如何创建常量自定义对象?
用var声明对象实例就能得到“常量对象”,比如你代码里的var security_type mysecurity = security_type.new(syminfo.tickerid),这个对象确实只会初始化一次。但如果要把它的属性传给需要简单值的函数(比如request.security),得把Series类型的属性转换成简单值,比如:
// 提取属性的初始值存为简单字符串常量 var string fixed_ticker = mysecurity.ticker[0] plot(closevalue(fixed_ticker))
或者干脆把简单值提前存在独立的var变量里,再传给对象初始化:
var string fixed_ticker = syminfo.tickerid var security_type mysecurity = security_type.new(fixed_ticker) plot(closevalue(fixed_ticker))
4. 为何var声明未达到预期效果?
var管的是对象实例的初始化时机,让它只在第一根K线创建一次,不会重复生成。但它管不了对象属性的类型——自定义对象的属性天生就是Series类型,哪怕你用简单值初始化,Pine Script也会把它包装成序列值。而request.security的第一个参数必须是简单字符串,不能是Series字符串,所以直接传mysecurity.ticker就会报错。
内容的提问来源于stack exchange,提问作者Gett

