訂閱機制與場景處理
加密貨幣交易推送採用連接即訂閱模型:客戶端完成 WebSocket 連接和登錄鑑權後,服務端會自動推送當前鑑權用戶的加密貨幣交易事件,無需客戶端發送額外的訂閱請求。
消息識別方式
收到一條推送消息後,按以下兩步確定處理場景:
步驟 1:讀 event_type → 確定大類(下單 / 成交 / 撤單 / 過期)
步驟 2:讀 order_info.is_close → 確定是否為終態,不再推送後續報告event_type | 說明 | order_info.is_close |
|---|---|---|
EVENT_NEW | 下單成功 | false — 訂單仍活躍 |
EVENT_NEW_REJECTED | 下單失敗 | true — 終態 |
EVENT_FILL(部分成交) | order_info.ord_status = PARTIAL_FILLED | false — 仍有剩餘 |
EVENT_FILL(全部成交) | order_info.ord_status = FILLED | true — 終態 |
EVENT_CANCELED | 撤單成功 | true — 終態 |
EVENT_EXPIRED | 訂單過期 | true — 終態 |
事件覆蓋範圍
鑑權成功後,客戶端將自動接收以下全部事件類型,無法單獨過濾某類事件:
| 事件類型 | 說明 |
|---|---|
EVENT_NEW | 下單成功 |
EVENT_NEW_REJECTED | 下單失敗 |
EVENT_FILL | 成交事件(含部分成交和全部成交) |
EVENT_CANCELED | 撤單成功 |
EVENT_EXPIRED | 訂單過期 |
各事件的消息結構和字段說明詳見 數據格式。
賬戶維度說明
服務端按鑑權用戶的賬戶維度推送事件,推送消息中的 user_info.account_id 字段標識事件所屬的具體加密貨幣賬戶。
各場景詳解
場景一:下單成功
觸發時機:系統確認訂單已進入委託隊列(狀態 NEW)。
識別方式:event_type = EVENT_NEW
order_info 特征:
ord_status = NEWis_close = false— 訂單仍活躍,後續會收到成交或撤單事件cum_qty = "0"— 尚未有成交avg_px = "0"— 尚未有成交
處理建議:記錄訂單進入「已掛單」狀態,展示等待成交 UI。
場景二:下單失敗
觸發時機:訂單被系統拒絕(如餘額不足、價格非法、風控攔截等)。
識別方式:event_type = EVENT_NEW_REJECTED
order_info 特征:
ord_status = REJECTED或FAILEDis_close = true— 終態,該訂單已結束,不會再收到後續事件cum_qty = "0"— 無成交
處理建議:將訂單標記為失敗,結束該訂單的生命週期。
場景三:部分成交
觸發時機:訂單被部分撮合,仍有剩餘未成交數量。
識別方式:event_type = EVENT_FILL,order_info.ord_status = PARTIAL_FILLED
order_info 特征:
ord_status = PARTIAL_FILLEDis_close = false— 非終態,後續還會收到成交或撤單事件cum_qty— 已更新為累計成交總量(含本次)avg_px— 已更新為新的成交均價
fill_infos[0] 特征:
quantity— 本次成交數量price— 本次成交價格amount— 本次成交金額
處理建議:累加成交明細,更新訂單的已成交數量和均價,展示「部分成交」狀態。用 fill_id 做冪等防止重複處理。
場景四:全部成交
觸發時機:訂單全部撮合完成。
識別方式:event_type = EVENT_FILL,order_info.ord_status = FILLED
order_info 特征:
ord_status = FILLEDis_close = true— 終態,訂單已完結cum_qty— 等於原始order_qty(全部成交)avg_px— 最終均價
處理建議:記錄最後一筆成交明細,將訂單標記為「全部成交」並關閉,不再等待後續事件。
場景五:撤單成功
觸發時機:系統確認撤單完成(全部撤單,或部分成交後撤單)。
識別方式:event_type = EVENT_CANCELED
order_info 特征:
ord_status = CANCELED或CANCELLED_PART(部分成交後撤單)is_close = true— 終態cum_qty— 撤單時的累計成交量(若之前有部分成交,此值大於 0)avg_px— 撤單時的成交均價
處理建議:將訂單標記為「已撤單」。若 cum_qty > "0",說明是部分成交後撤單,需保留已成交部分的記錄(ord_status = CANCELLED_PART)。
場景六:訂單過期
觸發時機:訂單超過有效期(如 IOC 單未完全即時成交、訂單到期等)。
識別方式:event_type = EVENT_EXPIRED
order_info 特征:
ord_status = EXPIREDis_close = true— 終態cum_qty— 過期時的累計成交量(IOC 單可能有部分成交後過期的情況)avg_px— 過期時的成交均價
處理建議:將訂單標記為「已過期」。若 cum_qty > "0",說明 IOC 單在過期前已有部分成交,需保留已成交記錄。
終態判斷速查
order_info.is_close == true → 訂單已到達終態,不會再推送該訂單的任何後續事件
order_info.is_close == false → 訂單仍活躍,後續還可能收到成交或撤單事件| 場景 | is_close |
|---|---|
| 下單成功 | false |
| 下單失敗 | true |
| 部分成交 | false |
| 全部成交 | true |
| 撤單成功 | true |
| 訂單過期 | true |
冪等處理建議
| 字段 | 用途 |
|---|---|
event_id | 消息級別去重,防止網絡重推導致重複處理 |
fill_infos[].fill_id | 成交級別去重,防止重複記賬 |
消費方應以 event_id 或 fill_id 為 key 做冪等校驗,避免重複處理。
時序示例
限價單買 0.1 BTC,部分成交後撤單
t1: event_type=EVENT_NEW
→ order_info.cum_qty="0", order_info.is_close=false
→ 下單成功,訂單掛出
t2: event_type=EVENT_FILL, order_info.ord_status=PARTIAL_FILLED
→ order_info.cum_qty="0.06", order_info.is_close=false
→ 部分成交 0.06 BTC,剩餘 0.04 BTC 未成交
t3: event_type=EVENT_CANCELED, order_info.ord_status=CANCELLED_PART
→ order_info.cum_qty="0.06", order_info.is_close=true
→ 撤單成功,最終成交 0.06 BTC,剩餘 0.04 BTC 已撤銷市價單完全成交
t1: event_type=EVENT_NEW
→ 下單成功
t2: event_type=EVENT_FILL, order_info.ord_status=FILLED
→ order_info.cum_qty=order_info.order_qty, order_info.is_close=true
→ 完全成交,訂單結束下單失敗
t1: event_type=EVENT_NEW_REJECTED
→ order_info.ord_status=REJECTED, order_info.is_close=true
→ 下單失敗,訂單結束IOC 單部分成交後過期
t1: event_type=EVENT_NEW
→ order_info.is_close=false
→ 下單成功
t2: event_type=EVENT_FILL, order_info.ord_status=PARTIAL_FILLED
→ order_info.cum_qty="0.03", order_info.is_close=false
→ 部分成交 0.03 BTC
t3: event_type=EVENT_EXPIRED, order_info.ord_status=EXPIRED
→ order_info.cum_qty="0.03", order_info.is_close=true
→ 剩餘數量已過期,最終成交 0.03 BTC行為說明
不補發歷史事件
連接斷開期間發生的交易事件不會在重連後補發。如需查詢歷史訂單或成交記錄,請使用以下 REST 接口:
重連後恢復
連接斷開並重新鑑權後,服務端會自動重新建立推送通道,繼續推送後續發生的事件。