如何在Pine Script中编写条件序列并检测MACD特定交叉信号
Pine Script 实现A-B-A或B-A-B的MACD穿0序列信号
核心逻辑定义
先明确触发条件与序列规则:
- A:MACD线上穿0轴(
ta.crossover(macdLine, 0)) - B:MACD线下穿0轴(
ta.crossunder(macdLine, 0)) - 有效序列:连续触发
A→B→A或B→A→B,中间不得出现额外的A/B动作(即两次触发必须是反向,不能重复同向动作)
实现思路:状态机追踪
用var变量持久化序列状态,逐bar更新状态,触发有效序列时绘制标记:
- 状态0:初始/重置状态(无有效序列启动)
- 状态1:已触发A,等待B
- 状态2:已触发
A→B,等待A(满足A-B-A的前置条件) - 状态3:已触发B,等待A
- 状态4:已触发
B→A,等待B(满足B-A-B的前置条件)
完整代码示例
//@version=5 indicator("MACD 0轴交叉序列信号", overlay=true, shorttitle="MACD Seq Sig") // 标准MACD计算 fastLength = input.int(12, title="Fast Length") slowLength = input.int(26, title="Slow Length") signalLength = input.int(9, title="Signal Length") src = input(close, title="Source") macdLine = ta.ema(src, fastLength) - ta.ema(src, slowLength) signalLine = ta.ema(macdLine, signalLength) histogram = macdLine - signalLine // 定义A/B触发条件 conditionA = ta.crossover(macdLine, 0) // 上穿0轴 = A conditionB = ta.crossunder(macdLine, 0) // 下穿0轴 = B // 状态机变量:用var持久化状态,避免逐bar重置 var int sequenceState = 0 // 0=初始,1=A后等B,2=A→B后等A,3=B后等A,4=B→A后等B // 更新状态逻辑 if conditionA switch sequenceState 0 => sequenceState := 1 // 初始状态触发A,进入等待B 2 => sequenceState := 0 // 完成A→B→A序列,重置状态 3 => sequenceState := 4 // B后等待A,触发A进入B→A等待B 1,4 => sequenceState := 0 // 重复触发A或错误触发A,重置状态 elif conditionB switch sequenceState 0 => sequenceState := 3 // 初始状态触发B,进入等待A 4 => sequenceState := 0 // 完成B→A→B序列,重置状态 1 => sequenceState := 2 // A后等待B,触发B进入A→B等待A 2,3 => sequenceState := 0 // 重复触发B或错误触发B,重置状态 else // 自定义灰色重置逻辑:连续20bar无A/B触发则重置状态,可按需修改 if ta.barssince(conditionA or conditionB) > 20 sequenceState := 0 // 定义有效信号触发条件 signalABACond = sequenceState == 2 and conditionA // A→B→A序列完成 signalBABCond = sequenceState == 4 and conditionB // B→A→B序列完成 // 绘制信号标记 plotshape(signalABACond, title="A-B-A Signal", location=location.belowbar, color=color.green, style=shape.labelup, text="A-B-A", textcolor=color.white, size=size.small) plotshape(signalBABCond, title="B-A-B Signal", location=location.abovebar, color=color.red, style=shape.labeldown, text="B-A-B", textcolor=color.white, size=size.small) // 可选:绘制MACD线与0轴参考线 plot(macdLine, color=color.blue, title="MACD Line") plot(signalLine, color=color.orange, title="Signal Line") hline(0, "Zero Line", color=color.gray, linestyle=hline.style_dashed)
关键细节说明
var关键字确保状态变量在bar之间持久化,不会每次bar都重置- 状态切换逻辑严格过滤中间额外交叉:比如已触发A后再次触发A,直接重置状态,避免无效序列
- 灰色重置逻辑可自定义:示例用连续20bar无交叉作为重置条件,可替换为用户自己的触发规则(如价格突破均线、柱状线颜色连续不变等)
- 信号标记分别放在下bar(A-B-A)和上bar(B-A-B),便于直观区分
内容的提问来源于stack exchange,提问作者xela_alex
相关产品推荐
相关产品推荐

