源码文件:vnpy_ctastrategy.strategies.multi_timeframe_strategy

1. 策略概述

MultiTimeframeStrategy 展示了如何在 CTA 策略中同时处理两个不同频率的时间序列。 通常策略只关注单一 K 线周期(如 15 分钟),但本策略同时订阅并合成:

  1. 15 分钟 K 线:用于判断大趋势(Trend)。
  2. 5 分钟 K 线:用于寻找具体的入场点(Timing)。

这种“大周期定方向,小周期找买点”的方法是手工交易中非常经典的多周期共振思路。

  • 基类CtaTemplate
  • 核心机制:双 BarGenerator (5m + 15m)
  • 核心指标:MA (趋势), RSI (择时)

2. 核心参数

参数名默认值含义
rsi_window14RSI 计算周期 (基于 5 分钟)
rsi_signal20RSI 阈值偏移 (50 ± 20)
fast_window5快线周期 (基于 15 分钟)
slow_window20慢线周期 (基于 15 分钟)

3. 策略逻辑详解

3.1 双周期 K 线合成

策略在 on_init 中初始化了两个 K 线生成器:

1
2
self.bg5 = BarGenerator(self.on_bar, 5, self.on_5min_bar)
self.bg15 = BarGenerator(self.on_bar, 15, self.on_15min_bar)

on_bar (1分钟) 回调中,同时推送数据给两者:

1
2
3
def on_bar(self, bar: BarData) -> None:
    self.bg5.update_bar(bar)
    self.bg15.update_bar(bar)

这样,on_5min_baron_15min_bar 就会各自独立触发。

3.2 大周期:15 分钟定趋势

on_15min_bar 中,计算双均线交叉,确定 ma_trend 状态。

  • 多头趋势 (ma_trend = 1):快线 > 慢线
  • 空头趋势 (ma_trend = -1):快线 < 慢线
1
2
3
4
if self.fast_ma > self.slow_ma:
    self.ma_trend = 1
else:
    self.ma_trend = -1

3.3 小周期:5 分钟 RSI 择时交易

on_5min_bar 中,结合大周期趋势和当前 RSI 值进行交易。

  • 做多条件

    1. 15分钟是大趋势多头 (ma_trend > 0)
    2. 5分钟 RSI 突破高位 (rsi_value >= 70) —— 注:这里是顺势突破逻辑,而非超买回调
    1
    2
    
    if self.ma_trend > 0 and self.rsi_value >= self.rsi_long:
        self.buy(bar.close_price + 5, self.fixed_size)
    
  • 做空条件

    1. 15分钟是大趋势空头 (ma_trend < 0)
    2. 5分钟 RSI 跌破低位 (rsi_value <= 30)
    1
    2
    
    elif self.ma_trend < 0 and self.rsi_value <= self.rsi_short:
        self.short(bar.close_price - 5, self.fixed_size)
    

3.4 出场逻辑

出场条件相对宽松,只要趋势反转或 RSI 回归中轴即可平仓。

  • 平多:15分钟转空 OR 5分钟 RSI < 50
  • 平空:15分钟转多 OR 5分钟 RSI > 50

4. 总结

MultiTimeframeStrategy 的核心价值在于代码结构: 它演示了如何在一个策略类里优雅地管理多个时间周期的状态。

  • bg5 负责战术(Tactical)
  • bg15 负责战略(Strategic) 这种模式可以扩展到更复杂的场景,例如“日线 MACD 背离 + 5分钟 KDJ 金叉”。