update
This commit is contained in:
parent
d16c5562de
commit
8f4938f17a
@ -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()
|
||||
|
||||
Loading…
Reference in New Issue
Block a user