def restart(self): """引擎初始化""" self.write_log("模拟交易主引擎:启动") # 引擎工作参数检查 self._param_check() # 持久化配置 if self._settings['PERSISTENCE_MODE'] == PersistanceMode.REALTIME: self.pst_active = True elif self._settings['PERSISTENCE_MODE'] == PersistanceMode.MANUAL: self.pst_active = False else: raise ValueError("持久化参数错误") # 连接数据库 db = self.creat_db() # 连接行情 hq_client = self.creat_hq_api() # 账户引擎启动 self.account_engine = AccountEngine(self.event_engine, self.pst_active, self._settings['LOAD_DATA_MODE'], db) self.account_engine.start() # 默认使用ChinaAMarket if not self._market or isinstance(self._market, ChinaAMarket): self._market = ChinaAMarket(self.event_engine, self.account_engine, hq_client, {}) else: self._market = self._market(self.event_engine, self.account_engine, hq_client, {}) # 交易市场初始化,并返回订单推送函数 self.order_put = self._market.on_init() # 启动订单薄撮合程序 self._thread = Thread(target=self._run) self._thread.start() self.__active = True return self
def start(self): """引擎初始化""" self.write_log("模拟交易主引擎:启动") # 默认使用ChinaAMarket if not self._market: self._market = ChinaAMarket(self.event_engine, self._mode) # 交易市场初始化 self.order_put = self._market.on_init() # 连接数据库 host = self.settings.get('MONGO_HOST') port = self.settings.get('MONGO_PORT') self.db = MongoDBService(host, port) self.db.connect_db() # 启动订单薄撮合程序 self._thread.start() return self
class MainEngine(): """模拟交易主引擎""" def __init__(self, event_engine: EventEngine = None, market=None, param: dict = None): # 绑定事件引擎 if not event_engine: self.event_engine = EventEngine() else: self.event_engine = event_engine self.event_engine.start() self._settings = SETTINGS # 配置参数 self.__active = False # 主引擎状态 self.pst_active = None # 数据持久化开关 self._market = market # 交易市场 self.account_engine = None # 账户引擎 self.order_put = None # 订单回调函数 # 更新参数 self._settings.update(param) # 开启日志引擎 log = LogEngine(self.event_engine) log.register_event() # 开启邮件引擎 # self.email = EmailEngine(self.event_engine) # self.email.start() # 市场模拟交易线程 self._thread = Thread(target=self._run) # 注册事件监听 self.event_register() self.write_log("模拟交易主引擎:初始化完毕") def event_register(self): """注册事件监听""" self.event_engine.register(EVENT_ERROR, self.process_error_event) self.event_engine.register(EVENT_MARKET_CLOSE, self.process_market_close) def start(self): """引擎初始化""" self.write_log("模拟交易主引擎:启动") # 引擎工作参数检查 self._param_check() # 持久化配置 if self._settings['PERSISTENCE_MODE'] == PersistanceMode.REALTIME: self.pst_active = True elif self._settings['PERSISTENCE_MODE'] == PersistanceMode.MANUAL: self.pst_active = False else: raise ValueError("持久化参数错误") # 连接数据库 db = self.creat_db() # 连接行情 hq_client = self.creat_hq_api() # 账户引擎启动 self.account_engine = AccountEngine(self.event_engine, self.pst_active, self._settings['LOAD_DATA_MODE'], db) self.account_engine.start() # 默认使用ChinaAMarket if not self._market or isinstance(self._market, ChinaAMarket): self._market = ChinaAMarket(self.event_engine, self.account_engine, hq_client, {}) else: self._market = self._market(self.event_engine, self.account_engine, hq_client, {}) # 交易市场初始化,并返回订单推送函数 self.order_put = self._market.on_init() # 启动订单薄撮合程序 self._thread.start() self.__active = True return self def restart(self): """引擎初始化""" self.write_log("模拟交易主引擎:启动") # 引擎工作参数检查 self._param_check() # 持久化配置 if self._settings['PERSISTENCE_MODE'] == PersistanceMode.REALTIME: self.pst_active = True elif self._settings['PERSISTENCE_MODE'] == PersistanceMode.MANUAL: self.pst_active = False else: raise ValueError("持久化参数错误") # 连接数据库 db = self.creat_db() # 连接行情 hq_client = self.creat_hq_api() # 账户引擎启动 self.account_engine = AccountEngine(self.event_engine, self.pst_active, self._settings['LOAD_DATA_MODE'], db) self.account_engine.start() # 默认使用ChinaAMarket if not self._market or isinstance(self._market, ChinaAMarket): self._market = ChinaAMarket(self.event_engine, self.account_engine, hq_client, {}) else: self._market = self._market(self.event_engine, self.account_engine, hq_client, {}) # 交易市场初始化,并返回订单推送函数 self.order_put = self._market.on_init() # 启动订单薄撮合程序 self._thread = Thread(target=self._run) self._thread.start() self.__active = True return self def _run(self): """订单薄撮合程序启动""" self._market.on_match() def _close(self): """模拟交易引擎关闭""" # 关闭市场 self._market._active = False self._thread.join() self.__active = False self.write_log("模拟交易主引擎:关闭") def _param_check(self): """引擎工作参数检查""" if not self._settings['PERSISTENCE_MODE']: raise ValueError("数据持久化参数未配置") def on_orders_arrived(self, order): """订单到达处理""" if self.__active: status, msg = self.account_engine.orders_arrived(order) return status, msg else: return False, "交易市场关闭" def process_market_close(self, event): """市场关闭处理""" market_name = event.data self.write_log("{}: 交易市场闭市".format(market_name)) self._close() def process_error_event(self, event): """系统错误处理""" msg = event.data self.write_log(msg, level=logging.CRITICAL) # self.email.queue.put(msg) def creat_db(self): """实例化数据库""" host = self._settings.get('MONGO_HOST', "localhost") port = self._settings.get('MONGO_PORT', 27017) db = MongoDBService(host, port) db.connect_db() return db def creat_hq_api(self): """实例化行情源""" tdx = PYTDXService() tdx.connect_api() return tdx def write_log(self, msg: str, level: int = logging.INFO): """""" log = LogData(log_content=msg, log_level=level) event = Event(EVENT_LOG, log) self.event_engine.put(event)
class MainEngine(): """模拟交易主引擎""" def __init__( self, event_engine: EventEngine = None, market: Exchange = None, param: dict = None ): # 绑定事件引擎 if not event_engine: self.event_engine = EventEngine() else: self.event_engine = event_engine self.event_engine.start() self.db = None # 数据库实例 self._market = market # 市场实例 self._mode = param.get('ENGINE_MODE') self.settings = SETTINGS # 绑定参数 self.order_put = None # 订单推送 # 更新参数 self.settings.update(param) # 开启日志引擎 log = LogEngine(self.event_engine) log.register_event() # 开启邮件引擎 # self.email = EmailEngine(self.event_engine) # self.email.start() # 市场交易线程 self._thread = Thread(target=self._run) # 注册事件监听 self.event_register() self.write_log("模拟交易主引擎:初始化完毕") def event_register(self): """注册事件监听""" self.event_engine.register(EVENT_ERROR, self.process_error_event) self.event_engine.register( EVENT_MARKET_CLOSE, self.process_market_close) def start(self): """引擎初始化""" self.write_log("模拟交易主引擎:启动") # 默认使用ChinaAMarket if not self._market: self._market = ChinaAMarket(self.event_engine, self._mode) # 交易市场初始化 self.order_put = self._market.on_init() # 连接数据库 host = self.settings.get('MONGO_HOST') port = self.settings.get('MONGO_PORT') self.db = MongoDBService(host, port) self.db.connect_db() # 启动订单薄撮合程序 self._thread.start() return self def _run(self): """订单薄撮合程序启动""" self._market.on_match(self.db) def _close(self): """模拟交易引擎关闭""" # 关闭市场 self._market._active = False self._thread.join() # 关闭数据库 self.db.close() self.write_log("模拟交易主引擎:关闭") def process_market_close(self, event): """市场关闭处理""" market_name = event.data self.write_log("{}: 交易市场闭市".format(market_name)) self._close() def process_error_event(self, event): """系统错误处理""" msg = event.data self.write_log(msg, level=logging.CRITICAL) # self.email.queue.put(msg) def get_report(self, token, start, end): """获取交易报告""" captial, account_df, pos_df, trade_df = calculate_result(token, self.db, start, end) if not len(trade_df): return "成交记录为空,无法计算" # 获取分析报告 statistics = trade_statistics(captial, account_df, pos_df, trade_df) return statistics def write_log(self, msg: str, level: int = logging.INFO): """""" log = LogData( log_content=msg, log_level=level ) event = Event(EVENT_LOG, log) self.event_engine.put(event)