diff --git a/src/trade_server.py b/src/trade_server.py index a65e12b..3207aba 100644 --- a/src/trade_server.py +++ b/src/trade_server.py @@ -22,9 +22,13 @@ strategy_positions = {} # 存储各策略持仓 strategy_trades = {} # 存储各策略交易记录 pending_orders = {} # 存储未完成委托 +# 全局交易实例(采用单例模式) +_sim_trader_instance = None # 模拟交易实例(单例) +_real_trader_instance = None # 实盘交易实例(单例) + # 获取交易实例 def get_trader(use_sim_trader=False): - """获取交易实例 + """获取交易实例 - 采用单例模式 Args: use_sim_trader (bool): 是否强制使用模拟交易,True表示必定返回模拟交易实例 @@ -32,13 +36,21 @@ def get_trader(use_sim_trader=False): Returns: 返回交易实例,根据参数和配置决定是模拟交易还是实盘交易 """ - # 如果强制使用模拟交易,直接返回 - if use_sim_trader: - return SimulationTrader() + global _sim_trader_instance, _real_trader_instance - # 如果配置为仅模拟交易,直接返回模拟交易实例 + # 如果强制使用模拟交易,返回模拟交易单例 + if use_sim_trader: + # 如果模拟交易实例不存在,创建一个 + if _sim_trader_instance is None: + _sim_trader_instance = SimulationTrader() + return _sim_trader_instance + + # 如果配置为仅模拟交易,返回模拟交易单例 if Config.SIMULATION_ONLY: - return SimulationTrader() + # 如果模拟交易实例不存在,创建一个 + if _sim_trader_instance is None: + _sim_trader_instance = SimulationTrader() + return _sim_trader_instance # 判断当前是否为交易时间 now = datetime.datetime.now() @@ -60,20 +72,23 @@ def get_trader(use_sim_trader=False): # 如果无法导入chinese_calendar,则简单地用工作日判断 is_trading_day = now.weekday() < 5 # 0-4 为周一至周五 - # 如果不是交易日或不在交易时间内,返回模拟交易实例 + # 如果不是交易日或不在交易时间内,返回模拟交易单例 if not is_trading_day or not is_trading_hour: logger.info(f"当前非交易时段 - 日期: {now.date()}, 时间: {current_time}, 使用模拟交易") - return SimulationTrader() + # 如果模拟交易实例不存在,创建一个 + if _sim_trader_instance is None: + _sim_trader_instance = SimulationTrader() + return _sim_trader_instance - # 否则返回真实交易实例 - trader = XtTrader() + # 否则返回真实交易单例(如果存在)或创建一个新的 + if _real_trader_instance is None: + _real_trader_instance = XtTrader() + # 检查交易实例是否已登录,如果未登录则进行登录 + if not _real_trader_instance.is_logged_in(): + logger.info("创建新的XtTrader实例并登录") + _real_trader_instance.login() - # 检查交易实例是否已登录,如果未登录则进行登录 - if not trader.is_logged_in(): - logger.info("创建新的XtTrader实例并登录") - trader.login() - - return trader + return _real_trader_instance # 配置日志 def setup_logger():