跳到主要内容

智能指令路由 (SOR)

声明:

  • 这里使用的符号和数值是虚构的,并不意味着真实交易所中的设置。
  • 为简单起见,本文档中的示例不包括佣金。

什么是智能指令路由 (SOR)?

智能订单路由(Smart Order Routing,简称SOR)允许客户通过使用具有相同基础资产(base asset )和可互换报价资产(interchangeable quote assets)的其他订单簿(order books)中的流动性来潜在获得更好的流动性。可互换报价资产是具有固定的1比1兑换率的报价资产,例如与同一法定货币挂钩的稳定币。

请注意,尽管报价资产(quote assets)是可互换的,但在出售基础资产(base asset)时,您将始终收到订单中交易对(symbol)对应的报价资产(quote asset)。

当您使用SOR下单时,它会在SOR配置的订单簿(order books)里,寻找每个订单簿的最佳价格水平,并在可能的情况下从中交易。

注意: 如果使用SOR的订单无法根据符合条件的订单簿流动性完全成交,IOC限价单(LIMIT IOC)或市价单(MARKET)将立即过期,而GTC限价单(LIMIT GTC)将把剩余数量放置在您最初提交订单的订单簿(order book)上。

示例 1

让我们考虑一个包含交易对BTCUSDTBTCUSDCBTCUSDP的SOR配置,并给出以下这些符号的卖出(ASK)方向的订单簿:

BTCUSDT quantity 3 price 30,800
BTCUSDT quantity 3 price 30,500

BTCUSDC quantity 1 price 30,000
BTCUSDC quantity 1 price 28,000

BTCUSDP quantity 1 price 35,000
BTCUSDP quantity 1 price 29,000

如果您以价格为31000、数量为0.5的限价挂单买入BTCUSDT,并且在BTCUSDT的订单簿中找到最佳的卖出价格为30,500 USDT,您将花费15,250 USDT 并收到0.5 BTC。

如果您通过使用SOR下达了一笔GTC限价买单(LIMIT GTC BUY),购买BTCUSDT,数量为 0.5,价格为 31000,您将与SOR涵盖的所有交易对中最佳的卖出价格相匹配,即BTCUSDC,价格为 28,000。您将花费 14,000 USDT(不是 USDC!),并收到 0.5 BTC。

{
"symbol": "BTCUSDT",
"orderId": 2,
"orderListId": -1,
"clientOrderId": "sBI1KM6nNtOfj5tccZSKly",
"transactTime": 1689149087774,
"price": "31000.00000000",
"origQty": "0.50000000",
"executedQty": "0.50000000",
"cummulativeQuoteQty": "14000.00000000",
"status": "FILLED",
"timeInForce": "GTC",
"type": "LIMIT",
"side": "BUY",
"workingTime": 1689149087774,
"fills": [
{
"matchType": "ONE_PARTY_TRADE_REPORT",
"price": "28000.00000000",
"qty": "0.50000000",
"commission": "0.00000000",
"commissionAsset": "BTC",
"tradeId": -1,
"allocId": 0
}
],
"workingFloor": "SOR",
"selfTradePreventionMode": "NONE",
"usedSor": true
}

示例 2

使用示例1中同样的订单薄:

BTCUSDT quantity 3 price 30,800
BTCUSDT quantity 3 price 30,500

BTCUSDC quantity 1 price 30,000
BTCUSDC quantity 1 price 28,000

BTCUSDP quantity 1 price 35,000
BTCUSDP quantity 1 price 29,000

如果您下达一笔GTC限价买单(LIMIT GTC BUY)购买BTCUSDT,数量为 5,价格为 31,000,则:

  • BTCUSDT 订单簿中价格为 30,500 USDT 的 3 个 BTCUSDT 成交,以 91,500 USDT 的价格购买 3 个 BTC。
  • 然后与 BTCUSDT 订单簿中价格为 30,800 USDT 的 3 个 BTCUSDT 成交,以 61,600 USDT 的价格购买 2 个 BTC。

总计您花费了 153,100 USDT 并获得了 5 BTC。

如果您通过使用SOR下达相同的GTC限价买单(LIMIT GTC BUY)购买 BTCUSDT,数量为 5,价格为 31,000,则:

  • BTCUSDC 订单簿中价格为 28,000 的 1 个 BTCUSDC 成交,以 28,000 USDT 的价格购买 1 个 BTC。
  • BTCUSDP 订单簿中价格为 29,000 的 1 个 BTCUSDP 成交,以 29,000 USDT 的价格购买 1 个 BTC。
  • BTCUSDC 订单簿中价格为 30,000 的 1 个 BTCUSDC 成交,以 30,000 USDT 的价格购买 1 个 BTC。
  • BTCUSDT 订单簿中价格为 30,500 的 3 个 BTCUSDT 成交,以 61,000 USDT 的价格购买 2 个 BTC。

总计您花费了 148,000 USDT 并获得了 5 BTC。

{
"symbol": "BTCUSDT",
"orderId": 2,
"orderListId": -1,
"clientOrderId": "tHonoNjWfOSaKiTygN3bfY",
"transactTime": 1689146154686,
"price": "31000.00000000",
"origQty": "5.00000000",
"executedQty": "5.00000000",
"cummulativeQuoteQty": "148000.00000000",
"status": "FILLED",
"timeInForce": "GTC",
"type": "LIMIT",
"side": "BUY",
"workingTime": 1689146154686,
"fills": [
{
"matchType": "ONE_PARTY_TRADE_REPORT",
"price": "28000.00000000",
"qty": "1.00000000",
"commission": "0.00000000",
"commissionAsset": "BTC",
"tradeId": -1,
"allocId": 0
},
{
"matchType": "ONE_PARTY_TRADE_REPORT",
"price": "29000.00000000",
"qty": "1.00000000",
"commission": "0.00000000",
"commissionAsset": "BTC",
"tradeId": -1,
"allocId": 1
},
{
"matchType": "ONE_PARTY_TRADE_REPORT",
"price": "30000.00000000",
"qty": "1.00000000",
"commission": "0.00000000",
"commissionAsset": "BTC",
"tradeId": -1,
"allocId": 2
},
{
"matchType": "ONE_PARTY_TRADE_REPORT",
"price": "30500.00000000",
"qty": "2.00000000",
"commission": "0.00000000",
"commissionAsset": "BTC",
"tradeId": -1,
"allocId": 3
}
],
"workingFloor": "SOR",
"selfTradePreventionMode": "NONE",
"usedSor": true
}

示例 3

使用示例1和2中同样的订单薄:

BTCUSDT quantity 3 price 30,800
BTCUSDT quantity 3 price 30,500

BTCUSDC quantity 1 price 30,000
BTCUSDC quantity 1 price 28,000

BTCUSDP quantity 1 price 35,000
BTCUSDP quantity 1 price 29,000

如果您通过使用SOR下市价买单(MARKET BUY) 购买 BTCUSDT,数量为 11,但在所有符合条件的订单簿中总共只有 10 个BTC可供交易。一旦所有SOR配置中的订单簿都耗尽了,剩余的数量1将过期。

{
"symbol": "BTCUSDT",
"orderId": 2,
"orderListId": -1,
"clientOrderId": "jdFYWTNyzplbNvVJEzQa0o",
"transactTime": 1689149513461,
"price": "0.00000000",
"origQty": "11.00000000",
"executedQty": "10.00000000",
"cummulativeQuoteQty": "305900.00000000",
"status": "EXPIRED",
"timeInForce": "GTC",
"type": "MARKET",
"side": "BUY",
"workingTime": 1689149513461,
"fills": [
{
"matchType": "ONE_PARTY_TRADE_REPORT",
"price": "28000.00000000",
"qty": "1.00000000",
"commission": "0.00000000",
"commissionAsset": "BTC",
"tradeId": -1,
"allocId": 0
},
{
"matchType": "ONE_PARTY_TRADE_REPORT",
"price": "29000.00000000",
"qty": "1.00000000",
"commission": "0.00000000",
"commissionAsset": "BTC",
"tradeId": -1,
"allocId": 1
},
{
"matchType": "ONE_PARTY_TRADE_REPORT",
"price": "30000.00000000",
"qty": "1.00000000",
"commission": "0.00000000",
"commissionAsset": "BTC",
"tradeId": -1,
"allocId": 2
},
{
"matchType": "ONE_PARTY_TRADE_REPORT",
"price": "30500.00000000",
"qty": "3.00000000",
"commission": "0.00000000",
"commissionAsset": "BTC",
"tradeId": -1,
"allocId": 3
},
{
"matchType": "ONE_PARTY_TRADE_REPORT",
"price": "30800.00000000",
"qty": "3.00000000",
"commission": "0.00000000",
"commissionAsset": "BTC",
"tradeId": -1,
"allocId": 4
},
{
"matchType": "ONE_PARTY_TRADE_REPORT",
"price": "35000.00000000",
"qty": "1.00000000",
"commission": "0.00000000",
"commissionAsset": "BTC",
"tradeId": -1,
"allocId": 5
}
],
"workingFloor": "SOR",
"selfTradePreventionMode": "NONE",
"usedSor": true
}

示例 4

假设有一个包含 BTCUSDT, BTCUSDCBTCUSDP 交易对的SOR配置, 以及下面这些交易对买方(BID)的订单簿:

BTCUSDT quantity 5 price 29,500

BTCUSDC quantity 5 price 35,000
BTCUSDC quantity 5 price 30,000

BTCUSDP quantity 5 price 28,000

如果您在BTCUSDT下一笔GTC限价卖单(LIMIT GTC SELL) 订单,价格是29000, 卖出10 BTC,那么您将卖出 5 个 BTC 并获得 147,500 USDT。由于BTCUSDT订单簿上没有更好的价格可用,订单的剩余(未成交)数量将会以29,000的价格保持在订单簿上。

如果您通过使用SOR下GTC限价卖单(LIMIT GTC SELL) 卖出 BTCUSDT,则会:

  • BTCUSDC 订单簿中价格为 35,000 的 5 个 BTCUSDC 成交,以 175,000 USDT 的价格出售 5 个 BTC。
  • BTCUSDC 订单簿中价格为 30,000 的 5 个 BTCUSDC 成交,以 150,000 USDT 的价格出售 5 个 BTC。

总计您卖出 10 个 BTC 并获得 325,000 USDT。

{
"symbol": "BTCUSDT",
"orderId": 1,
"orderListId": -1,
"clientOrderId": "W1iXSng1fS77dvanQJDGA5",
"transactTime": 1689147920113,
"price": "29000.00000000",
"origQty": "10.00000000",
"executedQty": "10.00000000",
"cummulativeQuoteQty": "325000.00000000",
"status": "FILLED",
"timeInForce": "GTC",
"type": "LIMIT",
"side": "SELL",
"workingTime": 1689147920113,
"fills": [
{
"matchType": "ONE_PARTY_TRADE_REPORT",
"price": "35000.00000000",
"qty": "5.00000000",
"commission": "0.00000000",
"commissionAsset": "USDT",
"tradeId": -1,
"allocId": 0
},
{
"matchType": "ONE_PARTY_TRADE_REPORT",
"price": "30000.00000000",
"qty": "5.00000000",
"commission": "0.00000000",
"commissionAsset": "USDT",
"tradeId": -1,
"allocId": 1
}
],
"workingFloor": "SOR",
"selfTradePreventionMode": "NONE",
"usedSor": true
}

概要:SOR的目标是潜在地在具有可互换报价资产(interchangeable quote assets)的订单簿之间获得更好的流动性。更好的流动性可以使订单以更好的价格,并更充分成交。

什么交易对支持SOR?

当前SOR配置可以在交易所信息接口查询(Restful接口GET /api/v3/exchangeInfo, Websocket API的 exchangeInfo).

  "sors": [
{
"baseAsset": "BTC",
"symbols": [
"BTCUSDT",
"BTCUSDC",
"BTCUSDP"
]
}
]

sors 字段是可选的。 如果 SOR 不可用, 该字段在响应中会被忽略。

如何下SOR订单?

通过Rest API接口 POST /api/v3/sor/order.

通过WebSocket API接口 sor.order.place.

在API响应里, 有个字段workingFloor是什么意思?

这是一个用于确定订单的最后更新操作(成交、过期或作为新订单下达等)的术语。

如果 workingFloor 是 SOR,这表示您的订单与SOR配置中的其他符合条件的订单簿进行了交互。

如果 workingFloor 是 EXCHANGE,这表示您的订单在您发送该订单的订单簿上进行了交互。

如果查询订单是否使用过SOR?

您可以像查询任何其他订单一样来查询。主要的区别是对于使用SOR的订单,在响应中会有两个额外的字段:usedSorworkingFloor

什么是资产分配?

资产分配是从交易所转移资产到您的账户。例如,当SOR从符合条件的订单簿中获取流动性时,您的订单将通过资产分配来填充。在这种情况下,您不直接进行交易,而是通过SOR代表您进行交易,并接收对应于SOR为您进行的交易的资产分配。

[
{
"symbol": "BTCUSDT", // Symbol the order was submitted to
"allocationId": 0,
"allocationType": "SOR",
"orderId": 2,
"orderListId": -1,
"price": "30000.00000000", // Price of the fill
"qty": "5.00000000", // Quantity of the fill
"quoteQty": "150000.00000000",
"commission": "0.00000000",
"commissionAsset": "BTC",
"time": 1688379272280, // Time the allocation occurred
"isBuyer": true,
"isMaker": false,
"isAllocator": false
}
]

如何获取使用SOR的订单成交细节?

当SOR订单与非提交订单的订单簿进行交易时,订单将通过资产分配(allocation)而不是交易(trade)来成交。使用SOR下达的订单可能同时拥有资产分配和交易。

在API响应中,您可以查看fills字段。资产分配具有allocIdmatchType: "ONE_PARTY_TRADE_REPORT",而交易将具有非负的tradeId

您可以使用以下方式查询资产分配和交易:

查询资产分配:使用Rest API接口 GET /api/v3/myAllocations 或 WebSocket API 的 myAllocations

查询交易:使用Rest API接口 GET /api/v3/myTrades 或 WebSocket API 的 myTrades

什么交易对支持SOR?

当前SOR配置可以在交易所信息接口查询(Rest API接口GET /api/v3/exchangeInfo, WebSocket API的 exchangeInfo).

  "sors": [
{
"baseAsset": "BTC",
"symbols": [
"BTCUSDT",
"BTCUSDC",
"BTCUSDP"
]
}
]