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
相关产品推荐
相关产品推荐

