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

如何在Pine Script中统计穿越EMA21后高低于EMA的K线数并显示在右上角?

修复Pine Script v5的EMA穿越后K线计数问题

问题根源

  1. 计数器未持久化:原代码中barsAboveEMA和barsBelowEMA未用var声明,每根K线都会被重新初始化为0,导致每次仅能累加1,结果始终显示为1。
  2. 标签位置错误:使用bar_index和K线的high/low作为坐标,标签会依附在最后一根K线上,无法固定在图表右上角。

修复后的代码

//@version=5
indicator("Bars Above/Below EMA Counter", overlay=true)

// 输入EMA周期
emaLength = input(21, title="EMA Length")

// 计算EMA
emaValue = ta.ema(close, emaLength)

// 初始化持久化计数器
var int barsAboveEMA = 0
var int barsBelowEMA = 0

// 检测EMA穿越信号并更新计数
if ta.crossover(close, emaValue)
    barsAboveEMA := 1
    barsBelowEMA := 0
elif ta.crossunder(close, emaValue)
    barsBelowEMA := 1
    barsAboveEMA := 0
elif close > emaValue
    barsAboveEMA += 1
elif close < emaValue
    barsBelowEMA += 1

// 绘制EMA
plot(emaValue, color=color.blue, title="EMA")

// 创建并更新右上角标签
var label counterLabel = label.new(chart.right, chart.top, "", color=color.black, textcolor=color.white, style=label.style_label_down)
label.set_text(counterLabel, str.format("Bars Above EMA: %d\nBars Below EMA: %d", barsAboveEMA, barsBelowEMA))

核心修改说明

  • 持久化计数器:用var声明计数器变量,确保数值在不同K线间保留,不会被重置。
  • 穿越触发逻辑:通过ta.crossover和ta.crossunder检测价格穿越EMA的信号,触发时重置对应计数器并开始新的计数周期(初始值设为1,因为当前穿越的K线已满足条件)。
  • 固定标签位置:使用chart.right和chart.top作为标签坐标,直接将标签固定在图表右上角;合并两个标签为一个,避免重叠,提升可读性。
  • 优化计数逻辑:仅在未发生穿越的情况下,根据当前价格与EMA的关系累加对应计数器,保证计数的连续性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 08:24:54