订单改撤与订单规则#
改单行为#
用户可通过订单 ID(oid)或客户订单 ID(clientOrderId)定位并修改已提交订单。
oid与clientOrderId仅用于定位目标订单,应二选一提供。- 不可通过改单修改
oid或clientOrderId。 - 若改单携带
orderType,必须完整传入对应子结构;不支持仅传入内部字段。 - 省略
orderType表示不修改订单类型及触发参数。
改单范围与限制#
普通限价单
- 仅可修改
price和size。 - 不可转换为 Trigger 或 TPSL 订单。
- 不可修改
tif或expiresAfter。
独立 Trigger 订单
| 订单类型 | 可修改字段 | 可切换类型 |
|---|---|---|
| Trigger Market | Trigger Price、Order Amount、Trigger Price Type | 可切换为 Trigger Limit;切换时必须提供有效的 Order Price。 |
| Trigger Limit | Trigger Price、Order Price、Order Amount、Trigger Price Type | 可切换为 Trigger Market;切换后不再使用触发后的限价。 |
Trigger Price Type 可在 Index Price 与 Mark Price 间切换。
Order-Attached TPSL#
子单生效前
| 子单类型 | 可修改字段 | 可切换类型 |
|---|---|---|
| TP 或 SL Trigger Market | Trigger Price | TP 可切换为 TP Limit、TP Trigger Market 或 TP Trigger Limit;SL 可在 SL Trigger Market 与 SL Trigger Limit 间切换。 |
| TP 或 SL Trigger Limit | Trigger Price、Order Price | 同上。 |
| TP Limit | Order Price | TP 可切换为 TP Trigger Market 或 TP Trigger Limit。 |
- Trigger 类型的 Trigger Price Type 可在 Index Price 与 Mark Price 间切换。
- 尚未生效的 TPSL 子单使用该 TPSL 子单的
oid定位。
子单生效后
| 子单类型 | 可修改字段 | 可切换类型 |
|---|---|---|
| TP 或 SL Trigger Market | Trigger Price、Order Amount | TP Trigger Market 与 TP Trigger Limit 可互相切换;SL Trigger Market 与 SL Trigger Limit 可互相切换。 |
| TP 或 SL Trigger Limit | Trigger Price、Order Price、Order Amount | 同上。 |
| TP Limit | Order Price、Order Amount | 不可切换订单类型。 |
- 子单转换为真实挂单后,应使用真实挂单的
oid改单。 - Trigger 类型的 Trigger Price Type 可在 Index Price 与 Mark Price 间切换。
Position-Attached TPSL#
全仓持仓
针对指定持仓的全部剩余数量设置 TPSL。触发时按当时实际剩余持仓执行平仓,因此不支持指定或修改 Order Amount。
- 仅支持 Trigger Market。
- 可修改 Trigger Price。
- Trigger Price Type 可在 Index Price 与 Mark Price 间切换。
- 不可修改 Order Amount。
- 不可切换为 Trigger Limit 或 TP Limit。
部分持仓
| 订单类型 | 可修改字段 | 可切换类型 |
|---|---|---|
| Trigger Market | Trigger Price、Order Amount | 可切换为 Trigger Limit。 |
| Trigger Limit | Trigger Price、Order Price、Order Amount | 可切换为 Trigger Market。 |
| TP Limit | Order Price、Order Amount | 不可切换订单类型。 |
- Position TP Limit 会立即转换为真实的 Reduce-Only GTC Limit 订单。
- 修改 Position TP Limit 时,应使用
children[0]对应的真实挂单oid。 - Partial Position Trigger 的 Trigger Price Type 是否可在 Index Price 与 Mark Price 间切换,当前规则未定义,须由交易及链上研发确认。
不可修改字段#
以下字段不可通过改单修改:
assetIdsidemarketType,包括marginMode和positionSidereduceOnlysizeTypetifexpiresAfterclientOrderIdgrouping
如需修改以上业务属性,必须先撤单,再重新下单。
其他改单限制#
- Prediction Market 不支持修改 Trigger 订单。
- IOC 和 FOK 订单不会持续挂在订单簿中,因此不可改单。
改单校验与撮合优先级#
| 改动参数 | 场景 | 是否需要重新校验 | 是否重新排序 | 规则 |
|---|---|---|---|---|
| 价格 | 修改为不同的订单价格 | 是。可能涉及订单限制、价格或仓位价值、冻结保证金及杠杆可开仓位价值校验。 | 是 | 无论改高或改低,订单均移至新价格队列尾部。 |
| 数量 | 改大 | 是。可能需要增加冻结保证金。 | 是 | 整张修改后的订单视为新订单,排至当前价格队列尾部。 |
| 数量 | 改少 | 是。仍须通过适用的订单限制校验。 | 否 | 保留原排队优先级。 |
已成交量继承与改单失败#
- 改单成功后,修改后的订单继承原订单的累计已成交量。
- 成功改单在业务语义上等同于取消原订单并创建修改后的新订单。
- 示例:
orderSize=10、accFillSz=4;改大至orderSize=15后,结果为orderSize=15、accFillSz=4。 - 若新
size小于或等于accFillSz,系统将有效委托总量调整为accFillSz,使剩余委托量归零,订单状态为part_filled_canceled。 - 改单校验失败时,原订单保持原有状态,不会先被取消。
Reduce-Only 订单改撤逻辑#
Reduce-Only(只减仓)是订单属性。设置 reduceOnly=true 后,订单只能减少既有持仓,不得增加持仓或反向开仓。
- 普通 Limit 订单和独立 Trigger 订单支持设置
reduceOnly=true。 - Trigger 触发后生成的执行订单仍须遵守只减仓限制。
- Position-Attached TPSL 只能减少对应持仓。
- Order-Attached TPSL 仅适用于
reduceOnly=false的 Market、Limit 或 Trigger 母单。 reduceOnly=true的母单不得携带 Order-Attached TPSL;该请求应整体拒绝,不得自动转换为 Position-Attached TPSL。- 同一持仓允许多张 Reduce-Only 订单同时存在。
下单与改单校验#
- 对应持仓必须存在。
- 订单方向必须与持仓方向相反。
- 不进行新增开仓保证金校验,但仍须通过账户状态、产品状态、价格、数量、精度及订单数量限制等一般校验。
reduceOnly属性不可通过改单修改;如需变更,必须撤单后重新下单。- 改价、改大或改少时,仍遵守一般改单的撮合排队优先级规则。
超量修剪规则#
- 系统按同一账户下的
assetId + marginMode + side维度计算 Reduce-Only 订单的剩余委托总量。 - Hedge 模式下,多仓与空仓分别计算,
side必须对应被减少的positionSide。 - 若总剩余委托量不超过对应持仓量,订单正常保留。
- 下单或改单后,若总剩余委托量超过持仓量,系统按
orderCreateTime从早到晚进行 FIFO 修剪:- 从最早建立的既有 Reduce-Only 订单开始减量。
- 若订单剩余量不大于待修剪量,则撤销该订单。
- 否则,仅减少该订单的相应数量。
- 持续处理,直至总剩余委托量不超过持仓量。
- 成交、清算、ADL、结算或其他事件导致持仓缩小时,系统重新执行相同检查与 FIFO 修剪。
- 修剪仅影响超出持仓量的部分,不得使订单产生反向开仓。
交易执行顺序与 Nonce 失效机制#
-
交易按 Sequencer 接收顺序进入区块。同一区块内按以下优先级执行:
- Noop
- Post-Only 下单,或改单为 Post-Only
- 撤单
- 其他操作
-
同一优先级内维持 Sequencer 接收的原始顺序。
-
Noop 不会跨区块回溯,也不能撤销已完成或已消耗 nonce 的 action。
