{"record":{"id":"c64a3bb150f3946b","repo":"nautechsystems/nautilus_trader","slug":"leverage-tiers-not-loaded-for-raw-symbol-cannot","errorCode":null,"errorMessage":"Leverage tiers not loaded for {raw_symbol}; cannot validate leverage {n}:1 (instruments must be initialized before submitting margin orders)","messagePattern":"Leverage tiers not loaded for (.+?); cannot validate leverage (.+?):1 \\(instruments must be initialized before submitting margin orders\\)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/adapters/kraken/src/http/spot/client.rs","lineNumber":3147,"sourceCode":"            builder.expiretm(expire);\n        }\n\n        if let Some(dq) = display_qty {\n            builder.displayvol(dq.to_string());\n        }\n\n        if let Some(ac) = asset_class {\n            builder.asset_class(ac);\n        }\n\n        if leverage.is_some() && account_type != AccountType::Margin {\n            anyhow::bail!(\"leverage requires spot_account_type=Margin (current: Cash)\");\n        }\n\n        if let Some(n) = leverage {\n            let tiers = self.leverage_tiers_cache.get_cloned(&raw_symbol);\n            let (buy_tiers, sell_tiers) = tiers.ok_or_else(|| {\n                anyhow::anyhow!(\n                    \"Leverage tiers not loaded for {raw_symbol}; cannot validate leverage {n}:1 (instruments must be initialized before submitting margin orders)\"\n                )\n            })?;\n            let valid_tiers = match order_side {\n                OrderSide::Buy => buy_tiers,\n                _ => sell_tiers,\n            };\n            let side_label = match order_side {\n                OrderSide::Buy => \"buy\",\n                _ => \"sell\",\n            };\n\n            if valid_tiers.is_empty() {\n                anyhow::bail!(\"Leverage not supported for {raw_symbol} on {side_label} side\");\n            }\n\n            if !valid_tiers.contains(&(n as i32)) {\n                anyhow::bail!(","sourceCodeStart":3129,"sourceCodeEnd":3165,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/kraken/src/http/spot/client.rs#L3129-L3165","documentation":"When submitting a margin (leveraged) spot order, the adapter validates the requested leverage against cached leverage tiers for the raw symbol. If no tiers were loaded into `leverage_tiers_cache` for that symbol, validation cannot proceed and this error is raised. The message states the remedy: instruments (including their leverage tiers) must be initialized before submitting margin orders.","triggerScenarios":"Placing an order with `leverage: Some(n)` for a symbol whose leverage tiers were never fetched/loaded (e.g. instruments initialization skipped, symbol absent from tier data, or trading a pair outside the loaded universe). Note a separate check rejects leverage when account type is Cash.","commonSituations":"Bypassing the adapter's instrument initialization in tests or scripts; margin order for a brand-new/delisted pair not in tier data; cache cleared or never populated because only Cash instruments were loaded.","solutions":["Initialize/load instruments (which populates leverage tiers) before submitting leveraged orders.","Confirm the exact `raw_symbol` in the error exists in Kraken's leverage tier data; use the venue's raw symbol spelling.","If you don't want leverage, submit with `leverage: None` so no tier validation is required.","Refresh the tier cache if Kraken recently changed tier data for the pair."],"exampleFix":"// before\nclient.submit_order(request_with_leverage(5)).await?; // tiers never loaded\n// after\nclient.load_instruments_if_needed().await?; // populates leverage_tiers_cache\nclient.submit_order(request_with_leverage(5)).await?;","handlingStrategy":"validation","validationCode":"fn ensure_tiers_loaded(client: &KrakenSpotHttpClient, raw_symbol: &str, leverage: Option<u32>) -> Result<(), String> {\n    if leverage.is_some() && client.leverage_tiers_cache.get(raw_symbol).is_none() {\n        Err(format!(\"leverage tiers missing for {raw_symbol}; initialize instruments first\"))\n    } else { Ok(()) }\n}","typeGuard":null,"tryCatchPattern":"if let Err(e) = ensure_tiers_loaded(&client, \"XBTUSD\", Some(5)) {\n    client.load_instruments_if_needed().await?; // then retry once\n}\nmatch client.submit_order(req).await { /* ... */ }","preventionTips":["Run instrument initialization as a mandatory startup step before any order submission","Reject leveraged orders at the strategy layer for symbols outside the loaded universe","Pass leverage: None for cash (non-margin) orders to skip tier validation entirely"],"tags":["leverage","margin","instrument-cache","kraken","initialization-order"],"backgroundTag":"invalid-state-transition","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"}