This commit is contained in:
aaron 2026-02-10 23:30:28 +08:00
parent 6739e0124f
commit 1c10361a55

View File

@ -254,12 +254,24 @@ class PaperTradingService:
""" """
db = db_service.get_session() db = db_service.get_session()
try: try:
# 从数据库重新查询订单,确保在当前会话中
db_order = db.query(PaperOrder).filter(PaperOrder.order_id == order.order_id).first()
if not db_order:
logger.error(f"数据库中未找到订单: {order.order_id}")
return None
# 更新订单状态
db_order.status = OrderStatus.OPEN
db_order.filled_price = filled_price
db_order.opened_at = datetime.utcnow()
db.commit()
db.refresh(db_order)
# 同步更新内存缓存
order.status = OrderStatus.OPEN order.status = OrderStatus.OPEN
order.filled_price = filled_price order.filled_price = filled_price
order.opened_at = datetime.utcnow() order.opened_at = db_order.opened_at
db.merge(order)
db.commit()
logger.info(f"挂单已激活: {order.order_id} | {order.symbol} {order.side.value} @ ${filled_price:,.2f}") logger.info(f"挂单已激活: {order.order_id} | {order.symbol} {order.side.value} @ ${filled_price:,.2f}")
@ -278,6 +290,8 @@ class PaperTradingService:
} }
except Exception as e: except Exception as e:
logger.error(f"激活挂单失败: {e}") logger.error(f"激活挂单失败: {e}")
import traceback
logger.error(traceback.format_exc())
db.rollback() db.rollback()
return None return None
finally: finally:
@ -319,53 +333,61 @@ class PaperTradingService:
"""平仓并计算盈亏""" """平仓并计算盈亏"""
db = db_service.get_session() db = db_service.get_session()
try: try:
# 计算盈亏 # 从数据库重新查询订单,确保在当前会话中
if order.side == OrderSide.LONG: db_order = db.query(PaperOrder).filter(PaperOrder.order_id == order.order_id).first()
pnl_percent = ((exit_price - order.filled_price) / order.filled_price) * 100 if not db_order:
else: logger.error(f"数据库中未找到订单: {order.order_id}")
pnl_percent = ((order.filled_price - exit_price) / order.filled_price) * 100 return None
pnl_amount = order.quantity * pnl_percent / 100 # 计算盈亏
if db_order.side == OrderSide.LONG:
pnl_percent = ((exit_price - db_order.filled_price) / db_order.filled_price) * 100
else:
pnl_percent = ((db_order.filled_price - exit_price) / db_order.filled_price) * 100
pnl_amount = db_order.quantity * pnl_percent / 100
# 计算持仓时间 # 计算持仓时间
hold_duration = datetime.utcnow() - order.opened_at if order.opened_at else timedelta(0) hold_duration = datetime.utcnow() - db_order.opened_at if db_order.opened_at else timedelta(0)
# 更新订单 # 更新订单
order.status = status db_order.status = status
order.exit_price = exit_price db_order.exit_price = exit_price
order.closed_at = datetime.utcnow() db_order.closed_at = datetime.utcnow()
order.pnl_amount = round(pnl_amount, 2) db_order.pnl_amount = round(pnl_amount, 2)
order.pnl_percent = round(pnl_percent, 4) db_order.pnl_percent = round(pnl_percent, 4)
db.merge(order)
db.commit() db.commit()
db.refresh(db_order)
# 从活跃订单缓存中移除 # 从活跃订单缓存中移除
if order.order_id in self.active_orders: if order.order_id in self.active_orders:
del self.active_orders[order.order_id] del self.active_orders[order.order_id]
result = { result = {
'order_id': order.order_id, 'order_id': db_order.order_id,
'symbol': order.symbol, 'symbol': db_order.symbol,
'side': order.side.value, 'side': db_order.side.value,
'status': status.value, 'status': status.value,
'entry_price': order.filled_price, 'entry_price': db_order.filled_price,
'exit_price': exit_price, 'exit_price': exit_price,
'quantity': order.quantity, 'quantity': db_order.quantity,
'pnl_amount': order.pnl_amount, 'pnl_amount': db_order.pnl_amount,
'pnl_percent': order.pnl_percent, 'pnl_percent': db_order.pnl_percent,
'is_win': pnl_amount > 0, 'is_win': pnl_amount > 0,
'hold_duration': str(hold_duration).split('.')[0], # 去掉微秒 'hold_duration': str(hold_duration).split('.')[0], # 去掉微秒
'signal_grade': order.signal_grade.value if order.signal_grade else None 'signal_grade': db_order.signal_grade.value if db_order.signal_grade else None
} }
status_text = "止盈" if status == OrderStatus.CLOSED_TP else "止损" status_text = "止盈" if status == OrderStatus.CLOSED_TP else "止损"
logger.info(f"订单{status_text}: {order.order_id} | {order.symbol} | 盈亏: {pnl_percent:+.2f}% (${pnl_amount:+.2f})") logger.info(f"订单{status_text}: {db_order.order_id} | {db_order.symbol} | 盈亏: {pnl_percent:+.2f}% (${pnl_amount:+.2f})")
return result return result
except Exception as e: except Exception as e:
logger.error(f"平仓失败: {e}") logger.error(f"平仓失败: {e}")
import traceback
logger.error(traceback.format_exc())
db.rollback() db.rollback()
return None return None
finally: finally: