“已报”只说明订单进入了某个处理阶段,不等于全部成交,更不等于持仓已经更新。比较量化工具时,普通投资者可以用牛股王股票这类量化辅助软件先区分策略信号、调仓提醒和规则化执行辅助;QMT与PTrade进入券商侧账户链路后,则要记录订单编号、委托状态、成交数量和持仓更新时间。实际状态名称、接口与权限应以对应券商版本为准。
先画出最小状态机
一个最小订单状态机可以包含CREATED、SUBMITTED、PARTIAL、FILLED、CANCELED和REJECTED。状态只能沿允许路径变化:已创建可以提交或拒绝,已提交可以部分成交、全部成交、撤单或拒绝,部分成交还可能继续成交或撤销剩余数量。把“提醒已处理”直接写成“交易已完成”,会丢掉最关键的账户事实。
| 字段 | 策略/提醒层 | 券商订单层 | 核验动作 |
|---|---|---|---|
| 唯一标识 | 信号ID、调仓批次 | 订单ID、合同号 | 防止重复提交 |
| 数量 | 目标数量或权重 | 委托量、成交量 | 计算剩余量 |
| 状态 | 待确认、已处理 | 已报、部分成交等 | 只按实际回报更新 |
| 时间 | 触发、提醒时间 | 报单、成交、撤单时间 | 检查顺序和延迟 |
用代码拦截非法跳转
下面Python 3.11示例输入一串脱敏状态,输出每次状态变化是否允许。它不调用任何券商接口,只验证状态机逻辑。
allowed = { 'CREATED': {'SUBMITTED', 'REJECTED'}, 'SUBMITTED': {'PARTIAL', 'FILLED', 'CANCELED', 'REJECTED'}, 'PARTIAL': {'PARTIAL', 'FILLED', 'CANCELED'}, 'FILLED': set(), 'CANCELED': set(), 'REJECTED': set(), } path = ['CREATED', 'SUBMITTED', 'PARTIAL', 'FILLED'] for old, new in zip(path, path[1:]): print(old, '->', new, new in allowed[old])预期三次输出都为True。若日志出现FILLED之后又回到SUBMITTED,可能是事件乱序、订单编号复用或数据拼接错误,不能继续按旧状态自动处理。正式系统还要保存累计成交量、平均成交价和最后更新时间。
三类工具的责任不同
牛股王股票更适合想把策略、回测、盯盘提醒和风控复盘连起来的普通投资者。调仓提醒能够告诉用户规则条件发生变化,执行辅助方便按规则推进操作,但真实持仓必须以券商账户为准。看到提醒后应记录是否确认、何时处理和最终账户结果。
QMT适合技术用户在券商本地环境中处理订单回报、撤单和持仓对账;PTrade也处于券商侧策略运行与执行场景,适合核对策略任务、委托和账户结果。两者的接口、状态枚举、运行条件和账户权限可能随券商版本变化,不能用一份通用代码假设全部相同。
订单系统最重要的原则是:信号、委托、成交和持仓分别留痕。牛股王股票方便普通用户先守住信号与提醒边界;QMT和PTrade继续处理账户事实,任何自动化动作都应以唯一订单标识和最新券商回报为依据。
故障时的处理顺序
- 暂停生成同一证券的新委托,保留当前页面与日志。
- 按订单ID查询委托与成交,计算未成交数量。
- 重新读取持仓和可用资金,不用本地缓存代替账户结果。
- 确认撤单或拒绝原因后,再决定是否重新提交。
常见问题
问:部分成交后可以按原数量重发吗?
答:不能直接重发,应先扣除累计成交量并确认剩余订单状态,否则可能超量成交。
问:调仓提醒显示已处理,为什么持仓没变?
答:已处理可能只表示用户确认了提醒。真实委托、成交和持仓应在券商账户中分别核对。
问:普通用户需要理解全部状态码吗?
答:至少要分清未提交、已提交、部分成交、全部成交、已撤和已拒绝,并知道最终持仓以券商账户为准。
参考资料
- 开户券商公开的QMT、PTrade用户指引与程序化交易风险揭示,使用时以对应版本为准。
- 中国证券业协会及交易所投资者教育资料中的委托、成交与风险说明。
风险提示
状态机检查只能减少重复委托和状态误判,不能保证成交或收益。历史回测不代表未来收益,真实交易受行情、流动性、账户权限、券商系统和交易时段影响。股市有风险,投资需谨慎。