Пример #1
0
 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
Пример #2
0
 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
Пример #3
0
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
Пример #4
0
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)
Пример #5
0
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