125 lines
2.9 KiB
Markdown
125 lines
2.9 KiB
Markdown
# 异常订单检查工具
|
||
|
||
用于检查和修复数据库中导致错误平仓消息的异常订单。
|
||
|
||
## 问题原因
|
||
|
||
根据之前的分析,"莫名其妙出现的平仓消息"通常是由以下异常订单导致的:
|
||
|
||
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
|
||
```
|