在编写 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_bar | K 线合成完毕 | 核心逻辑区:计算指标、判断信号、发单 |
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
| |
2.3 底层逻辑解析
该模板在 on_tick 或 on_bar 结束时,会调用 trade() 函数:
- 撤销所有未成交的活动委托(防止挂单冲突)。
- 计算
target_pos与self.pos的差值。 - 根据差值自动发出对应的
buy/sell/short/cover指令。
这极大地简化了多信号组合策略的开发难度。