Pine Script计算多单开平仓间动态长度最低low报错求解
Pine Script 动态计算多头头寸持仓区间最低值修正方案
错误根源
ta.lowest属于序列计算类函数,Pine要求这类函数必须在每根K线的全局作用域执行,不能放在if分支、三元运算符等条件触发的作用域内,否则会触发计算一致性报错max_bars_back报错是因为动态长度的ta.lowest放在条件分支内时,Pine无法提前推断函数需要的最大回溯K线数量,导致运行时内存分配异常
修正后可运行代码
var maeLong = 0.0 var maxMaeLong = 0.0 var sinceTrade = 0 // 全局范围计算动态长度的最低low,每根K线都执行,满足ta.lowest的调用要求 lowest_in_trade = ta.lowest(low, sinceTrade) // 持仓周期计数逻辑 if strategy.position_size != 0 sinceTrade := sinceTrade + 1 else sinceTrade := 0 // 多头平仓触发时计算MAE if strategy.closedtrades[0] > strategy.closedtrades[1] and strategy.position_size[1] > 0 // 平仓时sinceTrade已被重置为0,取上一根K线的持仓周期、对应区间最低值 trade_duration = sinceTrade[1] if trade_duration > 0 entry_price = open[trade_duration] trade_low = lowest_in_trade[1] maeLong := (entry_price - trade_low) / entry_price maxMaeLong := math.max(maxMaeLong, maeLong)
关键修改说明
- 将
ta.lowest的调用移到全局作用域,每根K线都执行,完全匹配Pine的函数调用规则 - 平仓计算时统一取上一根K线的计算结果,避免持仓周期被平仓逻辑重置后取值错误
- 新增持仓周期大于0的边界判断,避免除以0或者无效回溯的问题
- 用内置
math.max替代三元运算符,代码更简洁易读
内容的提问来源于stack exchange,提问作者meltinsands
相关产品推荐
相关产品推荐

