如何用python-binance多路复用套接字获取Binance期货K线
解决python-binance获取期货K线的问题
问题核心在于你使用的是现货客户端,要获取期货数据必须切换到期货专用的异步客户端,具体修改步骤如下:
- 替换客户端类型:将
AsyncClient替换为期货的AsyncFuturesClient - 创建期货客户端实例:用
AsyncFuturesClient.create()替代AsyncClient.create() - 调整流订阅格式:期货K线的订阅标识是
@kline_<周期>(注意是单数kline,而非现货的复数klines)
修改后的完整代码:
import asyncio from binance import AsyncFuturesClient, BinanceSocketManager api_key_real = '____________your api key________' secret_key_real = '____________your secret key________' async def process_message(msg): print(msg) async def start_user_data_stream(sockets_list): try: # 改用期货异步客户端 client = await AsyncFuturesClient.create(api_key_real, secret_key_real) bm = BinanceSocketManager(client) user_data_socket = bm.multiplex_socket(sockets_list) async with user_data_socket as stream: while True: try: res = await asyncio.wait_for(stream.recv(), timeout=5.0) await process_message(res) except asyncio.TimeoutError: print("Stream timeout. Restarting...") await client.close_connection() return await start_user_data_stream(sockets_list) async def main(): # 期货K线订阅用@kline_1h(单数kline) socket_list = ['bnbusdt@kline_1h','btcusdt@kline_1h','ethusdt@kline_1h'] await start_user_data_stream(sockets_list) if __name__ == "__main__": asyncio.run(main())
关键改动说明
- 客户端切换:
AsyncFuturesClient是python-binance专为期货API设计的异步客户端,会自动连接到期货的websocket端点,而非现货端点 - 流格式调整:期货的K线流订阅使用单数
kline,而现货用复数klines,这是Binance websocket接口的规范差异,之前错误用了现货的格式导致数据不对
内容的提问来源于stack exchange,提问作者PiDesign Interior
相关产品推荐
相关产品推荐

