Convert hyperoptloss resolver to static loader
This commit is contained in:
		| @@ -66,7 +66,7 @@ class Hyperopt: | ||||
|  | ||||
|         self.custom_hyperopt = HyperOptResolver.load_hyperopt(self.config) | ||||
|  | ||||
|         self.custom_hyperoptloss = HyperOptLossResolver(self.config).hyperoptloss | ||||
|         self.custom_hyperoptloss = HyperOptLossResolver.load_hyperoptloss(self.config) | ||||
|         self.calculate_loss = self.custom_hyperoptloss.hyperopt_loss_function | ||||
|  | ||||
|         self.trials_file = (self.config['user_data_dir'] / | ||||
|   | ||||
| @@ -77,9 +77,9 @@ class HyperOptLossResolver(IResolver): | ||||
|     """ | ||||
|     This class contains all the logic to load custom hyperopt loss class | ||||
|     """ | ||||
|     __slots__ = ['hyperoptloss'] | ||||
|  | ||||
|     def __init__(self, config: Dict) -> None: | ||||
|     @staticmethod | ||||
|     def load_hyperoptloss(config: Dict) -> IHyperOptLoss: | ||||
|         """ | ||||
|         Load the custom class from config parameter | ||||
|         :param config: configuration dictionary | ||||
| @@ -89,20 +89,21 @@ class HyperOptLossResolver(IResolver): | ||||
|         # default hyperopt loss | ||||
|         hyperoptloss_name = config.get('hyperopt_loss') or DEFAULT_HYPEROPT_LOSS | ||||
|  | ||||
|         self.hyperoptloss = self._load_hyperoptloss( | ||||
|         hyperoptloss = HyperOptLossResolver._load_hyperoptloss( | ||||
|             hyperoptloss_name, config, extra_dir=config.get('hyperopt_path')) | ||||
|  | ||||
|         # Assign ticker_interval to be used in hyperopt | ||||
|         self.hyperoptloss.__class__.ticker_interval = str(config['ticker_interval']) | ||||
|         hyperoptloss.__class__.ticker_interval = str(config['ticker_interval']) | ||||
|  | ||||
|         if not hasattr(self.hyperoptloss, 'hyperopt_loss_function'): | ||||
|         if not hasattr(hyperoptloss, 'hyperopt_loss_function'): | ||||
|             raise OperationalException( | ||||
|                 f"Found HyperoptLoss class {hyperoptloss_name} does not " | ||||
|                 "implement `hyperopt_loss_function`.") | ||||
|         return hyperoptloss | ||||
|  | ||||
|     def _load_hyperoptloss( | ||||
|             self, hyper_loss_name: str, config: Dict, | ||||
|             extra_dir: Optional[str] = None) -> IHyperOptLoss: | ||||
|     @staticmethod | ||||
|     def _load_hyperoptloss(hyper_loss_name: str, config: Dict, | ||||
|                            extra_dir: Optional[str] = None) -> IHyperOptLoss: | ||||
|         """ | ||||
|         Search and loads the specified hyperopt loss class. | ||||
|         :param hyper_loss_name: name of the module to import | ||||
| @@ -112,11 +113,12 @@ class HyperOptLossResolver(IResolver): | ||||
|         """ | ||||
|         current_path = Path(__file__).parent.parent.joinpath('optimize').resolve() | ||||
|  | ||||
|         abs_paths = self.build_search_paths(config, current_path=current_path, | ||||
|                                             user_subdir=USERPATH_HYPEROPTS, extra_dir=extra_dir) | ||||
|         abs_paths = IResolver.build_search_paths(config, current_path=current_path, | ||||
|                                                  user_subdir=USERPATH_HYPEROPTS, | ||||
|                                                  extra_dir=extra_dir) | ||||
|  | ||||
|         hyperoptloss = self._load_object(paths=abs_paths, object_type=IHyperOptLoss, | ||||
|                                          object_name=hyper_loss_name) | ||||
|         hyperoptloss = IResolver._load_object(paths=abs_paths, object_type=IHyperOptLoss, | ||||
|                                               object_name=hyper_loss_name) | ||||
|         if hyperoptloss: | ||||
|             return hyperoptloss | ||||
|  | ||||
|   | ||||
| @@ -198,7 +198,7 @@ def test_hyperoptlossresolver(mocker, default_conf, caplog) -> None: | ||||
|         'freqtrade.resolvers.hyperopt_resolver.HyperOptLossResolver._load_hyperoptloss', | ||||
|         MagicMock(return_value=hl) | ||||
|     ) | ||||
|     x = HyperOptLossResolver(default_conf).hyperoptloss | ||||
|     x = HyperOptLossResolver.load_hyperoptloss(default_conf) | ||||
|     assert hasattr(x, "hyperopt_loss_function") | ||||
|  | ||||
|  | ||||
| @@ -206,7 +206,7 @@ def test_hyperoptlossresolver_wrongname(mocker, default_conf, caplog) -> None: | ||||
|     default_conf.update({'hyperopt_loss': "NonExistingLossClass"}) | ||||
|  | ||||
|     with pytest.raises(OperationalException, match=r'Impossible to load HyperoptLoss.*'): | ||||
|         HyperOptLossResolver(default_conf).hyperopt | ||||
|         HyperOptLossResolver.load_hyperoptloss(default_conf) | ||||
|  | ||||
|  | ||||
| def test_start_not_installed(mocker, default_conf, caplog, import_fails) -> None: | ||||
| @@ -286,7 +286,7 @@ def test_start_filelock(mocker, default_conf, caplog) -> None: | ||||
|  | ||||
|  | ||||
| def test_loss_calculation_prefer_correct_trade_count(default_conf, hyperopt_results) -> None: | ||||
|     hl = HyperOptLossResolver(default_conf).hyperoptloss | ||||
|     hl = HyperOptLossResolver.load_hyperoptloss(default_conf) | ||||
|     correct = hl.hyperopt_loss_function(hyperopt_results, 600) | ||||
|     over = hl.hyperopt_loss_function(hyperopt_results, 600 + 100) | ||||
|     under = hl.hyperopt_loss_function(hyperopt_results, 600 - 100) | ||||
| @@ -298,7 +298,7 @@ def test_loss_calculation_prefer_shorter_trades(default_conf, hyperopt_results) | ||||
|     resultsb = hyperopt_results.copy() | ||||
|     resultsb.loc[1, 'trade_duration'] = 20 | ||||
|  | ||||
|     hl = HyperOptLossResolver(default_conf).hyperoptloss | ||||
|     hl = HyperOptLossResolver.load_hyperoptloss(default_conf) | ||||
|     longer = hl.hyperopt_loss_function(hyperopt_results, 100) | ||||
|     shorter = hl.hyperopt_loss_function(resultsb, 100) | ||||
|     assert shorter < longer | ||||
| @@ -310,7 +310,7 @@ def test_loss_calculation_has_limited_profit(default_conf, hyperopt_results) -> | ||||
|     results_under = hyperopt_results.copy() | ||||
|     results_under['profit_percent'] = hyperopt_results['profit_percent'] / 2 | ||||
|  | ||||
|     hl = HyperOptLossResolver(default_conf).hyperoptloss | ||||
|     hl = HyperOptLossResolver.load_hyperoptloss(default_conf) | ||||
|     correct = hl.hyperopt_loss_function(hyperopt_results, 600) | ||||
|     over = hl.hyperopt_loss_function(results_over, 600) | ||||
|     under = hl.hyperopt_loss_function(results_under, 600) | ||||
| @@ -325,7 +325,7 @@ def test_sharpe_loss_prefers_higher_profits(default_conf, hyperopt_results) -> N | ||||
|     results_under['profit_percent'] = hyperopt_results['profit_percent'] / 2 | ||||
|  | ||||
|     default_conf.update({'hyperopt_loss': 'SharpeHyperOptLoss'}) | ||||
|     hl = HyperOptLossResolver(default_conf).hyperoptloss | ||||
|     hl = HyperOptLossResolver.load_hyperoptloss(default_conf) | ||||
|     correct = hl.hyperopt_loss_function(hyperopt_results, len(hyperopt_results), | ||||
|                                         datetime(2019, 1, 1), datetime(2019, 5, 1)) | ||||
|     over = hl.hyperopt_loss_function(results_over, len(hyperopt_results), | ||||
| @@ -343,7 +343,7 @@ def test_onlyprofit_loss_prefers_higher_profits(default_conf, hyperopt_results) | ||||
|     results_under['profit_percent'] = hyperopt_results['profit_percent'] / 2 | ||||
|  | ||||
|     default_conf.update({'hyperopt_loss': 'OnlyProfitHyperOptLoss'}) | ||||
|     hl = HyperOptLossResolver(default_conf).hyperoptloss | ||||
|     hl = HyperOptLossResolver.load_hyperoptloss(default_conf) | ||||
|     correct = hl.hyperopt_loss_function(hyperopt_results, len(hyperopt_results), | ||||
|                                         datetime(2019, 1, 1), datetime(2019, 5, 1)) | ||||
|     over = hl.hyperopt_loss_function(results_over, len(hyperopt_results), | ||||
|   | ||||
		Reference in New Issue
	
	Block a user