From 34e6ce431f60f6cca0406546a4967d75f10b0e5f Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 14 Jun 2021 20:45:06 +0200 Subject: [PATCH] Print non-optimized parameters (also stop / roi) --- freqtrade/optimize/hyperopt.py | 22 +++++++++++++++++++++- freqtrade/optimize/hyperopt_tools.py | 28 ++++++++++++++++++++-------- 2 files changed, 41 insertions(+), 9 deletions(-) diff --git a/freqtrade/optimize/hyperopt.py b/freqtrade/optimize/hyperopt.py index 4d2924bf4..c23884bcd 100644 --- a/freqtrade/optimize/hyperopt.py +++ b/freqtrade/optimize/hyperopt.py @@ -23,7 +23,7 @@ from pandas import DataFrame from freqtrade.constants import DATETIME_PRINT_FORMAT, LAST_BT_RESULT_FN from freqtrade.data.converter import trim_dataframes from freqtrade.data.history import get_timerange -from freqtrade.misc import file_dump_json, plural +from freqtrade.misc import deep_merge_dicts, file_dump_json, plural from freqtrade.optimize.backtesting import Backtesting # Import IHyperOpt and IHyperOptLoss to allow unpickling classes from these modules from freqtrade.optimize.hyperopt_auto import HyperOptAuto @@ -201,6 +201,25 @@ class Hyperopt: return result + def _get_no_optimize_details(self) -> Dict[str, Any]: + """ + Get non-optimized parameters + """ + result: Dict[str, Any] = {} + strategy = self.backtesting.strategy + if not HyperoptTools.has_space(self.config, 'roi'): + result['roi'] = strategy.minimal_roi + if not HyperoptTools.has_space(self.config, 'stoploss'): + result['stoploss'] = strategy.stoploss + if not HyperoptTools.has_space(self.config, 'trailing'): + result['trailing'] = { + 'trailing_stop': strategy.trailing_stop, + 'trailing_stop_positive': strategy.trailing_stop_positive, + 'trailing_stop_positive_offset': strategy.trailing_stop_positive_offset, + 'trailing_only_offset_is_reached': strategy.trailing_only_offset_is_reached, + } + return result + def print_results(self, results) -> None: """ Log results if it is better than any previous evaluation @@ -311,6 +330,7 @@ class Hyperopt: strat_stats, self.config['stake_currency']) not_optimized = self.backtesting.strategy.get_no_optimize_params() + not_optimized = deep_merge_dicts(not_optimized, self._get_no_optimize_details()) trade_count = strat_stats['total_trades'] total_profit = strat_stats['profit_total'] diff --git a/freqtrade/optimize/hyperopt_tools.py b/freqtrade/optimize/hyperopt_tools.py index dcffab8b2..0d17a5d13 100755 --- a/freqtrade/optimize/hyperopt_tools.py +++ b/freqtrade/optimize/hyperopt_tools.py @@ -130,9 +130,9 @@ class HyperoptTools(): non_optimized) HyperoptTools._params_pretty_print(params, 'sell', "Sell hyperspace params:", non_optimized) - HyperoptTools._params_pretty_print(params, 'roi', "ROI table:") - HyperoptTools._params_pretty_print(params, 'stoploss', "Stoploss:") - HyperoptTools._params_pretty_print(params, 'trailing', "Trailing stop:") + HyperoptTools._params_pretty_print(params, 'roi', "ROI table:", non_optimized) + HyperoptTools._params_pretty_print(params, 'stoploss', "Stoploss:", non_optimized) + HyperoptTools._params_pretty_print(params, 'trailing', "Trailing stop:", non_optimized) @staticmethod def _params_update_for_json(result_dict, params, non_optimized, space: str) -> None: @@ -159,19 +159,31 @@ class HyperoptTools(): if space in params or space in non_optimized: space_params = HyperoptTools._space_params(params, space, 5) result = f"\n# {header}\n" - if space == 'stoploss': - result += f"stoploss = {space_params.get('stoploss')}" - elif space == 'roi': + if space == "stoploss": + opt = True + if not space_params: + space_params = HyperoptTools._space_params(params, space, 5) + opt = False + result += (f"stoploss = {space_params.get('stoploss')}" + f"{' # value loaded from strategy' if not opt else ''}") + + elif space == "roi": minimal_roi_result = rapidjson.dumps({ str(k): v for k, v in space_params.items() }, default=str, indent=4, number_mode=rapidjson.NM_NATIVE) result += f"minimal_roi = {minimal_roi_result}" - elif space == 'trailing': + elif space == "trailing": + opt = True + if not space_params: + # Not optimized ... + space_params = HyperoptTools._space_params(non_optimized, space, 5) + opt = False for k, v in space_params.items(): - result += f'{k} = {v}\n' + result += f"{k} = {v}{' # value loaded from strategy' if not opt else ''}\n" else: + # Buy / sell parameters no_params = HyperoptTools._space_params(non_optimized, space, 5) result += f"{space}_params = {HyperoptTools._pprint(space_params, no_params)}"