fix get_trader每次都返回新的实例

This commit is contained in:
zhiyong 2025-04-30 14:15:42 +08:00
parent 738bae5a4d
commit c616f9c5d9

View File

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