diff --git a/freqtrade/rpc/api_server/api_trading.py b/freqtrade/rpc/api_server/api_trading.py index 3ec7a08b3..085116d0a 100644 --- a/freqtrade/rpc/api_server/api_trading.py +++ b/freqtrade/rpc/api_server/api_trading.py @@ -31,6 +31,7 @@ from freqtrade.rpc.api_server.api_schemas import ( ResultMsg, Stats, StatusMsg, + WalletsSummary, WhitelistResponse, ) from freqtrade.rpc.api_server.deps import get_config, get_rpc @@ -104,6 +105,21 @@ def stats(rpc: RPC = Depends(get_rpc)): return rpc._rpc_stats() +@router.get( + "/historic_balance", + response_model=WalletsSummary, + tags=["info"], +) +def api_get_backtest_wallet(rpc: RPC = Depends(get_rpc)): + results = rpc._rpc_get_historic_balance() + + return { + "columns": results.columns.tolist(), + "data": results.values.tolist(), + "length": len(results), + } + + @router.get("/daily", response_model=DailyWeeklyMonthly, tags=["Trading-info"]) def daily( timescale: int = Query(7, ge=1, description="Number of days to fetch data for"), diff --git a/freqtrade/rpc/rpc.py b/freqtrade/rpc/rpc.py index 37b8dfa6d..7ad480989 100644 --- a/freqtrade/rpc/rpc.py +++ b/freqtrade/rpc/rpc.py @@ -12,7 +12,7 @@ import psutil from dateutil.relativedelta import relativedelta from dateutil.tz import tzlocal from numpy import inf, int64, isnan, mean, nan -from pandas import DataFrame, NaT +from pandas import DataFrame, NaT, read_sql from sqlalchemy import func, select from freqtrade import __version__ @@ -785,6 +785,19 @@ class RPC: "bot_start_date": format_date(bot_start), } + def _rpc_get_historic_balance(self) -> DataFrame: + """ + Returns the historic balance of the bot + :return: DataFrame with the balance history + """ + results = read_sql("wallet_balance", con=Trade.session.bind, parse_dates=["timestamp"]) + results.loc[:, "total"] = results["price"] * results["balance"] + results = results.rename({"timestamp": "date"}, axis=1) + results.loc[:, "__date_ts"] = results.loc[:, "date"].astype("int64") // 1000 // 1000 + + results = results.groupby(["date", "__date_ts"]).agg({"total": "sum"}).reset_index() + return results + def __balance_get_est_stake( self, coin: str, stake_currency: str, amount: float, balance: Wallet ) -> tuple[float, float]: