From a15572c705e4ace94085f7ffdd51fcc1dc548770 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E0=AE=AE=E0=AE=A9=E0=AF=8B=E0=AE=9C=E0=AF=8D=E0=AE=95?= =?UTF-8?q?=E0=AF=81=E0=AE=AE=E0=AE=BE=E0=AE=B0=E0=AF=8D=20=E0=AE=AA?= =?UTF-8?q?=E0=AE=B4=E0=AE=A9=E0=AE=BF=E0=AE=9A=E0=AF=8D=E0=AE=9A=E0=AE=BE?= =?UTF-8?q?=E0=AE=AE=E0=AE=BF?= Date: Tue, 5 Apr 2022 15:23:29 +0530 Subject: [PATCH] show reserved balance --- freqtrade/rpc/rpc.py | 26 +++++++++++++++----------- freqtrade/rpc/telegram.py | 20 ++++++++++++++------ freqtrade/wallets.py | 12 ++++++++++++ 3 files changed, 41 insertions(+), 17 deletions(-) diff --git a/freqtrade/rpc/rpc.py b/freqtrade/rpc/rpc.py index 4aef6c8ff..adf394156 100644 --- a/freqtrade/rpc/rpc.py +++ b/freqtrade/rpc/rpc.py @@ -597,20 +597,25 @@ class RPC: except (ExchangeError): logger.warning(f" Could not get rate for pair {coin}.") continue - total = total + (est_stake or 0) - currencies.append({ + total = total + est_stake + currency = { 'currency': coin, # TODO: The below can be simplified if we don't assign None to values. - 'free': balance.free if balance.free is not None else 0, - 'balance': balance.total if balance.total is not None else 0, - 'used': balance.used if balance.used is not None else 0, - 'est_stake': est_stake or 0, + 'free': balance.free or 0, + 'balance': balance.total or 0, + 'used': balance.used or 0, + 'est_stake': est_stake, 'stake': stake_currency, 'side': 'long', 'leverage': 1, 'position': 0, 'is_position': False, - }) + } + if coin == stake_currency: + currencies.insert(0, currency) + else: + currencies.append(currency) + symbol: str position: PositionWallet for symbol, position in self._freqtrade.wallets.get_all_positions().items(): @@ -633,7 +638,6 @@ class RPC: total, stake_currency, fiat_display_currency) if self._fiat_converter else 0 trade_count = len(Trade.get_trades_proxy()) - starting_capital_ratio = 0.0 starting_capital_ratio = (total / starting_capital) - 1 if starting_capital else 0.0 starting_cap_fiat_ratio = (value / starting_cap_fiat) - 1 if starting_cap_fiat else 0.0 @@ -921,7 +925,7 @@ class RPC: else: errors[pair] = { 'error_msg': f"Pair {pair} is not in the current blacklist." - } + } resp = self._rpc_blacklist() resp['errors'] = errors return resp @@ -959,8 +963,8 @@ class RPC: else: buffer = bufferHandler.buffer records = [[datetime.fromtimestamp(r.created).strftime(DATETIME_PRINT_FORMAT), - r.created * 1000, r.name, r.levelname, - r.message + ('\n' + r.exc_text if r.exc_text else '')] + r.created * 1000, r.name, r.levelname, + r.message + ('\n' + r.exc_text if r.exc_text else '')] for r in buffer] # Log format: diff --git a/freqtrade/rpc/telegram.py b/freqtrade/rpc/telegram.py index a72307634..f391fcfea 100644 --- a/freqtrade/rpc/telegram.py +++ b/freqtrade/rpc/telegram.py @@ -239,7 +239,7 @@ class Telegram(RPCHandler): f"{emoji} *{msg['exchange']}:*" f" {enter_side['entered'] if is_fill else enter_side['enter']} {msg['pair']}" f" (#{msg['trade_id']})\n" - ) + ) message += f"*Enter Tag:* `{msg['enter_tag']}`\n" if msg.get('enter_tag', None) else "" message += f"*Amount:* `{msg['amount']:.8f}`\n" if msg.get('leverage') and msg.get('leverage', 1.0) != 1.0: @@ -418,7 +418,8 @@ class Telegram(RPCHandler): if prev_avg_price: minus_on_entry = (cur_entry_average - prev_avg_price) / prev_avg_price - dur_entry = cur_entry_datetime - arrow.get(filled_orders[x-1]["order_filled_date"]) + dur_entry = cur_entry_datetime - \ + arrow.get(filled_orders[x - 1]["order_filled_date"]) days = dur_entry.days hours, remainder = divmod(dur_entry.seconds, 3600) minutes, seconds = divmod(remainder, 60) @@ -840,14 +841,20 @@ class Telegram(RPCHandler): f"*{curr['currency']}:*\n" f"\t`Available: {curr['free']:.8f}`\n" f"\t`Balance: {curr['balance']:.8f}`\n" - f"\t`Pending: {curr['used']:.8f}`\n" - f"\t`Est. {curr['stake']}: " - f"{round_coin_value(curr['est_stake'], curr['stake'], False)}`\n") + f"\t`Pending: {curr['used']:.8f}`\n") + if curr['stake'] == curr['stake']: + reserved = self._rpc._freqtrade.wallets.get_reserved_stake_amount() + curr_output += f"\t`Reserved: {reserved}`\n" + else: + curr_output += ( + f"\t`Est. {curr['stake']}: " + f"{round_coin_value(curr['est_stake'], curr['stake'], False)}`\n") elif curr['est_stake'] <= balance_dust_level: total_dust_balance += curr['est_stake'] total_dust_currencies += 1 # Handle overflowing message length + output = output.replace('\t', ' ' * 4) if len(output + curr_output) >= MAX_TELEGRAM_MESSAGE_LENGTH: self._send_msg(output) output = curr_output @@ -872,6 +879,7 @@ class Telegram(RPCHandler): f"\t`{result['symbol']}: " f"{round_coin_value(result['value'], result['symbol'], False)}`" f"{fiat_val}\n") + output = output.replace('\t', ' ' * 4) self._send_msg(output, reload_able=True, callback_path="update_balance", query=update.callback_query) except RPCException as e: @@ -1417,7 +1425,7 @@ class Telegram(RPCHandler): "Avg. holding durationsfor buys and sells.`\n" "*/help:* `This help message`\n" "*/version:* `Show version`" - ) + ) self._send_msg(message, parse_mode=ParseMode.MARKDOWN) diff --git a/freqtrade/wallets.py b/freqtrade/wallets.py index d93689a0e..af0bc65a2 100644 --- a/freqtrade/wallets.py +++ b/freqtrade/wallets.py @@ -214,6 +214,18 @@ class Wallets: self._config['tradable_balance_ratio']) return available_amount + def get_reserved_stake_amount(self): + """ + Return the total currently reserved balance in stake currency. + Calculated as + ( + free amount) - tot_profit - available_capital + """ + available_capital = self._config.get('available_capital') or 0 + tot_profit = Trade.get_total_closed_profit() + open_stakes = Trade.total_open_trades_stakes() + available_balance = self.get_free(self._config['stake_currency']) + return available_balance + open_stakes - tot_profit - available_capital + def get_available_stake_amount(self) -> float: """ Return the total currently available balance in stake currency,