diff --git a/freqtrade/strategy/hyper.py b/freqtrade/strategy/hyper.py index e7f31e20d..0b7055f01 100644 --- a/freqtrade/strategy/hyper.py +++ b/freqtrade/strategy/hyper.py @@ -244,6 +244,10 @@ class HyperStrategyMixin(object): if not attr_name.startswith('__'): # Ignore internals, not strictly necessary. attr = getattr(self, attr_name) if issubclass(attr.__class__, BaseParameter): + if (category and attr_name.startswith(category + '_') + and attr.category is not None and attr.category != category): + raise OperationalException( + f'Inconclusive parameter name {attr_name}, category: {attr.category}.') if (category is None or category == attr.category or (attr_name.startswith(category + '_') and attr.category is None)): yield attr_name, attr diff --git a/tests/optimize/test_hyperopt.py b/tests/optimize/test_hyperopt.py index 36b6f1229..c13da0d76 100644 --- a/tests/optimize/test_hyperopt.py +++ b/tests/optimize/test_hyperopt.py @@ -1093,8 +1093,6 @@ def test_print_epoch_details(capsys): def test_in_strategy_auto_hyperopt(mocker, hyperopt_conf, tmpdir) -> None: - # mocker.patch('freqtrade.optimize.hyperopt.dump', MagicMock()) - # mocker.patch('freqtrade.optimize.hyperopt.file_dump_json') (Path(tmpdir) / 'hyperopt_results').mkdir(parents=True) # No hyperopt needed del hyperopt_conf['hyperopt'] diff --git a/tests/strategy/test_interface.py b/tests/strategy/test_interface.py index 71f877cc3..3bfa691b4 100644 --- a/tests/strategy/test_interface.py +++ b/tests/strategy/test_interface.py @@ -617,3 +617,8 @@ def test_auto_hyperopt_interface(default_conf): # Parameter is disabled - so value from sell_param dict will NOT be used. assert strategy.sell_minusdi.value == 0.5 + + strategy.sell_rsi = IntParameter([0, 10], default=5, space='buy') + + with pytest.raises(OperationalException, match=r"Inconclusive parameter.*"): + [x for x in strategy.enumerate_parameters('sell')]