nautechsystems/nautilus_trader · warning · anyhow::Error

Symbol '{}' is not trading (status: {})

Error message

Symbol '{}' is not trading (status: {})

What it means

parse_spot_instrument_sbe_with_fees rejects Spot symbols whose SBE-decoded status differs from SBE_STATUS_TRADING, reporting the symbol and numeric status. Spot has more lifecycle states than futures (pre-trading, post-trading, end-of-day, halt, auction-match, break, pending-trading); any of them trips this check.

Source

Thrown at crates/adapters/binance/src/common/parse.rs:704

/// - Price or quantity values cannot be parsed.
/// - The symbol is not actively trading.
pub fn parse_spot_instrument_sbe(
    symbol: &BinanceSymbolSbe,
    ts_event: UnixNanos,
    ts_init: UnixNanos,
) -> anyhow::Result<InstrumentAny> {
    parse_spot_instrument_sbe_with_fees(symbol, None, None, ts_event, ts_init)
}

pub(crate) fn parse_spot_instrument_sbe_with_fees(
    symbol: &BinanceSymbolSbe,
    maker_fee: Option<Decimal>,
    taker_fee: Option<Decimal>,
    ts_event: UnixNanos,
    ts_init: UnixNanos,
) -> anyhow::Result<InstrumentAny> {
    if symbol.status != SBE_STATUS_TRADING {
        anyhow::bail!(
            "Symbol '{}' is not trading (status: {})",
            symbol.symbol,
            symbol.status
        );
    }

    let base_currency = get_currency(&symbol.base_asset);
    let quote_currency = get_currency(&symbol.quote_asset);

    let instrument_id = InstrumentId::new(
        Symbol::from_str_unchecked(&symbol.symbol),
        Venue::new(BINANCE),
    );
    let raw_symbol = Symbol::new(&symbol.symbol);

    let price_filter = symbol
        .filters
        .price_filter

View on GitHub (pinned to a4b06ed870)

Solutions

  1. Check the symbol's status on the Spot exchangeInfo endpoint.
  2. Load instruments for an explicit allowlist of TRADING symbols.
  3. Treat as a skip condition during bulk loads.
  4. Retry later if the symbol is only temporarily halted (BREAK).
Defensive patterns

Strategy: validation

Validate before calling

// Pre-filter SBE spot symbols to those trading
let tradable: Vec<_> = symbols
    .into_iter()
    .filter(|s| s.status == SBE_STATUS_TRADING)
    .collect();

Type guard

fn is_trading_spot_sbe(status: i64) -> bool {
    status == SBE_STATUS_TRADING
}

Try / catch

match parse_spot_instrument_sbe(&symbol, ts_event, ts_init) {
    Ok(inst) => instruments.push(inst),
    Err(e) if e.to_string().contains("is not trading") => {
        tracing::debug!(symbol = %symbol.symbol, "halted/break, skipping")
    }
    Err(e) => return Err(e),
}

Prevention

When it happens

Trigger: Loading Spot instruments over the SBE market-data channel when a symbol is halted (BREAK), in auction (AUCTION_MATCH), pre/post-trading, or otherwise not in the TRADING state.

Common situations: Symbols under maintenance halt at startup; pairs in auction phases; delisted pairs still present in the exchangeInfo snapshot; regional trading breaks.

Related errors


AI-assisted analysis of nautechsystems/nautilus_trader@a4b06ed870 (2026-08-16). Data as JSON: /api/errors/9e1af8537df22abf. Report an issue: GitHub.