{"record":{"id":"f7d601699cfc59f5","repo":"nautechsystems/nautilus_trader","slug":"ax-minimum-order-size-must-be-a-positive-whole-num","errorCode":null,"errorMessage":"AX minimum_order_size must be a positive whole number, was {}","messagePattern":"AX minimum_order_size must be a positive whole number, was (.+?)","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/adapters/architect_ax/src/http/parse.rs","lineNumber":206,"sourceCode":"    {\n        &symbol_prefix[..symbol_prefix.len() - quote_code.len()]\n    } else {\n        symbol_prefix\n    };\n\n    let asset_class = AssetClass::from(definition.category);\n\n    // Only resolve base currency for FX/crypto where the base code is a currency\n    let base_currency = match asset_class {\n        AssetClass::FX | AssetClass::Cryptocurrency => Some(get_currency(base_code)),\n        _ => None,\n    };\n\n    let quote_currency = get_currency(quote_code);\n    let settlement_currency = get_currency(definition.funding_settlement_currency.as_str());\n\n    let price_increment = decimal_to_price(definition.tick_size, \"tick_size\")?;\n    anyhow::ensure!(\n        definition.minimum_order_size > Decimal::ZERO\n            && definition.minimum_order_size.fract().is_zero(),\n        \"AX minimum_order_size must be a positive whole number, was {}\",\n        definition.minimum_order_size\n    );\n    let size_increment = decimal_to_quantity(Decimal::ONE, \"size_increment\")?;\n    let lot_size = Some(size_increment);\n    let min_quantity = Some(decimal_to_quantity(\n        definition.minimum_order_size.normalize(),\n        \"minimum_order_size\",\n    )?);\n\n    let (margin_init, margin_maint) = parse_margin_rates(\n        definition.initial_margin_pct,\n        definition.maintenance_margin_pct,\n    )?;\n\n    let mut info = Params::new();","sourceCodeStart":188,"sourceCodeEnd":224,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/a4b06ed870971b5671d12754ea138a3ab99b1dec/crates/adapters/architect_ax/src/http/parse.rs#L188-L224","documentation":"The parser requires minimum_order_size to be strictly positive with a zero fractional part, and separately hardcodes size_increment to Decimal::ONE. The adapter assumes whole-unit lots, so a venue-configured fractional minimum (e.g. 0.5) or zero is rejected rather than silently mis-sizing orders.","triggerScenarios":"An AX symbol is defined with minimum_order_size 0.5 (fractional crypto lots) or 0/omitted-default; the instrument load for that symbol then fails during parsing of tick_size/minimum_order_size validation.","commonSituations":"Crypto venues that genuinely support fractional minimum lots; new listings with unset minimums defaulting to 0; metadata copied from a permissive exchange into AX contract config.","solutions":["Check the symbol's contract metadata in AX and set a whole-number positive minimum_order_size","If the venue legitimately supports fractional lots, the adapter's sizing model must be extended (derive size_increment from a venue field instead of ONE) — file an issue/PR rather than loosening the check","Until resolved, exclude that symbol from subscription and trading so instrument loads succeed"],"exampleFix":"// before (AX contract metadata)\n\"minimum_order_size\": \"0.5\"\n// after\n\"minimum_order_size\": \"1\"","handlingStrategy":"try-catch","validationCode":"// If you control the definitions before they reach the parser\nfn min_order_size_ok(v: Decimal) -> bool {\n    v > Decimal::ZERO && v.fract().is_zero()\n}\n\nif !min_order_size_ok(definition.minimum_order_size) {\n    anyhow::bail!(\"symbol {} has fractional/zero minimum_order_size {}; fix venue config\", definition.symbol, definition.minimum_order_size);\n}","typeGuard":null,"tryCatchPattern":"match parse_instrument(&definition, ts_event, ts_init) {\n    Ok(instrument) => Ok(instrument),\n    Err(e) if e.to_string().contains(\"minimum_order_size\") => {\n        log::error!(\"symbol {} rejected for fractional min lot size; venue config must use whole units\", definition.symbol);\n        Err(e)\n    }\n    Err(e) => Err(e),\n}","preventionTips":["Validate venue contract metadata (positive whole minimum_order_size) in your listing pipeline","Do not copy fractional-lot parameters from other exchanges into AX config — this adapter assumes lot size 1","Track unsupported symbols explicitly so downstream strategies do not subscribe to them"],"tags":["architect-ax","instrument","validation","quantity","metadata"],"backgroundTag":"invalid-instrument-metadata","analyzedSha":"a4b06ed870971b5671d12754ea138a3ab99b1dec","analyzedAt":"2026-08-16T22:54:50.089Z","schemaVersion":2},"datasetVersion":"2026-08-16T23:17:17.608Z"}