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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 00:25:28