show /balance in stake currency

This commit is contained in:
Matthias 2019-11-15 06:33:07 +01:00
parent 62d50f512d
commit 1bf8d8cff3
6 changed files with 38 additions and 27 deletions

View File

@ -354,7 +354,8 @@ class ApiServer(RPC):
Returns the current status of the trades in json format Returns the current status of the trades in json format
""" """
results = self._rpc_balance(self._config.get('fiat_display_currency', '')) results = self._rpc_balance(self._config['stake_currency'],
self._config.get('fiat_display_currency', ''))
return self.rest_dump(results) return self.rest_dump(results)
@require_login @require_login

View File

@ -297,7 +297,7 @@ class RPC:
'best_rate': round(bp_rate * 100, 2), 'best_rate': round(bp_rate * 100, 2),
} }
def _rpc_balance(self, fiat_display_currency: str) -> Dict: def _rpc_balance(self, stake_currency: str, fiat_display_currency: str) -> Dict:
""" Returns current account balance per crypto """ """ Returns current account balance per crypto """
output = [] output = []
total = 0.0 total = 0.0
@ -310,27 +310,29 @@ class RPC:
if not balance['total']: if not balance['total']:
continue continue
if coin == 'BTC': est_stake: float = 0
if coin == stake_currency:
rate = 1.0 rate = 1.0
est_stake = balance['total']
else: else:
try: try:
pair = self._freqtrade.exchange.get_valid_pair_combination(coin, "BTC") pair = self._freqtrade.exchange.get_valid_pair_combination(coin, stake_currency)
rate = tickers.get(pair, {}).get('bid', None)
if pair.startswith("BTC"): if rate:
rate = 1.0 / tickers.get(pair, {}).get('bid', 1) if pair.startswith(stake_currency):
else: rate = 1.0 / rate
rate = tickers.get(pair, {}).get('bid', 1) est_stake = rate * balance['total']
except (TemporaryError, DependencyException): except (TemporaryError, DependencyException):
logger.warning(f" Could not get rate for pair {coin}.") logger.warning(f" Could not get rate for pair {coin}.")
continue continue
est_btc: float = rate * balance['total'] total = total + (est_stake or 0)
total = total + est_btc
output.append({ output.append({
'currency': coin, 'currency': coin,
'free': balance['free'] if balance['free'] is not None else 0, 'free': balance['free'] if balance['free'] is not None else 0,
'balance': balance['total'] if balance['total'] 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, 'used': balance['used'] if balance['used'] is not None else 0,
'est_btc': est_btc, 'est_stake': est_stake or 0,
'stake': stake_currency,
}) })
if total == 0.0: if total == 0.0:
if self._freqtrade.config.get('dry_run', False): if self._freqtrade.config.get('dry_run', False):

View File

@ -325,15 +325,16 @@ class Telegram(RPC):
def _balance(self, update: Update, context: CallbackContext) -> None: def _balance(self, update: Update, context: CallbackContext) -> None:
""" Handler for /balance """ """ Handler for /balance """
try: try:
result = self._rpc_balance(self._config.get('fiat_display_currency', '')) result = self._rpc_balance(self._config['stake_currency'],
self._config.get('fiat_display_currency', ''))
output = '' output = ''
for currency in result['currencies']: for currency in result['currencies']:
if currency['est_btc'] > 0.0001: if currency['est_stake'] > 0.0001:
curr_output = "*{currency}:*\n" \ curr_output = "*{currency}:*\n" \
"\t`Available: {free: .8f}`\n" \ "\t`Available: {free: .8f}`\n" \
"\t`Balance: {balance: .8f}`\n" \ "\t`Balance: {balance: .8f}`\n" \
"\t`Pending: {used: .8f}`\n" \ "\t`Pending: {used: .8f}`\n" \
"\t`Est. BTC: {est_btc: .8f}`\n".format(**currency) "\t`Est. {stake}: {est_stake: .8f}`\n".format(**currency)
else: else:
curr_output = "*{currency}:* not showing <1$ amount \n".format(**currency) curr_output = "*{currency}:* not showing <1$ amount \n".format(**currency)

View File

@ -363,7 +363,7 @@ def test_rpc_balance_handle_error(default_conf, mocker):
rpc = RPC(freqtradebot) rpc = RPC(freqtradebot)
rpc._fiat_converter = CryptoToFiatConverter() rpc._fiat_converter = CryptoToFiatConverter()
with pytest.raises(RPCException, match="Error getting current tickers."): with pytest.raises(RPCException, match="Error getting current tickers."):
rpc._rpc_balance(default_conf['fiat_display_currency']) rpc._rpc_balance(default_conf['stake_currency'], default_conf['fiat_display_currency'])
def test_rpc_balance_handle(default_conf, mocker, tickers): def test_rpc_balance_handle(default_conf, mocker, tickers):
@ -404,28 +404,33 @@ def test_rpc_balance_handle(default_conf, mocker, tickers):
rpc = RPC(freqtradebot) rpc = RPC(freqtradebot)
rpc._fiat_converter = CryptoToFiatConverter() rpc._fiat_converter = CryptoToFiatConverter()
result = rpc._rpc_balance(default_conf['fiat_display_currency']) result = rpc._rpc_balance(default_conf['stake_currency'], default_conf['fiat_display_currency'])
assert prec_satoshi(result['total'], 12.309096315) assert prec_satoshi(result['total'], 12.309096315)
assert prec_satoshi(result['value'], 184636.44472997) assert prec_satoshi(result['value'], 184636.44472997)
assert 'USD' == result['symbol'] assert 'USD' == result['symbol']
assert result['currencies'] == [ assert result['currencies'] == [
{'currency': 'BTC', {'currency': 'BTC',
'free': 10.0, 'free': 10.0,
'balance': 12.0, 'balance': 12.0,
'used': 2.0, 'used': 2.0,
'est_btc': 12.0, 'est_stake': 12.0,
'stake': 'BTC',
}, },
{'free': 1.0, {'free': 1.0,
'balance': 5.0, 'balance': 5.0,
'currency': 'ETH', 'currency': 'ETH',
'est_btc': 0.30794, 'est_stake': 0.30794,
'used': 4.0 'used': 4.0,
'stake': 'BTC',
}, },
{'free': 5.0, {'free': 5.0,
'balance': 10.0, 'balance': 10.0,
'currency': 'USDT', 'currency': 'USDT',
'est_btc': 0.0011563153318162476, 'est_stake': 0.0011563153318162476,
'used': 5.0} 'used': 5.0,
'stake': 'BTC',
}
] ]
assert result['total'] == 12.309096315331816 assert result['total'] == 12.309096315331816

View File

@ -256,7 +256,8 @@ def test_api_balance(botclient, mocker, rpc_balance):
'free': 12.0, 'free': 12.0,
'balance': 12.0, 'balance': 12.0,
'used': 0.0, 'used': 0.0,
'est_btc': 12.0, 'est_stake': 12.0,
'stake': 'BTC',
} }

View File

@ -545,7 +545,8 @@ def test_balance_handle_too_large_response(default_conf, update, mocker) -> None
'free': 1.0, 'free': 1.0,
'used': 0.5, 'used': 0.5,
'balance': i, 'balance': i,
'est_btc': 1 'est_stake': 1,
'stake': 'BTC',
}) })
mocker.patch('freqtrade.rpc.rpc.RPC._rpc_balance', return_value={ mocker.patch('freqtrade.rpc.rpc.RPC._rpc_balance', return_value={
'currencies': balances, 'currencies': balances,