{"record":{"id":"84b45dd259cbdbfc","repo":"nautechsystems/nautilus_trader","slug":"invalid-ticksize-of-0-for-symbol-cannot-crea","errorCode":null,"errorMessage":"Invalid tickSize of 0 for symbol '{}', cannot create instrument","messagePattern":"Invalid tickSize of 0 for symbol '(.+?)', cannot create instrument","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/adapters/binance/src/common/parse.rs","lineNumber":314,"sourceCode":"        anyhow::bail!(\n            \"Symbol '{}' is not trading (status: {:?})\",\n            symbol.symbol,\n            symbol.status\n        );\n    }\n\n    let quote_currency = get_currency(symbol.quote_asset.as_str());\n    let settlement_currency = get_currency(symbol.margin_asset.as_str());\n\n    let instrument_id = format_instrument_id(&symbol.symbol, BinanceProductType::UsdM);\n    let raw_symbol = Symbol::new(symbol.symbol.as_str());\n\n    let price_filter = get_filter(&symbol.filters, \"PRICE_FILTER\")\n        .context(\"Missing PRICE_FILTER in symbol filters\")?;\n\n    let tick_size = parse_filter_price(price_filter, \"tickSize\")?;\n    if tick_size.is_zero() {\n        anyhow::bail!(\n            \"Invalid tickSize of 0 for symbol '{}', cannot create instrument\",\n            symbol.symbol,\n        );\n    }\n    let max_price = parse_filter_price(price_filter, \"maxPrice\").ok();\n    let min_price = parse_filter_price(price_filter, \"minPrice\").ok();\n\n    let lot_filter =\n        get_filter(&symbol.filters, \"LOT_SIZE\").context(\"Missing LOT_SIZE in symbol filters\")?;\n\n    let step_size = parse_filter_quantity(lot_filter, \"stepSize\")?;\n    let max_quantity = parse_filter_quantity(lot_filter, \"maxQty\").ok();\n    let min_quantity = parse_filter_quantity(lot_filter, \"minQty\").ok();\n\n    let min_notional = parse_futures_min_notional(&symbol.filters, quote_currency);\n\n    // Default margin (0.1 = 10x leverage)\n    let default_margin = Decimal::new(1, 1);","sourceCodeStart":296,"sourceCodeEnd":332,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/a4b06ed870971b5671d12754ea138a3ab99b1dec/crates/adapters/binance/src/common/parse.rs#L296-L332","documentation":"After parsing PRICE_FILTER.tickSize for a USD-M symbol, parse_usdm_instrument_with_fees rejects a tick size of exactly zero: tick size parameterizes the instrument's price increment and precision, so a zero tick cannot produce a valid instrument.","triggerScenarios":"USD-M exchangeInfo contains a PRICE_FILTER with \"tickSize\": \"0\" — typically placeholder data on symbols in pre-listing/settlement states, or corrupted/cached responses.","commonSituations":"Pre-listing symbols before Binance populates real filters; a stale exchangeInfo cache or replayed fixture with zeroed filters; venue-side data glitch.","solutions":["Check the live exchangeInfo for the symbol; a zero tickSize usually means it is not tradable yet.","Skip or defer loading of symbols whose tickSize is 0.","Clear any exchangeInfo cache and retry with fresh data.","If a TRADING-status symbol persistently reports tickSize 0, report it to Binance / the adapter maintainers."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"fn usdm_tick_size_is_valid(symbol: &BinanceFuturesUsdSymbol) -> bool {\n    symbol\n        .filters\n        .iter()\n        .find(|f| f.get(\"filterType\").and_then(|v| v.as_str()) == Some(\"PRICE_FILTER\"))\n        .and_then(|f| f.get(\"tickSize\").and_then(|v| v.as_str()))\n        .map(|t| {\n            rust_decimal::Decimal::from_str(t)\n                .map(|d| !d.is_zero())\n                .unwrap_or(false)\n        })\n        .unwrap_or(false)\n}","typeGuard":null,"tryCatchPattern":"match parse_usdm_instrument(&symbol, ts_event, ts_init) {\n    Ok(inst) => instruments.push(inst),\n    Err(e) if e.to_string().contains(\"Invalid tickSize of 0\") => {\n        tracing::warn!(symbol = %symbol.symbol, \"venue reported zero tickSize, deferring load\")\n    }\n    Err(e) => return Err(e),\n}","preventionTips":["Pre-check tickSize != 0 when filtering symbols for loading.","Refresh cached exchangeInfo snapshots rather than serving them indefinitely.","Re-attempt loading later for pre-listing symbols whose filters are placeholders."],"tags":["binance","usdm-futures","tick-size","price-filter","rust"],"backgroundTag":"invalid-tick-size","analyzedSha":"a4b06ed870971b5671d12754ea138a3ab99b1dec","analyzedAt":"2026-08-16T22:54:50.089Z","schemaVersion":2},"datasetVersion":"2026-08-16T23:17:17.608Z"}