求助:Python WebSocket无法一次性获取Bitfinex订单簿全量数据
看起来你正在搭建一个Bitfinex订单簿数据收集工具,遇到了逐笔接收数据的情况——这其实是Bitfinex WebSocket接口的正常高效传输机制,我帮你补全代码并解释其中的关键点:
Bitfinex订单簿WebSocket数据收集Python实现
补全后的可运行代码
import json from websocket import create_connection # 连接Bitfinex WebSocket(当前为v1接口,已废弃,推荐使用下方注释的v2接口) ws = create_connection("wss://api.bitfinex.com/ws/1") # 推荐切换到稳定的v2接口:ws = create_connection("wss://api2.bitfinex.com/ws/2") # 订阅BTC/USD订单簿:精度P1(小数点后1位)、实时频率F1、深度25档 ws.send(json.dumps({ "event": "subscribe", "channel": "book", "symbol": "tBTCUSD", "prec": "P1", "freq": "F1", "len": "25" })) try: while True: result = ws.recv() data = json.loads(result) # 过滤订阅确认等非数据消息,只处理订单簿相关数据 if isinstance(data, list) and len(data) > 1: channel_id = data[0] book_content = data[1] # 初始全量快照是嵌套列表,后续增量是单条订单数据 if isinstance(book_content, list): print("=== 收到全量订单簿快照 ===") for order in book_content: side = "买单" if order[2] > 0 else "卖单" print(f"价格: {order[0]}, 数量: {order[1]}, 方向: {side}") else: # 增量更新格式:[价格, 数量, 方向],数量为0表示订单取消 price, amount, side_flag = book_content action = "新增/更新" if amount != 0 else "取消" side = "买单" if side_flag > 0 else "卖单" print(f"[{action}] 价格: {price}, 数量: {amount}, 方向: {side}") except KeyboardInterrupt: print("\n程序终止,关闭WebSocket连接") ws.close()
关于“逐笔接收数据”的核心说明
- 增量推送机制:这是你看到逐笔数据的根本原因——Bitfinex为了降低带宽消耗,采用行业通用的增量更新模式:
- 首次订阅成功后,会推送一次你设置的25档全量订单簿快照
- 后续只会推送发生变化的订单(新增、修改数量、取消),而非完整订单簿
- 接口版本提示:你当前使用的v1接口已被官方废弃,强烈建议切换到代码中注释的v2接口,其文档更完善、稳定性更高
- 数据解析技巧:
- 先过滤掉
event类型的订阅确认消息,只处理数组格式的订单数据 - 全量快照是嵌套列表,每个子项对应一档订单的
[价格, 数量, 方向标识](正数为买单,负数为卖单) - 增量更新是单个列表,若数量为0,代表该价格档位的订单已被完全取消
- 先过滤掉
内容的提问来源于stack exchange,提问作者J87
相关产品推荐
相关产品推荐

