Pine Script实现回溯更低收盘价K线数及ta.valuewhen()异常求解
Pine Script 计算每根K线回溯至更低收盘价的K线数量问题
需求说明
需要编写Pine Script脚本,计算每根K线需要回溯多少根才能找到收盘价更低的K线,且每根K线需独立完成计算。
给定时间序列
(bar_index,(open,close)): [(0,(1,2)),(1,(2,4)),(2,(4,8)),(3,(8,8)),(4,(8,5)),(5,(5,3)),(6,(3,1)),(7,(1,5)),(8,(5,9)),(9,(9,8))]
期望返回结果
(bar_index,result): [(0,na),(1,1),(2,1),(3,2),(4,3),(5,5),(6,na),(7,1),(8,1),(9,2)]
尝试的错误代码
lower_close(src) => ta.valuewhen(close<src, bar_index, 1) var a = close plot(lower_close(a))
错误结果
(bar_index,result): [(0,1),(1,1),(2,1),(3,1),(4,1),(5,1),(6,1),(7,1),(8,1),(9,1)]
问题分析
var声明错误:var a = close会让变量a仅在第一根K线初始化一次,后续不再更新,导致所有计算都基于第一根K线的收盘价,而非当前K线的收盘价。- 逻辑偏差:
ta.valuewhen仅返回满足条件的K线索引,但需求是计算当前K线与目标K线的索引差值(即回溯数量),而非直接返回索引值。 - 无边界处理:未处理找不到更低收盘价的情况(如首根K线或当前收盘价为历史最低),无法返回
na。
解决代码
//@version=5 indicator("回溯至更低收盘价的K线数量", overlay=false) getLowerCloseBacktrack() => float result = na // 从当前K线的前一根开始向前遍历 for i = 1 to bar_index prev_close = close[i] if prev_close < close result = i // i即为回溯的K线数量 break // 找到第一个目标后终止循环 result backtrack_count = getLowerCloseBacktrack() plot(backtrack_count, title="回溯数量", color=color.blue, linewidth=2)
代码说明
- 使用
for循环从当前K线的前1根开始逐步向前遍历,直到找到第一个收盘价小于当前收盘价的K线。 - 找到目标K线后,记录回溯的数量(
i即往前的K线根数)并终止循环,减少不必要的计算。 - 若遍历完所有历史K线仍未找到更低收盘价,保持结果为
na,符合需求。 - 移除了错误的
var声明,确保每根K线都使用自身的收盘价进行计算。
内容的提问来源于stack exchange,提问作者HelloWorld
相关产品推荐
相关产品推荐

