freqtrade/freqtrade · error · ExchangeError
Pair {pair} not available
Error message
Pair {pair} not available What it means
fetch_ticker() proactively raises ccxt.ExchangeError('Pair {pair} not available') when the pair is absent from self.markets or flagged inactive. Because it raises ccxt.ExchangeError inside its own try, the local handler converts it to TemporaryError('Could not load ticker ...') and the @retrier retries — so an unavailable pair burns retries each cycle. This is freqtrade guarding against querying dead markets.
Source
Thrown at freqtrade/exchange/exchange.py:2162
else TradingMode.FUTURES
),
)
ticker = tickers_other.get(pair, None)
if ticker:
rate: float | None = safe_value_fallback(ticker, "last", "ask", None)
if rate:
if pair.startswith(currency) and not pair.endswith(currency):
rate = 1.0 / rate
return rate
except ValueError:
return None
return None
@retrier
def fetch_ticker(self, pair: str) -> Ticker:
try:
if pair not in self.markets or self.markets[pair].get("active", False) is False:
raise ExchangeError(f"Pair {pair} not available")
data: Ticker = self._api.fetch_ticker(pair)
return data
except ccxt.DDoSProtection as e:
raise DDosProtection(e) from e
except (ccxt.OperationFailed, ccxt.ExchangeError) as e:
raise TemporaryError(
f"Could not load ticker due to {e.__class__.__name__}. Message: {e}"
) from e
except ccxt.BaseError as e:
raise OperationalException(e) from e
@retrier
def fetch_funding_rate(self, pair: str) -> FundingRate:
"""
Get current Funding rate from exchange.
On Futures markets, this is the interest rate for holding a position.
Won't work for non-futures markets
"""View on GitHub (pinned to 1c8edfe4d1)
Solutions
- Remove the dead/renamed pair from the pairlist or use VolumePairList-style dynamic lists that drop unavailable pairs.
- Verify the pair string exactly matches ccxt markets (futures pairs need the :USDT settle suffix).
- Call reload_markets() if you suspect stale markets (freqtrade does this periodically).
- Check the exchange's announcement page for delistings.
- Update ccxt so new/renamed markets are known.
Example fix
# before
ticker = exchange.fetch_ticker("SOME/USDT") # delisted -> retried TemporaryError loop
# after
markets = exchange.markets
active = [p for p, m in markets.items() if m.get("active", True)]
pair = "SOME/USDT" if "SOME/USDT" in active else next((p for p in active if p.startswith("SOME/")), None)
if pair:
ticker = exchange.fetch_ticker(pair) Defensive patterns
Strategy: validation
Validate before calling
market = exchange.markets.get(pair)
if market is None or not market.get("active", False):
# fetch_ticker would raise 'Pair not available' and burn retries
pair = None Type guard
def is_pair_available(exchange, pair: str) -> bool:
market = exchange.markets.get(pair)
return market is not None and market.get("active", True) is not False Try / catch
from freqtrade.exceptions import TemporaryError
try:
ticker = exchange.fetch_ticker(pair)
except TemporaryError as e:
if "not available" in str(e):
logger.warning(f"{pair} unavailable - removing from pairlist")
raise
time.sleep(2)
ticker = exchange.fetch_ticker(pair) Prevention
- Validate every static pairlist entry against exchange.markets at startup.
- Use exact ccxt pair notation (futures pairs need the :USDT settle suffix).
- Prefer dynamic pairlists that automatically drop delisted pairs.
When it happens
Trigger: Pair removed from the exchange's markets (delisted) while still in the bot's pairlist; pair listed as inactive by the exchange; markets not yet loaded (very early startup race); wrong pair notation (e.g. missing : separator for futures pairs).
Common situations: Delistings happen mid-run; static pairlists keep dead pairs; typos in custom pairlists; futures pair format mistakes (BTC/USDT:USDT vs BTC/USDT); markets cache stale after exchange adds/renames symbols.
Related errors
- Could not combine {curr_1} and {curr_2} to get a valid pair.
- Can't get market information for symbol {pair}
- Exchange {self._api.name} does not support fetching bids/ask
- Could not load bids/asks due to {e.__class__.__name__}. Mess
- Exchange {self._api.name} does not support fetching tickers
AI-assisted analysis of freqtrade/freqtrade@1c8edfe4d1 (2026-08-15).
Data as JSON: /api/errors/00550c23050a57c0.
Report an issue: GitHub.