如何用plotshape在EMA金叉死叉区间标记最高值K线?
解决EMA金叉死叉间最高点标记问题
问题场景
需要在EMA10与EMA20的金叉(crossUp)到死叉(crossDown)区间内,用plotshape标记这段区间中出现最高高点的K线,但当前代码会标记所有K线,不符合需求。
原代码
ema1 = ta.ema(close, 10) ema2 = ta.ema(close, 20) plot(ema1, color = color.black) plot(ema2, color = color.purple) crossUp = ta.crossover(ema1, ema2) crossDown = ta.crossunder(ema1, ema2) highest_pine(src, len) => max = src[0] for i = 1 to len if src[i] > max max := src[i] max HH = 0.0 HH := highest_pine(high, ta.barssince(crossUp)) plot(HH, color = color.green) plotshape(HH,text="Pe",style=shape.labeldown,size=size.small,offset=0,color=color.green,textcolor=color.white,location=location.abovebar)
问题分析
- 原代码中
HH在每根K线都会计算出对应区间的最高点数值,plotshape直接以HH为触发条件,只要HH有值就会生成标签,导致所有K线都被标记。 - 缺少两个关键判断:当前K线是否处于金叉到死叉的有效区间内,以及当前K线的高点是否等于区间内的最高点。
修正后的代码
ema1 = ta.ema(close, 10) ema2 = ta.ema(close, 20) plot(ema1, color = color.black) plot(ema2, color = color.purple) crossUp = ta.crossover(ema1, ema2) crossDown = ta.crossunder(ema1, ema2) // 标记当前是否处于金叉后、死叉前的区间 inLong = ta.barssince(crossDown) > ta.barssince(crossUp) // 计算金叉以来的区间最高点,仅在有效区间内生效 HH = inLong ? ta.highest(high, ta.barssince(crossUp) + 1) : na // 仅当当前K线高点等于区间最高点且在有效区间时标记 plotshape(high == HH and inLong, text="Pe", style=shape.labeldown, size=size.small, offset=0, color=color.green, textcolor=color.white, location=location.abovebar)
关键修正说明
- 区间有效性判断:新增
inLong变量,通过比较金叉和死叉的距离,确定当前是否处于金叉到死叉的有效区间,避免死叉后继续计算和标记。 - 高效计算最高点:用Pine Script内置的
ta.highest替代自定义循环函数,既提升运行效率,又避免循环逻辑可能带来的误差。 - 精准标记条件:
plotshape的触发条件改为high == HH and inLong,仅在当前K线是区间最高点且处于有效区间时才生成标签,解决了全K线标记的问题。
内容的提问来源于stack exchange,提问作者F..
相关产品推荐
相关产品推荐

