106 lines
3.2 KiB
Python
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()
|