自成交防护 (STP)
针对自成交的自动保护机制。
概述
当一个进入市场的(taker)订单将与来自同一钱包的挂单(maker)订单撮合时,撮合引擎会取消这两个订单,而不是让它们成交。这可以防止对敲交易(wash trading),并保护做市商免于意外与自己的报价成交。
STP 始终处于激活状态。没有任何配置选项、无法退出,也没有其他替代模式。
行为
策略:双向撤单(Cancel Both)
当检测到自成交时:
- Maker 订单被取消,原因为
"Self-trade prevention" - Taker 订单被拒绝(如果之前没有任何成交)或被取消(如果已部分成交)
这两个订单之间不会产生任何成交。
钱包级别的匹配
STP 比较的是钱包地址,而不是代理密钥。如果您使用代理授权通过多个密钥签署订单,同一交易钱包下的所有订单彼此之间均受 STP 约束。
部分成交将被保留
如果 taker 订单在遇到自成交之前已与其他交易对手方成交,这些成交会被保留。
示例:订单簿中先有钱包 B 卖出的 5 张合约,然后是钱包 A 卖出的 5 张合约。钱包 A 提交一笔买入 10 张合约的订单:
| 步骤 | 撮合对象 | 结果 |
|---|---|---|
| 1 | 钱包 B(5 张合约) | 成交:执行 5 张合约 |
| 2 | 钱包 A(5 张合约) | 检测到自成交 |
结果:
- 钱包 A 与钱包 B 成交 5 张合约
- 钱包 A 的 maker 订单(5 张合约)被取消
- 钱包 A 的 taker 订单被取消,
filled_size: 5
订单状态
| 场景 | Taker 状态 | 原因 |
|---|---|---|
| 之前无成交 | Rejected | "Self-trade prevention" |
| 自成交前有部分成交 | Canceled | "Self-trade prevention (partial fill kept)" |
Maker 订单始终为 Canceled,原因为 "Self-trade prevention"。
GTC 订单在触发自成交后不会挂单
如果 GTC taker 订单触发了 STP,其剩余数量不会被加入订单簿,即使该订单通常会挂单。该订单将被完全终止。
WebSocket 通知
taker 和 maker 的取消/拒绝通知均通过 order_updates 频道推送。reason 字段会指明原因是 STP。
监控
STP 事件会递增 ht_engine_self_trade_prevented_total Prometheus 计数器。
常见问题
我可以选择其他 STP 模式(例如取消最新订单或数量递减)吗? 不可以。Hypercall 仅使用双向撤单模式。
STP 适用于永续合约订单吗? 适用。STP 适用于撮合引擎上的所有订单类型,包括期权和永续合约。
STP 适用于 RFQ 交易吗? 适用。如果 taker 与报价提供方使用同一钱包,该报价将被拒绝。
我是双边报价的做市商。我的报价会相互取消吗? 只有当一个进入市场的订单导致它们交叉时才会。位于订单簿两侧、价格不同的挂单可以正常共存。STP 仅在撮合时触发。