# WebSocket 迁移方案 ## 当前问题分析 ### REST API 调用频率 1. **价格查询** (`get_ticker_24h`): 每个交易对每次扫描都调用 2. **K线数据** (`get_klines`): 技术分析时频繁调用 3. **账户余额** (`get_account_balance`): 风险检查时调用 4. **持仓信息** (`get_open_positions`): 持仓管理时调用 ### 已实现的优化 - ✅ 批量获取所有ticker (`get_all_tickers_24h`) - ✅ API请求限流 (`_rate_limited_request`) - ✅ 并发控制 (`asyncio.Semaphore`) - ✅ Unicorn WebSocket 基础框架已集成 ### 仍存在的问题 - ❌ 价格数据仍主要使用REST API - ❌ K线数据仍使用REST API轮询 - ❌ 账户数据使用REST API - ❌ 持仓数据使用REST API ## WebSocket 优势 1. **不占用REST API配额** - WebSocket流独立于REST API限流 - 可以实时接收数据,无需轮询 2. **更低延迟** - 数据推送,无需等待HTTP请求 - 实时性更好 3. **更高效率** - 一次订阅,持续接收 - 减少网络开销 4. **避免限流** - 不会触发 `-1003` 错误(请求过多) ## 迁移方案 ### 阶段1:价格数据 WebSocket 化(推荐优先实施) **影响范围**: - `market_scanner.py`: `_get_symbol_change()` 中的 `get_ticker_24h()` - `position_manager.py`: 持仓监控中的价格查询 - `risk_manager.py`: 风险计算中的价格查询 **实现难度**:⭐⭐ (简单) - 已有 `UnicornWebSocketManager` 基础 - 只需订阅ticker流并缓存价格 **效果**: - 减少 80%+ 的REST API调用 - 价格数据实时性提升 ### 阶段2:K线数据 WebSocket 化 **影响范围**: - `market_scanner.py`: `_get_symbol_change()` 中的 `get_klines()` - `indicators.py`: 技术指标计算 **实现难度**:⭐⭐⭐ (中等) - 需要订阅K线流 - 需要维护K线数据缓存 - 需要处理K线更新逻辑 **效果**: - 减少K线数据相关的REST API调用 - K线数据实时更新 ### 阶段3:账户数据 WebSocket 化(可选) **影响范围**: - `risk_manager.py`: 账户余额查询 - `position_manager.py`: 账户余额查询 **实现难度**:⭐⭐⭐⭐ (较复杂) - 需要实现User Data Stream - 需要HMAC签名 - 需要处理账户更新事件 **效果**: - 账户数据实时更新 - 减少账户查询API调用 ## 实施建议 ### 推荐方案:阶段1(价格数据WebSocket化) **原因**: 1. 实现简单,风险低 2. 效果显著,能解决大部分限流问题 3. 已有基础框架支持 **实施步骤**: 1. 在系统启动时订阅所有USDT交易对的ticker流 2. 维护价格缓存字典 3. 修改价格查询方法,优先从缓存读取 4. 保留REST API作为fallback ### 不推荐立即实施阶段3 **原因**: 1. 实现复杂,需要处理签名和事件 2. 账户数据更新频率相对较低 3. 风险较高,可能影响交易逻辑 ## 预期效果 ### 阶段1实施后 - REST API调用减少:**80-90%** - 价格数据延迟:**<100ms** (vs 500-1000ms) - 限流风险:**大幅降低** - 系统稳定性:**显著提升** ### 代码改动量 - 新增代码:~200行 - 修改代码:~100行 - 测试工作量:中等 ## 风险评估 ### 低风险 - ✅ 价格数据WebSocket化(已有fallback机制) - ✅ 不影响交易逻辑 ### 中风险 - ⚠️ K线数据WebSocket化(需要处理数据一致性) - ⚠️ 需要处理WebSocket断线重连 ### 高风险 - ❌ 账户数据WebSocket化(可能影响交易决策) ## 结论 **建议优先实施阶段1(价格数据WebSocket化)**: - ✅ 实现简单,风险低 - ✅ 效果显著 - ✅ 可以快速解决限流问题 - ✅ 为后续优化打下基础 **不建议立即实施阶段3**: - ❌ 复杂度高 - ❌ 风险大 - ❌ 收益相对有限