@@ -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