From 7bf20d9060e999358510afeeacfafe5abfd818dd Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 4 Sep 2023 18:25:00 +0200 Subject: [PATCH 1/2] Show drawdown from/to on /profit calls --- freqtrade/rpc/rpc.py | 16 ++++++++++++++-- freqtrade/rpc/telegram.py | 6 +++++- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/freqtrade/rpc/rpc.py b/freqtrade/rpc/rpc.py index 1206cc2f1..57d1b6c36 100644 --- a/freqtrade/rpc/rpc.py +++ b/freqtrade/rpc/rpc.py @@ -526,6 +526,7 @@ class RPC: winrate = (winning_trades / closed_trade_count) if closed_trade_count > 0 else 0 trades_df = DataFrame([{'close_date': format_date(trade.close_date), + 'close_date_dt': trade.close_date, 'profit_abs': trade.close_profit_abs} for trade in trades if not trade.is_open and trade.close_date]) @@ -533,10 +534,15 @@ class RPC: max_drawdown_abs = 0.0 max_drawdown = 0.0 + drawdown_start: Optional[datetime] = None + drawdown_end: Optional[datetime] = None + dd_high_val = dd_low_val = 0.0 if len(trades_df) > 0: try: - (max_drawdown_abs, _, _, _, _, max_drawdown) = calculate_max_drawdown( - trades_df, value_col='profit_abs', starting_balance=starting_balance) + (max_drawdown_abs, drawdown_start, drawdown_end, dd_high_val, dd_low_val, + max_drawdown) = calculate_max_drawdown( + trades_df, value_col='profit_abs', date_col='close_date_dt', + starting_balance=starting_balance) except ValueError: # ValueError if no losing trade. pass @@ -588,6 +594,12 @@ class RPC: 'expectancy_ratio': expectancy_ratio, 'max_drawdown': max_drawdown, 'max_drawdown_abs': max_drawdown_abs, + 'max_drawdown_start': format_date(drawdown_start), + 'max_drawdown_start_timestamp': dt_ts_def(drawdown_start), + 'max_drawdown_end': format_date(drawdown_end), + 'max_drawdown_end_timestamp': dt_ts_def(drawdown_end), + 'drawdown_high': dd_high_val, + 'drawdown_low': dd_low_val, 'trading_volume': trading_volume, 'bot_start_timestamp': dt_ts_def(bot_start, 0), 'bot_start_date': format_date(bot_start), diff --git a/freqtrade/rpc/telegram.py b/freqtrade/rpc/telegram.py index 8972f4a16..92b91ece3 100644 --- a/freqtrade/rpc/telegram.py +++ b/freqtrade/rpc/telegram.py @@ -889,7 +889,11 @@ class Telegram(RPCHandler): f"*Trading volume:* `{round_coin_value(stats['trading_volume'], stake_cur)}`\n" f"*Profit factor:* `{stats['profit_factor']:.2f}`\n" f"*Max Drawdown:* `{stats['max_drawdown']:.2%} " - f"({round_coin_value(stats['max_drawdown_abs'], stake_cur)})`" + f"({round_coin_value(stats['max_drawdown_abs'], stake_cur)})`\n" + f" from `{stats['max_drawdown_start']} " + f"({round_coin_value(stats['drawdown_high'], stake_cur)})`\n" + f" to `{stats['max_drawdown_end']} " + f"({round_coin_value(stats['drawdown_low'], stake_cur)})`\n" ) await self._send_msg(markdown_msg, reload_able=True, callback_path="update_profit", query=update.callback_query) From e854667eb83ed59b62ad3f2431e38f0cb9e3e436 Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 4 Sep 2023 18:27:45 +0200 Subject: [PATCH 2/2] Add max_drawdown_start and end to /profit API endpoints --- freqtrade/rpc/api_server/api_schemas.py | 4 ++++ tests/rpc/test_rpc_apiserver.py | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/freqtrade/rpc/api_server/api_schemas.py b/freqtrade/rpc/api_server/api_schemas.py index 422e5ac3a..aad06644a 100644 --- a/freqtrade/rpc/api_server/api_schemas.py +++ b/freqtrade/rpc/api_server/api_schemas.py @@ -141,6 +141,10 @@ class Profit(BaseModel): expectancy_ratio: float max_drawdown: float max_drawdown_abs: float + max_drawdown_start: str + max_drawdown_start_timestamp: int + max_drawdown_end: str + max_drawdown_end_timestamp: int trading_volume: Optional[float] = None bot_start_timestamp: int bot_start_date: str diff --git a/tests/rpc/test_rpc_apiserver.py b/tests/rpc/test_rpc_apiserver.py index 856d10dc5..2b6e1d530 100644 --- a/tests/rpc/test_rpc_apiserver.py +++ b/tests/rpc/test_rpc_apiserver.py @@ -977,6 +977,10 @@ def test_api_profit(botclient, mocker, ticker, fee, markets, is_short, expected) 'expectancy_ratio': expected['expectancy_ratio'], 'max_drawdown': ANY, 'max_drawdown_abs': ANY, + 'max_drawdown_start': ANY, + 'max_drawdown_start_timestamp': ANY, + 'max_drawdown_end': ANY, + 'max_drawdown_end_timestamp': ANY, 'trading_volume': expected['trading_volume'], 'bot_start_timestamp': 0, 'bot_start_date': '',