{"record":{"id":"ece4ae55f08a3240","repo":"nautechsystems/nautilus_trader","slug":"actual-order-symbol-mismatch-expected-was","errorCode":null,"errorMessage":"actual order symbol mismatch: expected {}, was {}","messagePattern":"actual order symbol mismatch: expected (.+?), was (.+?)","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/adapters/binance/src/futures/http/models.rs","lineNumber":1627,"sourceCode":"        size_precision: u8,\n        treat_expired_as_canceled: bool,\n        ts_init: UnixNanos,\n    ) -> anyhow::Result<OrderStatusReport> {\n        let expected_actual_order_id = self\n            .actual_order_id\n            .as_deref()\n            .filter(|id| !id.is_empty())\n            .context(\"algo order has no actual_order_id\")?;\n\n        if expected_actual_order_id != actual.order_id.to_string() {\n            anyhow::bail!(\n                \"actual order ID mismatch: expected {expected_actual_order_id}, was {}\",\n                actual.order_id\n            );\n        }\n\n        if self.symbol != actual.symbol {\n            anyhow::bail!(\n                \"actual order symbol mismatch: expected {}, was {}\",\n                self.symbol,\n                actual.symbol\n            );\n        }\n\n        if self.side != actual.side {\n            anyhow::bail!(\n                \"actual order side mismatch: expected {:?}, was {:?}\",\n                self.side,\n                actual.side\n            );\n        }\n\n        let mut report = self.to_order_status_report(\n            account_id,\n            instrument_id,\n            price_precision,","sourceCodeStart":1609,"sourceCodeEnd":1645,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/binance/src/futures/http/models.rs#L1609-L1645","documentation":"During algo order reconciliation the symbol on the parent algo record must equal the symbol on the matched actual (child) order. A mismatch indicates the two records describe different instruments, so the pair cannot be merged into one order report.","triggerScenarios":"Parsing an algo order update where self.symbol (the algo record's symbol) differs from actual.symbol of the matched sub-order, e.g. 'BTCUSDT' vs 'ETHUSDT' in the same payload.","commonSituations":"Malformed or cross-wired exchange payloads; buggy fixture data; a matching routine that pairs records from different symbols after a stream hiccup or multiplexing error.","solutions":["Verify the algo and actual records come from the same stream/symbol; refetch the order via REST.","Fix stream multiplexing so per-symbol messages are not crossed.","Correct fixture/test data so symbols agree."],"exampleFix":"// before\n// algo record symbol: BTCUSDT, actual sub-order symbol: ETHUSDT\n// after\n// ensure both records carry the same symbol, e.g. BTCUSDT, or re-fetch correct data","handlingStrategy":"try-catch","validationCode":"fn same_symbol(algo_sym: &str, actual_sym: &str) -> bool { algo_sym == actual_sym }","typeGuard":null,"tryCatchPattern":"match result {\n    Err(e) if e.to_string().contains(\"actual order symbol mismatch\") => {\n        tracing::error!(\"algo/actual symbol mismatch in stream data: {e}\");\n    }\n    r => r?,\n}","preventionTips":["Verify stream multiplexing keeps per-symbol payloads together.","Validate payload symbols against the subscribed instrument list before parsing.","Flag such payloads for refetch instead of trusting crossed data."],"tags":["reconciliation","symbol","binance-futures","algo-orders"],"backgroundTag":"internal-invariant-violation","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"}