You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用python-binance多路复用套接字获取Binance期货K线

解决python-binance获取期货K线的问题

问题核心在于你使用的是现货客户端,要获取期货数据必须切换到期货专用的异步客户端,具体修改步骤如下:

  1. 替换客户端类型:将AsyncClient替换为期货的AsyncFuturesClient
  2. 创建期货客户端实例:用AsyncFuturesClient.create()替代AsyncClient.create()
  3. 调整流订阅格式:期货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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 13:42:37