使用ta.barssince获取指定时间戳后K线数返回NaN的技术咨询
解决ta.barssince返回NaN的问题
问题原因
你遇到的NaN是因为time == startDate的判断过于严格:
- TradingView中
time代表每根K线的开盘时间戳,仅当用户输入的startDate与某根K线的开盘时间完全一致时,time == startDate才会成立。 - 若输入的时间戳(比如非开盘时刻的任意时间)与所有K线的开盘时间不匹配,
ta.barssince找不到满足条件的K线,就会返回NaN。
解决方案
我们需要放宽时间匹配条件,改为匹配大于等于目标时间的第一根K线,以下是两种可行实现方式:
方式1:基于ta.valuewhen计算K线数量
通过定位第一个符合时间条件的K线索引,再与当前K线索引做差值计算:
//@version=5 indicator("My Indicator") startDate = input.time(timestamp("August 08 2024"), "Start date", group = 'Lookback Properties') // 获取第一个时间>=startDate的K线索引 firstTargetBar = ta.valuewhen(time >= startDate, bar_index, ta.barssince(time >= startDate)) // 计算从目标K线到当前的数量(+1是因为包含当前K线) lookBack = bar_index - firstTargetBar + 1 // 处理目标时间未到的情况(此时lookBack为NaN) lookBack := na(lookBack) ? na : lookBack log.info("lookBack = {0}", lookBack)
方式2:基于ta.barssince反向判断
通过判断最后一根早于目标时间的K线,计算其到当前的间隔数:
//@version=5 indicator("My Indicator") startDate = input.time(timestamp("August 08 2024"), "Start date", group = 'Lookback Properties') // 计算最后一根早于startDate的K线到当前的间隔数 lookBack = ta.barssince(time < startDate) // 处理所有K线都晚于目标时间的情况 lookBack := na(lookBack) ? bar_index + 1 : lookBack log.info("lookBack = {0}", lookBack)
说明
- 两种方式都能正确获取从目标时间戳至今的K线数量,包含当前K线。
- 若目标时间晚于当前所有K线的时间,两种方式都会返回
NaN(方式2中通过na(lookBack)判断),符合逻辑。
内容的提问来源于stack exchange,提问作者John554
相关产品推荐
相关产品推荐

