You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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)

关键修正说明

  1. 区间有效性判断:新增inLong变量,通过比较金叉和死叉的距离,确定当前是否处于金叉到死叉的有效区间,避免死叉后继续计算和标记。
  2. 高效计算最高点:用Pine Script内置的ta.highest替代自定义循环函数,既提升运行效率,又避免循环逻辑可能带来的误差。
  3. 精准标记条件:plotshape的触发条件改为high == HH and inLong,仅在当前K线是区间最高点且处于有效区间时才生成标签,解决了全K线标记的问题。

内容的提问来源于stack exchange,提问作者F..

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 08:17:26