Skip to content

Commit 718efc8

Browse files
committed
Also add min trade duration and display the info horizontally
1 parent 6d3ed84 commit 718efc8

File tree

2 files changed

+44
-12
lines changed

2 files changed

+44
-12
lines changed

freqtrade/optimize/optimize_reports/bt_output.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -370,9 +370,18 @@ def text_table_add_metrics(strat_results: dict) -> None:
370370
f"{strat_results['winning_days']} / "
371371
f"{strat_results['draw_days']} / {strat_results['losing_days']}",
372372
),
373-
("Max trade duration", f"{strat_results['holding_max']}"),
374-
("Avg. Duration Winners", f"{strat_results['winner_holding_avg']}"),
375-
("Avg. Duration Loser", f"{strat_results['loser_holding_avg']}"),
373+
(
374+
"Min/Max/Avg. Duration Winners",
375+
f"{strat_results.get('winner_holding_min', 'N/A')} / "
376+
f"{strat_results.get('winner_holding_max', 'N/A')} / "
377+
f"{strat_results.get('winner_holding_avg', 'N/A')}",
378+
),
379+
(
380+
"Min/Max/Avg. Duration Losers",
381+
f"{strat_results.get('loser_holding_min', 'N/A')} / "
382+
f"{strat_results.get('loser_holding_max', 'N/A')} / "
383+
f"{strat_results.get('loser_holding_avg', 'N/A')}",
384+
),
376385
(
377386
"Max Consecutive Wins / Loss",
378387
(

freqtrade/optimize/optimize_reports/optimize_reports.py

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -336,27 +336,44 @@ def generate_trading_stats(results: DataFrame) -> dict[str, Any]:
336336
}
337337

338338
winning_trades = results.loc[results["profit_ratio"] > 0]
339+
winning_duratios = winning_trades["trade_duration"]
339340
draw_trades = results.loc[results["profit_ratio"] == 0]
340341
losing_trades = results.loc[results["profit_ratio"] < 0]
342+
losing_duratios = losing_trades["trade_duration"]
341343

342344
holding_avg = (
343345
timedelta(minutes=round(results["trade_duration"].mean()))
344346
if not results.empty
345347
else timedelta()
346348
)
347-
holding_max = (
348-
timedelta(minutes=round(results["trade_duration"].max()))
349-
if not results.empty
349+
winner_holding_min = (
350+
timedelta(minutes=round(winning_duratios[winning_duratios > 0].min()))
351+
if not winning_duratios.empty
352+
else timedelta()
353+
)
354+
winner_holding_max = (
355+
timedelta(minutes=round(winning_duratios.max()))
356+
if not winning_duratios.empty
350357
else timedelta()
351358
)
352359
winner_holding_avg = (
353-
timedelta(minutes=round(winning_trades["trade_duration"].mean()))
354-
if not winning_trades.empty
360+
timedelta(minutes=round(winning_duratios.mean()))
361+
if not winning_duratios.empty
362+
else timedelta()
363+
)
364+
loser_holding_min = (
365+
timedelta(minutes=round(losing_duratios[losing_duratios > 0].min()))
366+
if not losing_duratios.empty
367+
else timedelta()
368+
)
369+
loser_holding_max = (
370+
timedelta(minutes=round(losing_duratios.max()))
371+
if not losing_duratios.empty
355372
else timedelta()
356373
)
357374
loser_holding_avg = (
358-
timedelta(minutes=round(losing_trades["trade_duration"].mean()))
359-
if not losing_trades.empty
375+
timedelta(minutes=round(losing_duratios.mean()))
376+
if not losing_duratios.empty
360377
else timedelta()
361378
)
362379
winstreak, loss_streak = calc_streak(results)
@@ -368,10 +385,16 @@ def generate_trading_stats(results: DataFrame) -> dict[str, Any]:
368385
"winrate": len(winning_trades) / len(results) if len(results) else 0.0,
369386
"holding_avg": holding_avg,
370387
"holding_avg_s": holding_avg.total_seconds(),
371-
"holding_max": holding_max,
372-
"holding_max_s": holding_max.total_seconds(),
388+
"winner_holding_min": winner_holding_min,
389+
"winner_holding_min_s": winner_holding_min.total_seconds(),
390+
"winner_holding_max": winner_holding_max,
391+
"winner_holding_max_s": winner_holding_max.total_seconds(),
373392
"winner_holding_avg": winner_holding_avg,
374393
"winner_holding_avg_s": winner_holding_avg.total_seconds(),
394+
"loser_holding_min": loser_holding_min,
395+
"loser_holding_min_s": loser_holding_min.total_seconds(),
396+
"loser_holding_max": loser_holding_max,
397+
"loser_holding_max_s": loser_holding_max.total_seconds(),
375398
"loser_holding_avg": loser_holding_avg,
376399
"loser_holding_avg_s": loser_holding_avg.total_seconds(),
377400
"max_consecutive_wins": winstreak,

0 commit comments

Comments
 (0)