如何获取图表倒数第n根bar及图表总bar数量?
问题描述
你目前已经可以通过bar_index的固定序号获取图表最左侧的前三根bar引用,示例代码:
firstBar = bar_index == 0 secondBar = bar_index == 1 thirdBar = bar_index == 2
但需要实现获取图表最右侧最后三根bar的引用时,尝试手动统计总bar数的方法始终不符合预期。
你最初的思路是通过统计图表总bar数来推算最后三根的位置,原本预期的代码逻辑是:
totalNumOfBars = ??????? // 期望获取图表总bar数 lastBar = bar_index == totalNumOfBars previousBar = bar_index == totalNumOfBars - 1 antePreviousBar = bar_index == totalNumOfBars - 2
你之前的尝试为什么失效
你针对1分钟周期写的统计逻辑代码如下:
// for the 1mn timeframe var TotalNumOfBars = 0 if time == timestamp(year(timenow), month(timenow), dayofmonth(timenow), hour(timenow), minute(timenow), 0) TotalNumOfBars := bar_index
这段代码运行后,无法在倒数第三根bar上画出你预期的1值,核心原因有两个:
- Pine Script是逐根bar从左到右顺序执行的,不是等所有bar加载完成后只执行一遍。你代码里的
TotalNumOfBars只会在每小时第一根bar的触发节点,把当时已经执行到的bar索引存下来,这个值永远是上一个整点时刻的bar位置,和图表最右侧的实际最后bar位置存在滞后差。 - 实时行情下图表的最后一根bar是动态更新的,你手动统计的数值永远追不上实时生成的新bar位置,自然匹配不上目标bar的索引。
正确实现方案
完全不需要自己手动统计总bar数,Pine Script已经提供了直接可用的内置变量:
last_bar_index:内置变量,直接返回整个图表最右侧最后一根bar的bar_index值,也就是你想要的总bar数减1的结果。- 结合历史引用的
barstate.islast状态判断,偏移获取倒数bar的位置。
方案1:用last_bar_index匹配索引
直接引用内置变量匹配bar索引,代码示例:
// 最后三根bar的引用逻辑 lastBar = bar_index == last_bar_index previousBar = bar_index == last_bar_index - 1 antePreviousBar = bar_index == last_bar_index - 2 // 你原本想要的倒数第三根bar绘制值为1的线 plot(antePreviousBar ? 1 : 0)
方案2:用barstate.islast历史偏移判断
不依赖bar索引值,直接基于最后一根bar的状态做偏移引用,适配性更强,哪怕图表加载的bar范围发生变化也不会出错:
// 最后三根bar的引用逻辑 lastBar = barstate.islast previousBar = barstate.islast[1] antePreviousBar = barstate.islast[2] plot(antePreviousBar ? 1 : 0)
注意:上述两种方法都不需要手动统计总bar数,内置变量会自动匹配图表实际的最右侧bar位置,实时更新下也能保持判断准确。
内容的提问来源于stack exchange,提问作者Jona Rodrigues
相关产品推荐
相关产品推荐

