This commit is contained in:
aaron 2026-02-12 17:39:31 +08:00
parent d16c5562de
commit 8f4938f17a

View File

@ -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()