Pine Script报“Loop takes too long to execute”错误,新手代码如何优化?
解决Pine Script v5循环超时问题
首先你代码里的核心问题是那段while循环是死循环——每次进入循环都会把count重置为1,循环条件bars_since只要不为0就会一直执行,永远跳不出循环,这才触发了“Loop takes too long to execute”报错。
如果你的需求是获取倒数第二次ta.cross(deliveryVolumePercentage, 95)触发的位置,完全不用循环,用Pine的var数组记录触发位置更高效:
//@version=5 indicator("Second Last Cross Tracker", overlay=true) // 定义触发条件 condition = ta.cross(deliveryVolumePercentage, 95) // 用var数组存储每次触发条件的K线索引(var保证数组不会随K线重置) var int[] crossBars = array.new_int() // 条件触发时,将当前K线索引存入数组 if condition array.push(crossBars, bar_index) // 计算倒数第二次触发的间隔K线数 int secondToLast = na if array.size(crossBars) >= 2 // 取倒数第二个触发点的K线索引,计算与当前K线的差值 lastCrossIndex = array.get(crossBars, array.size(crossBars)-2) secondToLast := bar_index - lastCrossIndex // 绘制结果 plot(ta.barssince(condition), "Last Cross Bars", color=color.blue) plot(secondToLast, "Second Last Cross Bars", color=color.red)
优化说明:
- 用
var声明数组,确保数组在脚本运行全程仅初始化一次,不会每根K线都重置 - 每次条件触发时直接存入当前K线索引,避免循环遍历的无效开销
- 通过数组的
size和get方法直接定位倒数第二次触发位置,效率远高于循环
内容的提问来源于stack exchange,提问作者Dev Oberay
相关产品推荐
相关产品推荐

