{"record":{"id":"9b301f45093863c9","repo":"nautechsystems/nautilus_trader","slug":"failed-to-process-position-reports-failed-binanc","errorCode":null,"errorMessage":"Failed to process {position_reports_failed} Binance Futures position reports","messagePattern":"Failed to process (.+?) Binance Futures position reports","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/adapters/binance/src/futures/execution.rs","lineNumber":2706,"sourceCode":"            };\n\n            match self.create_position_report(\n                &position,\n                instrument.id(),\n                instrument.size_precision(),\n            ) {\n                Ok(report) => reports.push(report),\n                Err(e) => {\n                    log::warn!(\n                        \"Failed to create Futures position report for symbol={}: {e}\",\n                        position.symbol\n                    );\n                    position_reports_failed += 1;\n                }\n            }\n        }\n\n        anyhow::ensure!(\n            position_reports_failed == 0,\n            \"Failed to process {position_reports_failed} Binance Futures position reports\",\n        );\n\n        Ok(reports)\n    }\n\n    async fn generate_mass_status(\n        &self,\n        lookback_mins: Option<u64>,\n    ) -> anyhow::Result<Option<ExecutionMassStatus>> {\n        log::info!(\"Generating ExecutionMassStatus (lookback_mins={lookback_mins:?})\");\n\n        let ts_now = self.clock.get_time_ns();\n\n        let requested_start = lookback_mins\n            .map(DurationNanos::try_from_mins)\n            .transpose()?","sourceCodeStart":2688,"sourceCodeEnd":2724,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/binance/src/futures/execution.rs#L2688-L2724","documentation":"After querying position risk, the adapter converts each Binance position entry into a PositionStatusReport; individual conversion failures are counted rather than aborting. If any position failed to convert, the method ends with this aggregated error instead of returning a partially complete reconciliation snapshot.","triggerScenarios":"One or more Binance Futures positions (often zero-balance or unusual positionSide=NONE / hedge-mode entries) fail report conversion during generate_position_status_reports, incrementing position_reports_failed above zero.","commonSituations":"Positions in instruments that could not be resolved to Nautilus instruments, dust positions with unexpected values, hedge-mode (dual-side) positions the converter doesn't handle, or adapter/instrument-cache version mismatches.","solutions":["Check the logs just before the error — each failed conversion is logged with its reason.","Ensure all traded instruments are loaded/registered in the cache so conversion can resolve them.","Check position mode: switch the account out of unexpected hedge-mode/dual-side settings or use an adapter version supporting them.","Retry after positions settle (e.g. during liquidation or ADL the data can be transiently inconsistent)."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"if let Err(e) = client.generate_mass_status().await {\n    if e.to_string().contains(\"position reports\") {\n        warn!(\"partial position reconciliation failure: {e}; check cache and position mode\");\n    } else {\n        return Err(e);\n    }\n}","preventionTips":["Load all traded instruments into the cache before reconciliation.","Keep account position mode (one-way vs hedge) consistent with adapter support.","Check adapter logs for per-position conversion warnings before the aggregate error."],"tags":["binance","reconciliation","positions","conversion"],"backgroundTag":"unexpected-api-response-shape","analyzedSha":"18893faf8b356be3320add8de2f861b0b647cf06","analyzedAt":"2026-09-08T20:49:34.690Z","contentChangedAt":"2026-09-08T20:49:34.690Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}