# 配置值格式转换修复(2026-01-26) ## 🚨 问题描述 ### 问题1:配置值格式不一致 **数据库中的配置值**(百分比形式): - `TRAILING_STOP_ACTIVATION` = 30(表示30%) - `TRAILING_STOP_PROTECT` = 15(表示15%) - `MIN_VOLATILITY` = 3(表示3%) **代码期望的格式**(比例形式): - `TRAILING_STOP_ACTIVATION` = 0.30(表示30%) - `TRAILING_STOP_PROTECT` = 0.15(表示15%) - `MIN_VOLATILITY` = 0.03(表示3%) **问题**: - 如果数据库中存储的是百分比形式(30),代码中 `trailing_activation * 100` 会变成 `30 * 100 = 3000` - 导致移动止损永远不会激活(需要盈利3000%才激活) - 导致止盈价计算错误(止盈目标显示为683.17%等异常值) ### 问题2:止盈价计算错误 **日志显示**: - AUCTIONUSDT 盈利30.52%,但止盈目标是**683.17%** - ROSEUSDT 盈利30.12%,但止盈目标是**306.38%** - AXSUSDT 盈利80.86%,但止盈目标是**470.29%** **原因**: - 如果 `TAKE_PROFIT_PERCENT = 30`(百分比形式),那么 `margin * 30 = 30倍保证金` - 导致止盈价计算错误,止盈目标异常高 --- ## 🔧 修复方案 ### 修复1:配置值格式转换(backend/config_manager.py) **位置**:`backend/config_manager.py:720-733` **修复**: - 在 `eff_get()` 函数中添加格式转换逻辑 - 如果配置值是百分比形式(>1),自动转换为比例形式(除以100) - 兼容数据库中存储的百分比形式和比例形式 **代码**: ```python def eff_get(key: str, default: Any): # ... 读取配置值 ... # ⚠️ 关键修复:百分比配置值格式转换 if isinstance(value, (int, float)) and value is not None: percent_keys = [ 'TRAILING_STOP_ACTIVATION', 'TRAILING_STOP_PROTECT', 'MIN_VOLATILITY', 'TAKE_PROFIT_PERCENT', 'STOP_LOSS_PERCENT', # ... 其他百分比配置项 ... ] if key in percent_keys: # 如果值>1,认为是百分比形式,转换为比例形式 if value > 1: value = value / 100.0 logger.debug(f"配置值格式转换: {key} = {value*100:.2f}%") return value ``` ### 修复2:日志输出修复(trading_system/main.py) **位置**:`trading_system/main.py:344-347, 355` **修复**: - 修复移动止损激活条件和保护利润的显示 - 修复最小波动率的显示 - 确保配置值格式正确后再显示 ### 修复3:移动止损逻辑修复(trading_system/position_manager.py) **位置**:`trading_system/position_manager.py:1442-1447` **修复**: - 在使用移动止损配置值前,检查并转换格式 - 确保移动止损能正确激活 ### 修复4:止盈价计算修复(trading_system/risk_manager.py) **位置**:`trading_system/risk_manager.py:814-820` **修复**: - 在使用 `TAKE_PROFIT_PERCENT` 前,检查并转换格式 - 确保止盈价计算正确 ### 修复5:开仓时止盈计算修复(trading_system/position_manager.py) **位置**:`trading_system/position_manager.py:512-515` **修复**: - 在使用 `TAKE_PROFIT_PERCENT` 前,检查并转换格式 - 确保开仓时止盈价计算正确 ### 修复6:推荐系统止盈计算修复(trading_system/trade_recommender.py) **位置**:`trading_system/trade_recommender.py:455-460` **修复**: - 在使用 `TAKE_PROFIT_PERCENT` 前,检查并转换格式 - 确保推荐系统止盈价计算正确 --- ## 📊 修复效果 ### 修复前 **配置值**: - `TRAILING_STOP_ACTIVATION` = 30(百分比形式) - 代码中 `30 * 100 = 3000`,移动止损永远不会激活 **止盈价**: - `TAKE_PROFIT_PERCENT` = 30(百分比形式) - `margin * 30 = 30倍保证金`,止盈目标显示为683.17%等异常值 ### 修复后 **配置值**: - `TRAILING_STOP_ACTIVATION` = 30 → 自动转换为 0.30(比例形式) - 代码中 `0.30 * 100 = 30`,移动止损在盈利30%时激活 ✅ **止盈价**: - `TAKE_PROFIT_PERCENT` = 30 → 自动转换为 0.30(比例形式) - `margin * 0.30 = 30%保证金`,止盈目标显示为30% ✅ --- ## ✅ 修复完成 **修复文件**: 1. `backend/config_manager.py`:配置值格式转换(核心修复) 2. `trading_system/main.py`:日志输出修复 3. `trading_system/position_manager.py`:移动止损和止盈计算修复 4. `trading_system/risk_manager.py`:止盈价计算修复 5. `trading_system/trade_recommender.py`:推荐系统止盈计算修复 **下一步**: 1. 重启交易进程,让修复生效 2. 观察日志,确认配置值显示正确 3. 观察止盈单,确认止盈目标正常(30%而不是683%) 4. 观察移动止损,确认在盈利30%时激活 --- ## 📝 注意事项 1. **兼容性**: - 修复后,系统同时支持百分比形式(30)和比例形式(0.30) - 如果值>1,自动转换为比例形式 - 如果值<=1,直接使用 2. **数据库**: - 数据库中的配置值可以保持百分比形式(30) - 系统会自动转换,不需要修改数据库 3. **前端**: - 前端显示时,需要将比例形式转换为百分比形式(乘以100) - 前端输入时,可以输入百分比形式(30),系统会自动转换