From 8f4938f17a58caeeaf742ffd9e0c1f081950337a Mon Sep 17 00:00:00 2001 From: aaron <> Date: Thu, 12 Feb 2026 17:39:31 +0800 Subject: [PATCH] update --- backend/app/services/paper_trading_service.py | 45 +++++++++++++++++-- 1 file changed, 42 insertions(+), 3 deletions(-) diff --git a/backend/app/services/paper_trading_service.py b/backend/app/services/paper_trading_service.py index 81a8944..bbf4da9 100644 --- a/backend/app/services/paper_trading_service.py +++ b/backend/app/services/paper_trading_service.py @@ -47,7 +47,11 @@ class PaperTradingService: PaperOrder.status.in_([OrderStatus.PENDING, OrderStatus.OPEN]) ).all() + # 使用 make_transient 将对象从会话中分离,使其成为独立对象 + from sqlalchemy.orm import make_transient for order in orders: + db.expunge(order) # 从会话中移除 + make_transient(order) # 使对象独立 self.active_orders[order.order_id] = order logger.info(f"已加载 {len(orders)} 个活跃订单") @@ -401,11 +405,29 @@ class PaperTradingService: else: current_pnl_percent = ((order.filled_price - current_price) / order.filled_price) * 100 - # 更新极值 + # 检查是否需要更新极值 + needs_update = False if current_pnl_percent > order.max_profit: order.max_profit = current_pnl_percent + needs_update = True if current_pnl_percent < order.max_drawdown: order.max_drawdown = current_pnl_percent + needs_update = True + + # 如果有更新,持久化到数据库 + if needs_update: + db = db_service.get_session() + try: + db_order = db.query(PaperOrder).filter(PaperOrder.order_id == order.order_id).first() + if db_order: + db_order.max_profit = order.max_profit + db_order.max_drawdown = order.max_drawdown + db.commit() + except Exception as e: + logger.error(f"更新订单极值失败: {e}") + db.rollback() + finally: + db.close() def close_order_manual(self, order_id: str, exit_price: float) -> Optional[Dict[str, Any]]: """手动平仓或取消挂单""" @@ -457,13 +479,30 @@ class PaperTradingService: orders = list(self.active_orders.values()) if symbol: orders = [o for o in orders if o.symbol == symbol] - return [o.to_dict() for o in orders] + + # 转换为字典,添加错误处理 + result = [] + for order in orders: + try: + result.append(order.to_dict()) + except Exception as e: + logger.error(f"转换订单 {order.order_id} 为字典失败: {e}") + import traceback + logger.error(traceback.format_exc()) + + return result def get_order_by_id(self, order_id: str) -> Optional[Dict[str, Any]]: """根据ID获取订单""" # 先从缓存查找 if order_id in self.active_orders: - return self.active_orders[order_id].to_dict() + try: + return self.active_orders[order_id].to_dict() + except Exception as e: + logger.error(f"转换订单 {order_id} 为字典失败: {e}") + import traceback + logger.error(traceback.format_exc()) + return None # 从数据库查找 db = db_service.get_session()