You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pine Script报错:Bar 0数组过大,求嵌套循环优化方案

问题解决:Pine Script v5数组过大报错优化方案

错误原因

原代码嵌套循环内的while i!=j逻辑存在致命问题:当i≠j时,循环体内未修改i或j的值,会触发无限循环,持续向数组中写入元素,导致数组规模远超平台限制的100000,最终抛出报错。同时,先存储中间结果再求和的方式也会额外占用大量内存资源。

优化方案

  1. 将错误的while判断替换为if,彻底避免无限循环
  2. 取消存储中间结果的数组,直接在循环中累计求和值,从根源上规避数组大小限制
  3. 简化代码结构,减少不必要的数组操作,提升运行效率

修改后的完整代码

//@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 15:38:00