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) # 获取所有已平仓订单(按日期范围)