def test_strategy_config_template_complete(self): folder = realpath(join(__file__, "../../../../../hummingbot/strategy")) # Only include valid directories strategies = [ d for d in listdir(folder) if isdir(join(folder, d)) and not d.startswith("__") ] strategies.sort() for strategy in strategies: strategy_template_path: str = get_strategy_template_path(strategy) strategy_config_map = get_strategy_config_map(strategy) with open(strategy_template_path, "r") as template_fd: template_data = yaml_parser.load(template_fd) template_version = template_data.get("template_version", 0) self.assertGreaterEqual( template_version, 1, f"Template version too low at {strategy_template_path}") for key in template_data: if key == "template_version": continue self.assertTrue(key in strategy_config_map, f"{key} not in {strategy}_config_map") for key in strategy_config_map: self.assertTrue(key in template_data, f"{key} not in {strategy_template_path}")
async def prompt_for_configuration(self, # type: HummingbotApplication file_name): self.app.clear_input() self.placeholder_mode = True self.app.hide_input = True required_exchanges.clear() strategy_config = ConfigVar(key="strategy", prompt="What is your market making strategy? >>> ", validator=validate_strategy) await self.prompt_a_config(strategy_config) if self.app.to_stop_config: self.app.to_stop_config = False return strategy = strategy_config.value config_map = get_strategy_config_map(strategy) self._notify(f"Please see https://docs.hummingbot.io/strategies/{strategy.replace('_', '-')}/ " f"while setting up these below configuration.") # assign default values and reset those not required for config in config_map.values(): if config.required: config.value = config.default else: config.value = None for config in config_map.values(): if config.prompt_on_new and config.required: if not self.app.to_stop_config: await self.prompt_a_config(config) else: self.app.to_stop_config = False return else: config.value = config.default # catch a last key binding to stop config, if any if self.app.to_stop_config: self.app.to_stop_config = False return if file_name is None: file_name = await self.prompt_new_file_name(strategy) if self.app.to_stop_config: self.app.to_stop_config = False self.app.set_text("") return self.app.change_prompt(prompt=">>> ") strategy_path = os.path.join(CONF_FILE_PATH, file_name) template = get_strategy_template_path(strategy) shutil.copy(template, strategy_path) save_to_yml(strategy_path, config_map) self.strategy_file_name = file_name self.strategy_name = strategy # Reload completer here otherwise the new file will not appear self.app.input_field.completer = load_completer(self) self._notify(f"A new config file {self.strategy_file_name} created.") self.placeholder_mode = False self.app.hide_input = False if await self.status_check_all(): self._notify("\nEnter \"start\" to start market making.")
async def prompt_for_configuration_legacy( self, # type: HummingbotApplication file_name, strategy: str, config_map: Dict, ): config_map_backup = copy.deepcopy(config_map) # assign default values and reset those not required for config in config_map.values(): if config.required: config.value = config.default else: config.value = None for config in config_map.values(): if config.prompt_on_new and config.required: if not self.app.to_stop_config: await self.prompt_a_config_legacy(config) else: break else: config.value = config.default if self.app.to_stop_config: self.restore_config_legacy(config_map, config_map_backup) self.app.set_text("") return if file_name is None: file_name = await self.prompt_new_file_name(strategy) if self.app.to_stop_config: self.restore_config_legacy(config_map, config_map_backup) self.app.set_text("") return self.app.change_prompt(prompt=">>> ") strategy_path = STRATEGIES_CONF_DIR_PATH / file_name template = get_strategy_template_path(strategy) shutil.copy(template, strategy_path) save_to_yml_legacy(str(strategy_path), config_map) return file_name
async def prompt_for_configuration( self, # type: HummingbotApplication file_name): self.app.clear_input() self.placeholder_mode = True self.app.hide_input = True required_exchanges.clear() strategy_config = ConfigVar( key="strategy", prompt="What is your market making strategy? >>> ", validator=validate_strategy) await self.prompt_a_config(strategy_config) if self.app.to_stop_config: self.stop_config() return strategy = strategy_config.value config_map = get_strategy_config_map(strategy) config_map_backup = copy.deepcopy(config_map) self._notify( f"Please see https://docs.hummingbot.io/strategies/{strategy.replace('_', '-')}/ " f"while setting up these below configuration.") # assign default values and reset those not required for config in config_map.values(): if config.required: config.value = config.default else: config.value = None for config in config_map.values(): if config.prompt_on_new and config.required: if not self.app.to_stop_config: await self.prompt_a_config(config) else: break else: config.value = config.default if self.app.to_stop_config: self.stop_config(config_map, config_map_backup) return if file_name is None: file_name = await self.prompt_new_file_name(strategy) if self.app.to_stop_config: self.stop_config(config_map, config_map_backup) self.app.set_text("") return self.app.change_prompt(prompt=">>> ") strategy_path = os.path.join(CONF_FILE_PATH, file_name) template = get_strategy_template_path(strategy) shutil.copy(template, strategy_path) save_to_yml(strategy_path, config_map) self.strategy_file_name = file_name self.strategy_name = strategy # Reload completer here otherwise the new file will not appear self.app.input_field.completer = load_completer(self) self._notify(f"A new config file {self.strategy_file_name} created.") self.placeholder_mode = False self.app.hide_input = False try: timeout = float(global_config_map["create_command_timeout"].value) all_status_go = await asyncio.wait_for(self.status_check_all(), timeout) except asyncio.TimeoutError: self._notify( "\nA network error prevented the connection check to complete. See logs for more details." ) self.strategy_file_name = None self.strategy_name = None raise if all_status_go: self._notify("\nEnter \"start\" to start market making.")