在编写 CTA 策略前,必须理解 vnpy_ctastrategy.template 提供的基础框架。本文将拆解核心接口。

1. CtaTemplate:策略的灵魂

所有 CTA 策略都继承自 CtaTemplate

1.1 生命周期回调

策略在不同阶段会自动触发以下函数,你需要重写它们来实现逻辑:

回调函数触发时机典型用途
on_init策略初始化时加载历史数据 (self.load_bar(10)),初始化指标
on_start策略启动时标记状态,打印日志
on_tick收到 Tick 数据高频逻辑,或合成 K 线 (bg.update_tick(tick))
on_barK 线合成完毕核心逻辑区:计算指标、判断信号、发单
on_order委托状态变化追踪订单状态(未成交/部分成交/全成/撤单)
on_trade成交推送更新持仓均价,记录交易日志

1.2 交易指令(原始接口)

CtaTemplate 中,发单函数是“方向”与“开平”的组合:

  • 买入开仓 (Long): self.buy(price, volume)
  • 卖出平仓 (Sell): self.sell(price, volume)
  • 卖出开仓 (Short): self.short(price, volume)
  • 买入平仓 (Cover): self.cover(price, volume)

注意:只有当 self.trading = True 时(即策略启动后),这些函数才会真正发出委托,否则只会返回空列表。


2. TargetPosTemplate:目标仓位管理

对于复杂的组合策略,手动管理开平仓极其繁琐(需要判断当前持仓是多还是空,是平仓还是反手)。 TargetPosTemplate 解决了这个问题。

2.1 核心思想

你只需要告诉策略:“我现在想要持有多少手”

  • 想做多 5 手:target_pos = 5
  • 想空仓:target_pos = 0
  • 想做空 3 手:target_pos = -3

2.2 核心函数:set_target_pos

1
2
3
4
def set_target_pos(self, target_pos: int):
    # 模板会自动计算差额,并执行下单
    # 例如:当前持仓 2,目标 5 -> 自动买入 3
    # 例如:当前持仓 2,目标 -2 -> 自动卖平 2 + 卖开 2

2.3 底层逻辑解析

该模板在 on_tickon_bar 结束时,会调用 trade() 函数:

  1. 撤销所有未成交的活动委托(防止挂单冲突)。
  2. 计算 target_posself.pos 的差值。
  3. 根据差值自动发出对应的 buy/sell/short/cover 指令。

这极大地简化了多信号组合策略的开发难度。