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 pairView on GitHub (pinned to 1c8edfe4d1)
Solutions
- Pick a stake currency from the list printed in the error message - it enumerates every quote currency the exchange actually offers.
- Fix typos/case: stake_currency must match the quote exactly (usually uppercase, e.g. USDT).
- If a different market type was intended, also fix the pair format (BTC/USDT:USDT for futures).
- 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
- Copy stake_currency from the error's available list - it is authoritative.
- Re-validate stake currency whenever switching exchanges.
- Keep pair_whitelist consistent with stake_currency (quote side must match).
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
- This command requires a configured exchange. You should eith
- Exchange "{exchange}" is not known to the ccxt library and t
- Exchange "{exchange}" will not work with Freqtrade. Reason:
- Exchange {name} is not supported by ccxt
- Initialization of ccxt failed. Reason: {e}
AI-assisted analysis of freqtrade/freqtrade@1c8edfe4d1 (2026-08-15).
Data as JSON: /api/errors/3860441cee561963.
Report an issue: GitHub.