diff --git a/freqtrade/exchange/kraken.py b/freqtrade/exchange/kraken.py index 91b41a159..df74a762d 100644 --- a/freqtrade/exchange/kraken.py +++ b/freqtrade/exchange/kraken.py @@ -2,7 +2,11 @@ import logging from typing import Dict +import ccxt + +from freqtrade import OperationalException, TemporaryError from freqtrade.exchange import Exchange +from freqtrade.exchange.exchange import retrier logger = logging.getLogger(__name__) @@ -10,3 +14,30 @@ logger = logging.getLogger(__name__) class Kraken(Exchange): _params: Dict = {"trading_agreement": "agree"} + + @retrier + def get_balances(self) -> dict: + if self._config['dry_run']: + return {} + + try: + balances = self._api.fetch_balance() + # Remove additional info from ccxt results + balances.pop("info", None) + balances.pop("free", None) + balances.pop("total", None) + balances.pop("used", None) + + orders = self._api.fetch_open_orders() + order_list = [[x["symbol"].split("/")[0 if x["side"] == "sell" else 1], + x["remaining"], x["side"], x["amount"], ] for x in orders] + for bal in balances: + balances[bal]['used'] = sum(order[1] for order in order_list if order[0] == bal) + balances[bal]['free'] = balances[bal]['total'] - balances[bal]['used'] + + return balances + except (ccxt.NetworkError, ccxt.ExchangeError) as e: + raise TemporaryError( + f'Could not get balance due to {e.__class__.__name__}. Message: {e}') from e + except ccxt.BaseError as e: + raise OperationalException(e) from e