TradingView Pine Script报Array is to large错误如何解决
Pine Script 少量数据写入触发「Array is too large」报错的解决思路
开发TradingView Pine Script时,仅单次往数组写入约20个数据项就触发Study Error Array is too large, Maximum size is 1000000报错的核心诱因:报错和你单次写入的数据量没有直接关系,Pine Script是逐K线执行的脚本语言,只要你没有对数组的初始化、写入操作做执行范围限制,代码会在每一根历史K线、实时K线更新时重复执行,累计写入的元素量会随K线数量线性增长,很容易触达1000000的数组总大小上限。
可行的解决、规避思路如下:
- 数组初始化统一用
var关键字修饰
不要用普通赋值语句声明数组,普通声明arr = array.new_float()会在每根K线执行时重新创建数组对象,历史执行过程中写入的元素不会被正常回收,会计入总大小统计;用var arr = array.new_float()声明的数组,只会在整个脚本运行周期的第一根K线初始化一次,不会重复创建对象,从根源避免无意义的内存占用。 - 给所有数组写入操作加触发条件
不要把array.push()、array.insert()这类写入方法直接写在全局作用域,否则每根K线都会执行写入操作。比如你只需要在金叉信号出现时记录价格,就把写入逻辑包裹在条件判断内:
仅当业务条件满足时才写入数据,避免无意义的累计写入。// 仅金叉触发时写入数据 if ta.crossover(ta.sma(close,5), ta.sma(close,20)) array.push(arr, close) - 主动控制数组有效长度
如果你只需要固定数量的最新数据点,每次写入后主动删除过期的无效数据,把数组长度始终控制在业务需要的范围内。比如你只需要保留最近20个有效数据点,可以在写入逻辑后加长度校验:// 写入完成后校验长度,超过20就移除最旧的元素 if array.size(arr) > 20 array.shift(arr) - 排查循环逻辑的边界问题
检查所有涉及数组写入的for/while循环,确认循环终止条件设置正确,没有出现死循环、循环边界值设置过大的问题——如果循环逻辑异常,单次K线执行时就可能写入数万甚至数十万条无效数据,直接触发超限报错。可以临时加计数器打印循环执行次数快速定位问题。 - 大体积连续数据优先用原生序列类型存储
如果你需要存储和K线一一对应的连续历史数据,不要用数组存储,直接用Pine Script原生的series类型变量即可,该类型是和K线深度绑定的原生存储结构,没有1000000的数组大小限制,读写效率也比普通数组更高。
内容的提问来源于stack exchange,提问作者robin crama
相关产品推荐
相关产品推荐

