# 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
