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

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

Crossings

问题描述

我正在研究图中的红绿点交叉信号,目标是对交叉点进行验证:若交叉点出现前有大幅波动则保留该信号,若市场过于平静则丢弃交叉事件。

将两个指标图之间的差值命名为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 01:25:02