自成交防护 (STP)
针对自成交的自动保护机制。
概述
当一笔新进入的(Taker)订单将与同一钱包挂出的(Maker)订单撮合时,引擎会同时撤销这两笔订单,而不是让它们成交。这可以防止对敲交易,并避免做市商意外与自己的报价交叉成交。
STP 始终处于启用状态。没有任何配置项,不可选择退出,也没有其他可选模式。
行为
策略:双边撤单
检测到自成交时:
- 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 模式吗(例如撤销最新订单或递减)? 不能。Hypercall 仅使用双边撤单模式。
STP 是否适用于永续合约订单? 不适用。Hypercall 的 STP 适用于在 Hypercall 订单簿上撮合的订单:期权订单和组合订单。永续合约订单在 Hyperliquid 的订单簿上撮合,适用 Hyperliquid 自身的自成交规则。
STP 是否适用于组合订单? 适用。在组合或隐含路径会让账户与自身成交之前,撮合即会停止,挂单中的 Maker 订单会被撤销。关于全部成交或全部不成交的情况(FOK 和原子替换),请参阅实验性组合 API。
STP 是否适用于 RFQ 交易? 适用。如果 Taker 与某个报价方使用同一钱包,该报价将被拒绝。
我是做市商,同时进行双边报价。我的报价会互相撤销吗? 只有当新进入的订单会导致它们交叉成交时才会。在订单簿两侧以不同价格挂出的订单可以正常共存。STP 仅在撮合时触发。