自我交易预防 (Self Trade Prevention - STP) 常见问题
免责声明:
- 此处使用的佣金和价格是虚构的,并不反映实际交易所的设置。
什么是 Self Trade Prevention - STP?
自我交易预防是指阻止订单与来自同一账户或者同一 tradeGroupId 账户的订单交易。
什么是自我交易(self-trade)?
在以下任一情况下都可能发生自我交易:
- 属于同一账户的订单之间交易。
- 属于相同
tradeGroupId的账户的订单之间交易。
STP 触发时会发生什么?
如果订单会触发自我交易,系统将执行五种可能的模式:
NONE - 此模式使订单免于自我交易预防。
EXPIRE_TAKER - 此模式通过立即使吃单者(taker)的剩余数量过期来预防交易。
EXPIRE_MAKER - 此模式通过立即使潜在挂单者(maker)的剩余数量过期来预防交易。
EXPIRE_BOTH - 此模式通过立即同时使吃单和挂单者的剩余数量过期来预防交易。
DECREMENT - 此模式通过阻止匹配的数量来增加两种订单的 prevented quantity。这将使可用数量较少的订单过期, 如果两个订单的可用数量相等,那么两个订单都将过期。
TRANSFER - 如果订单来自同一账户,则行为与 DECREMENT 相同。
如果订单来自不同账户且具有相同的 tradeGroupId,则除了 DECREMENT 的行为外,最后被阻止的数量 及其名义价值将在两个账户之间转移。
STP 行为通常仅由吃单的 STP 模式决定。例外情况是,只有当挂单和吃单都指定 STP 模式为 TRANSFER 时,才会发生 STP TRANSFER。如果吃单指定 STP 模式为 TRANSFER,但挂单指定了不同的 STP 模式,则 STP 行为为 DECREMENT。
总结如下:
| 吃单 STP 模式 | 挂单 STP 模式 | 实际生效的 STP 模式 |
|---|---|---|
TRANSFER | TRANSFER | TRANSFER |
TRANSFER | EXPIRE_MAKER、EXPIRE_TAKER、EXPIRE_BOTH、NONE、DECREMENT | DECREMENT |
EXPIRE_MAKER、EXPIRE_TAKER、EXPIRE_BOTH、NONE、DECREMENT | 任意 STP 模式 | 吃单的 STP 模式 |
什么是交易组 Id(Trade Group Id)?
属于同一 tradeGroupId 的账户被视为同一交易组。相同交易组成员提交的订单有 STP 资格。
每个账户可以从 GET /api/v3/account(REST API)或 account.status(WebSocket API)确认账户是否属于同一个 tradeGroupId。
tradeGroupId 也存在 GET /api/v3/preventedMatches(REST API)或 myPreventedMatches(WebSocket API)的响应中。
如果该值为 -1,这表示账户未设置 tradeGroupId,因此 STP 只能发生在同一账户的 订单之间。
什么是 Prevented Match?
当一个或多个订单因 STP 而过期时,这会创建一个被阻止的撮合交易事务。
当一个自我交易被阻止时,将会创建一个被阻止的撮合交易事务。隶属于被阻止的撮合交易中的订单会增加其 prevented quantity 然后导致一个或多个订单过期。
通过 REST API 的 GET /api/v3/preventedMatches 或 WebSocket API 的 myPreventedMatches 可以查询到有哪些被阻止的撮合交易。
请求的响应示例:
[
{
"symbol": "BTCDUSDT", // 交易对
"preventedMatchId": 8, // 被阻止撮合交易的Id
"takerOrderId": 12, // 吃单者的订单Id
"makerOrderId": 10, // 挂单者的订单Id
"tradeGroupId": 1, // 交易组的Id。(如果账户不属于交易组,则为 -1)
"selfTradePreventionMode": "EXPIRE_BOTH", // 订单过期的 STP 模式。
"price": "50.00000000", // 撮合交易的价格。
"takerPreventedQuantity": "1.00000000", // 在STP 前, 吃单者的剩余数量。 仅在 STP 模式为 EXPIRE_TAKER 或 EXPIRE_BOTH 或 DECREMENT 时出现。
"makerPreventedQuantity": "10.00000000", // 在STP 前, 挂单者的剩余数量。 仅在 STP 模式为 EXPIRE_MAKER 或 EXPIRE_BOTH 或 DECREMENT 时出现。
"transactTime": 1663190634060 // 订单因 STP 而过期的时间。
}
]
什么是 "prevented quantity"?
STP事件会导致挂单的数量失效; STP的模式 EXPIRE_TAKER, EXPIRE_MAKER 以及 EXPIRE_BOTH 会使挂单中剩余的数量全部失效,从而使整个订单失效。
Prevented quantity 表示订单中因为STP事件失效的数量, 用户WebSocket数据流中可能有如下两个字段:
{
"A": "3.000000", // Prevented Quantity
"B": "3.000000" // Last Prevented Quantity
}
B 代表着 TRADE_PREVENTION 交易类型, 其值表示本次STP事件导致失效的订单数量。
A 代表着某订单因为STP事件导致的累计失效订单数量。 对于 EXPIRE_TAKER, EXPIRE_MAKER 以及 EXPIRE_BOTH 模式, 其值总是和 B 一样。
由于 STP 而过期 的订单的 API 响应也将有一个 preventedQuantity 字段,指示在订单由于 STP 而过期的累计数量。
如果订单是处于挂单状态, 如下的公式成立:
original order quantity - executed quantity - prevented quantity = quantity available for further execution
原始的订单数量 - 执行的订单数量 - 被过期的数量 = 可用于未来执行的数量
当一个订单的可用数量归 0 时,该订单会被从订单簿中移除。 这个状态会是 EXPIRED_IN_MATCH, FILLED, 或 EXPIRED 模式中的一个。
如何知道有那些交易对支持 STP?
交易对可以配置为允许不同的 STP 模式集并采用不同的默认 STP 模式。
defaultSelfTradePreventionMode - 如果用户在下单时不提供,订单将使用此 STP 模式。
allowedSelfTradePreventionModes - 交易对允许的下单 STP 模式集。
例如,如果交易对有以下配置:
{
"defaultSelfTradePreventionMode": "NONE",
"allowedSelfTradePreventionModes": ["NONE", "EXPIRE_TAKER", "EXPIRE_BOTH"]
}
这表示如果用户在没有提供 selfTradePreventionMode 的情况下发送订单,发送的订单有 NONE 的值。
如果用户想明确指定模式,可以传 NONE,EXPIRE_TAKER,或 EXPIRE_BOTH。
如果用户尝试为此交易对的订单指定 EXPIRE_MAKER,将会收到错误消息:
{
"code": -1013,
"msg": "This symbol does not allow the specified self-trade prevention mode."
}