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

  1. Remove the dead/renamed pair from the pairlist or use VolumePairList-style dynamic lists that drop unavailable pairs.
  2. Verify the pair string exactly matches ccxt markets (futures pairs need the :USDT settle suffix).
  3. Call reload_markets() if you suspect stale markets (freqtrade does this periodically).
  4. Check the exchange's announcement page for delistings.
  5. 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

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


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