Pine Script实现仅标记当前绝对历史高低点 隐藏被突破旧极值
问题根因
原代码采用逐bar判断逻辑,会给每一根创下「截止到该bar位置历史新高/新低」的K线都打上标记,未判断该极值是否为全数据集范围内的最终极值,因此旧标记不会被自动清除。
修正方案
先在图表最后一根K线位置计算全加载范围内的全局最高、最低值及对应的K线位置,仅在匹配全局最终极值的K线上打标记即可,旧极值被突破后标记会自动移除。
修正后的完整代码:
//@version=5 indicator(title="全局历史高低点标记", shorttitle="全局高低点", overlay=true) // 定义变量存储全局极值和对应K线索引 var float finalHigh = na var int finalHighBar = na var float finalLow = na var int finalLowBar = na // 运行到最后一根K线时,计算全数据集的极值和对应位置 if barstate.islast finalHigh := ta.highest(high, bar_index + 1) finalHighBar := ta.highestbars(high, bar_index + 1) + bar_index finalLow := ta.lowest(low, bar_index + 1) finalLowBar := ta.lowestbars(low, bar_index + 1) + bar_index // 仅在全局极值对应的K线位置显示标记 plotchar(bar_index == finalHighBar, title="历史最高点", char="*", location=location.abovebar, size=size.normal, color=color.lime) plotchar(bar_index == finalLowBar, title="历史最低点", char="*", location=location.belowbar, size=size.normal, color=color.red)
逻辑说明
ta.highest()/ta.lowest()传入长度参数bar_index + 1,代表统计范围覆盖从图表第一根K线到当前最后一根K线的全部行情数据ta.highestbars()/ta.lowestbars()会返回极值距离当前K线的偏移量,加上当前K线的绝对索引bar_index,就能得到极值所在K线的准确位置- 仅当K线索引完全匹配全局极值位置时才会渲染标记,不会给中途创新高、后续被突破的K线保留标记
- 缩放、平移图表加载更多历史/最新K线时,脚本会自动重新计算全局极值位置,旧标记自动清除,新极值点自动显示
- 如果需要标记所有价格和全局极值相等的K线(比如多个平头顶/平脚底的情况),将判断条件替换为
high == finalHigh、low == finalLow即可
内容的提问来源于stack exchange,提问作者silverstreak
相关产品推荐
相关产品推荐

