2.3 KiB
2.3 KiB
订单状态同步问题分析与修复
🔍 问题分析
用户反映:订单记录中的订单状态没有及时同步,明明已经平仓了,但还是显示持仓状态。
可能的原因
-
自动平仓时的双重更新问题:
_check_single_position中先更新数据库(第1926行)- 然后调用
close_position(第1943行) close_position中如果币安还有持仓,会再次更新数据库(第615行)- 但如果币安已经没有持仓了,
close_position会检查并更新(第432-492行) - 问题:如果
close_position执行时币安订单还没完全成交,可能状态不一致
-
同步间隔太长:
POSITION_SYNC_INTERVAL= 300秒(5分钟)- 如果自动平仓后数据库更新失败,需要等5分钟才能同步
-
前端没有自动刷新:
TradeList组件只在加载时获取一次数据- 没有定时刷新机制
- 用户需要手动刷新页面才能看到最新状态
-
平仓订单可能失败但数据库已更新:
- 如果先更新数据库,然后平仓订单失败,状态会不一致
🔧 修复方案
方案一:优化自动平仓流程(推荐)
问题:_check_single_position 中先更新数据库,然后调用 close_position,但 close_position 可能因为币安订单还没成交而无法正确更新。
修复:
- 在
_check_single_position中,不要先更新数据库 - 只调用
close_position,让close_position负责更新数据库 - 确保
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