From 0379fdf123db65e30fe3b32867239a024aed7593 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=96=87=E8=96=87=E5=AE=89?= Date: Wed, 14 Jan 2026 13:36:30 +0800 Subject: [PATCH] a --- trading_system/WEBSOCKET_LICENSE_FIX.md | 85 +++++++++++++++++++++++++ trading_system/binance_client.py | 6 +- trading_system/requirements.txt | 3 +- trading_system/unicorn_websocket.py | 52 ++++++++++++--- 4 files changed, 134 insertions(+), 12 deletions(-) create mode 100644 trading_system/WEBSOCKET_LICENSE_FIX.md diff --git a/trading_system/WEBSOCKET_LICENSE_FIX.md b/trading_system/WEBSOCKET_LICENSE_FIX.md new file mode 100644 index 0000000..6567431 --- /dev/null +++ b/trading_system/WEBSOCKET_LICENSE_FIX.md @@ -0,0 +1,85 @@ +# WebSocket 许可证问题解决方案 + +## 问题描述 + +`unicorn-binance-websocket-api` 2.4.0 版本需要 LUCIT 商业许可证,导致 WebSocket 管理器无法启动。 + +## 解决方案 + +### 方案1:使用标准 WebSocket(推荐,已实现) + +系统已自动回退到使用 `python-binance` 自带的 `BinanceSocketManager`,功能不受影响。 + +**优点**: +- ✅ 无需许可证 +- ✅ 完全免费 +- ✅ 功能完整 +- ✅ 已集成在系统中 + +**缺点**: +- ⚠️ 性能略低于 Unicorn(但对大多数场景足够) + +### 方案2:降级到旧版本(可选) + +如果需要使用 Unicorn WebSocket,可以降级到不需要许可证的旧版本: + +```bash +pip uninstall unicorn-binance-websocket-api +pip install unicorn-binance-websocket-api==1.45.0 +``` + +**注意**: 旧版本可能功能较少,但不需要许可证。 + +### 方案3:获取 LUCIT 许可证(不推荐) + +如果需要使用 Unicorn WebSocket 2.4.0+ 的高级功能,可以获取 LUCIT 许可证: +- 参考: https://medium.lucit.tech/87b0088124a8 +- 需要商业许可证费用 + +## 当前实现 + +系统已实现智能回退机制: + +1. **优先尝试 Unicorn WebSocket** + - 如果可用且不需要许可证,使用 Unicorn + - 性能最优 + +2. **自动回退到标准 WebSocket** + - 如果 Unicorn 不可用或需要许可证 + - 使用 `python-binance` 的 `BinanceSocketManager` + - 功能完全兼容 + +3. **价格缓存机制** + - 无论使用哪种 WebSocket,都会维护价格缓存 + - 减少 REST API 调用 + +## 验证标准 WebSocket 是否工作 + +查看日志,应该看到: + +``` +⚠ Unicorn WebSocket管理器启动失败,将使用标准WebSocket +提示: 系统将使用python-binance的标准WebSocket,功能不受影响 +``` + +系统会继续正常运行,使用标准 WebSocket 获取实时价格数据。 + +## 性能对比 + +| 特性 | Unicorn WebSocket | 标准 WebSocket | +|------|------------------|---------------| +| 性能 | 高 | 中 | +| 许可证 | 需要(2.4.0+) | 不需要 | +| 功能 | 完整 | 完整 | +| 稳定性 | 高 | 高 | +| 推荐度 | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | + +## 结论 + +**推荐使用标准 WebSocket**(当前实现): +- ✅ 无需许可证 +- ✅ 功能完整 +- ✅ 性能足够 +- ✅ 系统已自动处理 + +系统会自动使用标准 WebSocket,无需额外配置。 diff --git a/trading_system/binance_client.py b/trading_system/binance_client.py index ffdaebe..f20e3df 100644 --- a/trading_system/binance_client.py +++ b/trading_system/binance_client.py @@ -91,10 +91,12 @@ class BinanceClient: asyncio.create_task(self.unicorn_manager.process_stream_data()) logger.info("WebSocket价格缓存已启用,将在订阅交易对后自动更新") else: - logger.warning("Unicorn WebSocket管理器启动失败,将使用标准WebSocket") + logger.warning("⚠ Unicorn WebSocket管理器启动失败,将使用标准WebSocket") + logger.info("提示: 系统将使用python-binance的标准WebSocket,功能不受影响") self.unicorn_manager = None except Exception as e: - logger.warning(f"启动Unicorn WebSocket失败: {e},将使用标准WebSocket") + logger.warning(f"⚠ 启动Unicorn WebSocket失败: {e},将使用标准WebSocket") + logger.info("提示: 系统将使用python-binance的标准WebSocket,功能不受影响") self.unicorn_manager = None # 验证API密钥权限 diff --git a/trading_system/requirements.txt b/trading_system/requirements.txt index 6153487..3c110c5 100644 --- a/trading_system/requirements.txt +++ b/trading_system/requirements.txt @@ -2,7 +2,8 @@ python-binance==1.0.19 websocket-client==1.6.1 aiohttp==3.9.1 -unicorn-binance-websocket-api==2.4.0 +# unicorn-binance-websocket-api 2.4.0需要LUCIT许可证,改用1.x版本或使用标准WebSocket +# unicorn-binance-websocket-api==1.45.0 # 可选:旧版本不需要许可证 # 数据库依赖(用于从数据库读取配置) pymysql==1.1.0 diff --git a/trading_system/unicorn_websocket.py b/trading_system/unicorn_websocket.py index cc88441..2d98737 100644 --- a/trading_system/unicorn_websocket.py +++ b/trading_system/unicorn_websocket.py @@ -5,20 +5,29 @@ import asyncio import logging from typing import Dict, List, Optional, Callable +# 尝试导入Unicorn WebSocket(可选,如果未安装或需要许可证则使用标准WebSocket) +_unicorn_available = False +BinanceWebSocketApiManager = None + try: # 新版本导入路径 from unicorn_binance_websocket_api.manager import BinanceWebSocketApiManager + _unicorn_available = True except ImportError: try: # 兼容旧版本路径 from unicorn_binance_websocket_api.unicorn_binance_websocket_api_manager import ( BinanceWebSocketApiManager, ) - except ImportError as e: # pragma: no cover - 环境缺失依赖时提示 - raise ImportError( - "缺少依赖 unicorn-binance-websocket-api,请执行 " - "'pip install unicorn-binance-websocket-api==2.4.0'" - ) from e + _unicorn_available = True + except ImportError: + # Unicorn WebSocket不可用,将使用标准WebSocket + _unicorn_available = False + BinanceWebSocketApiManager = None + except Exception: + # 其他错误(如许可证问题),也标记为不可用 + _unicorn_available = False + BinanceWebSocketApiManager = None try: from . import config @@ -46,9 +55,14 @@ class UnicornWebSocketManager: def start(self): """启动WebSocket管理器""" + # 检查Unicorn是否可用 + if not _unicorn_available or BinanceWebSocketApiManager is None: + logger.warning("Unicorn WebSocket不可用(未安装或需要许可证),将使用标准WebSocket") + return False + try: # 创建管理器 - # 注意:unicorn-binance-websocket-api 2.4.0版本不支持某些参数 + # 注意:unicorn-binance-websocket-api 2.4.0版本需要LUCIT许可证 exchange = "binance.com-futures" if not self.testnet else "binance.com-futures-testnet" # 尝试不同的初始化方式(兼容不同版本) @@ -59,12 +73,12 @@ class UnicornWebSocketManager: high_performance=True ) logger.debug("使用 high_performance=True 参数初始化成功") - except TypeError as e1: + except (TypeError, ValueError) as e1: # 方式2:只使用exchange参数 try: self.manager = BinanceWebSocketApiManager(exchange=exchange) logger.debug("使用 exchange 参数初始化成功") - except TypeError as e2: + except (TypeError, ValueError) as e2: # 方式3:使用位置参数 try: self.manager = BinanceWebSocketApiManager(exchange) @@ -75,14 +89,34 @@ class UnicornWebSocketManager: logger.error(f" 方式2错误: {e2}") logger.error(f" 方式3错误: {e3}") raise e3 + except Exception as e: + # 捕获许可证错误或其他异常 + error_msg = str(e) + if "license" in error_msg.lower() or "lucit" in error_msg.lower(): + logger.warning(f"Unicorn WebSocket需要LUCIT许可证: {e}") + logger.warning("将使用标准WebSocket作为替代方案") + return False + raise self.running = True logger.info(f"✓ Unicorn WebSocket管理器启动成功 (测试网: {self.testnet})") logger.info(f" 交易所: {exchange}") return True except Exception as e: + error_msg = str(e) + error_type = type(e).__name__ + + # 检查是否是许可证相关错误 + if "license" in error_msg.lower() or "lucit" in error_msg.lower() or "NoValidatedLucitLicense" in error_type: + logger.warning(f"Unicorn WebSocket需要LUCIT许可证: {e}") + logger.warning("将使用标准WebSocket作为替代方案") + logger.info("提示: 如果需要使用Unicorn WebSocket,请:") + logger.info(" 1. 获取LUCIT许可证: https://medium.lucit.tech/87b0088124a8") + logger.info(" 2. 或降级到旧版本: pip install unicorn-binance-websocket-api==1.45.0") + return False + logger.error(f"启动Unicorn WebSocket管理器失败: {e}") - logger.error(f"错误类型: {type(e).__name__}") + logger.error(f"错误类型: {error_type}") import traceback logger.debug(f"详细错误信息:\n{traceback.format_exc()}") return False