Pine Script报错:Bar 0数组过大,求嵌套循环优化方案
问题解决:Pine Script v5数组过大报错优化方案
错误原因
原代码嵌套循环内的while i!=j逻辑存在致命问题:当i≠j时,循环体内未修改i或j的值,会触发无限循环,持续向数组中写入元素,导致数组规模远超平台限制的100000,最终抛出报错。同时,先存储中间结果再求和的方式也会额外占用大量内存资源。
优化方案
- 将错误的
while判断替换为if,彻底避免无限循环 - 取消存储中间结果的数组,直接在循环中累计求和值,从根源上规避数组大小限制
- 简化代码结构,减少不必要的数组操作,提升运行效率
修改后的完整代码
//@version=5 indicator("My script", max_bars_back = 55) import E5Trading/E5TradingLibrary/1 as auto import kaigouthro/into/2 as boof price = hlc3 // 用数组批量管理SMA参数,替代重复变量定义 srce_vals = [1, 2, 3, 5, 8, 13, 21, 34, 55, 84, 139] basis_arr = array.new_float() for val in srce_vals array.push(basis_arr, ta.sma(price, val)) N = array.size(basis_arr) - 1 funcml(data) => cum_gr = 0.0 cum_rd = 0.0 for i = 0 to N by 1 val_i = array.get(data, i) for j = 0 to N by 1 if i != j // 替换原错误的while逻辑 val_j = array.get(data, j) // 直接累计上涨信号值,无需存入数组 gchk = auto.isReversalUpTrend(val_i, val_j) cum_gr += boof.f(gchk) // 直接累计下跌信号值,无需存入数组 rchk = auto.isReversalDownTrend(val_i, val_j) cum_rd += boof.f(rchk) [cum_gr, cum_rd] [smacumgr, smacumrd] = funcml(basis_arr) vuptrnd = smacumgr > math.abs(smacumrd) vdwntrnd = smacumgr < math.abs(smacumrd) plotchar(vuptrnd, char="🡩", color=color.green, location=location.top, size=size.tiny) plotchar(vdwntrnd, char="🡫", color=color.red, location=location.top, size=size.tiny)
额外优化细节
- 用数组批量管理SMA参数与结果,替代原重复的变量定义,提升代码可读性和维护性
- 循环中提前读取数组元素值,避免重复调用
array.get(),减少运行开销
内容的提问来源于stack exchange,提问作者Babu Ramasamy
相关产品推荐
相关产品推荐

