3.8 KiB
3.8 KiB
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 的初始化逻辑:
修复前:
# 直接比较当前盈亏百分比与止盈目标(基于保证金)
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} 分钟") # ❌ 变量未初始化
# ...
修复后:
# 直接比较当前盈亏百分比与止盈目标(基于保证金)
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监控正常
🔄 相关代码路径
- 止损分支(第2725-2734行):已正确初始化
hold_time_minutes - 止盈分支(第2877-2907行):已修复,现在也会初始化
hold_time_minutes - 第二目标止盈分支(第2838-2846行):未使用
hold_time_minutes,无需修复
⚠️ 注意事项
- 变量作用域:
hold_time_minutes是局部变量,只在各自的代码分支内有效。 - 初始化逻辑:与止损分支的初始化逻辑保持一致,确保计算方式统一。
- 异常处理:如果计算持仓时间失败,默认设置为 0,避免程序崩溃。
🚀 部署建议
-
重启交易进程:修复后需要重启所有
trading_system进程才能生效。supervisorctl restart auto_sys_acc1 auto_sys_acc2 auto_sys_acc3 ... -
验证修复:查看日志,确认 WebSocket 监控不再出现
hold_time_minutes相关错误。
📝 相关文件
trading_system/position_manager.py:主要修复文件_check_single_position()方法(第2580-2960行)_monitor_position_price()方法(第2499-2578行)
✅ 修复完成时间
2026-01-25