开发者平台
主题

订单改撤与订单规则#

改单行为#

用户可通过订单 ID(oid)或客户订单 ID(clientOrderId)定位并修改已提交订单。

  • oid 与 clientOrderId 仅用于定位目标订单,应二选一提供。
  • 不可通过改单修改 oid 或 clientOrderId。
  • 若改单携带 orderType,必须完整传入对应子结构;不支持仅传入内部字段。
  • 省略 orderType 表示不修改订单类型及触发参数。

改单范围与限制#

普通限价单

  • 仅可修改 price 和 size。
  • 不可转换为 Trigger 或 TPSL 订单。
  • 不可修改 tif 或 expiresAfter。

独立 Trigger 订单

订单类型可修改字段可切换类型
Trigger MarketTrigger Price、Order Amount、Trigger Price Type可切换为 Trigger Limit;切换时必须提供有效的 Order Price。
Trigger LimitTrigger Price、Order Price、Order Amount、Trigger Price Type可切换为 Trigger Market;切换后不再使用触发后的限价。

Trigger Price Type 可在 Index Price 与 Mark Price 间切换。

Order-Attached TPSL#

子单生效前

子单类型可修改字段可切换类型
TP 或 SL Trigger MarketTrigger PriceTP 可切换为 TP Limit、TP Trigger Market 或 TP Trigger Limit;SL 可在 SL Trigger Market 与 SL Trigger Limit 间切换。
TP 或 SL Trigger LimitTrigger Price、Order Price同上。
TP LimitOrder PriceTP 可切换为 TP Trigger Market 或 TP Trigger Limit。
  • Trigger 类型的 Trigger Price Type 可在 Index Price 与 Mark Price 间切换。
  • 尚未生效的 TPSL 子单使用该 TPSL 子单的 oid 定位。

子单生效后

子单类型可修改字段可切换类型
TP 或 SL Trigger MarketTrigger Price、Order AmountTP Trigger Market 与 TP Trigger Limit 可互相切换;SL Trigger Market 与 SL Trigger Limit 可互相切换。
TP 或 SL Trigger LimitTrigger Price、Order Price、Order Amount同上。
TP LimitOrder 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 MarketTrigger Price、Order Amount可切换为 Trigger Limit。
Trigger LimitTrigger Price、Order Price、Order Amount可切换为 Trigger Market。
TP LimitOrder 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 间切换,当前规则未定义,须由交易及链上研发确认。

不可修改字段#

以下字段不可通过改单修改:

  • assetId
  • side
  • marketType,包括 marginMode 和 positionSide
  • reduceOnly
  • sizeType
  • tif
  • expiresAfter
  • clientOrderId
  • grouping

如需修改以上业务属性,必须先撤单,再重新下单。

其他改单限制#

  • 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 属性不可通过改单修改;如需变更,必须撤单后重新下单。
  • 改价、改大或改少时,仍遵守一般改单的撮合排队优先级规则。

超量修剪规则#

  1. 系统按同一账户下的 assetId + marginMode + side 维度计算 Reduce-Only 订单的剩余委托总量。
  2. Hedge 模式下,多仓与空仓分别计算,side 必须对应被减少的 positionSide。
  3. 若总剩余委托量不超过对应持仓量,订单正常保留。
  4. 下单或改单后,若总剩余委托量超过持仓量,系统按 orderCreateTime 从早到晚进行 FIFO 修剪:
    1. 从最早建立的既有 Reduce-Only 订单开始减量。
    2. 若订单剩余量不大于待修剪量,则撤销该订单。
    3. 否则,仅减少该订单的相应数量。
    4. 持续处理,直至总剩余委托量不超过持仓量。
  5. 成交、清算、ADL、结算或其他事件导致持仓缩小时,系统重新执行相同检查与 FIFO 修剪。
  6. 修剪仅影响超出持仓量的部分,不得使订单产生反向开仓。

交易执行顺序与 Nonce 失效机制#

  1. 交易按 Sequencer 接收顺序进入区块。同一区块内按以下优先级执行:

    1. Noop
    2. Post-Only 下单,或改单为 Post-Only
    3. 撤单
    4. 其他操作
  2. 同一优先级内维持 Sequencer 接收的原始顺序。

  3. Noop 不会跨区块回溯,也不能撤销已完成或已消耗 nonce 的 action。