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 接口:

重连后恢复

连接断开并重新鉴权后,服务端会自动重新建立推送通道,继续推送后续发生的事件。

下一步