Beispiel #1
0
def run_tests(file_path=None):
    if file_path is not None:
        files = [file_path]
    else:
        files = [f for f in os.listdir(TEST_DIR) if f.find("test") == 0]
    error_map = {}
    for filename in files:
        try:
            r, result_data = run_test(filename)
            if r is not None:
                error_map[filename.replace(".py", "")] = result_data
        except Exception as e:
            system_log.exception()
            error_map[filename.replace(".py", "")] = e
    for filename, result_data in iteritems(error_map):
        print(u"*" * 20, u"[{}]did not pass!".format(filename), u"*" * 20)
        if isinstance(result_data, Exception):
            system_log.error(result_data)
        else:
            df, old_df, result = result_data
            # print("+" * 10, "old test Dataframe: ", "+" * 10)
            # print(old_df.drop(result.columns[result.all()], axis=1))
            # print("+" * 10, "new test Dataframe: ", "+" * 10)
            # print(df.drop(result.columns[result.all()], axis=1))
            print(result.all())
    print(u"=" * 40)
    print(u"[{}|{}] strategies has been passed!".format(len(files) - len(error_map), len(files)))
    return len(error_map)
Beispiel #2
0
def run_tests(file_path=None):
    tests = {
        f.replace(".py", ""): f
        for f in ((file_path, ) if file_path else (
            f for f in os.listdir(TEST_DIR) if f.find("test") == 0))
    }
    error_map = {}
    for name, filename in tests.items():
        try:
            result_data = run_test(filename)
            if result_data is not None:
                error_map[name] = result_data
        except Exception as e:
            error_map[name] = e
    for filename, result_data in iteritems(error_map):
        print(u"*" * 20, u"[{}]did not pass!".format(filename), u"*" * 20)
        if isinstance(result_data, Exception):
            system_log.error(result_data)
        else:
            _, __, result = result_data
            print(result.all())
    print(u"=" * 40)
    print("[{}|{}] strategies has been passed!".format(
        len(tests) - len(error_map), len(tests)))
    return len(error_map)
Beispiel #3
0
def run_tests(file_path=None):
    if file_path is not None:
        files = [file_path]
    else:
        files = [f for f in os.listdir(TEST_DIR) if f.find("test") == 0]
    error_map = {}
    for filename in files:
        try:
            r, result_data = run_test(filename)
            if r is not None:
                error_map[filename.replace(".py", "")] = result_data
        except Exception as e:
            system_log.exception()
            error_map[filename.replace(".py", "")] = e
    for filename, result_data in iteritems(error_map):
        print(u"*" * 20, u"[{}]did not pass!".format(filename), u"*" * 20)
        if isinstance(result_data, Exception):
            system_log.error(result_data)
        else:
            df, old_df, result = result_data
            # print("+" * 10, "old test Dataframe: ", "+" * 10)
            # print(old_df.drop(result.columns[result.all()], axis=1))
            # print("+" * 10, "new test Dataframe: ", "+" * 10)
            # print(df.drop(result.columns[result.all()], axis=1))
            print(result.all())
    print(u"=" * 40)
    print(u"[{}|{}] strategies has been passed!".format(
        len(files) - len(error_map), len(files)))
    return len(error_map)
 def onRspUserLogin(self, data, error, n, last):
     # 登录后会自动订阅之前已订阅了的合约
     super(RqCtpMdApi, self).onRspUserLogin(data, error, n, last)
     if error['ErrorID'] == 0:
         system_log.info('CTP行情服务器登录成功')
     else:
         system_log.error('CTP行情服务器登录错误,错误代码:%s,错误信息:%s' % (str(error['ErrorID']), error['ErrorMsg'].decode('gbk')))
Beispiel #5
0
 def subscribe(self, order_book_id):
     subscribe_req = self._data_factory.make_subscribe_req(order_book_id)
     if subscribe_req is None:
         system_log.error('Cannot find contract whose order_book_id is %s' %
                          order_book_id)
         return
     self.vnpy_gateway.subscribe(subscribeReq=subscribe_req)
Beispiel #6
0
 def _init_gateway(self):
     self.gateway_type = self._config.gateway_type
     if self.gateway_type == 'CTP':
         self.vnpy_gateway = RQCtpGateway(
             self.event_engine, self.gateway_type,
             getattr(self._config, self.gateway_type))
     else:
         system_log.error('No Gateway named {}', self.gateway_type)
Beispiel #7
0
 def get_limit_up(self, order_book_id):
     tick_snapshot = self._data_factory.get_tick_snapshot(order_book_id)
     if tick_snapshot is None:
         system_log.error(
             'Cannot find such tick whose order_book_id is {} ',
             order_book_id)
         return
     return tick_snapshot['limit_up']
 def get_limit_down(self, order_book_id):
     tick_snapshot = self._cache.snapshot.get(order_book_id)
     if tick_snapshot is None:
         system_log.error(
             'Cannot find such tick whose order_book_id is {} ',
             order_book_id)
         return
     return tick_snapshot['limit_down']
Beispiel #9
0
 def get_last_price(self, order_book_id):
     tick_snapshot = self._md_gateway.snapshot.get(order_book_id)
     if tick_snapshot is None:
         tick_snapshot = self._trade_gateway.snapshot.get(order_book_id)
     if tick_snapshot is None:
         system_log.error('Cannot find such tick whose order_book_id is {} ', order_book_id)
         return
     return tick_snapshot['last']
Beispiel #10
0
    def current_snapshot(self, instrument, frequency, dt):
        if frequency != 'tick':
            raise NotImplementedError

        order_book_id = instrument.order_book_id
        tick_snapshot = self._md_gateway.snapshot.get(order_book_id)
        if tick_snapshot is None:
            system_log.error('Cannot find such tick whose order_book_id is {} ', order_book_id)
        return SnapshotObject(instrument, tick_snapshot, dt)
    def onRspUserLogin(self, data, error, n, last):
        if error['ErrorID'] == 0:
            self.frontID = str(data['FrontID'])
            self.sessionID = str(data['SessionID'])
            self.loginStatus = True
            self.gateway.tdConnected = True
            system_log.info('CTP交易服务器登录成功')

        else:
            system_log.error('CTP交易服务器登录错误,错误代码:%s,错误信息:%s' % (str(error['ErrorID']), error['ErrorMsg'].decode('gbk')))
 def _query_futu_market_state(self):
     print("请求当前市场状态")
     ret, state_dict = self._quote_context.get_global_state()
     if ret == 0:
         mkt_val = int(state_dict[self._mkt_key])
         if mkt_val in self._mkt_dic.keys():
             self._market_state = self._mkt_dic[mkt_val]
         else:
             err_log = "Unknown market state: {}".format(mkt_val)
             system_log.error(err_log)
     return ret
Beispiel #13
0
 def _init_gateway(self):
     self.gateway_type = self._config.gateway_type
     if self.gateway_type == 'CTP':
         try:
             from .vnpy_gateway import RQVNCTPGateway
             self.vnpy_gateway = RQVNCTPGateway(
                 self.event_engine, self.gateway_type,
                 dict(getattr(self._config, self.gateway_type)))
             QueryExecutor.interval = self._config.query_interval
             QueryExecutor.start()
         except ImportError as e:
             system_log.exception("No Gateway named CTP")
     else:
         system_log.error('No Gateway named {}', self.gateway_type)
Beispiel #14
0
def _exception_handler(e):
    try:
        sys.excepthook(e.error.exc_type, e.error.exc_val, e.error.exc_tb)
    except Exception as e:
        system_log.exception("hook exception failed")

    user_system_log.error(e.error)
    if not is_user_exc(e.error.exc_val):
        code = const.EXIT_CODE.EXIT_INTERNAL_ERROR
        system_log.error(_(u"strategy execute exception"), exc=e)
    else:
        code = const.EXIT_CODE.EXIT_USER_ERROR
        user_detail_log.error(_(u"strategy execute exception"), exc=e)

    return code
Beispiel #15
0
def _exception_handler(e):
    try:
        sys.excepthook(e.error.exc_type, e.error.exc_val, e.error.exc_tb)
    except Exception as e:
        system_log.exception("hook exception failed")

    user_system_log.error(e.error)
    if not is_user_exc(e.error.exc_val):
        code = const.EXIT_CODE.EXIT_INTERNAL_ERROR
        system_log.error(_(u"strategy execute exception"), exc=e)
    else:
        code = const.EXIT_CODE.EXIT_USER_ERROR
        user_detail_log.error(_(u"strategy execute exception"), exc=e)

    return code
Beispiel #16
0
    def get_price(self,
                  instrument,
                  start_date,
                  end_date,
                  frequency='1d',
                  fields=None,
                  adjust_type='pre',
                  skip_suspended=False):
        """
        :param instrument:
        :param start_date: 开始日期 (格式:YYYYMMDD)
        :param end_date:  结束日期 (格式:YYYYMMDD)
        :param frequency: 1MIN表示1分钟(1/5/15/30/60分钟) D日线 ,默认D
        :param fields:
        :param adjust_type: 复权类型(只针对股票):None未复权 qfq前复权 hfq后复权 , 默认None
        :param skip_suspended:
        :return:
        """
        # 获取order_book_id 将其转成tushare 所能识别的 code
        # order_book_id = ricequant_to_tushare(instrument.order_book_id)
        order_book_id = ricequant_to_tushare(instrument)

        # adj:  None未复权 qfq前复权 hfq后复权 , 默认None
        # asset: 资产类别:E股票 I沪深指数 C数字货币 FT期货 FD基金 O期权,默认E
        adj = map_adjust_type[adjust_type]
        start_date = '{}'.format(start_date).replace("-", "")
        end_date = '{}'.format(end_date).replace("-", "")
        bar_data = ts.pro_bar(pro_api=self._pro,
                              ts_code=order_book_id,
                              adj=adjust_type,
                              start_date=start_date,
                              end_date=end_date)

        if bar_data is None or bar_data.empty:
            system_log.error("tuahre get_tushare_k_data return date is None")
        else:
            bar_data['trade_date'] = pd.to_datetime(bar_data['trade_date'])
            bar_data.set_index(bar_data['trade_date'], inplace=True)
            bar_data.rename(columns={'vol': 'volume'}, inplace=True)
            bar_data.sort_index(inplace=True)
            if isinstance(fields,
                          six.string_types) and fields in bar_data.columns:
                return bar_data[fields].values
            # fields = [fields]
            fields = [field for field in fields if field in bar_data.columns]
            # return bar_data[fields].values
            return bar_data[fields]
Beispiel #17
0
def code_config(config, source_code=None):
    try:
        if source_code is None:
            with codecs.open(config["base"]["strategy_file"], encoding="utf-8") as f:
                source_code = f.read()

        # FIXME: hardcode for parametric mod
        def noop(*args, **kwargs):
            pass
        scope = {'define_parameter': noop}

        code = compile(source_code, config["base"]["strategy_file"], 'exec')
        six.exec_(code, scope)

        return scope.get('__config__', {})
    except Exception as e:
        system_log.error(_(u"in parse_user_config, exception: {e}").format(e=e))
        return {}
Beispiel #18
0
def code_config(config, source_code=None):
    try:
        if source_code is None:
            with codecs.open(config["base"]["strategy_file"], encoding="utf-8") as f:
                source_code = f.read()

        # FIXME: hardcode for parametric mod
        def noop(*args, **kwargs):
            pass
        scope = {'define_parameter': noop}

        code = compile(source_code, config["base"]["strategy_file"], 'exec')
        six.exec_(code, scope)

        return scope.get('__config__', {})
    except Exception as e:
        system_log.error(_(u"in parse_user_config, exception: {e}").format(e=e))
        return {}
def write_csv(path, fields):
    old_test_times = []
    if not os.path.exists(path):
        with open(path, 'w') as csv_file:
            writer = csv.DictWriter(csv_file, fieldnames=fields)
            writer.writeheader()
    with open(path) as csv_file:
        reader = csv.DictReader(csv_file)
        for row in reader:
            old_test_times.append(row)

    if performance_path is None:
        if len(old_test_times) != 0 and time_spend > float(old_test_times[-1]["time_spend"]) * 1.1:
            system_log.error("代码咋写的,太慢了!")
            system_log.error("上次测试用例执行的总时长为:" + old_test_times[-1]["time_spend"])
            system_log.error("本次测试用例执行的总时长增长为: " + str(time_spend))
        else:
            with open(path, 'a') as csv_file:
                writer = csv.DictWriter(csv_file, fieldnames=fields)
                writer.writerow({'date_time': end_time, 'time_spend': time_spend})
    else:
        if 0 < len(old_test_times) < 5 and time_spend > float(sum(float(i['time_spend']) for i in old_test_times)) / len(old_test_times) * 1.1:
            print('Average time of last 5 runs:', float(sum(float(i['time_spend']) for i in old_test_times))/len(old_test_times))
            print('Now time spend:', time_spend)
            raise RuntimeError('Performance regresses!')
        elif len(old_test_times) >= 5 and time_spend > float(sum(float(i['time_spend']) for i in old_test_times[-5:])) / 5 * 1.1:
            print('Average time of last 5 runs:',
                  float(sum(float(i['time_spend']) for i in old_test_times[-5:])) / 5)
            print('Now time spend:', time_spend)
            raise RuntimeError('Performance regresses!')
        else:
            with open(path, 'a') as csv_file:
                writer = csv.DictWriter(csv_file, fieldnames=fields)
                writer.writerow({'date_time': end_time, 'time_spend': time_spend})
Beispiel #20
0
def import_mod(mod_name):
    try:
        from importlib import import_module
        return import_module(mod_name)
    except Exception as e:
        system_log.error("*" * 30)
        system_log.error("Mod Import Error: {}, error: {}", mod_name, e)
        system_log.error("*" * 30)
        raise
Beispiel #21
0
def import_mod(mod_name):
    try:
        from importlib import import_module
        return import_module(mod_name)
    except Exception as e:
        system_log.error("*" * 30)
        system_log.error("Mod Import Error: {}, error: {}", mod_name, e)
        system_log.error("*" * 30)
        raise
Beispiel #22
0
def run_tests(file_path=None):
    if file_path is not None:
        files = [file_path]
    else:
        files = [f for f in os.listdir(TEST_DIR) if f.find("test") == 0]
    error_map = {}
    for filename in files:
        try:
            r, result_data = run_test(filename)
            if r is not None:
                error_map[filename.replace(".py", "")] = result_data
        except Exception as e:
            system_log.exception()
            error_map[filename.replace(".py", "")] = e
    for filename, result_data in iteritems(error_map):
        print(u"*" * 20, u"[{}]did not pass!".format(filename), u"*" * 20)
        if isinstance(result_data, Exception):
            system_log.error(result_data)
        else:
            df, old_df, result = result_data
            # print("+" * 10, "old test Dataframe: ", "+" * 10)
            # print(old_df.drop(result.columns[result.all()], axis=1))
            # print("+" * 10, "new test Dataframe: ", "+" * 10)
            # print(df.drop(result.columns[result.all()], axis=1))
            if "summary" in df.keys():
                df["summary"] = pd.DataFrame([df["summary"]])
                old_df["summary"] = pd.DataFrame([old_df["summary"]])
            for k in df.keys():
                d = old_df[k][~old_df[k].isin(df[k])].dropna()
                if not d.empty:
                    print(k, 'max diff:', d.abs().max(), "\n")
            print(result.all())
    print(u"=" * 40)
    print(u"[{}|{}] strategies has been passed!".format(
        len(files) - len(error_map), len(files)))
    return len(error_map)
    def _register_event(self):
        self.event_engine.register(EVENT_ORDER, self.on_order)
        self.event_engine.register(EVENT_CONTRACT, self.on_contract)
        self.event_engine.register(EVENT_TRADE, self.on_trade)
        self.event_engine.register(EVENT_TICK, self.on_tick)
        self.event_engine.register(EVENT_LOG, self.on_log)
        self.event_engine.register(EVENT_ACCOUNT, self.on_account)
        self.event_engine.register(EVENT_POSITION, self.on_positions)
        self.event_engine.register(EVENT_POSITION_EXTRA,
                                   self.on_position_extra)
        self.event_engine.register(EVENT_CONTRACT_EXTRA,
                                   self.on_contract_extra)
        self.event_engine.register(EVENT_COMMISSION, self.on_commission)
        self.event_engine.register(EVENT_ERROR,
                                   lambda e: system_log.error(e.dict_['data']))

        self._env.event_bus.add_listener(EVENT.POST_UNIVERSE_CHANGED,
                                         self.on_universe_changed)
 def onRspError(self, error, n, last):
     system_log.error('CTP交易服务器错误,错误代码:%s,错误信息:%s' % (str(error['ErrorID']), error['ErrorMsg'].decode('gbk')))
 def onRspOrderInsert(self, data, error, n, last):
     system_log.error('CTP交易服务器发单错误,错误代码:%s,错误信息:%s' % (str(error['ErrorID']), error['ErrorMsg'].decode('gbk')))
 def onRspUserLogout(self, data, error, n, last):
     super(RqCtpTdApi, self).onRspUserLogout(data, error, n, last)
     if error['ErrorID'] == 0:
         system_log.info('CTP交易服务器登出成功')
     else:
         system_log.error('CTP交易服务器登出错误,错误代码:%s,错误信息:%s' % (str(error['ErrorID']), error['ErrorMsg'].decode('gbk')))
Beispiel #27
0
 def on_err(self, error):
     system_log.error(
         'CTP 错误,错误代码:%s,错误信息:%s' %
         (str(error['ErrorID']), error['ErrorMsg'].decode('GBK')))
 def on_err(error, func_name):
     system_log.error('CTP 错误,错误代码:%s,错误信息:%s' %
                      (str(error.ErrorID), error.ErrorMsg.decode('GBK')))
Beispiel #29
0
        if error_count == 0:
            time_csv_file_path = os.path.join(TEST_OUT, "time.csv")
            field_names = ['date_time', 'time_spend']
            old_test_times = []
            time_spend = (end_time - start_time).total_seconds()
            if not os.path.exists(time_csv_file_path):
                with open(time_csv_file_path, 'w') as csv_file:
                    writer = csv.DictWriter(csv_file, fieldnames=field_names)
                    writer.writeheader()
            with open(time_csv_file_path) as csv_file:
                reader = csv.DictReader(csv_file)
                for row in reader:
                    old_test_times.append(row)
            if len(old_test_times) != 0 and time_spend > float(
                    old_test_times[-1]["time_spend"]) * 1.1:
                system_log.error("代码咋写的,太慢了!")
                system_log.error("上次测试用例执行的总时长为:" +
                                 old_test_times[-1]["time_spend"])
                system_log.error("本次测试用例执行的总时长增长为: " + str(time_spend))
            else:
                with open(time_csv_file_path, 'a') as csv_file:
                    writer = csv.DictWriter(csv_file, fieldnames=field_names)
                    writer.writerow({
                        'date_time': end_time,
                        'time_spend': time_spend
                    })

        else:
            print('Failed!')
            sys.exit(-1)
    if is_enable_coverage():
 def onErrRtnOrderAction(self, data, error):
     system_log.error('CTP交易服务器撤单错误,错误代码:%s,错误信息:%s' % (str(error['ErrorID']), error['ErrorMsg'].decode('gbk')))
Beispiel #31
0
def run(config, source_code=None, user_funcs=None):
    env = Environment(config)
    persist_helper = None
    init_succeed = False
    mod_handler = ModHandler()

    try:
        # avoid register handlers everytime
        # when running in ipython
        set_loggers(config)
        init_rqdatac(getattr(config.base, 'rqdatac_uri', None))
        system_log.debug("\n" + pformat(config.convert_to_dict()))

        env.set_strategy_loader(
            init_strategy_loader(env, source_code, user_funcs, config))
        mod_handler.set_env(env)
        mod_handler.start_up()

        if not env.data_source:
            env.set_data_source(
                BaseDataSource(config.base.data_bundle_path,
                               getattr(config.base, "future_info", {})))
        if env.price_board is None:
            from rqalpha.data.bar_dict_price_board import BarDictPriceBoard
            env.price_board = BarDictPriceBoard()
        env.set_data_proxy(DataProxy(env.data_source, env.price_board))

        _adjust_start_date(env.config, env.data_proxy)

        ctx = ExecutionContext(const.EXECUTION_PHASE.GLOBAL)
        ctx._push()

        # FIXME
        start_dt = datetime.datetime.combine(config.base.start_date,
                                             datetime.datetime.min.time())
        env.calendar_dt = start_dt
        env.trading_dt = start_dt

        assert env.broker is not None
        assert env.event_source is not None
        if env.portfolio is None:
            from rqalpha.portfolio import Portfolio
            env.set_portfolio(
                Portfolio(config.base.accounts, config.base.init_positions))

        env.event_bus.publish_event(Event(EVENT.POST_SYSTEM_INIT))

        scope = create_base_scope()
        scope.update({"g": env.global_vars})
        scope.update(get_strategy_apis())
        scope = env.strategy_loader.load(scope)

        if config.extra.enable_profiler:
            enable_profiler(env, scope)

        ucontext = StrategyContext()
        executor = Executor(env)

        persist_helper = init_persist_helper(env, ucontext, executor, config)
        user_strategy = Strategy(env.event_bus, scope, ucontext)
        env.user_strategy = user_strategy

        env.event_bus.publish_event(Event(EVENT.BEFORE_STRATEGY_RUN))
        if persist_helper:
            with LogCapture(user_log) as log_capture:
                user_strategy.init()
        else:
            user_strategy.init()

        if config.extra.context_vars:
            for k, v in config.extra.context_vars.items():
                if isinstance(v, RqAttrDict):
                    v = v.__dict__
                setattr(ucontext, k, v)

        if persist_helper:
            env.event_bus.publish_event(Event(EVENT.BEFORE_SYSTEM_RESTORED))
            restored_obj_state = persist_helper.restore(None)
            check_key = ["global_vars", "user_context", "executor", "universe"]
            kept_current_init_data = not any(
                v for k, v in restored_obj_state.items() if k in check_key)
            system_log.debug(
                "restored_obj_state: {}".format(restored_obj_state))
            system_log.debug(
                "kept_current_init_data: {}".format(kept_current_init_data))
            if kept_current_init_data:
                # 未能恢复init相关数据 保留当前策略初始化变量(展示当前策略初始化日志)
                log_capture.replay()
            else:
                user_system_log.info(_('system restored'))
            env.event_bus.publish_event(Event(EVENT.POST_SYSTEM_RESTORED))

        init_succeed = True

        bar_dict = BarMap(env.data_proxy, config.base.frequency)
        executor.run(bar_dict)
        env.event_bus.publish_event(Event(EVENT.POST_STRATEGY_RUN))

        if env.profile_deco:
            output_profile_result(env)
        release_print(scope)
    except CustomException as e:
        if init_succeed and persist_helper and env.config.base.persist_mode == const.PERSIST_MODE.ON_CRASH:
            persist_helper.persist()

        code = _exception_handler(e)
        mod_handler.tear_down(code, e)
    except Exception as e:
        system_log.error(traceback.format_exc())

        if init_succeed and persist_helper and env.config.base.persist_mode == const.PERSIST_MODE.ON_CRASH:
            persist_helper.persist()

        exc_type, exc_val, exc_tb = sys.exc_info()
        user_exc = create_custom_exception(exc_type, exc_val, exc_tb,
                                           config.base.strategy_file)

        code = _exception_handler(user_exc)
        mod_handler.tear_down(code, user_exc)
    else:
        if persist_helper and env.config.base.persist_mode == const.PERSIST_MODE.ON_NORMAL_EXIT:
            persist_helper.persist()
        result = mod_handler.tear_down(const.EXIT_CODE.EXIT_SUCCESS)
        system_log.debug(_(u"strategy run successfully, normal exit"))
        return result
Beispiel #32
0
 def get_limit_up(self, order_book_id):
     tick_snapshot = self._md_gateway.snapshot.get(order_book_id)
     if tick_snapshot is None:
         system_log.error('Cannot find such tick whose order_book_id is {} ', order_book_id)
         return
     return tick_snapshot['limit_up']