2.9 KiB
2.9 KiB
异常订单检查工具
用于检查和修复数据库中导致错误平仓消息的异常订单。
问题原因
根据之前的分析,"莫名其妙出现的平仓消息"通常是由以下异常订单导致的:
- OPEN 状态但成交价为 0 的订单:这些订单被系统认为是"已成交"但价格无效,导致平仓计算时显示
$0.00 - PENDING 状态但有成交价的订单:状态不一致,可能导致重复处理
使用方法
方法 1: Python 脚本(推荐)
在服务器上执行:
cd /path/to/Stock_Agent/backend
# 检查异常订单(不会修改数据)
python3 check_abnormal_orders.py
# 自动修复异常订单(会删除/修改数据,需要确认)
python3 fix_abnormal_orders.py
方法 2: SQL 查询
如果有 SQLite 命令行工具:
cd /path/to/Stock_Agent/backend
# 需要先确认数据库路径
sqlite3 /path/to/your/database.db < check_abnormal_orders.sql
或者直接进入 SQLite:
sqlite3 /path/to/your/database.db
# 然后复制粘贴 check_abnormal_orders.sql 中的查询语句
方法 3: Bash 脚本
cd /path/to/Stock_Agent/backend
# 需要指定数据库路径
./check_orders.sh /path/to/your/database.db
检查结果说明
脚本会检查以下问题:
| 问题 | 说明 | 影响 |
|---|---|---|
| OPEN 状态但成交价无效 | 订单已成交但 filled_price 为 0 或 NULL |
可能导致 $0.00 平仓消息 |
| PENDING 状态但有成交价 | 状态应该是 OPEN 但实际是 PENDING | 状态不一致 |
| 平仓订单价格异常 | 出场价或成交价为 0 | 历史记录错误 |
| 重复订单 | 同一交易对短时间内创建多个订单 | 可能是重复信号 |
修复操作
确认有异常订单后,可以:
- 手动删除异常订单(最安全):
-- 删除 OPEN 状态但成交价无效的订单
DELETE FROM paper_orders
WHERE status = 'OPEN'
AND (filled_price IS NULL OR filled_price = 0);
- 使用 Python 自动修复:
python3 fix_abnormal_orders.py
# 脚本会要求确认,输入 yes 确认删除/修复
- 重启服务(推荐):
修复后重启服务,让系统重新加载正确的活跃订单:
# 重启 FastAPI 服务
systemctl restart stock-agent # 或你的服务名称
防止再次出现
代码中已添加防御性检查(在 paper_trading_service.py 中):
_load_active_orders()会跳过异常订单_check_order_trigger()会检查成交价有效性_close_order()会防止无效订单平仓
但建议定期运行检查脚本,确保数据库状态正常。
紧急处理
如果正在出现大量错误消息,可以:
- 临时停止服务:
systemctl stop stock-agent
- 运行检查和修复:
python3 check_abnormal_orders.py
python3 fix_abnormal_orders.py
- 重启服务:
systemctl start stock-agent