169 lines
5.2 KiB
Markdown
169 lines
5.2 KiB
Markdown
# 配置值格式转换修复(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),系统会自动转换
|