104 lines
3.8 KiB
Markdown
104 lines
3.8 KiB
Markdown
# WebSocket监控 hold_time_minutes 变量未初始化修复
|
||
|
||
## 🔍 问题描述
|
||
|
||
**错误信息**:
|
||
```
|
||
trading_system.position_manager - WARNING - FLUIDUSDT WebSocket监控出错 (重试 1/5):
|
||
cannot access local variable 'hold_time_minutes' where it is not associated with a value
|
||
```
|
||
|
||
**问题根源**:
|
||
在 `_check_single_position()` 方法中,`hold_time_minutes` 变量只在**止损分支**(第2725-2734行)中被初始化,但在**止盈分支**(第2889行)中也被使用。当代码走止盈路径时,变量未被初始化,导致 `UnboundLocalError`。
|
||
|
||
## ✅ 修复方案
|
||
|
||
### 修复位置
|
||
`trading_system/position_manager.py` 的 `_check_single_position()` 方法
|
||
|
||
### 修复内容
|
||
|
||
在止盈分支(第2877行之后)中,添加 `hold_time_minutes` 的初始化逻辑:
|
||
|
||
**修复前**:
|
||
```python
|
||
# 直接比较当前盈亏百分比与止盈目标(基于保证金)
|
||
if pnl_percent_margin >= take_profit_pct_margin:
|
||
should_close = True
|
||
exit_reason = 'take_profit'
|
||
|
||
# 详细诊断日志:记录平仓时的所有关键信息
|
||
logger.info("=" * 80)
|
||
logger.info(f"{symbol} [实时监控-平仓诊断日志] ===== 触发止盈平仓 =====")
|
||
# ...
|
||
logger.info(f" 持仓时间: {hold_time_minutes:.1f} 分钟") # ❌ 变量未初始化
|
||
# ...
|
||
```
|
||
|
||
**修复后**:
|
||
```python
|
||
# 直接比较当前盈亏百分比与止盈目标(基于保证金)
|
||
if pnl_percent_margin >= take_profit_pct_margin:
|
||
should_close = True
|
||
exit_reason = 'take_profit'
|
||
|
||
# 计算持仓时间(用于日志)
|
||
entry_time = position_info.get('entryTime')
|
||
hold_time_minutes = 0
|
||
if entry_time:
|
||
try:
|
||
if isinstance(entry_time, datetime):
|
||
hold_time_sec = int((get_beijing_time() - entry_time).total_seconds())
|
||
else:
|
||
hold_time_sec = int(time.time() - (float(entry_time) if isinstance(entry_time, (int, float)) else 0))
|
||
hold_time_minutes = hold_time_sec / 60.0
|
||
except Exception:
|
||
hold_time_minutes = 0
|
||
|
||
# 详细诊断日志:记录平仓时的所有关键信息
|
||
logger.info("=" * 80)
|
||
logger.info(f"{symbol} [实时监控-平仓诊断日志] ===== 触发止盈平仓 =====")
|
||
# ...
|
||
logger.info(f" 持仓时间: {hold_time_minutes:.1f} 分钟") # ✅ 变量已初始化
|
||
# ...
|
||
```
|
||
|
||
## 📊 修复效果
|
||
|
||
### 修复前
|
||
- ❌ 止盈触发时 → 尝试使用 `hold_time_minutes` → `UnboundLocalError` → WebSocket监控出错 → 重试
|
||
|
||
### 修复后
|
||
- ✅ 止盈触发时 → `hold_time_minutes` 已初始化 → 正常记录日志 → WebSocket监控正常
|
||
|
||
## 🔄 相关代码路径
|
||
|
||
1. **止损分支**(第2725-2734行):已正确初始化 `hold_time_minutes`
|
||
2. **止盈分支**(第2877-2907行):**已修复**,现在也会初始化 `hold_time_minutes`
|
||
3. **第二目标止盈分支**(第2838-2846行):未使用 `hold_time_minutes`,无需修复
|
||
|
||
## ⚠️ 注意事项
|
||
|
||
1. **变量作用域**:`hold_time_minutes` 是局部变量,只在各自的代码分支内有效。
|
||
2. **初始化逻辑**:与止损分支的初始化逻辑保持一致,确保计算方式统一。
|
||
3. **异常处理**:如果计算持仓时间失败,默认设置为 0,避免程序崩溃。
|
||
|
||
## 🚀 部署建议
|
||
|
||
1. **重启交易进程**:修复后需要重启所有 `trading_system` 进程才能生效。
|
||
```bash
|
||
supervisorctl restart auto_sys_acc1 auto_sys_acc2 auto_sys_acc3 ...
|
||
```
|
||
|
||
2. **验证修复**:查看日志,确认 WebSocket 监控不再出现 `hold_time_minutes` 相关错误。
|
||
|
||
## 📝 相关文件
|
||
|
||
- `trading_system/position_manager.py`:主要修复文件
|
||
- `_check_single_position()` 方法(第2580-2960行)
|
||
- `_monitor_position_price()` 方法(第2499-2578行)
|
||
|
||
## ✅ 修复完成时间
|
||
|
||
2026-01-25
|