a
This commit is contained in:
parent
0fc718dbe3
commit
0379fdf123
85
trading_system/WEBSOCKET_LICENSE_FIX.md
Normal file
85
trading_system/WEBSOCKET_LICENSE_FIX.md
Normal file
|
|
@ -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,无需额外配置。
|
||||||
|
|
@ -91,10 +91,12 @@ class BinanceClient:
|
||||||
asyncio.create_task(self.unicorn_manager.process_stream_data())
|
asyncio.create_task(self.unicorn_manager.process_stream_data())
|
||||||
logger.info("WebSocket价格缓存已启用,将在订阅交易对后自动更新")
|
logger.info("WebSocket价格缓存已启用,将在订阅交易对后自动更新")
|
||||||
else:
|
else:
|
||||||
logger.warning("Unicorn WebSocket管理器启动失败,将使用标准WebSocket")
|
logger.warning("⚠ Unicorn WebSocket管理器启动失败,将使用标准WebSocket")
|
||||||
|
logger.info("提示: 系统将使用python-binance的标准WebSocket,功能不受影响")
|
||||||
self.unicorn_manager = None
|
self.unicorn_manager = None
|
||||||
except Exception as e:
|
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
|
self.unicorn_manager = None
|
||||||
|
|
||||||
# 验证API密钥权限
|
# 验证API密钥权限
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,8 @@
|
||||||
python-binance==1.0.19
|
python-binance==1.0.19
|
||||||
websocket-client==1.6.1
|
websocket-client==1.6.1
|
||||||
aiohttp==3.9.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
|
pymysql==1.1.0
|
||||||
|
|
|
||||||
|
|
@ -5,20 +5,29 @@ import asyncio
|
||||||
import logging
|
import logging
|
||||||
from typing import Dict, List, Optional, Callable
|
from typing import Dict, List, Optional, Callable
|
||||||
|
|
||||||
|
# 尝试导入Unicorn WebSocket(可选,如果未安装或需要许可证则使用标准WebSocket)
|
||||||
|
_unicorn_available = False
|
||||||
|
BinanceWebSocketApiManager = None
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# 新版本导入路径
|
# 新版本导入路径
|
||||||
from unicorn_binance_websocket_api.manager import BinanceWebSocketApiManager
|
from unicorn_binance_websocket_api.manager import BinanceWebSocketApiManager
|
||||||
|
_unicorn_available = True
|
||||||
except ImportError:
|
except ImportError:
|
||||||
try:
|
try:
|
||||||
# 兼容旧版本路径
|
# 兼容旧版本路径
|
||||||
from unicorn_binance_websocket_api.unicorn_binance_websocket_api_manager import (
|
from unicorn_binance_websocket_api.unicorn_binance_websocket_api_manager import (
|
||||||
BinanceWebSocketApiManager,
|
BinanceWebSocketApiManager,
|
||||||
)
|
)
|
||||||
except ImportError as e: # pragma: no cover - 环境缺失依赖时提示
|
_unicorn_available = True
|
||||||
raise ImportError(
|
except ImportError:
|
||||||
"缺少依赖 unicorn-binance-websocket-api,请执行 "
|
# Unicorn WebSocket不可用,将使用标准WebSocket
|
||||||
"'pip install unicorn-binance-websocket-api==2.4.0'"
|
_unicorn_available = False
|
||||||
) from e
|
BinanceWebSocketApiManager = None
|
||||||
|
except Exception:
|
||||||
|
# 其他错误(如许可证问题),也标记为不可用
|
||||||
|
_unicorn_available = False
|
||||||
|
BinanceWebSocketApiManager = None
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from . import config
|
from . import config
|
||||||
|
|
@ -46,9 +55,14 @@ class UnicornWebSocketManager:
|
||||||
|
|
||||||
def start(self):
|
def start(self):
|
||||||
"""启动WebSocket管理器"""
|
"""启动WebSocket管理器"""
|
||||||
|
# 检查Unicorn是否可用
|
||||||
|
if not _unicorn_available or BinanceWebSocketApiManager is None:
|
||||||
|
logger.warning("Unicorn WebSocket不可用(未安装或需要许可证),将使用标准WebSocket")
|
||||||
|
return False
|
||||||
|
|
||||||
try:
|
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"
|
exchange = "binance.com-futures" if not self.testnet else "binance.com-futures-testnet"
|
||||||
|
|
||||||
# 尝试不同的初始化方式(兼容不同版本)
|
# 尝试不同的初始化方式(兼容不同版本)
|
||||||
|
|
@ -59,12 +73,12 @@ class UnicornWebSocketManager:
|
||||||
high_performance=True
|
high_performance=True
|
||||||
)
|
)
|
||||||
logger.debug("使用 high_performance=True 参数初始化成功")
|
logger.debug("使用 high_performance=True 参数初始化成功")
|
||||||
except TypeError as e1:
|
except (TypeError, ValueError) as e1:
|
||||||
# 方式2:只使用exchange参数
|
# 方式2:只使用exchange参数
|
||||||
try:
|
try:
|
||||||
self.manager = BinanceWebSocketApiManager(exchange=exchange)
|
self.manager = BinanceWebSocketApiManager(exchange=exchange)
|
||||||
logger.debug("使用 exchange 参数初始化成功")
|
logger.debug("使用 exchange 参数初始化成功")
|
||||||
except TypeError as e2:
|
except (TypeError, ValueError) as e2:
|
||||||
# 方式3:使用位置参数
|
# 方式3:使用位置参数
|
||||||
try:
|
try:
|
||||||
self.manager = BinanceWebSocketApiManager(exchange)
|
self.manager = BinanceWebSocketApiManager(exchange)
|
||||||
|
|
@ -75,14 +89,34 @@ class UnicornWebSocketManager:
|
||||||
logger.error(f" 方式2错误: {e2}")
|
logger.error(f" 方式2错误: {e2}")
|
||||||
logger.error(f" 方式3错误: {e3}")
|
logger.error(f" 方式3错误: {e3}")
|
||||||
raise 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
|
self.running = True
|
||||||
logger.info(f"✓ Unicorn WebSocket管理器启动成功 (测试网: {self.testnet})")
|
logger.info(f"✓ Unicorn WebSocket管理器启动成功 (测试网: {self.testnet})")
|
||||||
logger.info(f" 交易所: {exchange}")
|
logger.info(f" 交易所: {exchange}")
|
||||||
return True
|
return True
|
||||||
except Exception as e:
|
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"启动Unicorn WebSocket管理器失败: {e}")
|
||||||
logger.error(f"错误类型: {type(e).__name__}")
|
logger.error(f"错误类型: {error_type}")
|
||||||
import traceback
|
import traceback
|
||||||
logger.debug(f"详细错误信息:\n{traceback.format_exc()}")
|
logger.debug(f"详细错误信息:\n{traceback.format_exc()}")
|
||||||
return False
|
return False
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user