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

如何结合BB交叉与MACD交叉策略?需检测BB交叉后MACD交叉的情况

解决BB交叉后触发MACD交叉的策略检测问题

核心思路是先标记BB交叉的发生时刻,然后在后续指定数量的K线内监测对应方向的MACD交叉,避免只识别同K线的同步信号。以下是具体实现方案:

关键步骤

  • 先独立计算BB和MACD的交叉信号
  • 用持久化变量记录BB交叉的方向(做多/做空)及监测状态
  • 在BB交叉后的N根K线内,检测MACD是否出现匹配方向的交叉,触发交易信号

Pine Script 实现示例(TradingView 适用)

//@version=5
strategy("BB After MACD Cross Strategy", overlay=true, default_qty_type=strategy.cash, default_qty_value=10000, commission_type=strategy.commission.percent, commission_value=0.1)

// 计算布林带交叉信号
length = input.int(20, title="BB周期")
mult = input.float(2.0, title="BB标准差倍数")
src = close
basis = ta.sma(src, length)
dev = mult * ta.stdev(src, length)
upper = basis + dev
lower = basis - dev

bb_long_cross = ta.crossover(src, lower)  // 价格上穿布林下轨=做多交叉
bb_short_cross = ta.crossunder(src, upper) // 价格下穿布林上轨=做空交叉

// 计算MACD交叉信号
fast_length = input.int(12, title="MACD快线周期")
slow_length = input.int(26, title="MACD慢线周期")
signal_length = input.int(9, title="MACD信号线周期")
macd_line = ta.ema(src, fast_length) - ta.ema(src, slow_length)
signal_line = ta.ema(macd_line, signal_length)

macd_gold_cross = ta.crossover(macd_line, signal_line) // MACD金叉
macd_death_cross = ta.crossunder(macd_line, signal_line) // MACD死叉

// 记录BB交叉后的监测状态与计数器
var bool in_bb_long_monitor = false
var bool in_bb_short_monitor = false
var int monitor_count = 0
max_monitor_bars = input.int(10, title="BB交叉后最大监测K线数")

// 更新监测状态:触发BB交叉时开启对应方向的监测
if bb_long_cross
    in_bb_long_monitor := true
    in_bb_short_monitor := false
    monitor_count := 0
if bb_short_cross
    in_bb_short_monitor := true
    in_bb_long_monitor := false
    monitor_count := 0

// 计数器递增,超过监测时长则重置状态
if in_bb_long_monitor or in_bb_short_monitor
    monitor_count := monitor_count + 1
    if monitor_count > max_monitor_bars
        in_bb_long_monitor := false
        in_bb_short_monitor := false

// 触发交易信号:BB做多交叉后出现MACD金叉 / BB做空交叉后出现MACD死叉
if in_bb_long_monitor and macd_gold_cross
    strategy.entry("多单", strategy.long)
    in_bb_long_monitor := false // 触发后关闭监测,避免重复信号
if in_bb_short_monitor and macd_death_cross
    strategy.entry("空单", strategy.short)
    in_bb_short_monitor := false

// 绘图辅助
plot(basis, color=color.blue, title="布林中轨")
plot(upper, color=color.red, title="布林上轨")
plot(lower, color=color.green, title="布林下轨")
plot(macd_line, color=color.orange, title="MACD线")
plot(signal_line, color=color.purple, title="信号线")

代码要点说明

  • 用var关键字定义的变量会在整个回测周期内保持值,不会每根K线重置,用来记录监测状态
  • max_monitor_bars参数可以自定义,控制BB交叉后多久内的MACD交叉有效,过滤太久远的信号
  • 触发MACD交叉后立即关闭监测,避免同一BB交叉触发多次交易

Python Pandas 实现思路(本地回测适用)

  1. 先计算BB和MACD的交叉信号,生成bb_cross(1=做多交叉,-1=做空交叉,0=无)和macd_cross(1=金叉,-1=死叉,0=无)两列
  2. 遍历数据,用变量记录最近一次非0的bb_cross值及对应的K线索引
  3. 对每一行,检查当前macd_cross是否与最近的bb_cross方向一致,且当前K线与BB交叉K线的距离不超过设定值,符合则标记为有效信号

内容的提问来源于stack exchange,提问作者وليد الأشهب

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 20:44:57