diff --git a/freqtrade/optimize/hyperopt_tools.py b/freqtrade/optimize/hyperopt_tools.py index 393c055c4..f8e9ad617 100755 --- a/freqtrade/optimize/hyperopt_tools.py +++ b/freqtrade/optimize/hyperopt_tools.py @@ -17,6 +17,7 @@ from freqtrade.enums import HyperoptState from freqtrade.exceptions import OperationalException from freqtrade.misc import deep_merge_dicts, round_coin_value, round_dict, safe_value_fallback2 from freqtrade.optimize.hyperopt_epoch_filters import hyperopt_filter_epochs +from freqtrade.optimize.optimize_reports import generate_wins_draws_losses logger = logging.getLogger(__name__) @@ -325,8 +326,10 @@ class HyperoptTools(): # New mode, using backtest result for metrics trials['results_metrics.winsdrawslosses'] = trials.apply( - lambda x: f"{x['results_metrics.wins']} {x['results_metrics.draws']:>4} " - f"{x['results_metrics.losses']:>4}", axis=1) + lambda x: generate_wins_draws_losses( + x['results_metrics.wins'], x['results_metrics.draws'], + x['results_metrics.losses'] + ), axis=1) trials = trials[['Best', 'current_epoch', 'results_metrics.total_trades', 'results_metrics.winsdrawslosses', @@ -337,7 +340,7 @@ class HyperoptTools(): 'loss', 'is_initial_point', 'is_random', 'is_best']] trials.columns = [ - 'Best', 'Epoch', 'Trades', ' Win Draw Loss', 'Avg profit', + 'Best', 'Epoch', 'Trades', ' Win Draw Loss Win%', 'Avg profit', 'Total profit', 'Profit', 'Avg duration', 'max_drawdown', 'max_drawdown_account', 'max_drawdown_abs', 'Objective', 'is_initial_point', 'is_random', 'is_best' ] diff --git a/freqtrade/optimize/optimize_reports.py b/freqtrade/optimize/optimize_reports.py index c406f866b..8ad37e7d8 100644 --- a/freqtrade/optimize/optimize_reports.py +++ b/freqtrade/optimize/optimize_reports.py @@ -86,7 +86,7 @@ def _get_line_header(first_column: str, stake_currency: str, 'Win Draw Loss Win%'] -def _generate_wins_draws_losses(wins, draws, losses): +def generate_wins_draws_losses(wins, draws, losses): if wins > 0 and losses == 0: wl_ratio = '100' elif wins == 0: @@ -600,7 +600,7 @@ def text_table_bt_results(pair_results: List[Dict[str, Any]], stake_currency: st output = [[ t['key'], t['trades'], t['profit_mean_pct'], t['profit_sum_pct'], t['profit_total_abs'], t['profit_total_pct'], t['duration_avg'], - _generate_wins_draws_losses(t['wins'], t['draws'], t['losses']) + generate_wins_draws_losses(t['wins'], t['draws'], t['losses']) ] for t in pair_results] # Ignore type as floatfmt does allow tuples but mypy does not know that return tabulate(output, headers=headers, @@ -626,7 +626,7 @@ def text_table_exit_reason(exit_reason_stats: List[Dict[str, Any]], stake_curren output = [[ t.get('exit_reason', t.get('sell_reason')), t['trades'], - _generate_wins_draws_losses(t['wins'], t['draws'], t['losses']), + generate_wins_draws_losses(t['wins'], t['draws'], t['losses']), t['profit_mean_pct'], t['profit_sum_pct'], round_coin_value(t['profit_total_abs'], stake_currency, False), t['profit_total_pct'], @@ -656,7 +656,7 @@ def text_table_tags(tag_type: str, tag_results: List[Dict[str, Any]], stake_curr t['profit_total_abs'], t['profit_total_pct'], t['duration_avg'], - _generate_wins_draws_losses( + generate_wins_draws_losses( t['wins'], t['draws'], t['losses'])] for t in tag_results] @@ -715,7 +715,7 @@ def text_table_strategy(strategy_results, stake_currency: str) -> str: output = [[ t['key'], t['trades'], t['profit_mean_pct'], t['profit_sum_pct'], t['profit_total_abs'], t['profit_total_pct'], t['duration_avg'], - _generate_wins_draws_losses(t['wins'], t['draws'], t['losses']), drawdown] + generate_wins_draws_losses(t['wins'], t['draws'], t['losses']), drawdown] for t, drawdown in zip(strategy_results, drawdown)] # Ignore type as floatfmt does allow tuples but mypy does not know that return tabulate(output, headers=headers,