208 lines
5.1 KiB
Markdown
208 lines
5.1 KiB
Markdown
# 修复日志格式化错误和订单状态延迟分析
|
||
|
||
## 🐛 问题1:日志格式化错误(已修复)
|
||
|
||
### 错误信息
|
||
|
||
```
|
||
DUSKUSDT 检查止损触发条件时出错: Invalid format specifier '.8f if entry_price_val else 'N/A'' for object of type 'float'
|
||
```
|
||
|
||
### 问题原因
|
||
|
||
在 `position_manager.py` 第1203行和1220行,格式化字符串语法错误:
|
||
|
||
**错误代码**:
|
||
```python
|
||
logger.error(f" 入场价: {entry_price_val:.8f if entry_price_val else 'N/A'}")
|
||
```
|
||
|
||
**问题**:
|
||
- Python 的 f-string 不支持在格式化说明符中使用三元表达式
|
||
- 应该先判断值是否存在,然后再格式化
|
||
|
||
### 修复方案
|
||
|
||
**修复后代码**:
|
||
```python
|
||
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` 方法会立即更新数据库,但可能存在以下情况:
|
||
- 数据库连接延迟
|
||
- 事务提交延迟
|
||
- 数据库锁竞争
|
||
|
||
**检查方法**:
|
||
```bash
|
||
# 查看数据库更新日志
|
||
grep -E "更新数据库状态|数据库状态已更新" /www/wwwroot/autosys_new/logs/trading_*.log | tail -n 20
|
||
```
|
||
|
||
#### 3. 缓存未及时更新
|
||
|
||
**问题**:
|
||
- 如果使用了 Redis 缓存,缓存可能未及时更新
|
||
- 前端可能从缓存读取数据,而不是直接从数据库读取
|
||
|
||
**检查方法**:
|
||
- 检查是否有 Redis 缓存机制
|
||
- 检查缓存更新逻辑
|
||
|
||
#### 4. 平仓操作异步执行
|
||
|
||
**问题**:
|
||
- `close_position` 方法是异步的,可能在执行过程中有延迟
|
||
- WebSocket 监控触发平仓后,可能需要一些时间才能完成
|
||
|
||
**检查方法**:
|
||
```bash
|
||
# 查看平仓操作的执行时间
|
||
grep -E "开始平仓操作|平仓成功完成" /www/wwwroot/autosys_new/logs/trading_*.log | tail -n 20
|
||
```
|
||
|
||
---
|
||
|
||
## 🔍 诊断步骤
|
||
|
||
### 1. 检查数据库更新日志
|
||
|
||
```bash
|
||
# 查看最近的数据库更新记录
|
||
grep -E "更新数据库状态|数据库状态已更新" /www/wwwroot/autosys_new/logs/trading_*.log | tail -n 30
|
||
```
|
||
|
||
### 2. 检查平仓操作时间
|
||
|
||
```bash
|
||
# 查看平仓操作的开始和完成时间
|
||
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 缓存
|
||
|
||
```bash
|
||
# 如果有 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. 验证格式化错误修复
|
||
|
||
重启交易进程,确认日志格式化错误已修复:
|
||
```bash
|
||
supervisorctl restart auto_sys_acc1 auto_sys_acc2 auto_sys_acc3 auto_sys_acc4
|
||
```
|
||
|
||
### 2. 检查订单状态更新
|
||
|
||
查看最近的平仓操作和数据库更新:
|
||
```bash
|
||
# 查看最近的平仓操作
|
||
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
|