{"record":{"id":"d33d2bff96f8d8a5","repo":"nautechsystems/nautilus_trader","slug":"invalid-starting-balance-e","errorCode":null,"errorMessage":"Invalid starting balance: {e}","messagePattern":"Invalid starting balance: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/backtest/src/node.rs","lineNumber":227,"sourceCode":"    pub fn dispose(&mut self) {\n        for engine in self.engines.values_mut() {\n            engine.dispose();\n        }\n        self.engines.clear();\n    }\n}\n\nfn build_engine(config: &BacktestRunConfig) -> anyhow::Result<BacktestEngine> {\n    let engine_config = config.engine().clone();\n    let mut engine = BacktestEngine::new(engine_config)?;\n\n    for venue_config in config.venues() {\n        let starting_balances: Vec<Money> = venue_config\n            .starting_balances()\n            .iter()\n            .map(|s| s.parse::<Money>())\n            .collect::<Result<Vec<_>, _>>()\n            .map_err(|e| anyhow::anyhow!(\"Invalid starting balance: {e}\"))?;\n\n        let default_leverage = venue_config.default_leverage();\n        let leverages = venue_config.leverages().cloned().unwrap_or_default();\n        let margin_model = venue_config.margin_model().cloned().map(Into::into);\n        let modules = venue_config\n            .modules()\n            .iter()\n            .cloned()\n            .map(Into::into)\n            .collect();\n        let fill_model = venue_config\n            .fill_model()\n            .cloned()\n            .unwrap_or_default()\n            .into();\n        let fee_model = venue_config.fee_model().cloned().unwrap_or_default().into();\n        let latency_model = venue_config.latency_model().cloned().map(Into::into);\n        let sim_config = SimulatedVenueConfig::builder()","sourceCodeStart":209,"sourceCodeEnd":245,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/backtest/src/node.rs#L209-L245","documentation":"Each venue's starting balances are parsed from their string form into Money. If any string is not a valid Money representation (wrong format, bad currency code, malformed amount), parsing fails and the error is wrapped as \"Invalid starting balance: {e}\".","triggerScenarios":"Providing a venue starting balance string that fails `\"...\".parse::<Money>()` — e.g. wrong decimal format, missing currency, unknown currency code — in a BacktestVenueConfig passed to BacktestNode::build.","commonSituations":"Typo in currency code; amounts with thousands separators or symbols; locale-formatted numbers; balance strings copied from a different API with different formatting.","solutions":["Use the exact Money string format, e.g. \"1000000.00 USD\" (amount, space, ISO currency code)","Remove separators/symbols and use a plain decimal amount","Check for currency codes outside the registered currency list","Read the inner parse error after \"Invalid starting balance:\" for the specific cause"],"exampleFix":"// before\nvenue_config.add_starting_balance(\"$1,000,000.00\");\n// after\nvenue_config.add_starting_balance(\"1000000.00 USD\");","handlingStrategy":"validation","validationCode":"let money: Money = s.parse().map_err(|e| anyhow!(\"bad starting balance '{s}': {e}\"))?;","typeGuard":null,"tryCatchPattern":"match s.parse::<Money>() {\n    Ok(m) => m,\n    Err(e) => { eprintln!(\"balance '{s}' invalid: {e}\"); return Err(e.into()); }\n}","preventionTips":["Use the canonical Money string format: \"<amount> <CURRENCY>\"","Avoid locale-formatted numbers, symbols, and thousands separators","Validate currency codes against registered currencies"],"tags":["backtest","configuration","money-parsing"],"backgroundTag":"invalid-argument-format","analyzedSha":"18893faf8b356be3320add8de2f861b0b647cf06","analyzedAt":"2026-09-08T20:49:34.690Z","contentChangedAt":"2026-09-08T20:49:34.690Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}