仅检测均线交叉后首个收盘价突破交叉K线高点的脚本问题
解决方案:MA金叉后标记首个突破金叉K线高点的K线
你的核心需求是MA9上穿MA21后,仅标记首次收盘价突破该金叉K线高点的K线,原代码的问题在于缺少信号触发状态的跟踪,导致要么无法正确触发,要么重复标记。以下是修正后的Pine Script代码:
//@version=5 indicator(title="MA Cross - First Breakout", overlay=true, timeframe="", timeframe_gaps=true) // 输入参数 shortlen = input.int(9, "短期均线长度", minval=1) longlen = input.int(21, "长期均线长度", minval=1) // 计算均线 short_ma = ta.sma(close, shortlen) long_ma = ta.sma(close, longlen) // 绘制均线 plot(short_ma, color=#2196F3, title="MA9") plot(long_ma, color=#43A047, title="MA21") // 识别MA金叉信号 bullish_cross = ta.crossover(short_ma, long_ma) // 标记金叉K线 plotshape(bullish_cross, style=shape.triangleup, location=location.belowbar, size=size.small, color=color.green, text="金叉") // 跟踪金叉K线的高点,以及是否已触发突破信号 var float cross_high = na var bool signal_triggered = false // 当金叉出现时,重置高点和触发状态 if bullish_cross cross_high := high signal_triggered := false // 定义买入信号:收盘价突破金叉高点,且当前周期未触发过信号 buy_signal = close > cross_high and not signal_triggered // 触发信号后,标记状态为已触发,避免重复标记 if buy_signal signal_triggered := true // 标记首个突破K线 plotshape(buy_signal, title="买入信号", text="买", style=shape.circle, color=color.rgb(67, 224, 138), size=size.tiny, location=location.belowbar)
关键逻辑说明:
- 状态跟踪:用
var bool signal_triggered记录当前金叉周期内是否已经触发过突破信号,初始为false。 - 重置机制:每次新的金叉出现时,重置
cross_high为当前K线高点,并把signal_triggered设为false,确保下一轮突破可以被检测。 - 信号过滤:买入信号仅在
close > cross_high且signal_triggered为false时触发,触发后立即将signal_triggered设为true,后续K线即使收盘价仍高于cross_high也不会再标记。
内容的提问来源于stack exchange,提问作者TylerM
相关产品推荐
相关产品推荐

