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

Binance期货WebSocket数据获取故障及重连机制咨询

币安期货WebSocket数据获取问题排查与解决方案

问题背景

我正在尝试通过WebSocket流获取Binance期货数据,已查阅所有Binance文档并尝试多种Python实现方式,但均未成功。代码运行在PythonAnywhere服务器上。

需要获取的数据类型:

  • 合约行情(SYMBOL TICKER)
  • 期货账户余额(FUTURES ACCOUNT BALANCE)
  • 期货持仓、订单(FUTURES OPEN POSITIONS, ORDERS)

尝试的代码如下,但未收到流的任何响应,同时想了解如何处理WebSocket重连以及流的持续连接时长:

import asyncio
from binance import AsyncClient, BinanceSocketManager

# API keys
API_KEY = '<api_key>'
API_SECRET = '<api_secret>'

# Binance API endpoint
BASE_URL = 'https://fapi.binance.com'

async def main():
    client = await AsyncClient.create(api_key=API_KEY,api_secret=API_SECRET)
    bm = BinanceSocketManager(client)
    # start any sockets here, i.e a trade socket
    ts = bm.futures_socket() # Tried also bm.futures_user_socket()
    # then start receiving messages
    async with ts as tscm:
        while True:
            res = await tscm.recv()
            print(res)

    await client.close_connection()


loop = asyncio.get_event_loop()
loop.run_until_complete(main())

问题排查与解决方案

1. 明确WebSocket流的订阅类型

你当前的代码未指定具体的流订阅目标,币安期货WebSocket需要明确对应的数据类型:

  • 合约行情:需指定具体合约,使用futures_ticker_socket方法订阅单合约或组合合约ticker流
  • 账户余额/持仓/订单:必须使用futures_user_socket,但需确保API密钥已开启期货权限,若设置IP白名单则需将PythonAnywhere服务器IP加入列表

2. PythonAnywhere网络限制检查

PythonAnywhere的免费/基础套餐可能对出站WebSocket连接有限制:

  • 先测试服务器连通性:执行telnet fstream.binance.com 443,确认能正常连接到币安WebSocket端点
  • 免费版可能无法维持持久WebSocket连接,建议先在本地环境验证代码有效性,再排查服务器权限问题

3. 修正后的示例代码

合约行情流示例

import asyncio
from binance import AsyncClient, BinanceSocketManager

API_KEY = '<api_key>'
API_SECRET = '<api_secret>'

async def main():
    client = await AsyncClient.create(api_key=API_KEY, api_secret=API_SECRET)
    bm = BinanceSocketManager(client)
    
    # 订阅BTCUSDT合约ticker流
    ts = bm.futures_ticker_socket("BTCUSDT")
    async with ts as tscm:
        while True:
            res = await tscm.recv()
            print("合约行情数据:", res)
    
    await client.close_connection()

if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())

用户私有数据(余额/持仓/订单)流示例

import asyncio
from binance import AsyncClient, BinanceSocketManager

API_KEY = '<api_key>'
API_SECRET = '<api_secret>'

async def main():
    client = await AsyncClient.create(api_key=API_KEY, api_secret=API_SECRET)
    bm = BinanceSocketManager(client)
    
    # 订阅用户私有流,包含余额、持仓、订单更新
    ts = bm.futures_user_socket()
    async with ts as tscm:
        while True:
            res = await tscm.recv()
            print("用户账户数据:", res)
    
    await client.close_connection()

if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())

4. WebSocket重连与连接时长处理

  • 自动重连实现:BinanceSocketManager内置基础重连机制,可手动捕获异常实现更可靠的重连逻辑:
import asyncio
from binance import AsyncClient, BinanceSocketManager

API_KEY = '<api_key>'
API_SECRET = '<api_secret>'

async def main():
    client = await AsyncClient.create(api_key=API_KEY, api_secret=API_SECRET)
    bm = BinanceSocketManager(client)
    
    while True:
        try:
            ts = bm.futures_user_socket()
            async with ts as tscm:
                while True:
                    res = await tscm.recv()
                    print("用户账户数据:", res)
        except Exception as e:
            print(f"连接断开,5秒后重连: {str(e)}")
            await asyncio.sleep(5)
            continue
    
    await client.close_connection()

if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())
  • 连接时长维护:币安WebSocket默认无强制断开时间,但10分钟无数据交互会被服务器主动断开。BinanceSocketManager会自动发送心跳包维持连接,无需额外处理。

内容的提问来源于stack exchange,提问作者Jože Strožer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 21:22:40