def init(self): if self.__initialized: return True assert isinstance(self._config, BfConfig) # 判断初始化前是否设置好了基本参数 self.__strategy_engine = StrategyEngine(parent=self) self.__strategy = Strategy(self.__strategy_engine, self.__code, parent=self) self.__strategy_engine.add_strategy(self.__strategy) self.__data_generator = TickDataGenerator(lambda x: self.__strategy_engine.put_event(x.to_event()), lambda: self.__strategy_engine.put_event(Event(EVENT_FINISH)), parent=self) if DEBUG: self.logger.setLevel(logging.DEBUG) else: self.logger.setLevel(logging.INFO) self.__initialized = True
def init(self): if self.__initialized: return True bf_config = BfConfig(**self.__config) self.__strategy_engine = StrategyEngine(is_backtest=False, **self.__config) self.__strategy = Strategy(self.__strategy_engine, code=self.__code, logger=self._logger, **self.__config) self.__strategy_engine.add_strategy(self.__strategy) self.__data_generator = TickDataGenerator(bf_config, lambda x: self.__strategy_engine.put_event(x.to_event()), lambda: self.__strategy_engine.put_event(Event(EVENT_FINISH))) self.__initialized = True
class TracebackSignal(LoggerInterface, ConfigInterface, Runnable): def __init__(self): LoggerInterface.__init__(self) ConfigInterface.__init__(self) Runnable.__init__(self) self.__code = None self.__strategy = None self.__strategy_engine = None self.__tb_data_generator = None self.__rt_data_generator = None self.__strategy_parameters = None self.__initialized = False self.logger_name = 'RuntimeSignal' def init(self): if self.__initialized: return True assert isinstance(self._config, BfConfig) # 判断初始化前是否设置好了基本参数 self.__strategy_engine = StrategyEngine(parent=self) self.__strategy = Strategy(self.__strategy_engine, self.__code, parent=self) self.__strategy_engine.add_strategy(self.__strategy) self.__rt_data_generator = TickDataGenerator( lambda x: self.__strategy_engine.put_event(x.to_event()), partial(self.__strategy_engine.put_event, Event(EVENT_FINISH)), parent=self) self.__tb_data_generator = DataGenerator( lambda x: self.__strategy_engine.put_event(x.to_event()), partial(self.__strategy_engine.put_event, Event(EVENT_EMPTY, message="traceback over")), parent=self) if DEBUG: self.logger.setLevel(logging.DEBUG) else: self.logger.setLevel(logging.INFO) self.__initialized = True def set_config(self, config): assert isinstance(config, BfConfig) self._config = config self._config.allow_trading = False self._config.running_mode = RunningMode.traceback @property def code(self): return self.__code @code.setter def code(self, value): assert isinstance(value, str) self.__code = value.replace('\t', ' ') def register_event(self, event_type, func): if self.__initialized: self.__strategy_engine.register_event(event_type, func) else: self.logger.warning("无效的事件注册,原因:未初始化") @property def is_finished(self): return self.__is_alive def _start(self, paras=None): """ :param paras: :param refresh: True表示刷新绩效且需要释放资源,即用户一个完整的请求已经结束;False的情况主要是参数优化时批量运行回测。 """ try: self.logger.info("<%s>策略回溯运算开始" % self._config["name"]) if not self.__initialized: self.init() if paras is not None: self.__strategy.set_parameters(paras) self.__strategy_engine.start() self.__tb_data_generator.start() self.__strategy_engine.register_event(EVENT_EMPTY, self._change_trading_mode) self.__strategy_engine.wait() except: self.logger.error("\n" + traceback.format_exc()) self.stop() def _change_trading_mode(self, event): if event.content["message"] == "traceback over": try: self.logger.info("<%s>策略回溯运算停止" % self._config["name"]) self._config.allow_trading = True self.logger.info("<%s>策略实时运算开始" % self._config["name"]) self.__rt_data_generator.start() except: self.logger.error("\n" + traceback.format_exc()) self.stop() def _stop(self): self.logger.info("<%s>策略实时运算停止" % self._config["name"]) self.__tb_data_generator.stop() self.__rt_data_generator.stop() self.__strategy_engine.stop() def get_output(self): return self.__strategy.get_output() def get_setting(self): return self._config.to_dict() def get_parameters(self): if self.__strategy_parameters is None: temp = self.__strategy.get_parameters() for handle_name in temp.keys(): for para_name, values in temp[handle_name].items(): temp[handle_name][para_name] = { 'default': values, 'type': str(type(values)) } self.__strategy_parameters = temp return self.__strategy_parameters
class RuntimeSignal(LoggerInterface): def __init__(self): super().__init__() self.__config = {} self.__code = None self.__strategy = None self.__strategy_engine = None self.__data_generator = None self.__strategy_parameters = None self._logger = None self.__performance_manager = None self.__timer = Timer() self._login = False self.__is_alive = False self.__initialized = False def init(self): if self.__initialized: return True bf_config = BfConfig(**self.__config) self.__strategy_engine = StrategyEngine(is_backtest=False, **self.__config) self.__strategy = Strategy(self.__strategy_engine, code=self.__code, logger=self._logger, **self.__config) self.__strategy_engine.add_strategy(self.__strategy) self.__data_generator = TickDataGenerator(bf_config, lambda x: self.__strategy_engine.put_event(x.to_event()), lambda: self.__strategy_engine.put_event(Event(EVENT_FINISH))) self.__initialized = True def set_config(self, **kwargs): self.__config.update(kwargs) def login(self): if not self._login: self._login = False def set_logger(self, logger): self._logger = logger @property def code(self): return self.__code @code.setter def code(self, code): if self.__code is None: self.__code = code @property def is_finished(self): return self.__is_alive @profile def start(self, paras=None, refresh=True): """ :param paras: :param refresh: True表示刷新绩效且需要释放资源,即用户一个完整的请求已经结束;False的情况主要是参数优化时批量运行回测。 """ try: if not self.__initialized: self.init() gc.collect() self.__is_alive = True if paras is not None: self.__strategy.set_parameters(paras) self.__strategy_engine.start() self.__data_generator.start() if refresh: self.__performance_manager = self.__strategy_engine.wait(self.__get_performance_manager) self.__data_generator.stop() if MEMORY_DEBUG: print('gb:\n%s' % sys.getsizeof(gc.garbage)) # 写日志,计算垃圾占用的内存等 gb_log = {} for gb in gc.garbage: type_ = type(gb) if type_ not in gb_log: gb_log[type_] = 0 gb_log[type_] += sys.getsizeof(gb) print(gb_log) result = self.__performance_manager else: result = self.__strategy_engine.wait() self.log(self.__timer.time("策略运算完成,耗时:{0}"), logging.INFO) return result except Exception as e: self.stop() raise e def stop(self): self.__is_alive = False self.__timer.reset() self.__data_generator.stop() self.__strategy_engine.stop() def __get_performance_manager(self): # TODO 加入回测是否运行的判断 if False: raise ValueError('please run the backtest first') return StrategyPerformanceManagerOnline(self.__strategy_engine.get_profit_records(), self.__strategy_engine.get_deals(), self.__strategy_engine.get_positions()) def get_profit_records(self): return self.__strategy_engine.get_profit_records() def get_performance(self): return self.__performance_manager.get_performance() def get_output(self): return self.__strategy.get_output() def get_setting(self): setting = self.__config.copy() return setting def get_parameters(self): if self.__strategy_parameters is None: temp = self.__strategy.get_parameters() for handle_name in temp.keys(): for para_name, values in temp[handle_name].items(): temp[handle_name][para_name] = {'default': values, 'type': str(type(values))} self.__strategy_parameters = temp return self.__strategy_parameters def time(self, *args): return self.__timer.time(*args)
class TracebackSignal(LoggerInterface, ConfigInterface, Runnable): def __init__(self): LoggerInterface.__init__(self) ConfigInterface.__init__(self) Runnable.__init__(self) self.__code = None self.__strategy = None self.__strategy_engine = None self.__tb_data_generator = None self.__rt_data_generator = None self.__strategy_parameters = None self.__initialized = False self.logger_name = 'RuntimeSignal' def init(self): if self.__initialized: return True assert isinstance(self._config, BfConfig) # 判断初始化前是否设置好了基本参数 self.__strategy_engine = StrategyEngine(parent=self) self.__strategy = Strategy(self.__strategy_engine, self.__code, parent=self) self.__strategy_engine.add_strategy(self.__strategy) self.__rt_data_generator = TickDataGenerator(lambda x: self.__strategy_engine.put_event(x.to_event()), partial(self.__strategy_engine.put_event, Event(EVENT_FINISH)), parent=self) self.__tb_data_generator = DataGenerator(lambda x: self.__strategy_engine.put_event(x.to_event()), partial(self.__strategy_engine.put_event, Event(EVENT_EMPTY, message="traceback over")), parent=self) if DEBUG: self.logger.setLevel(logging.DEBUG) else: self.logger.setLevel(logging.INFO) self.__initialized = True def set_config(self, config): assert isinstance(config, BfConfig) self._config = config self._config.allow_trading = False self._config.running_mode = RunningMode.traceback @property def code(self): return self.__code @code.setter def code(self, value): assert isinstance(value, str) self.__code = value.replace('\t', ' ') def register_event(self, event_type, func): if self.__initialized: self.__strategy_engine.register_event(event_type, func) else: self.logger.warning("无效的事件注册,原因:未初始化") @property def is_finished(self): return self.__is_alive def _start(self, paras=None): """ :param paras: :param refresh: True表示刷新绩效且需要释放资源,即用户一个完整的请求已经结束;False的情况主要是参数优化时批量运行回测。 """ try: self.logger.info("<%s>策略回溯运算开始" % self._config["name"]) if not self.__initialized: self.init() if paras is not None: self.__strategy.set_parameters(paras) self.__strategy_engine.start() self.__tb_data_generator.start() self.__strategy_engine.register_event(EVENT_EMPTY, self._change_trading_mode) self.__strategy_engine.wait() except: self.logger.error("\n" + traceback.format_exc()) self.stop() def _change_trading_mode(self, event): if event.content["message"] == "traceback over": try: self.logger.info("<%s>策略回溯运算停止" % self._config["name"]) self._config.allow_trading = True self.logger.info("<%s>策略实时运算开始" % self._config["name"]) self.__rt_data_generator.start() except: self.logger.error("\n" + traceback.format_exc()) self.stop() def _stop(self): self.logger.info("<%s>策略实时运算停止" % self._config["name"]) self.__tb_data_generator.stop() self.__rt_data_generator.stop() self.__strategy_engine.stop() def get_output(self): return self.__strategy.get_output() def get_setting(self): return self._config.to_dict() def get_parameters(self): if self.__strategy_parameters is None: temp = self.__strategy.get_parameters() for handle_name in temp.keys(): for para_name, values in temp[handle_name].items(): temp[handle_name][para_name] = {'default': values, 'type': str(type(values))} self.__strategy_parameters = temp return self.__strategy_parameters