Skip to content

訂閱機制與場景處理

加密貨幣交易推送採用連接即訂閱模型:客戶端完成 WebSocket 連接和登錄鑑權後,服務端會自動推送當前鑑權用戶的加密貨幣交易事件,無需客戶端發送額外的訂閱請求。

消息識別方式

收到一條推送消息後,按以下兩步確定處理場景:

步驟 1:讀 report_type  →  確定大類(下單 / 成交 / 撤單 / 過期)
步驟 2:讀 order.is_close  →  確定是否為終態,不再推送後續報告
report_type說明order.is_close
1new_rpt.result=0下單成功false — 訂單仍活躍
1new_rpt.result≠0下單失敗true — 終態
4fill_rpt.fill_status=1部分成交false — 仍有剩餘
4fill_rpt.fill_status=2完全成交true — 終態
3cancel_rpt.result=0撤單成功true — 終態
5訂單過期true — 終態

事件覆蓋範圍

鑑權成功後,客戶端將自動接收以下全部報告類型,無法單獨過濾某類事件:

report_type說明
1下單報告(含成功和失敗)
3撤單報告
4成交報告(含部分成交和完全成交)
5訂單過期報告

各報告類型的消息結構和字段說明詳見 數據格式


各場景詳解


場景一:下單成功

觸發時機:系統確認訂單已進入委託隊列。

識別方式report_type=1new_rpt.result=0

order 特征

  • is_close = false — 訂單仍活躍,後續會收到成交或撤單事件
  • cum_qty = "0" — 尚未有成交
  • avg_px = "0" — 尚未有成交

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


場景二:下單失敗

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

識別方式report_type=1new_rpt.result≠0

order 特征

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

new_rpt 特征

  • result — 非 0 的錯誤碼
  • err_msg — 失敗原因說明

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


場景三:部分成交

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

識別方式report_type=4fill_rpt.fill_status=1

order 特征

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

fill_rpt 特征

  • last_qty — 本次成交數量
  • last_px — 本次成交價格
  • last_amount — 本次成交金額
  • leave_qty — 剩餘未成交數量

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


場景四:完全成交

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

識別方式report_type=4fill_rpt.fill_status=2

order 特征

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

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


場景五:撤單成功

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

識別方式report_type=3cancel_rpt.result=0

order 特征

  • is_close = true終態
  • cum_qty — 撤單時的累計成交量(若之前有部分成交,此值大於 0)
  • avg_px — 撤單時的成交均價

處理建議:將訂單標記為「已撤單」。若 order.cum_qty > "0",說明是部分成交後撤單,需保留已成交部分的記錄。


場景六:訂單過期

觸發時機:訂單超過有效期(如 IOC 單未完全即時成交、訂單到期等)。

識別方式report_type=5

order 特征

  • is_close = true終態
  • cum_qty — 過期時的累計成交量(IOC 單可能有部分成交後過期的情況)
  • avg_px — 過期時的成交均價

處理建議:將訂單標記為「已過期」。若 order.cum_qty > "0",說明 IOC 單在過期前已有部分成交,需保留已成交記錄。


終態判斷速查

order.is_close == true   →  訂單已到達終態,不會再推送該訂單的任何後續事件
order.is_close == false  →  訂單仍活躍,後續還可能收到成交或撤單事件
場景order.is_close
下單成功false
下單失敗true
部分成交false
完全成交true
撤單成功true
訂單過期true

冪等處理建議

字段用途
report_id消息級別去重,防止網絡重推導致重複處理
fill_rpt.fill_id成交級別去重,防止重複記賬

消費方應以 report_idfill_rpt.fill_id 為 key 做冪等校驗,避免重複處理。

時序示例

限價單買 0.1 BTC,部分成交後撤單

t1: report_type=1, new_rpt.result=0
    → order.cum_qty="0", order.is_close=false
    → 下單成功,訂單掛出

t2: report_type=4, fill_rpt.fill_status=1
    → order.cum_qty="0.06", order.is_close=false
    → 部分成交 0.06 BTC,fill_rpt.leave_qty="0.04"

t3: report_type=3, cancel_rpt.result=0
    → order.cum_qty="0.06", order.is_close=true
    → 撤單成功,最終成交 0.06 BTC,剩餘 0.04 BTC 已撤銷

市價單完全成交

t1: report_type=1, new_rpt.result=0
    → 下單成功

t2: report_type=4, fill_rpt.fill_status=2
    → order.cum_qty=order.order_qty, order.is_close=true
    → 完全成交,訂單結束

下單失敗

t1: report_type=1, new_rpt.result≠0
    → order.is_close=true, new_rpt.err_msg="<失敗原因>"
    → 下單失敗,訂單結束

IOC 單部分成交後過期

t1: report_type=1, new_rpt.result=0
    → order.is_close=false
    → 下單成功

t2: report_type=4, fill_rpt.fill_status=1
    → order.cum_qty="0.03", order.is_close=false
    → 部分成交 0.03 BTC

t3: report_type=5
    → order.cum_qty="0.03", order.is_close=true
    → 剩餘數量已過期,最終成交 0.03 BTC

行為說明

不補發歷史事件

連接斷開期間發生的交易事件不會在重連後補發。如需查詢歷史訂單或成交記錄,請使用以下 REST 接口:

重連後恢復

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

下一步