From eaa656f859a5edfb9837707b14846aa5a44f06cc Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 30 May 2022 07:07:47 +0200 Subject: [PATCH] Hyperoptable parameters can be instance attributes --- freqtrade/optimize/backtesting.py | 4 +--- freqtrade/strategy/hyper.py | 12 ++++-------- freqtrade/strategy/interface.py | 3 +++ 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/freqtrade/optimize/backtesting.py b/freqtrade/optimize/backtesting.py index 43bc97f32..fa32666cc 100755 --- a/freqtrade/optimize/backtesting.py +++ b/freqtrade/optimize/backtesting.py @@ -187,9 +187,7 @@ class Backtesting: # since a "perfect" stoploss-exit is assumed anyway # And the regular "stoploss" function would not apply to that case self.strategy.order_types['stoploss_on_exchange'] = False - if self.dataprovider.runmode == RunMode.BACKTEST: - # in hyperopt mode - don't re-init params - self.strategy.ft_load_hyper_params(False) + self.strategy.ft_bot_start() def _load_protections(self, strategy: IStrategy): diff --git a/freqtrade/strategy/hyper.py b/freqtrade/strategy/hyper.py index ee62b5516..7f99c9b8a 100644 --- a/freqtrade/strategy/hyper.py +++ b/freqtrade/strategy/hyper.py @@ -6,7 +6,6 @@ import logging from pathlib import Path from typing import Any, Dict, Iterator, List, Tuple -from freqtrade.enums import RunMode from freqtrade.exceptions import OperationalException from freqtrade.misc import deep_merge_dicts, json_load from freqtrade.optimize.hyperopt_tools import HyperoptTools @@ -34,9 +33,7 @@ class HyperStrategyMixin: params = self.load_params_from_file() params = params.get('params', {}) self._ft_params_from_file = params - - if config.get('runmode') != RunMode.BACKTEST: - self.ft_load_hyper_params(config.get('runmode') == RunMode.HYPEROPT) + # Init/loading of parameters is done as part of ft_bot_start(). def enumerate_parameters(self, category: str = None) -> Iterator[Tuple[str, BaseParameter]]: """ @@ -56,12 +53,11 @@ class HyperStrategyMixin: for par in params: yield par.name, par - @classmethod - def detect_parameters(cls, category: str) -> Iterator[Tuple[str, BaseParameter]]: + def detect_parameters(self, category: str) -> Iterator[Tuple[str, BaseParameter]]: """ Detect all parameters for 'category' """ - for attr_name in dir(cls): + for attr_name in dir(self): if not attr_name.startswith('__'): # Ignore internals, not strictly necessary. - attr = getattr(cls, attr_name) + attr = getattr(self, attr_name) if issubclass(attr.__class__, BaseParameter): if (attr_name.startswith(category + '_') and attr.category is not None and attr.category != category): diff --git a/freqtrade/strategy/interface.py b/freqtrade/strategy/interface.py index c521943b1..344c43b15 100644 --- a/freqtrade/strategy/interface.py +++ b/freqtrade/strategy/interface.py @@ -14,6 +14,7 @@ from freqtrade.constants import ListPairsWithTimeframes from freqtrade.data.dataprovider import DataProvider from freqtrade.enums import (CandleType, ExitCheckTuple, ExitType, SignalDirection, SignalTagType, SignalType, TradingMode) +from freqtrade.enums.runmode import RunMode from freqtrade.exceptions import OperationalException, StrategyError from freqtrade.exchange import timeframe_to_minutes, timeframe_to_next_date, timeframe_to_seconds from freqtrade.persistence import Order, PairLocks, Trade @@ -151,6 +152,8 @@ class IStrategy(ABC, HyperStrategyMixin): """ strategy_safe_wrapper(self.bot_start)() + self.ft_load_hyper_params(self.config.get('runmode') == RunMode.HYPEROPT) + @abstractmethod def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: """