如何解决ta.highest()函数报错?交叉点验证场景问题排查

问题描述
我正在研究图中的红绿点交叉信号,目标是对交叉点进行验证:若交叉点出现前有大幅波动则保留该信号,若市场过于平静则丢弃交叉事件。
将两个指标图之间的差值命名为X_hist,我希望获取上次向上交叉(CrossingUp)事件以来X_hist绝对值的最高值。
最初编写的代码
BarsSinceCrossingUp = ta.barssince(CrossingUp) CrossingIsValid = ta.highest(math.abs(X_hist), BarsSinceCrossingUp) > math.abs(X_hist[1]) * 5
报错信息
Error on bar 22: Invalid value of the 'length' argument (NaN) in the "highest" function. It must be > 0.
尝试的修正代码(仍报错)
BarsSinceCrossingUp = // wrapped for readability ta.barssince(CrossingUp) < 1 or // handling 0 na(ta.barssince(CrossingUp)) ? 1 : // handling NaN ta.barssince(CrossingUp) CrossingIsValid = ta.highest(math.abs(X_hist), BarsSinceCrossingUp) > math.abs(X_hist[1]) * 5
请问如何让ta.highest()函数正常工作?或许ta.barssince(CrossingUp)并非获取上次CrossingUp事件以来K线数量的正确方法?
解决方案
问题根源
ta.barssince(CrossingUp)在还未出现过CrossingUp信号时会返回NaN,你尝试的布尔运算逻辑有误——or的运算优先级高于?:,导致最终BarsSinceCrossingUp仍可能出现NaN值,传入ta.highest()后触发报错。
正确处理代码
方法一:修复ta.barssince()的数值处理逻辑
先单独获取信号间隔值,再统一替换NaN和确保长度≥1:
barsSince = ta.barssince(CrossingUp) // 未出现过CrossingUp时设为1,出现过则取实际间隔数,同时保证数值不小于1 BarsSinceCrossingUp = na(barsSince) ? 1 : math.max(barsSince, 1) CrossingIsValid = ta.highest(math.abs(X_hist), BarsSinceCrossingUp) > math.abs(X_hist[1]) * 5
方法二:用ta.valuewhen()获取信号位置计算间隔
通过记录上次CrossingUp的K线索引,计算当前与该位置的间隔:
lastCrossUpBar = ta.valuewhen(CrossingUp, bar_index, 0) barsSince = bar_index - lastCrossUpBar // 未出现过信号时设为1,避免NaN BarsSinceCrossingUp = na(lastCrossUpBar) ? 1 : barsSince CrossingIsValid = ta.highest(math.abs(X_hist), BarsSinceCrossingUp) > math.abs(X_hist[1]) * 5
关键说明
ta.barssince()本身逻辑正确,它确实能返回上次信号到当前的间隔K线数,核心问题是未处理初始阶段无信号时的NaN值。ta.highest()要求length参数必须是大于0的整数,因此必须确保传入的参数满足该条件。
内容的提问来源于stack exchange,提问作者Vendrel
相关产品推荐
相关产品推荐

