{"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":210,"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":192,"sourceCodeEnd":228,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/architect_ax/src/http/parse.rs#L192-L228","documentation":"The AX instrument definition's `minimum_order_size` must be a positive whole number (strictly greater than zero with no fractional part). The adapter enforces this because NautilusTrader quantity increments derived from it require discrete whole-number minimums.","triggerScenarios":"request_instruments/request_instrument -> parse_instrument on a definition where minimum_order_size is zero, negative, or fractional (e.g. 0, -1, 0.5, 10.25).","commonSituations":"AX venue changes instrument metadata to a fractional minimum lot size; fixtures with placeholder values like 0; a new instrument type (e.g. fractional notional minimums) not supported by the adapter yet.","solutions":["Check the raw definition's minimum_order_size value returned by the AX API.","Round/floor to a whole number at the data source if the venue's value is representable that way, or truncate trailing fraction if it is a formatting artifact.","If the venue now legitimately supports fractional minimums, extend the adapter's parsing logic instead of altering data.","Fix fixture values to positive whole numbers in tests/mocks."],"exampleFix":"// before (payload)\n\"minimum_order_size\": \"0.5\"\n// after\n\"minimum_order_size\": \"1\"","handlingStrategy":"validation","validationCode":"fn valid_min_size(d: &InstrumentDefinition) -> bool {\n    d.minimum_order_size > Decimal::ZERO && d.minimum_order_size.fract().is_zero()\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Validate instrument definitions before feeding them to the adapter","Quantize venue-provided minimums at ingestion","Keep fixtures realistic (no zero placeholders)","Track AX venue metadata changes for new instrument types"],"tags":["rust","validation","instrument","decimal"],"backgroundTag":"invalid-argument-value","analyzedSha":"18893faf8b356be3320add8de2f861b0b647cf06","analyzedAt":"2026-09-08T20:49:34.690Z","contentChangedAt":"2026-09-08T20:49:34.690Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}