From 2c7a248307356fb6170ac2aa79c7f9e5443e0066 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 21 Jul 2019 16:07:06 +0200 Subject: [PATCH] Use user_data_dir in hyperopt --- freqtrade/optimize/__init__.py | 4 ++-- freqtrade/optimize/hyperopt.py | 17 ++++++++++------- freqtrade/tests/optimize/test_hyperopt.py | 9 ++++----- 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/freqtrade/optimize/__init__.py b/freqtrade/optimize/__init__.py index 8b548eefe..2c7c42c4d 100644 --- a/freqtrade/optimize/__init__.py +++ b/freqtrade/optimize/__init__.py @@ -64,14 +64,14 @@ def start_hyperopt(args: Namespace) -> None: :return: None """ # Import here to avoid loading hyperopt module when it's not used - from freqtrade.optimize.hyperopt import Hyperopt, HYPEROPT_LOCKFILE + from freqtrade.optimize.hyperopt import Hyperopt # Initialize configuration config = setup_configuration(args, RunMode.HYPEROPT) logger.info('Starting freqtrade in Hyperopt mode') - lock = FileLock(HYPEROPT_LOCKFILE) + lock = FileLock(Hyperopt.get_lock_filename(config)) try: with lock.acquire(timeout=1): diff --git a/freqtrade/optimize/hyperopt.py b/freqtrade/optimize/hyperopt.py index a1ec43c14..2fff91e58 100644 --- a/freqtrade/optimize/hyperopt.py +++ b/freqtrade/optimize/hyperopt.py @@ -30,9 +30,6 @@ logger = logging.getLogger(__name__) INITIAL_POINTS = 30 MAX_LOSS = 100000 # just a big enough number to be bad result in loss optimization -TICKERDATA_PICKLE = Path.cwd() / 'user_data' / 'hyperopt_tickerdata.pkl' -TRIALSDATA_PICKLE = Path.cwd() / 'user_data' / 'hyperopt_results.pickle' -HYPEROPT_LOCKFILE = Path.cwd() / 'user_data' / 'hyperopt.lock' class Hyperopt(Backtesting): @@ -50,6 +47,8 @@ class Hyperopt(Backtesting): self.custom_hyperoptloss = HyperOptLossResolver(self.config).hyperoptloss self.calculate_loss = self.custom_hyperoptloss.hyperopt_loss_function + self.trials_file = self.config['user_data_dir'] / 'hyperopt_results.pickle' + self.tickerdata_pickle = self.config['user_data_dir'] / 'hyperopt_tickerdata.pkl' self.total_tries = config.get('epochs', 0) self.current_best_loss = 100 @@ -59,7 +58,6 @@ class Hyperopt(Backtesting): logger.info("Continuing on previous hyperopt results.") # Previous evaluations - self.trials_file = TRIALSDATA_PICKLE self.trials: List = [] # Populate functions here (hasattr is slow so should not be run during "regular" operations) @@ -77,11 +75,16 @@ class Hyperopt(Backtesting): self.max_open_trades = 0 self.position_stacking = self.config.get('position_stacking', False), + @staticmethod + def get_lock_filename(config) -> str: + + return str(config['user_data_dir'] / 'hyperopt.lock') + def clean_hyperopt(self): """ Remove hyperopt pickle files to restart hyperopt. """ - for f in [TICKERDATA_PICKLE, TRIALSDATA_PICKLE]: + for f in [self.tickerdata_pickle, self.trials_file]: p = Path(f) if p.is_file(): logger.info(f"Removing `{p}`.") @@ -199,7 +202,7 @@ class Hyperopt(Backtesting): if self.has_space('stoploss'): self.strategy.stoploss = params['stoploss'] - processed = load(TICKERDATA_PICKLE) + processed = load(self.tickerdata_pickle) min_date, max_date = get_timeframe(processed) @@ -305,7 +308,7 @@ class Hyperopt(Backtesting): preprocessed = self.strategy.tickerdata_to_dataframe(data) - dump(preprocessed, TICKERDATA_PICKLE) + dump(preprocessed, self.tickerdata_pickle) # We don't need exchange instance anymore while running hyperopt self.exchange = None # type: ignore diff --git a/freqtrade/tests/optimize/test_hyperopt.py b/freqtrade/tests/optimize/test_hyperopt.py index 2370e145e..dc34198cf 100644 --- a/freqtrade/tests/optimize/test_hyperopt.py +++ b/freqtrade/tests/optimize/test_hyperopt.py @@ -15,8 +15,7 @@ from freqtrade.data.history import load_tickerdata_file from freqtrade.optimize import setup_configuration, start_hyperopt from freqtrade.optimize.default_hyperopt import DefaultHyperOpts from freqtrade.optimize.default_hyperopt_loss import DefaultHyperOptLoss -from freqtrade.optimize.hyperopt import (HYPEROPT_LOCKFILE, TICKERDATA_PICKLE, - Hyperopt) +from freqtrade.optimize.hyperopt import Hyperopt from freqtrade.resolvers.hyperopt_resolver import HyperOptResolver, HyperOptLossResolver from freqtrade.state import RunMode from freqtrade.strategy.interface import SellType @@ -272,7 +271,7 @@ def test_start_failure(mocker, default_conf, caplog) -> None: def test_start_filelock(mocker, default_conf, caplog) -> None: - start_mock = MagicMock(side_effect=Timeout(HYPEROPT_LOCKFILE)) + start_mock = MagicMock(side_effect=Timeout(Hyperopt.get_lock_filename(default_conf))) patched_configuration_load_config_file(mocker, default_conf) mocker.patch('freqtrade.optimize.hyperopt.Hyperopt.start', start_mock) patch_exchange(mocker) @@ -609,10 +608,10 @@ def test_clean_hyperopt(mocker, default_conf, caplog): }) mocker.patch("freqtrade.optimize.hyperopt.Path.is_file", MagicMock(return_value=True)) unlinkmock = mocker.patch("freqtrade.optimize.hyperopt.Path.unlink", MagicMock()) - Hyperopt(default_conf) + h = Hyperopt(default_conf) assert unlinkmock.call_count == 2 - assert log_has(f"Removing `{TICKERDATA_PICKLE}`.", caplog.record_tuples) + assert log_has(f"Removing `{h.tickerdata_pickle}`.", caplog.record_tuples) def test_continue_hyperopt(mocker, default_conf, caplog):