update
This commit is contained in:
parent
d16c5562de
commit
8f4938f17a
@ -47,7 +47,11 @@ class PaperTradingService:
|
|||||||
PaperOrder.status.in_([OrderStatus.PENDING, OrderStatus.OPEN])
|
PaperOrder.status.in_([OrderStatus.PENDING, OrderStatus.OPEN])
|
||||||
).all()
|
).all()
|
||||||
|
|
||||||
|
# 使用 make_transient 将对象从会话中分离,使其成为独立对象
|
||||||
|
from sqlalchemy.orm import make_transient
|
||||||
for order in orders:
|
for order in orders:
|
||||||
|
db.expunge(order) # 从会话中移除
|
||||||
|
make_transient(order) # 使对象独立
|
||||||
self.active_orders[order.order_id] = order
|
self.active_orders[order.order_id] = order
|
||||||
|
|
||||||
logger.info(f"已加载 {len(orders)} 个活跃订单")
|
logger.info(f"已加载 {len(orders)} 个活跃订单")
|
||||||
@ -401,11 +405,29 @@ class PaperTradingService:
|
|||||||
else:
|
else:
|
||||||
current_pnl_percent = ((order.filled_price - current_price) / order.filled_price) * 100
|
current_pnl_percent = ((order.filled_price - current_price) / order.filled_price) * 100
|
||||||
|
|
||||||
# 更新极值
|
# 检查是否需要更新极值
|
||||||
|
needs_update = False
|
||||||
if current_pnl_percent > order.max_profit:
|
if current_pnl_percent > order.max_profit:
|
||||||
order.max_profit = current_pnl_percent
|
order.max_profit = current_pnl_percent
|
||||||
|
needs_update = True
|
||||||
if current_pnl_percent < order.max_drawdown:
|
if current_pnl_percent < order.max_drawdown:
|
||||||
order.max_drawdown = current_pnl_percent
|
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]]:
|
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())
|
orders = list(self.active_orders.values())
|
||||||
if symbol:
|
if symbol:
|
||||||
orders = [o for o in orders if o.symbol == 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]]:
|
def get_order_by_id(self, order_id: str) -> Optional[Dict[str, Any]]:
|
||||||
"""根据ID获取订单"""
|
"""根据ID获取订单"""
|
||||||
# 先从缓存查找
|
# 先从缓存查找
|
||||||
if order_id in self.active_orders:
|
if order_id in self.active_orders:
|
||||||
|
try:
|
||||||
return self.active_orders[order_id].to_dict()
|
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()
|
db = db_service.get_session()
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user