源码文件:vnpy_ctastrategy.strategies.multi_signal_strategy

1. 策略概述

MultiSignalStrategy 是一个典型的“投票型”策略。它不依赖单一指标,而是同时计算 RSICCIMA 三个指标的信号,将它们的建议仓位叠加,最终得出目标仓位。

  • 基类TargetPosTemplate (目标仓位模板)
  • 适用场景:趋势跟踪与震荡过滤结合
  • 核心逻辑Target Pos = Signal_RSI + Signal_CCI + Signal_MA

2. 指标逻辑拆解

策略内部定义了三个子信号类(Signal),分别处理不同逻辑:

2.1 RSI 信号 (相对强弱指标)

  • 逻辑
    • RSI > 阈值(如 70):超买区,可能看多或看空(视策略定义,通常趋势策略会认为突破向上)。
    • RSI < 阈值(如 30):超卖区。
  • 代码片段
    1
    
    self.signal_pos["rsi"] = self.rsi_signal.get_signal_pos()
    

2.2 CCI 信号 (顺势指标)

  • 逻辑:CCI 用于捕捉趋势爆发。
  • 代码片段
    1
    
    self.signal_pos["cci"] = self.cci_signal.get_signal_pos()
    

2.3 MA 信号 (移动平均线)

  • 逻辑:通常使用双均线(快线/慢线)交叉判断趋势。
    • 快线 > 慢线:金叉,看多。
    • 快线 < 慢线:死叉,看空。

3. 核心执行逻辑:calculate_target_pos

这是该策略最精彩的部分。它没有复杂的 if-else 嵌套,而是简单的算术叠加

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
def calculate_target_pos(self) -> None:
    """"""
    # 1. 获取各个子信号的建议仓位
    self.signal_pos["rsi"] = self.rsi_signal.get_signal_pos()
    self.signal_pos["cci"] = self.cci_signal.get_signal_pos()
    self.signal_pos["ma"] = self.ma_signal.get_signal_pos()

    # 2. 累加计算总目标仓位
    target_pos = 0
    for v in self.signal_pos.values():
        target_pos += v

    # 3. 调用模板接口执行
    self.set_target_pos(target_pos)

逻辑图解

假设我们设置每个信号满仓为 1 手:

市场情况RSI 信号CCI 信号MA 信号最终目标仓位行为
强劲上涨+1 (多)+1 (多)+1 (多)+3买入 3 手
震荡偏多+1 (多)0 (观望)-1 (空)0空仓 (多空抵消)
趋势反转-1 (空)-1 (空)+1 (多)-1做空 1 手

4. 总结与教学

这种写法的最大优势是解耦。 如果你想增加一个 MACD 信号,只需要:

  1. 写一个 MacdSignal 类。
  2. __init__ 里实例化它。
  3. calculate_target_pos 里加上它的投票权。

这比在一个巨大的 on_bar 函数里写几百行 if 判断要优雅得多,也更容易维护。