DAS 订单、成交与保护单是不同状态
读懂确认、部分成交和关联订单之间的时序。
沿着外部证据看状态
脚本可以提出动作请求,后续状态由平台与券商决定。把“请求已创建、已观察到确认、已观察到成交数量、已观察到保护订单”作为不同检查点。本地成功提示不能同时证明这四件事。
推演一次部分成交
假设模拟订单请求 120 股,报告已成交 45 股,那么该订单剩余 75 股。这道减法不能证明账户总持仓是多少,因为可能还有原持仓或其他订单。
| 观察 | 能证明什么 | 不能证明什么 |
|---|---|---|
| 输入字段已填好 | 意图已加载 | 已提交 |
| 订单记录已接受 | 请求已接受 | 完全成交 |
| 已成交量为 45 | 报告了这部分执行数量 | 没有其他敞口 |
| 已请求撤单 | 撤单请求已发起 | 剩余数量已撤销 |
| 出现后续订单 | 存在后续单 | 数量、关联、接受状态正确 |
Trigger 与 OCO 关系
DAS 文档把 Trigger Order 描述为主订单执行后发送的后续订单。向导先构造后续部分,再加入主订单部分。完全成交的要求要对照适用的 Trigger 文档,并在当前 build 单独验证部分成交情形。
OCO 通过撤销行为关联两笔订单。两笔独立订单不会因为写在一起就自动成为 OCO。核对关联关系和券商确认,不凭两行脚本推断保护已经成立。
动手练习:写一份观察日志
为模拟测试记录订单标识、请求量、已成交量、剩余量、确认和时间戳。覆盖部分成交、拒单、撤单等待、后续单缺失。写清观察到什么就停止并交给人工。这是生命周期测试设计,不是可执行下单配方。
逐字段阅读 WithTrigger
官方 Trigger Order Guide 给出了 WithTrigger 写法,并说明该关系在主单完全成交后触发次单。下面使用假定价格展示字段结构。只用于阅读:所有命令都已注释,没有可提交的执行路径。 实际模板必须由目标 build、模拟账户和路由共同验证。
// ROUTE=LIMIT;
// Price=195;
// Share=30;
// TIF=DAY+;
// WithTrigger=RT:LIMIT PX:200 ACT:SELL QTY:POS TIF:DAY+;
// BUY=Send;
| 字段 | 在这段结构中的角色 |
|---|---|
| 前四行 | 主单路由、价格、数量与有效期 |
RT:LIMIT |
次单路由 |
PX:200 |
次单价格 |
ACT:SELL |
次单方向 |
QTY:POS |
基于持仓数量,不等于固定的主单 Share |
次单 TIF:DAY+ |
次单自己的有效期 |
BUY=Send |
提交主单及其所附关系的动作 |
注意次单子字段用冒号,主单字段赋值用等号。账户与股票仍来自 Montage 上下文。这是特定官方示例的阅读,不是对所有订单种类通用的语法推导。TriggerOrder 作为概念或其他模板中的词,也不能凭相似性直接替换 WithTrigger。
POS 与部分成交的数量陷阱
假设先前已有 20 股,主单再申请 30 股。QTY:POS 不是字面量 30;它涉及触发时持仓语义。先把 0 原持仓和非零原持仓分成不同测试,再验证主单部分成交时是否出现次单、完全成交时数量是什么。若主单尚未完全成交,不能把“写了 WithTrigger”当作已有覆盖。
创建 OCO 关系与核对关系
官方提供两种界面路径:Montage 的 OCO 样式中勾选 OCO 关联;或在 Orders 中选择已有订单后使用 Create OCO。只输入两张票据而未建立关系,仍可能是两张独立订单。Hotkey Wizard 的 Order Cancel Order 分类可生成对应模板;这里不编造未核对的 OCO 字段。
测试记录分别列出两个订单身份、关联证据、哪一侧发生了事件、另一侧收到的取消回报。取消请求发出后仍可能发生竞态成交。OCO 的名称不能代替接受与最终状态核对。
练习解答
120 请求、45 已成交时,未成交部分的算术值为 75。取消请求后不应立即把它写成零;只有对应取消或其他终态证据才能更新分类。接到拒绝时,先查明拒绝的具体请求,再决定下一步,不能重放整段含主单提交的脚本。