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