11.4 订单管理:从信号到成交的生命周期
课前导读
学习目标
你将学会:把一笔下单看成有起点、有中途变化、有终点的生命周期,而不是一次简单点击。
适合谁读:已经理解实盘系统由数据、信号、风控、执行、监控组成,但还不清楚订单在系统里如何流转的学习者。
难度:advanced
预计用时:约 40 分钟
如果把实盘系统比作一家餐厅,策略信号只是顾客说“我想点一份饭”。
真正让这份饭送到桌上的,是点单小票、前台确认、后厨制作、服务员送餐、顾客签收这整条流程。
在量化交易里,这张“小票”就是订单。
订单管理做得好,小错误会被挡在流程里。
订单管理做得差,一个网络抖动、一条重复信号、一次状态误判,都可能变成真实亏损。
本节不讲真实券商接口连接,也不提供可直接实盘下单的实现。
我们只学习专业系统必须具备的订单生命周期思维。
知识正文
1. 类比:订单像一张必须全程盖章的快递单
想象你寄出一台相机。
你先填写快递单。
快递员检查地址是否完整。
包裹进入网点。
运输途中可能只到达了中转站。
收件人可能签收。
也可能因为地址错误被退回。
如果你看不到每个节点,只知道“我寄出去了”,就很难判断包裹到底在哪里。
交易订单也是如此。
策略说“买入”并不等于已经成交。
系统说“提交”也不等于市场已经接受。
行情里看到价格合适,也不等于你的订单一定排到了队伍前面。
所以专业系统会把订单拆成一连串状态。
每个状态都要被记录、被确认、被允许或被拒绝。
2. 从生活语言进入术语
订单意图:策略想做什么,例如“买入某只股票 2000 股”。
它像顾客的点餐想法,还不是正式小票。
订单请求:经过初步整理后的下单内容,例如股票代码、方向、数量、价格类型。
它像已经写好的快递单,可以交给检查员。
风控通过:下单前检查确认没有明显违规。
它不是保证赚钱,只是确认这笔交易没有违反系统规则。
提交:订单被送到交易通道。
这里仍然不能假设成交,因为交易所队列、价格、数量都会影响结果。
部分成交:订单只成交了一部分。
例如想买 2000 股,实际只买到 800 股。
全部成交:订单目标数量全部成交。
这才代表该订单的交易数量完成。
撤单:对未成交部分发出取消请求。
撤单也可能失败,因为未成交部分可能刚刚成交。
失败或拒绝:订单没有进入可成交流程,可能是参数错误、价格不合规、资金不足或系统规则阻止。
3. 订单生命周期的状态机直觉
“状态机”听起来像计算机术语,其实很像地铁闸机。
你刷卡前是“未进站”。
刷卡成功后是“已进站”。
出站成功后是“已出站”。
你不能从“未进站”直接变成“已出站”。
订单也不应从“刚生成”直接被当成“已成交”。
下面是一张简化状态图。
stateDiagram-v2
[*] --> 已生成: 策略产生订单意图
已生成 --> 风控通过: 检查价格数量资金
已生成 --> 已拒绝: 风控未通过
风控通过 --> 已提交: 送入交易通道
已提交 --> 部分成交: 部分数量成交
已提交 --> 全部成交: 全部数量成交
部分成交 --> 全部成交: 剩余数量继续成交
部分成交 --> 撤单中: 请求取消剩余数量
已提交 --> 撤单中: 请求取消未成交数量
撤单中 --> 已撤单: 取消成功
撤单中 --> 全部成交: 撤单前已全部成交
已提交 --> 失败: 提交异常或被拒
已拒绝 --> [*]
已撤单 --> [*]
全部成交 --> [*]
失败 --> [*]这张图最重要的不是箭头数量。
而是告诉你:每次状态变化都应该有来源、有原因、有时间。
如果系统漏掉“部分成交”,就可能误以为没有持仓。
如果系统漏掉“撤单中”,就可能一边撤单一边又补发新单。
如果系统把“提交超时”直接当成“失败”,就可能重复下单。
4. A 股案例:一次买入不等于一次成交
假设某策略在 10:02 发出信号。
它想买入 600000,数量 2000 股。
这里的代码只是教学示例,不代表投资建议。
系统先生成订单意图。
风控检查可用资金、单票仓位、价格偏离、黑名单、交易时间。
检查通过后,订单被提交。
但市场不是超市货架。
你排队买入时,要看卖方挂单数量和队列位置。
如果当前能成交的数量只有 800 股,你的订单可能先成交 800 股。
此时订单状态是“部分成交”。
系统里的持仓应该增加 800 股,而不是增加 2000 股。
剩余 1200 股如果继续排队,风险敞口还在变化。
如果价格快速上行,策略可能决定撤掉剩余订单。
撤单成功后,这笔订单最终状态是“部分成交后撤单”。
这和“全部失败”完全不同。
投资者角度看,你已经承担了 800 股的涨跌风险。
老师角度看,这是理解实盘与回测差异的关键。
开发角度看,订单表必须同时记录目标数量、已成交数量、剩余数量和最终状态。
5. 幂等:防止“我只点了一次,却买了两次”
幂等是订单管理里特别重要的安全词。
它的生活类比是电梯按钮。
你连续按三次“上楼”,电梯不应该来三台。
交易系统也一样。
同一条策略信号在短时间内被重复处理,系统不应该生成多笔相同订单。
为什么会重复?
可能是网络超时。
可能是程序重启后重新读取了信号。
可能是定时任务在同一分钟跑了两次。
可能是人工误点了“重新执行”。
如果没有幂等保护,系统可能把一次买入意图变成两次买入。
这就是重复下单风险。
专业系统通常会给每笔订单意图生成一个内部编号。
这个编号可以理解为“客户侧订单号”。
它不需要也不应该暴露真实接口细节。
它的作用是让系统知道:“这件事我是否已经处理过”。
概念性伪代码:
如果同一个订单意图编号已经存在:
查看旧订单状态
若旧订单仍在处理中或已成交:
不再生成新订单
若旧订单明确被拒绝且允许重试:
进入人工或风控复核
否则:
创建新订单记录
进入风控检查这段只是帮助理解流程,不是实盘接口实现。
真正的重点是:重试可以有,但必须知道自己在重试什么。
6. 订单表应该记录什么
一个可审计的订单记录,至少要回答六个问题。
| 问题 | 字段示例 | 为什么重要 |
|---|---|---|
| 谁发起 | 策略名称、信号编号 | 区分人工、策略、风控动作 |
| 买什么 | 证券代码、市场、方向 | 防止代码混淆 |
| 买多少 | 目标数量、已成交数量、剩余数量 | 正确计算持仓和风险 |
| 多少钱 | 委托价格、成交均价 | 判断滑点和成交质量 |
| 到哪一步 | 当前状态、最后更新时间 | 防止误判成交或失败 |
| 为什么变 | 状态原因、错误摘要、撤单原因 | 复盘和追责依据 |
不要只记录“买入成功”。
“成功”对投资者来说可能指成交。
对程序来说可能只指提交。
对风控来说可能只指通过检查。
如果词语不精确,事故复盘时就会互相误解。
7. 状态更新的三条底线
第一,状态只能按规则流转。
例如“已撤单”不应再变成“部分成交”,除非你有明确的交易回报解释。
第二,成交数量只能来自可靠回报或人工核对后的记录。
不能因为策略想买 2000 股,就直接把持仓写成 2000 股。
第三,每一次状态改变都要留下时间和原因。
订单系统不是为了显得复杂。
它是在帮你抵御实盘中最常见的混乱:延迟、重复、部分成交、撤单竞态和人工误判。
8. 小错误如何变成大亏损
一个新手常见误区是:只关心策略信号准不准。
专业投资者会多问一句:信号变成订单时有没有走样?
如果买入信号重复触发,仓位可能翻倍。
如果部分成交被当作全部失败,系统可能再次买入。
如果撤单未确认就立刻补单,可能形成超额仓位。
如果失败原因没有记录,下次同样的错误还会发生。
订单管理的价值,就是把这些小裂缝及时暴露出来。
交互实验室
练习 1:给订单贴状态标签
请把下面每个场景对应到最合适的状态。
| 场景 | 你认为的状态 | 关键判断 |
|---|---|---|
| 策略刚产生“买入 1000 股”的想法,还没检查资金 | 已生成 | 还不是正式可提交订单 |
| 风控发现股票在黑名单中 | 已拒绝 | 下单前被阻止 |
| 订单已送出,但没有任何成交回报 | 已提交 | 不能当成成交 |
| 1000 股只成交 300 股 | 部分成交 | 持仓只增加 300 股 |
| 剩余 700 股撤单成功 | 已撤单 | 撤的是剩余未成交数量 |
| 提交后收到参数错误提示 | 失败 | 没有进入正常成交流程 |
练习 2:设计你的订单生命周期检查卡
在纸上或笔记软件里为每笔模拟订单写下这些项目。
- [ ] 订单意图编号是否唯一。
- [ ] 股票代码和方向是否确认。
- [ ] 目标数量、已成交数量、剩余数量是否分开记录。
- [ ] 当前状态是否来自明确事件。
- [ ] 状态更新时间是否存在。
- [ ] 重试前是否检查过旧订单状态。
- [ ] 撤单前是否确认还有未成交数量。
- [ ] 订单结束后是否写明最终原因。
练习 3:判断是否可以重试
阅读下面三个情况,尝试写出你的处理选择。
| 情况 | 是否直接重试 | 建议处理 |
|---|---|---|
| 风控拒绝:可用资金不足 | 否 | 降低数量或停止下单 |
| 网络超时:不知道订单是否提交成功 | 否 | 先查询和核对本地订单状态 |
| 参数填写错误:数量不是规则允许单位 | 否 | 修正订单意图后重新走风控 |
真正的交互不是一定要有按钮。
对实盘系统来说,最重要的交互是你能否在下单前停下来问一句:这笔订单现在到底处于哪一步?
核心复盘
知识清单:
- [ ] 策略信号不等于订单,订单也不等于成交。
- [ ] 订单生命周期包括生成、风控通过、提交、部分成交、全部成交、撤单、失败等状态。
- [ ] 状态机的价值是防止系统从一个状态跳到不合理状态。
- [ ] 部分成交必须改变持仓和风险暴露,不能忽略。
- [ ] 幂等能防止网络重试、程序重启、重复信号带来的重复下单。
- [ ] 每次状态变化都要有时间、原因和来源。
- [ ] 订单管理的核心目标是让每一笔交易“现在在哪里”都说得清楚。
金句总结
实盘里最危险的不是订单失败,而是你以为它失败了,其实它已经成交了一部分。