Skip to content

訂閱機制與場景處理

加密貨幣交易推送採用連接即訂閱模型:客戶端完成 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_FILLEDfalse — 仍有剩餘
EVENT_FILL(全部成交)order_info.ord_status = FILLEDtrue — 終態
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 = NEW
  • is_close = false — 訂單仍活躍,後續會收到成交或撤單事件
  • cum_qty = "0" — 尚未有成交
  • avg_px = "0" — 尚未有成交

處理建議:記錄訂單進入「已掛單」狀態,展示等待成交 UI。


場景二:下單失敗

觸發時機:訂單被系統拒絕(如餘額不足、價格非法、風控攔截等)。

識別方式event_type = EVENT_NEW_REJECTED

order_info 特征

  • ord_status = REJECTEDFAILED
  • is_close = true終態,該訂單已結束,不會再收到後續事件
  • cum_qty = "0" — 無成交

處理建議:將訂單標記為失敗,結束該訂單的生命週期。


場景三:部分成交

觸發時機:訂單被部分撮合,仍有剩餘未成交數量。

識別方式event_type = EVENT_FILLorder_info.ord_status = PARTIAL_FILLED

order_info 特征

  • ord_status = PARTIAL_FILLED
  • is_close = false非終態,後續還會收到成交或撤單事件
  • cum_qty — 已更新為累計成交總量(含本次)
  • avg_px — 已更新為新的成交均價

fill_infos[0] 特征

  • quantity — 本次成交數量
  • price — 本次成交價格
  • amount — 本次成交金額

處理建議:累加成交明細,更新訂單的已成交數量和均價,展示「部分成交」狀態。用 fill_id 做冪等防止重複處理。


場景四:全部成交

觸發時機:訂單全部撮合完成。

識別方式event_type = EVENT_FILLorder_info.ord_status = FILLED

order_info 特征

  • ord_status = FILLED
  • is_close = true終態,訂單已完結
  • cum_qty — 等於原始 order_qty(全部成交)
  • avg_px — 最終均價

處理建議:記錄最後一筆成交明細,將訂單標記為「全部成交」並關閉,不再等待後續事件。


場景五:撤單成功

觸發時機:系統確認撤單完成(全部撤單,或部分成交後撤單)。

識別方式event_type = EVENT_CANCELED

order_info 特征

  • ord_status = CANCELEDCANCELLED_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 = EXPIRED
  • is_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_idfill_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 接口:

重連後恢復

連接斷開並重新鑑權後,服務端會自動重新建立推送通道,繼續推送後續發生的事件。

下一步