如何在Pine Script中统计穿越EMA21后高低于EMA的K线数并显示在右上角?
修复Pine Script v5的EMA穿越后K线计数问题
问题根源
- 计数器未持久化:原代码中
barsAboveEMA和barsBelowEMA未用var声明,每根K线都会被重新初始化为0,导致每次仅能累加1,结果始终显示为1。 - 标签位置错误:使用
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
相关产品推荐
相关产品推荐

