订阅机制与场景处理
加密货币交易推送采用连接即订阅模型:客户端完成 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 接口:
重连后恢复
连接断开并重新鉴权后,服务端会自动重新建立推送通道,继续推送后续发生的事件。