如何限制box.all与line.all仅删除LuxAlgo脚本的图形对象?
解决TradingView脚本中box.all/line.all误删自定义对象的问题
核心问题是box.all和line.all会返回当前脚本内创建的所有箱体/线条对象,LuxAlgo原脚本用这两个全局遍历删除旧对象时,会误删私有指标的同类对象。以下是具体解决办法:
1. 替换全局遍历,用数组跟踪LuxAlgo专属对象
这是最彻底的解决方案,直接修改LuxAlgo脚本的对象管理逻辑:
- 在LuxAlgo代码块开头,定义全局数组用于存储自身创建的箱体和线条:
var luxBoxes = array.new_box() var luxLines = array.new_line() - 找到LuxAlgo中所有创建箱体/线条的代码,把创建的对象存入对应数组:
比如原代码box.new(...)改成:newBox = box.new(...) array.push(luxBoxes, newBox) - 修改删除旧对象的循环,从遍历全局对象改为遍历专属数组:
原代码的删除循环:
替换为:for b in box.all box.delete(b)
线条的修改逻辑完全一致,对应// 删除所有LuxAlgo箱体 for i = 0 to array.size(luxBoxes) - 1 box.delete(array.get(luxBoxes, i)) array.clear(luxBoxes) // 清空数组准备存储新对象luxLines数组。
2. 给私有指标对象单独做数组跟踪
如果暂时不想大改LuxAlgo代码,也可以对私有指标的对象做隔离管理:
- 为私有指标的箱体和线条创建独立的全局数组:
var privateBoxes = array.new_box() var privateLines = array.new_line() - 每次创建私有对象时存入数组,删除时只操作这个数组,避免被LuxAlgo的全局删除影响。不过这种方法只能保护私有对象,LuxAlgo的逻辑还是会删除全局对象,所以更推荐第一种方法。
3. 用函数封装隔离两个模块的逻辑
把LuxAlgo代码和私有指标代码分别封装成独立函数,各自维护自己的对象数组,彻底实现逻辑隔离:
- LuxAlgo函数内只管理自身的box/line数组,私有函数同理,两个模块的对象完全不会互相干扰。
关键注意点
TradingView的Pine Script中,box.all和line.all是全局作用域的,只要是当前脚本创建的同类对象都会被返回,所以必须用数组跟踪专属对象来替代全局遍历,才能实现对象的隔离管理。
内容的提问来源于stack exchange,提问作者Mido Gamal Azzouz
相关产品推荐
相关产品推荐

