feat: improve Auto-space detection logic

This commit is contained in:
Matthias
2025-11-04 06:54:42 +01:00
parent ab28e43050
commit c091426c44
2 changed files with 22 additions and 13 deletions

View File

@@ -174,21 +174,23 @@ def detect_all_parameters(
attr = getattr(obj, attr_name) attr = getattr(obj, attr_name)
if not issubclass(attr.__class__, BaseParameter): if not issubclass(attr.__class__, BaseParameter):
continue continue
category = attr.category auto_category: str | None = None
if attr.category is None: # Category auto detection
# Category auto detection for category in auto_categories:
for category in auto_categories: if attr_name.startswith(category + "_"):
if category == attr.category or ( auto_category = category
attr_name.startswith(category + "_") and attr.category is None break
): if auto_category is None and attr.category is None:
attr.category = category raise OperationalException(f"Cannot determine parameter space for {attr_name}.")
if attr.category is None or ( if auto_category is not None and attr.category is None:
attr_name.startswith(category + "_") attr.category = auto_category
if (
auto_category is not None
and attr.category is not None and attr.category is not None
and attr.category != category and auto_category != attr.category
): ):
raise OperationalException( raise OperationalException(
f"Inconclusive parameter name {attr_name}, space: {attr.category}." f"Conflicting parameter space for {attr_name}: {auto_category} vs {attr.category}."
) )
attr.name = attr_name attr.name = attr_name
result[attr.category][attr_name] = attr result[attr.category][attr_name] = attr

View File

@@ -951,7 +951,14 @@ def test_auto_hyperopt_interface(default_conf):
strategy.__class__.sell_rsi = IntParameter([0, 10], default=5, space="buy") strategy.__class__.sell_rsi = IntParameter([0, 10], default=5, space="buy")
with pytest.raises(OperationalException, match=r"Inconclusive parameter.*"): with pytest.raises(OperationalException, match=r"Conflicting parameter space.*"):
detect_all_parameters(strategy.__class__)
strategy.__class__.exit22_rsi = IntParameter([0, 10], default=5)
with pytest.raises(
OperationalException, match=r"Cannot determine parameter space for exit22_rsi\."
):
detect_all_parameters(strategy.__class__) detect_all_parameters(strategy.__class__)