如何使用ta.barssince引用当前K线值,实现历史与当前值比较?
解决ta.barssince引用当前K线收盘价的问题
你碰到的核心问题是Pine Script的回溯机制:当ta.barssince遍历历史K线时,close[0]会被解析为对应历史K线自身的收盘价,而非当前最新K线的收盘价,所以close<close[0]本质是在判断历史收盘价是否小于它自己,结果永远为false,自然得不到想要的结果。
正确实现思路
要让ta.barssince用当前K线的收盘价作为比较基准,得把当前收盘价存成一个固定值,不让它在回溯历史时跟着变化。具体步骤:
- 用
var定义一个变量,专门存储当前最新K线的收盘价 - 只在新K线生成时(或K线收盘后,按需选择)更新这个变量
- 把这个固定值作为比较基准传入
ta.barssince
完整代码示例
//@version=5 indicator("上一次收盘价低于当前价的间隔", overlay=true) // 存储当前K线收盘价,仅在新K线生成时更新(若要固定用收盘后的价格,把barstate.isnew改成barstate.isconfirmed) var float current_close = na if barstate.isnew current_close := close // 计算上一次收盘价低于当前价的间隔K线数 bars_since = ta.barssince(close < current_close) // 可视化结果 plot(bars_since, color=color.blue, title="间隔K线数") label.new(bar_index, high, str.tostring(bars_since), color=color.red, textcolor=color.white)
关键细节说明
var关键字确保变量不会在每次回溯时重新初始化,只会保留最新赋值barstate.isnew保证只有当新K线开始时,才把当前收盘价存入变量,避免回溯时变量被历史值覆盖- 如果需要用已确认的收盘价(而非盘中实时价),把
barstate.isnew换成barstate.isconfirmed即可,这样变量只会在K线收盘后更新
内容的提问来源于stack exchange,提问作者Alexei Andronov
相关产品推荐
相关产品推荐

