freqtrade/freqtrade · error · ConfigurationError

{stake_currency} is not available as stake on {self.name}. A

Error message

{stake_currency} is not available as stake on {self.name}. Available currencies are: {', '.join(quote_currencies)}

What it means

Markets loaded fine, but the configured stake_currency does not appear as a quote currency on the exchange. ConfigurationError (subclass of OperationalException) raised at startup during stake-currency validation - purely a config/validation issue, not transient.

Source

Thrown at freqtrade/exchange/exchange.py:760

        except (ccxt.BaseError, TemporaryError):
            logger.exception("Could not load markets.")

    def validate_stakecurrency(self, stake_currency: str) -> None:
        """
        Checks stake-currency against available currencies on the exchange.
        Only runs on startup. If markets have not been loaded, there's been a problem with
        the connection to the exchange.
        :param stake_currency: Stake-currency to validate
        :raise: OperationalException if stake-currency is not available.
        """
        if not self._markets:
            raise OperationalException(
                "Could not load markets, therefore cannot start. "
                "Please investigate the above error for more details."
            )
        quote_currencies = self.get_quote_currencies()
        if stake_currency not in quote_currencies:
            raise ConfigurationError(
                f"{stake_currency} is not available as stake on {self.name}. "
                f"Available currencies are: {', '.join(quote_currencies)}"
            )

    def get_valid_pair_combination(self, curr_1: str, curr_2: str) -> Generator[str, None, None]:
        """
        Get valid pair combination of curr_1 and curr_2 by trying both combinations.
        """
        yielded = False
        for pair in (
            f"{curr_1}/{curr_2}",
            f"{curr_2}/{curr_1}",
            f"{curr_1}/{curr_2}:{curr_2}",
            f"{curr_2}/{curr_1}:{curr_1}",
        ):
            if pair in self.markets and self.markets[pair].get("active"):
                yielded = True
                yield pair

View on GitHub (pinned to 1c8edfe4d1)

Solutions

  1. Pick a stake currency from the list printed in the error message - it enumerates every quote currency the exchange actually offers.
  2. Fix typos/case: stake_currency must match the quote exactly (usually uppercase, e.g. USDT).
  3. If a different market type was intended, also fix the pair format (BTC/USDT:USDT for futures).
  4. Run `freqtrade list-pairs --exchange <name> --all` to see valid quote currencies.

Example fix

# config.json - before
"stake_currency": "USDC"

# after (a currency the exchange actually quotes)
"stake_currency": "USDT"
Defensive patterns

Strategy: validation

Validate before calling

# before starting the bot
quotes = {m['quote'] for m in exchange.markets.values() if m.get('active', True)}
assert config['stake_currency'] in quotes, (
    f"stake_currency must be one of {sorted(quotes)}")

Type guard

def stake_currency_valid(exchange, stake_currency: str) -> bool:
    quotes = {m.get('quote') for m in exchange.markets.values()}
    return stake_currency in quotes

Prevention

When it happens

Trigger: stake_currency typo ('USDT ' with whitespace, 'USD' vs 'USDC'/'FDUSD'); a stake currency the exchange does not quote; switching exchanges while keeping the old stake_currency.

Common situations: New users guessing stake currencies; copying configs between exchanges; regional exchanges with limited quote currencies.

Related errors


AI-assisted analysis of freqtrade/freqtrade@1c8edfe4d1 (2026-08-15). Data as JSON: /api/errors/3860441cee561963. Report an issue: GitHub.