69 lines
2.3 KiB
Markdown
69 lines
2.3 KiB
Markdown
# 订单状态同步问题分析与修复
|
||
|
||
## 🔍 问题分析
|
||
|
||
用户反映:订单记录中的订单状态没有及时同步,明明已经平仓了,但还是显示持仓状态。
|
||
|
||
### 可能的原因
|
||
|
||
1. **自动平仓时的双重更新问题**:
|
||
- `_check_single_position` 中先更新数据库(第1926行)
|
||
- 然后调用 `close_position`(第1943行)
|
||
- `close_position` 中如果币安还有持仓,会再次更新数据库(第615行)
|
||
- 但如果币安已经没有持仓了,`close_position` 会检查并更新(第432-492行)
|
||
- **问题**:如果 `close_position` 执行时币安订单还没完全成交,可能状态不一致
|
||
|
||
2. **同步间隔太长**:
|
||
- `POSITION_SYNC_INTERVAL` = 300秒(5分钟)
|
||
- 如果自动平仓后数据库更新失败,需要等5分钟才能同步
|
||
|
||
3. **前端没有自动刷新**:
|
||
- `TradeList` 组件只在加载时获取一次数据
|
||
- 没有定时刷新机制
|
||
- 用户需要手动刷新页面才能看到最新状态
|
||
|
||
4. **平仓订单可能失败但数据库已更新**:
|
||
- 如果先更新数据库,然后平仓订单失败,状态会不一致
|
||
|
||
## 🔧 修复方案
|
||
|
||
### 方案一:优化自动平仓流程(推荐)
|
||
|
||
**问题**:`_check_single_position` 中先更新数据库,然后调用 `close_position`,但 `close_position` 可能因为币安订单还没成交而无法正确更新。
|
||
|
||
**修复**:
|
||
1. 在 `_check_single_position` 中,不要先更新数据库
|
||
2. 只调用 `close_position`,让 `close_position` 负责更新数据库
|
||
3. 确保 `close_position` 在平仓成功后立即更新数据库
|
||
|
||
### 方案二:缩短同步间隔
|
||
|
||
**当前**:300秒(5分钟)
|
||
**建议**:60-120秒(1-2分钟)
|
||
|
||
### 方案三:前端自动刷新
|
||
|
||
**添加**:TradeList 组件定时刷新(每30秒或1分钟)
|
||
|
||
### 方案四:平仓后立即同步
|
||
|
||
**添加**:在 `close_position` 成功后,立即触发一次状态同步
|
||
|
||
## 📝 具体修改
|
||
|
||
### 1. 优化自动平仓流程
|
||
|
||
修改 `_check_single_position` 方法,移除提前更新数据库的逻辑,让 `close_position` 统一处理。
|
||
|
||
### 2. 缩短同步间隔
|
||
|
||
将 `POSITION_SYNC_INTERVAL` 从 300秒 改为 60秒(1分钟)
|
||
|
||
### 3. 前端自动刷新
|
||
|
||
在 `TradeList` 组件中添加定时刷新机制
|
||
|
||
### 4. 平仓后立即同步
|
||
|
||
在 `close_position` 成功后,立即调用 `sync_positions_with_binance`
|