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

重连后恢复

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

下一步