diff --git a/freqtrade/optimize/hyperopt.py b/freqtrade/optimize/hyperopt.py index 2ef8ddc2f..d2404beb5 100644 --- a/freqtrade/optimize/hyperopt.py +++ b/freqtrade/optimize/hyperopt.py @@ -181,7 +181,7 @@ class Hyperopt: """ Display details of the hyperopt result """ - params = results['params_details'] + params = results.get('params_details', {}) # Default header string if header_str is None: @@ -335,6 +335,11 @@ class Hyperopt: 'end_date': max_date, } ) + return self._get_results_dict(backtesting_results, min_date, max_date, + params_dict, params_details) + + def _get_results_dict(self, backtesting_results, min_date, max_date, + params_dict, params_details): results_metrics = self._calculate_results_metrics(backtesting_results) results_explanation = self._format_results_explanation_string(results_metrics) diff --git a/tests/optimize/test_hyperopt.py b/tests/optimize/test_hyperopt.py index d3d544502..d18263ea2 100644 --- a/tests/optimize/test_hyperopt.py +++ b/tests/optimize/test_hyperopt.py @@ -357,8 +357,9 @@ def test_onlyprofit_loss_prefers_higher_profits(default_conf, hyperopt_results) def test_log_results_if_loss_improves(hyperopt, capsys) -> None: hyperopt.current_best_loss = 2 hyperopt.total_epochs = 2 - hyperopt.log_results( + hyperopt.print_results( { + 'is_best': False, 'loss': 1, 'current_epoch': 2, # This starts from 1 (in a human-friendly manner) 'results_explanation': 'foo.', @@ -371,8 +372,9 @@ def test_log_results_if_loss_improves(hyperopt, capsys) -> None: def test_no_log_if_loss_does_not_improve(hyperopt, caplog) -> None: hyperopt.current_best_loss = 2 - hyperopt.log_results( + hyperopt.print_results( { + 'is_best': False, 'loss': 3, 'current_epoch': 1, } @@ -400,8 +402,8 @@ def test_save_trials_saves_trials(mocker, hyperopt, testdatadir, caplog) -> None def test_read_trials_returns_trials_file(mocker, hyperopt, testdatadir, caplog) -> None: trials = create_trials(mocker, hyperopt, testdatadir) mock_load = mocker.patch('freqtrade.optimize.hyperopt.load', return_value=trials) - hyperopt_trial = hyperopt.read_trials() trials_file = testdatadir / 'optimize' / 'ut_trials.pickle' + hyperopt_trial = hyperopt._read_trials(trials_file) assert log_has(f"Reading Trials from '{trials_file}'", caplog) assert hyperopt_trial == trials mock_load.assert_called_once() @@ -472,8 +474,8 @@ def test_format_results(hyperopt): ] labels = ['currency', 'profit_percent', 'profit_abs', 'trade_duration'] df = pd.DataFrame.from_records(trades, columns=labels) - - result = hyperopt.format_results(df) + results_metrics = hyperopt._calculate_results_metrics(df) + result = hyperopt._format_explanation_string(results_metrics, 1) assert result.find(' 66.67%') assert result.find('Total profit 1.00000000 BTC') assert result.find('2.0000Σ %') @@ -485,7 +487,8 @@ def test_format_results(hyperopt): ('XPR/EUR', -1, -2, -246) ] df = pd.DataFrame.from_records(trades, columns=labels) - result = hyperopt.format_results(df) + results_metrics = hyperopt._calculate_results_metrics(df) + result = hyperopt._format_explanation_string(results_metrics, 1) assert result.find('Total profit 1.00000000 EUR') @@ -594,10 +597,38 @@ def test_generate_optimizer(mocker, default_conf) -> None: } response_expected = { 'loss': 1.9840569076926293, - 'results_explanation': (' 1 trades. Avg profit 2.31%. Total profit 0.00023300 BTC ' + 'results_explanation': (' 1 trades. Avg profit 2.31%. Total profit 0.00023300 BTC ' '( 2.31\N{GREEK CAPITAL LETTER SIGMA}%). Avg duration 100.0 mins.' ).encode(locale.getpreferredencoding(), 'replace').decode('utf-8'), - 'params': optimizer_param, + 'params_details': {'buy': {'adx-enabled': False, + 'adx-value': 0, + 'fastd-enabled': True, + 'fastd-value': 35, + 'mfi-enabled': False, + 'mfi-value': 0, + 'rsi-enabled': False, + 'rsi-value': 0, + 'trigger': 'macd_cross_signal'}, + 'roi': {0: 0.12000000000000001, + 20.0: 0.02, + 50.0: 0.01, + 110.0: 0}, + 'sell': {'sell-adx-enabled': False, + 'sell-adx-value': 0, + 'sell-fastd-enabled': True, + 'sell-fastd-value': 75, + 'sell-mfi-enabled': False, + 'sell-mfi-value': 0, + 'sell-rsi-enabled': False, + 'sell-rsi-value': 0, + 'sell-trigger': 'macd_cross_signal'}, + 'stoploss': -0.4}, + 'params_dict': optimizer_param, + 'results_metrics': {'avg_profit': 2.3117, + 'duration': 100.0, + 'profit': 2.3117, + 'total_profit': 0.000233, + 'trade_count': 1}, 'total_profit': 0.00023300 } @@ -692,7 +723,8 @@ def test_print_json_spaces_roi_stoploss(mocker, default_conf, caplog, capsys) -> parallel = mocker.patch( 'freqtrade.optimize.hyperopt.Hyperopt.run_optimizer_parallel', - MagicMock(return_value=[{'loss': 1, 'results_explanation': 'foo result', 'params': {}}]) + MagicMock(return_value=[{'loss': 1, 'results_explanation': 'foo result', 'params': {}, + 'params_details': {'roi': {}, 'stoploss': None}}]) ) patch_exchange(mocker)