Pine Script取两个数组唯一值时出现index 30越界错误如何解决
错误原因排查
- 数组引用赋值问题:Pine Script中数组属于引用类型,你写
c = e、d = f并没有复制出两个新数组,只是给原数组e、f起了别名,对c、d的修改会直接改变原数组e、f的内容,导致外层循环的array.size(e)动态变小,但你循环的终止条件是初始计算的array.size(e)-1,后续i的取值会超过当前数组的实际长度,触发越界错误。
- 数组引用赋值问题:Pine Script中数组属于引用类型,你写
- 索引逻辑错误:你匹配到的是数组e的i下标元素和数组f的j下标元素相等,但删除d(也就是f的别名)时用了i作为下标,完全不符合实际匹配位置,会误删元素。
- 循环逻辑错误:在遍历数组的过程中删除元素,会导致后续元素的下标集体前移,如果不调整循环变量的步长,会跳过部分元素,同时也会加剧下标越界的概率。
修正方案
你的需求是获取两个数组的对称差集(即仅在其中一个数组中出现、没有同时出现在两个数组里的元素),修正后的代码如下:
// 深拷贝数组避免修改原数组 array_copy(arr)=> new_arr = array.new_float() for i = 0 to array.size(arr) - 1 array.push(new_arr, array.get(arr, i)) new_arr // 检查元素是否存在于数组中 array_contains(arr, val)=> res = false for i = 0 to array.size(arr) - 1 if array.get(arr, i) == val res = true break res // 求两个数组的对称差集 disjoint(e, f)=> // 先复制两个原数组,避免修改原数据 c = array_copy(e) d = array_copy(f) res = array.new_float() // 遍历第一个数组,收集不在第二个数组里的元素 for i = 0 to array.size(c) - 1 val = array.get(c, i) if not array_contains(d, val) array.push(res, val) // 遍历第二个数组,收集不在第一个数组里的元素 for i = 0 to array.size(d) - 1 val = array.get(d, i) if not array_contains(c, val) array.push(res, val) res // 调用示例 final_array = disjoint(array1, array2)
优化说明
- 新增
array_copy工具函数深拷贝数组,不会修改传入的原始数组 - 新增
array_contains工具函数简化存在性判断逻辑,避免嵌套循环过程中删除元素导致的索引混乱 - 整个过程不需要在遍历数组时删除元素,从根源上避免了下标越界问题
内容的提问来源于stack exchange,提问作者TJalam
相关产品推荐
相关产品推荐

