def load_from_files(self, files: List[str]) -> Dict[str, Any]: # Keep this method as staticmethod, so it can be used from interactive environments config: Dict[str, Any] = {} if not files: return deepcopy(constants.MINIMAL_CONFIG) # We expect here a list of config filenames for path in files: logger.info(f'Using config: {path} ...') # Merge config options, overwriting old values config = deep_merge_dicts(load_config_file(path), config) # Load environment variables env_data = enironment_vars_to_dict() config = deep_merge_dicts(env_data, config) config['config_files'] = files # Normalize config if 'internals' not in config: config['internals'] = {} if 'ask_strategy' not in config: config['ask_strategy'] = {} if 'pairlists' not in config: config['pairlists'] = [] return config
def load_config(self) -> Dict[str, Any]: """ Extract information for sys.argv and load the bot configuration :return: Configuration dictionary """ # Load all configs config: Dict[str, Any] = load_from_files(self.args.get("config", [])) # Load environment variables env_data = enironment_vars_to_dict() config = deep_merge_dicts(env_data, config) # Normalize config if 'internals' not in config: config['internals'] = {} if 'pairlists' not in config: config['pairlists'] = [] # Keep a copy of the original configuration file config['original_config'] = deepcopy(config) self._process_logging_options(config) self._process_runmode(config) self._process_common_options(config) self._process_trading_options(config) self._process_optimize_options(config) self._process_plot_options(config) self._process_data_options(config) # Check if the exchange set by the user is supported check_exchange( config, config.get('experimental', {}).get('block_bad_exchanges', True)) self._resolve_pairs_list(config) process_temporary_deprecated_settings(config) return config