如何结合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 实现思路(本地回测适用)
- 先计算BB和MACD的交叉信号,生成
bb_cross(1=做多交叉,-1=做空交叉,0=无)和macd_cross(1=金叉,-1=死叉,0=无)两列 - 遍历数据,用变量记录最近一次非0的
bb_cross值及对应的K线索引 - 对每一行,检查当前
macd_cross是否与最近的bb_cross方向一致,且当前K线与BB交叉K线的距离不超过设定值,符合则标记为有效信号
内容的提问来源于stack exchange,提问作者وليد الأشهب
相关产品推荐
相关产品推荐

