5.1 KiB
5.1 KiB
修复日志格式化错误和订单状态延迟分析
🐛 问题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:优化前端轮询频率(推荐)
问题:前端轮询间隔过长
解决:
- 减少轮询间隔(如从30秒改为5秒)
- 实现实时推送机制(WebSocket)
- 在平仓操作后立即刷新订单列表
方案2:优化数据库更新
问题:数据库更新延迟
解决:
- 确保数据库更新是同步的(等待更新完成)
- 添加数据库更新确认日志
- 检查数据库连接池配置
方案3:添加实时推送
问题:前端依赖轮询
解决:
- 实现 WebSocket 实时推送订单状态更新
- 在平仓操作完成后立即推送状态更新
- 前端监听推送消息并更新 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,说明止损价设置错误
- 这可能是在修复止损价选择逻辑之前设置的止损价
建议:
- 立即手动平仓 DUSKUSDT(止损价设置错误)
- 重启交易进程,确保新的止损价计算逻辑生效
- 检查其他做空持仓的止损价是否正确
✅ 完成时间
2026-01-25