在进行价差交易(套利)开发前,必须理解 vnpy_spreadtrading.template 提供的基础框架。与 CTA 策略不同,价差交易涉及多条腿(Legs)的同步操作,因此引入了“算法执行”的概念。
1. SpreadStrategyTemplate:策略的大脑
所有价差策略都继承自 SpreadStrategyTemplate。
1.1 核心回调函数
| 回调函数 | 触发时机 | 典型用途 |
|---|---|---|
on_init | 策略初始化 | 初始化变量,加载历史数据 |
on_start | 策略启动 | 标记状态 |
on_spread_data | 价差行情更新 | 核心逻辑区:判断价差是否满足开平仓条件 |
on_spread_pos | 价差持仓更新 | 监听持仓变化,决定下一步动作 |
on_spread_algo | 算法状态更新 | 监听算法执行进度(如算法完成、停止) |
1.2 算法启动接口
价差交易不直接发单(不调用 buy/sell),而是启动一个算法 (Algo) 来负责执行。
这是因为买入一个价差通常意味着“买入腿A + 卖出腿B”,必须保证原子性或滑点控制。
买入价差 (Long Spread):
1self.start_long_algo(price, volume, payup, interval, lock)price: 价差限价volume: 数量payup: 超价跳数(用于保证成交)interval: 撤单重发间隔lock: 是否锁仓(针对上期所)
卖出价差 (Short Spread):
1self.start_short_algo(price, volume, payup, interval, lock)
1.3 停止算法
stop_algo(algoid): 停止特定算法stop_all_algos(): 停止所有正在运行的算法
2. SpreadAlgoTemplate:执行的手脚
策略只负责“决定要做什么”,而 SpreadAlgoTemplate 负责“具体怎么做”。
2.1 默认算法逻辑
VN.PY 默认提供的算法逻辑通常是 Sniper(狙击) 或 Maker/Taker 模式的变种。 通常流程:
- 检查主动腿(Active Leg)是否有盘口满足价格条件。
- 发出主动腿委托。
- 主动腿成交后,立即发出被动腿(Passive Leg)的对冲委托(Hedge)。
- 循环直到目标数量全部成交。
2.2 关键参数
payup(超价): 为了保证被动腿能迅速成交,通常会以对手价 + N跳的价格发单。interval(间隔): 如果委托未成交,隔多久撤单重发。
3. 数据获取
get_spread_tick(): 获取价差的合成 Tick(买一价、卖一价等)。get_spread_pos(): 获取当前价差的净持仓。get_leg_tick(vt_symbol): 获取单腿的原始 Tick。