{"record":{"id":"9e1af8537df22abf","repo":"nautechsystems/nautilus_trader","slug":"symbol-is-not-trading-status-9e1af8","errorCode":null,"errorMessage":"Symbol '{}' is not trading (status: {})","messagePattern":"Symbol '(.+?)' is not trading \\(status: (.+?)\\)","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"warning","filePath":"crates/adapters/binance/src/common/parse.rs","lineNumber":704,"sourceCode":"/// - Price or quantity values cannot be parsed.\n/// - The symbol is not actively trading.\npub fn parse_spot_instrument_sbe(\n    symbol: &BinanceSymbolSbe,\n    ts_event: UnixNanos,\n    ts_init: UnixNanos,\n) -> anyhow::Result<InstrumentAny> {\n    parse_spot_instrument_sbe_with_fees(symbol, None, None, ts_event, ts_init)\n}\n\npub(crate) fn parse_spot_instrument_sbe_with_fees(\n    symbol: &BinanceSymbolSbe,\n    maker_fee: Option<Decimal>,\n    taker_fee: Option<Decimal>,\n    ts_event: UnixNanos,\n    ts_init: UnixNanos,\n) -> anyhow::Result<InstrumentAny> {\n    if symbol.status != SBE_STATUS_TRADING {\n        anyhow::bail!(\n            \"Symbol '{}' is not trading (status: {})\",\n            symbol.symbol,\n            symbol.status\n        );\n    }\n\n    let base_currency = get_currency(&symbol.base_asset);\n    let quote_currency = get_currency(&symbol.quote_asset);\n\n    let instrument_id = InstrumentId::new(\n        Symbol::from_str_unchecked(&symbol.symbol),\n        Venue::new(BINANCE),\n    );\n    let raw_symbol = Symbol::new(&symbol.symbol);\n\n    let price_filter = symbol\n        .filters\n        .price_filter","sourceCodeStart":686,"sourceCodeEnd":722,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/a4b06ed870971b5671d12754ea138a3ab99b1dec/crates/adapters/binance/src/common/parse.rs#L686-L722","documentation":"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.","triggerScenarios":"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.","commonSituations":"Symbols under maintenance halt at startup; pairs in auction phases; delisted pairs still present in the exchangeInfo snapshot; regional trading breaks.","solutions":["Check the symbol's status on the Spot exchangeInfo endpoint.","Load instruments for an explicit allowlist of TRADING symbols.","Treat as a skip condition during bulk loads.","Retry later if the symbol is only temporarily halted (BREAK)."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"// Pre-filter SBE spot symbols to those trading\nlet tradable: Vec<_> = symbols\n    .into_iter()\n    .filter(|s| s.status == SBE_STATUS_TRADING)\n    .collect();","typeGuard":"fn is_trading_spot_sbe(status: i64) -> bool {\n    status == SBE_STATUS_TRADING\n}","tryCatchPattern":"match parse_spot_instrument_sbe(&symbol, ts_event, ts_init) {\n    Ok(inst) => instruments.push(inst),\n    Err(e) if e.to_string().contains(\"is not trading\") => {\n        tracing::debug!(symbol = %symbol.symbol, \"halted/break, skipping\")\n    }\n    Err(e) => return Err(e),\n}","preventionTips":["Filter SBE symbol data to TRADING status before requesting instruments.","Expect BREAK/HALT statuses around maintenance windows and schedule loads accordingly.","Use an explicit symbol allowlist for live trading."],"tags":["binance","spot","sbe","instrument-status","rust"],"backgroundTag":"instrument-not-trading","analyzedSha":"a4b06ed870971b5671d12754ea138a3ab99b1dec","analyzedAt":"2026-08-16T22:54:50.089Z","schemaVersion":2},"datasetVersion":"2026-08-16T23:17:17.608Z"}