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

Pine Script报错求助:bar 0处循环执行超时(>500ms)

问题解决:Pine Script循环超时报错(loops takes too long to execute)

问题描述

编写的Pine Script编译成功,但在TradingView指标窗口触发报错:error on bar 0, loops takes too long to execute (>500ms),指标无法正常运行。

核心原因

  1. 嵌套循环次数爆炸:代码包含三层嵌套while循环,外层循环次数基于historyBars=2345,内层循环直接使用time(tf2)(时间戳数值极大,如分钟级周期的time值达百万级),导致循环执行次数远超TradingView的500ms运行限制
  2. 循环内频繁跨周期请求:每次循环都调用request.security获取跨周期数据,这类IO操作本身耗时,叠加循环次数后直接触发超时
  3. 逻辑冗余与错误:存在无效数组赋值、函数返回值逻辑错误、循环内初始化var变量导致无限循环等问题,进一步拖慢执行效率

修复方案

关键优化点

  • 用Pine Script内置的向量化函数替代while循环(向量化操作是Pine的原生高效实现,远快于手动循环)
  • 一次性获取跨周期历史数据,避免循环内重复请求
  • 清理无效逻辑,修正变量使用错误

修改后的代码

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © felixxzz

//@version=5
indicator("Custom Indicator", overlay=false, max_bars_back = 5000)

// 输入参数
len = input.int(15, title="Len")
historyBars = input.int(2345, title="HistoryBars")
urovenSignal = input.int(5, title="UrovenSignal")
tf1 = input.timeframe("", "Tf1")
tf2 = input.timeframe("", "Tf2")
alert = input(false, title="Alert")
sound = input(false, title="Sound")
gv = input(false, title="GV")

// 计算跨周期倍数,调整历史K线数
tf2_multiplier = ta.timeframe.multiplier(tf2) / timeframe.multiplier
adjusted_historyBars = math.round(historyBars / tf2_multiplier)

// 一次性获取tf1周期的历史数据,避免循环内重复请求
[tf1_close, tf1_high, tf1_low] = request.security(syminfo.tickerid, tf1, [close, high, low], lookahead=barmerge.lookahead_off)

// 计算信号以来的K线数
barSinceSignal = ta.barssince(ta.barssince(tf1_close) <= adjusted_historyBars + len)

// 向量化计算高低点对应的收盘价求和
sumHigh = ta.sum(ta.valuewhen(ta.highest(tf1_high, len) == tf1_high, tf1_close, 0), adjusted_historyBars)
sumLow = ta.sum(ta.valuewhen(ta.lowest(tf1_low, len) == tf1_low, tf1_close, 0), adjusted_historyBars)

// 计算UP和DN值
UP_value = sumHigh != 0 and sumLow != 0 ? sumHigh / sumLow : na
DN_value = sumHigh != 0 and sumLow != 0 ? sumLow / sumHigh : na

// 绘图
plot(UP_value, "Label1", color=color.green, linewidth=1)
plot(DN_value, "Label2", color=color.red, linewidth=1)

说明

  • 代码移除了所有while循环,改用ta.highest、ta.lowest、ta.sum等内置函数实现相同逻辑,执行效率大幅提升
  • 跨周期数据仅请求一次,避免重复IO开销
  • 修正了原代码中变量未初始化、逻辑冗余等问题,确保运行稳定

内容的提问来源于stack exchange,提问作者felix Chidubem

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 10:54:52