From fc5afb0e847ec8418dd6689c7066c925c537f27b Mon Sep 17 00:00:00 2001
From: aaron <>
Date: Thu, 26 Feb 2026 10:03:40 +0800
Subject: [PATCH] 1
---
backend/app/services/paper_trading_service.py | 34 +++++++++++++------
1 file changed, 23 insertions(+), 11 deletions(-)
diff --git a/backend/app/services/paper_trading_service.py b/backend/app/services/paper_trading_service.py
index 6fa9c2c..23d31ed 100644
--- a/backend/app/services/paper_trading_service.py
+++ b/backend/app/services/paper_trading_service.py
@@ -2,7 +2,7 @@
模拟交易服务 - 订单管理和盈亏统计
"""
import uuid
-from datetime import datetime, timedelta
+from datetime import datetime, timedelta, timezone
from typing import Dict, Any, List, Optional
from app.models.paper_trading import PaperOrder, OrderStatus, OrderSide, SignalGrade, EntryType
@@ -11,6 +11,18 @@ from app.config import get_settings
from app.utils.logger import logger
+def get_beijing_time() -> datetime:
+ """
+ 获取东八区(北京时间)当前时间
+
+ Returns:
+ 东八区的当前时间
+ """
+ utc_time = datetime.utcnow().replace(tzinfo=timezone.utc)
+ beijing_tz = timezone(timedelta(hours=8))
+ return utc_time.astimezone(beijing_tz).replace(tzinfo=None)
+
+
class PaperTradingService:
"""模拟交易服务"""
@@ -273,7 +285,7 @@ class PaperTradingService:
# 现价单:立即开仓
status = OrderStatus.OPEN
filled_price = current_price if current_price else entry_price
- opened_at = datetime.utcnow()
+ opened_at = get_beijing_time()
else:
# 挂单:等待触发
status = OrderStatus.PENDING
@@ -519,7 +531,7 @@ class PaperTradingService:
# 更新订单状态
db_order.status = OrderStatus.OPEN
db_order.filled_price = filled_price
- db_order.opened_at = datetime.utcnow()
+ db_order.opened_at = get_beijing_time()
db.commit()
db.refresh(db_order)
@@ -627,12 +639,12 @@ class PaperTradingService:
pnl_amount = round(db_order.quantity * pnl_percent / 100, 2)
# 计算持仓时间
- hold_duration = datetime.utcnow() - db_order.opened_at if db_order.opened_at else timedelta(0)
+ hold_duration = get_beijing_time() - db_order.opened_at if db_order.opened_at else timedelta(0)
# 更新订单
db_order.status = status
db_order.exit_price = exit_price
- db_order.closed_at = datetime.utcnow()
+ db_order.closed_at = get_beijing_time()
db_order.pnl_amount = round(pnl_amount, 2)
db_order.pnl_percent = round(pnl_percent, 4)
@@ -1161,7 +1173,7 @@ class PaperTradingService:
db = db_service.get_session()
try:
order.status = OrderStatus.CANCELLED
- order.closed_at = datetime.utcnow()
+ order.closed_at = get_beijing_time()
db.merge(order)
db.commit()
@@ -1437,7 +1449,7 @@ class PaperTradingService:
return 0.0
# 确保订单按平仓时间排序
- orders = sorted(orders, key=lambda o: o.closed_at or datetime.utcnow())
+ orders = sorted(orders, key=lambda o: o.closed_at or get_beijing_time())
# 模拟账户权益曲线
initial_balance = self.initial_balance
@@ -1599,7 +1611,7 @@ class PaperTradingService:
"""
db = db_service.get_session()
try:
- cutoff_time = datetime.utcnow() - timedelta(hours=hours)
+ cutoff_time = get_beijing_time() - timedelta(hours=hours)
# 查询时间段内平仓的订单
closed_orders = db.query(PaperOrder).filter(
@@ -1701,7 +1713,7 @@ class PaperTradingService:
lines.append(f"{grade}级: {g['count']}笔 | 胜率{g['win_rate']}% | {pnl_sign}${g['total_pnl']:.0f}")
lines.append("")
- lines.append(f"报告时间: {datetime.now().strftime('%Y-%m-%d %H:%M')}")
+ lines.append(f"报告时间: {get_beijing_time().strftime('%Y-%m-%d %H:%M')}")
return "\n".join(lines)
@@ -1844,7 +1856,7 @@ class PaperTradingService:
# 更新订单状态
order.status = OrderStatus.CLOSED
order.close_price = current_price
- order.close_time = datetime.utcnow()
+ order.close_time = get_beijing_time()
order.pnl = pnl['pnl']
order.pnl_percent = pnl['pnl_percent']
order.close_reason = close_reason
@@ -1904,7 +1916,7 @@ class PaperTradingService:
from collections import defaultdict
# 计算起始日期
- end_date = datetime.utcnow().replace(hour=0, minute=0, second=0, microsecond=0)
+ end_date = get_beijing_time().replace(hour=0, minute=0, second=0, microsecond=0)
start_date = end_date - timedelta(days=days)
# 获取所有已平仓订单(按日期范围)