auto_trade_sys/docs/修复日志格式化错误和订单状态延迟分析.md
薇薇安 86b85c2609 a
2026-01-25 11:19:39 +08:00

5.1 KiB
Raw Blame History

修复日志格式化错误和订单状态延迟分析

🐛 问题1日志格式化错误已修复

错误信息

DUSKUSDT 检查止损触发条件时出错: Invalid format specifier '.8f if entry_price_val else 'N/A'' for object of type 'float'

问题原因

position_manager.py 第1203行和1220行格式化字符串语法错误

错误代码

logger.error(f"  入场价: {entry_price_val:.8f if entry_price_val else 'N/A'}")

问题

  • Python 的 f-string 不支持在格式化说明符中使用三元表达式
  • 应该先判断值是否存在,然后再格式化

修复方案

修复后代码

entry_price_str = f"{entry_price_val:.8f}" if entry_price_val is not None else 'N/A'
logger.error(f"  入场价: {entry_price_str}")

修复位置

  • trading_system/position_manager.py 第1203行做多止损
  • trading_system/position_manager.py 第1220行做空止损

⏱️ 问题2订单状态延迟

问题描述

订单记录的状态有很大延迟,平仓后前端显示的状态没有及时更新。

可能原因

1. 前端轮询间隔过长

问题

  • 前端可能使用定时轮询如每30秒或1分钟获取订单状态
  • 如果轮询间隔过长,会导致状态更新延迟

检查方法

  • 查看前端代码中的 API 调用频率
  • 检查是否有实时推送机制WebSocket

2. 数据库更新延迟

问题

  • 虽然 close_position 方法会立即更新数据库,但可能存在以下情况:
    • 数据库连接延迟
    • 事务提交延迟
    • 数据库锁竞争

检查方法

# 查看数据库更新日志
grep -E "更新数据库状态|数据库状态已更新" /www/wwwroot/autosys_new/logs/trading_*.log | tail -n 20

3. 缓存未及时更新

问题

  • 如果使用了 Redis 缓存,缓存可能未及时更新
  • 前端可能从缓存读取数据,而不是直接从数据库读取

检查方法

  • 检查是否有 Redis 缓存机制
  • 检查缓存更新逻辑

4. 平仓操作异步执行

问题

  • close_position 方法是异步的,可能在执行过程中有延迟
  • WebSocket 监控触发平仓后,可能需要一些时间才能完成

检查方法

# 查看平仓操作的执行时间
grep -E "开始平仓操作|平仓成功完成" /www/wwwroot/autosys_new/logs/trading_*.log | tail -n 20

🔍 诊断步骤

1. 检查数据库更新日志

# 查看最近的数据库更新记录
grep -E "更新数据库状态|数据库状态已更新" /www/wwwroot/autosys_new/logs/trading_*.log | tail -n 30

2. 检查平仓操作时间

# 查看平仓操作的开始和完成时间
grep -E "开始平仓操作|平仓成功完成|平仓订单已提交" /www/wwwroot/autosys_new/logs/trading_*.log | tail -n 30

3. 检查前端轮询频率

查看前端代码中的 API 调用频率:

  • frontend/src/services/api.js - 检查 API 调用间隔
  • frontend/src/components/TradeList.jsx - 检查订单列表刷新频率

4. 检查 Redis 缓存

# 如果有 Redis检查缓存更新
redis-cli keys "*trade*" | head -n 10

修复方案

方案1优化前端轮询频率推荐

问题:前端轮询间隔过长

解决

  1. 减少轮询间隔如从30秒改为5秒
  2. 实现实时推送机制WebSocket
  3. 在平仓操作后立即刷新订单列表

方案2优化数据库更新

问题:数据库更新延迟

解决

  1. 确保数据库更新是同步的(等待更新完成)
  2. 添加数据库更新确认日志
  3. 检查数据库连接池配置

方案3添加实时推送

问题:前端依赖轮询

解决

  1. 实现 WebSocket 实时推送订单状态更新
  2. 在平仓操作完成后立即推送状态更新
  3. 前端监听推送消息并更新 UI

🎯 立即行动

1. 验证格式化错误修复

重启交易进程,确认日志格式化错误已修复:

supervisorctl restart auto_sys_acc1 auto_sys_acc2 auto_sys_acc3 auto_sys_acc4

2. 检查订单状态更新

查看最近的平仓操作和数据库更新:

# 查看最近的平仓操作
grep -E "开始平仓操作|数据库状态已更新" /www/wwwroot/autosys_new/logs/trading_*.log | tail -n 20

3. 检查前端轮询频率

查看前端代码,确认订单列表的刷新频率。


📊 关于 DUSKUSDT 止损价问题

日志显示的问题

DUSKUSDT ⚠️ 当前价格(0.18064246)已触发止损价(0.16414860)

分析

  • 做空SELL交易
  • 当前价0.1806
  • 止损价0.1641 错误!

问题

  • 做空时,止损价应该高于入场价(价格上涨触发止损)
  • 但止损价0.1641 < 当前价0.1806,说明止损价设置错误
  • 这可能是在修复止损价选择逻辑之前设置的止损价

建议

  1. 立即手动平仓 DUSKUSDT止损价设置错误
  2. 重启交易进程,确保新的止损价计算逻辑生效
  3. 检查其他做空持仓的止损价是否正确

完成时间

2026-01-25