5.2 KiB
5.2 KiB
配置值格式转换修复(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)
- 兼容数据库中存储的百分比形式和比例形式
代码:
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% ✅
✅ 修复完成
修复文件:
backend/config_manager.py:配置值格式转换(核心修复)trading_system/main.py:日志输出修复trading_system/position_manager.py:移动止损和止盈计算修复trading_system/risk_manager.py:止盈价计算修复trading_system/trade_recommender.py:推荐系统止盈计算修复
下一步:
- 重启交易进程,让修复生效
- 观察日志,确认配置值显示正确
- 观察止盈单,确认止盈目标正常(30%而不是683%)
- 观察移动止损,确认在盈利30%时激活
📝 注意事项
-
兼容性:
- 修复后,系统同时支持百分比形式(30)和比例形式(0.30)
- 如果值>1,自动转换为比例形式
- 如果值<=1,直接使用
-
数据库:
- 数据库中的配置值可以保持百分比形式(30)
- 系统会自动转换,不需要修改数据库
-
前端:
- 前端显示时,需要将比例形式转换为百分比形式(乘以100)
- 前端输入时,可以输入百分比形式(30),系统会自动转换