如何在Pine Script中查找EMA6与EMA12交叉后的红绿K线
报错原因与修复方案
核心报错原因
你当前代码的核心问题是aboveMa是布尔类型的序列(交叉发生时为true,其余为false),直接将布尔值作为[]偏移量传入是语法错误,偏移量必须是非负整数。你原来写的threeAboveMa1 = aboveMa[1]拿到的是上一根K线是否发生交叉的布尔值,true等价于1、false等价于0,传入open[threeAboveMa1]完全不符合你定位交叉后K线的逻辑,还会在校验严格的运行环境直接报错。
修复后的可运行代码(Pine Script v5)
//@version=5 indicator("EMA交叉后K线红绿判断", overlay=false) // 计算EMA值 ma = ta.ema(close, 6) ma2 = ta.ema(close, 12) // 识别EMA6上穿EMA12的交叉 aboveMa = ta.crossover(ma, ma2) // 计算距离上次交叉的K线根数:返回0代表当前K线刚好发生交叉,1代表是交叉后的第一根K线,以此类推 bars_since_cross = ta.barssince(aboveMa) // 判断交叉后的第一根K线的红绿状态 is_green_candle_after_cross = na is_red_candle_after_cross = na var float open_after_cross = na var float close_after_cross = na if bars_since_cross == 1 // 取交叉后的第一根K线,调整数值即可取交叉后第N根 is_green_candle_after_cross = close > open is_red_candle_after_cross = close < open // 存储对应K线的开收盘值供后续计算 open_after_cross = open close_after_cross = close // 可视化标记,可直接在K线图看到结果 plotshape(is_green_candle_after_cross, title="交叉后收涨", location=location.belowbar, color=color.green, style=shape.labelup, text="涨") plotshape(is_red_candle_after_cross, title="交叉后收跌", location=location.abovebar, color=color.red, style=shape.labeldown, text="跌")
关键修改说明
- 替换错误的布尔值偏移写法,使用
ta.barssince()精准定位交叉发生后的K线位置,逻辑更稳定 - 增加空值判断,避免未发生交叉时返回无效值导致运行报错
- 内置可视化标记,运行后可直接在K线图上看到交叉后第一根K线的涨跌状态
- 保留了开收盘值存储逻辑,你可以直接调用
open_after_cross和close_after_cross做后续计算
内容的提问来源于stack exchange,提问作者Mudassar Ali Ansari
相关产品推荐
相关产品推荐

