如何通过Binance WebSocket获取多种加密货币实时数据
实现多币种Binance WebSocket实时1分钟K线数据获取
修改思路
- Binance WebSocket支持合并流:通过一个WebSocket连接同时订阅多个币种的流,只需在
streams参数中用斜杠/分隔各币种的流路径,格式为{币种小写}@kline_1m。 - 修复原代码缩进错误:原代码中
on_error、on_close、on_open嵌套在on_message函数内,会导致回调无法正常触发,需将这些函数放到全局作用域。 - 动态生成流地址:利用已定义的
pairs列表,自动拼接多币种的流路径,避免手动写死URL。
修改后的完整代码
import websocket import json pairs = ['fxsusdt', 'bnbusdt', 'btcusdt'] # 动态生成多币种合并流地址 stream_paths = [f"{pair}@kline_1m" for pair in pairs] socket = f'wss://stream.binance.com:9443/stream?streams={"/".join(stream_paths)}' def on_message(ws, message): json_message = json.loads(message) # 提取币种标识 stream = json_message['stream'] symbol = stream.split('@')[0].upper() data = json_message['data'] candle = data['k'] candle_closed = candle['x'] close = candle['c'] high = candle['h'] low = candle['l'] volume = candle['v'] # 打印带币种标识的K线数据 print(f"[{symbol}] 1分钟K线 - 收盘价:{close}, 最高价:{high}, 最低价:{low}, 成交量:{volume}, 已收盘:{candle_closed}") def on_error(ws, error): print(f"错误: {error}") def on_close(ws, close_status_code, close_msg): print("### 连接已关闭 ###") if close_status_code or close_msg: print(f"状态码: {close_status_code}, 关闭信息: {close_msg}") def on_open(ws): print("已建立WebSocket连接") ws = websocket.WebSocketApp( socket, on_open=on_open, on_message=on_message, on_error=on_error, on_close=on_close ) ws.run_forever()
核心说明
- 合并流地址生成:用列表推导式把每个币种转换成
xxxusdt@kline_1m格式,再用"/".join()拼接成完整的streams参数值,最终构造出支持多币种的WebSocket URL。 - 消息解析优化:在
on_message中通过stream字段提取币种名称,方便区分不同币种的K线数据。 - 错误与关闭信息增强:在
on_close中添加状态码和关闭信息的打印,便于排查连接异常问题。
学习参考要点
- Binance官方API文档:重点查看「WebSocket Market Streams」章节,里面详细说明了单流、合并流的规则,以及K线、交易、深度等各类流的数据格式。
- Python websocket库实操:掌握
WebSocketApp的回调函数用法(on_open/on_message/on_error/on_close),理解WebSocket长连接的维护逻辑。
内容的提问来源于stack exchange,提问作者Shankar
相关产品推荐
相关产品推荐

