Pine Script中能否通过for循环批量声明line类型变量?
问题结论
Pine Script 不支持通过字符串拼接动态声明变量名,不需要尝试把拼接后的字符串转成line类型的方案,语法层面本身就不提供这个能力,也完全不需要逐一声明几十上百个line变量,用line类型数组就能实现完全等价的批量创建、管理需求。
原有写法的问题
- 直接在for循环里写
var linei = line.new(...)不会生成line0、line1…linen这类独立变量,整个循环过程中linei是同一个作用域下的单个变量,循环结束后只会保留最后一次创建的line对象引用,前面创建的线会因为没有引用留存,后续无法修改、操作。 - 字符串拼接生成变量名的思路在JS、Python这类通用语言里可以通过特殊语法实现,但Pine Script作为交易场景的领域特定语言,没有开放这类动态变量声明的能力。
正确实现方案
用array<line>类型的数组存储所有批量创建的line对象即可,初始化只需要一次循环,后续调用对应序号的线时直接按数组索引取值,和单独命名的line变量使用体验完全一致,代码量不会随用户输入的n值变大而膨胀。
示例代码:
// 用户输入n值 n = input.int(50, "User defined input", minval=1, maxval=200) // 声明全局line类型数组,var修饰保证只在脚本首根K线初始化一次 var array<line> lineArr = array.new_line() // 首根K线循环批量创建line对象,存入数组 if barstate.isfirst // 先清空数组,避免重载脚本时重复创建 array.clear(lineArr) for i = 0 to n - 1 // 创建空line,和逐一声明的na参数写法一致 tempLine = line.new(na, na, na, na) array.push(lineArr, tempLine) // 后续需要操作第k条线时(对应原写法的linek,注意数组索引从0开始),直接按索引取即可 // 比如修改第3条线的起点位置示例: // line.set_x1(array.get(lineArr, 2), bar_index[10])
额外优化提示
- 如果用户调整输入的n值变小,记得遍历数组把超出数量的line对象删除,避免残留无用绘图对象占用渲染资源:
// 数组长度超过用户输入的n时,删除多余的线 while array.size(lineArr) > n deleteLine = array.pop(lineArr) line.delete(deleteLine) - 所有针对独立line变量的操作函数(
line.set_*系列属性设置、line.delete删除等)都可以直接传入从数组中取出的line对象,不存在兼容性问题。
内容的提问来源于stack exchange,提问作者Steven Ward
相关产品推荐
相关产品推荐

