diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index 9e18378c1..a0343147c 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -1855,7 +1855,36 @@ class Exchange: except ccxt.BaseError as e: raise OperationalException(e) from e - # Pricing info + def get_conversion_rate(self, coin: str, currency: str) -> float: + """ + Quick and cached way to get conversion rate one currency to the other. + Can then be used as "rate * amount" to convert between currencies. + :param coin: Coin to convert + :param currency: Currency to convert to + :returns: Conversion rate from coin to currency + :raises: ExchangeErrors + """ + if coin == currency: + return 1.0 + tickers = self.get_tickers(cached=True) + pair = self.get_valid_pair_combination(coin, currency) + ticker: Ticker | None = tickers.get(pair, None) + if not ticker: + tickers_other: Tickers = self.get_tickers( + cached=True, + market_type=( + TradingMode.SPOT + if self.trading_mode != TradingMode.SPOT + else TradingMode.FUTURES + ), + ) + ticker = tickers_other.get(pair, None) + if ticker: + rate: float | None = ticker.get("last", None) + if rate and pair.startswith(currency) and not pair.endswith(currency): + rate = 1.0 / rate + return rate + return None @retrier def fetch_ticker(self, pair: str) -> Ticker: diff --git a/freqtrade/rpc/rpc.py b/freqtrade/rpc/rpc.py index a1a3df0db..3c9a12c93 100644 --- a/freqtrade/rpc/rpc.py +++ b/freqtrade/rpc/rpc.py @@ -687,25 +687,12 @@ class RPC: est_bot_stake = amount else: try: - tickers: Tickers = self._freqtrade.exchange.get_tickers(cached=True) - pair = self._freqtrade.exchange.get_valid_pair_combination(coin, stake_currency) - ticker: Ticker | None = tickers.get(pair, None) - if not ticker: - tickers_spot: Tickers = self._freqtrade.exchange.get_tickers( - cached=True, - market_type=TradingMode.SPOT - if self._config.get("trading_mode", TradingMode.SPOT) != TradingMode.SPOT - else TradingMode.FUTURES, - ) - ticker = tickers_spot.get(pair, None) - - if ticker: - rate: float | None = ticker.get("last", None) - if rate: - if pair.startswith(stake_currency) and not pair.endswith(stake_currency): - rate = 1.0 / rate - est_stake = rate * balance.total - est_bot_stake = rate * amount + rate: float | None = self._freqtrade.exchange.get_conversion_rate( + coin, stake_currency + ) + if rate: + est_stake = rate * balance.total + est_bot_stake = rate * amount return est_stake, est_bot_stake except (ExchangeError, PricingError) as e: