stock-ai-agent/backend/fix_abnormal_orders.py
2026-02-21 19:39:19 +08:00

106 lines
3.2 KiB
Python

#!/usr/bin/env python3
"""
自动修复数据库中的异常订单
"""
import sys
import os
# 添加项目路径
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from app.services.db_service import db_service
from app.models.paper_trading import PaperOrder, OrderStatus
from datetime import datetime
def fix_abnormal_orders():
"""修复异常订单"""
db = db_service.get_session()
print("=" * 80)
print("异常订单自动修复")
print("=" * 80)
print()
fixed_count = 0
# 1. 删除 OPEN 状态但 filled_price 为 0 或 None 的订单
print("【1】清理 OPEN 状态但成交价无效的订单...")
invalid_orders = db.query(PaperOrder).filter(
PaperOrder.status == OrderStatus.OPEN,
(PaperOrder.filled_price == None) | (PaperOrder.filled_price == 0)
).all()
if invalid_orders:
print(f" 发现 {len(invalid_orders)} 个异常订单:")
for order in invalid_orders:
print(f" - {order.order_id} | {order.symbol} | {order.side.value} | 成交价: {order.filled_price}")
# 确认删除
confirm = input("\n 确认删除这些订单? (yes/no): ")
if confirm.lower() == 'yes':
for order in invalid_orders:
db.delete(order)
fixed_count += 1
db.commit()
print(f" ✅ 已删除 {len(invalid_orders)} 个异常订单")
else:
print(" ⏭️ 跳过删除")
else:
print(" ✅ 无异常订单")
print()
# 2. 修复 PENDING 状态但有成交价的订单
print("【2】修复 PENDING 状态但有成交价的订单...")
pending_orders = db.query(PaperOrder).filter(
PaperOrder.status == OrderStatus.PENDING,
PaperOrder.filled_price != None,
PaperOrder.filled_price > 0
).all()
if pending_orders:
print(f" 发现 {len(pending_orders)} 个状态不一致的订单:")
for order in pending_orders:
print(f" - {order.order_id} | {order.symbol} | 状态: PENDING → OPEN")
confirm = input("\n 确认修复这些订单? (yes/no): ")
if confirm.lower() == 'yes':
for order in pending_orders:
order.status = OrderStatus.OPEN
fixed_count += 1
db.commit()
print(f" ✅ 已修复 {len(pending_orders)} 个订单")
else:
print(" ⏭️ 跳过修复")
else:
print(" ✅ 无异常订单")
print()
# 3. 删除无用的测试数据(可选)
print("【3】检查是否有测试数据需要清理...")
test_orders = db.query(PaperOrder).filter(
PaperOrder.symbol.like('%TEST%')
).count()
if test_orders > 0:
print(f" 发现 {test_orders} 个测试订单")
confirm = input(" 是否删除测试数据? (yes/no): ")
if confirm.lower() == 'yes':
db.execute("DELETE FROM paper_orders WHERE symbol LIKE '%TEST%'")
db.commit()
print(f" ✅ 已删除测试数据")
else:
print(" ✅ 无测试数据")
print()
print("=" * 80)
print(f"修复完成!共处理 {fixed_count} 个异常订单")
print("=" * 80)
db.close()
if __name__ == "__main__":
fix_abnormal_orders()