nautechsystems/nautilus_trader · error
Leverage not supported for {raw_symbol} on {side_label} side
Error message
Leverage not supported for {raw_symbol} on {side_label} side What it means
Kraken publishes per-instrument, per-side leverage tier tables. When the requested leverage level has no valid tier for the order's side on the given symbol (the filtered tier list is empty), the adapter refuses to build the order because Kraken would reject it.
Source
Thrown at crates/adapters/kraken/src/http/spot/client.rs:3161
if let Some(n) = leverage {
let tiers = self.leverage_tiers_cache.get_cloned(&raw_symbol);
let (buy_tiers, sell_tiers) = tiers.ok_or_else(|| {
anyhow::anyhow!(
"Leverage tiers not loaded for {raw_symbol}; cannot validate leverage {n}:1 (instruments must be initialized before submitting margin orders)"
)
})?;
let valid_tiers = match order_side {
OrderSide::Buy => buy_tiers,
_ => sell_tiers,
};
let side_label = match order_side {
OrderSide::Buy => "buy",
_ => "sell",
};
if valid_tiers.is_empty() {
anyhow::bail!("Leverage not supported for {raw_symbol} on {side_label} side");
}
if !valid_tiers.contains(&(n as i32)) {
anyhow::bail!(
"Leverage {n}:1 not supported for {raw_symbol} on {side_label} side (valid: {valid_tiers:?})"
);
}
builder.leverage(format!("{n}:1"));
}
if reduce_only {
if account_type != AccountType::Margin {
anyhow::bail!("reduce_only requires spot_account_type=Margin (current: Cash)");
}
builder.reduce_only(true);
}
builderView on GitHub (pinned to 18893faf8b)
Solutions
- Remove leverage (trade on spot without margin) for that symbol/side.
- Check Kraken's published leverage tiers for the symbol and request a level actually offered on that side.
- Refresh the leverage tiers cache (reconnect/reload instrument data) if tiers may be stale or missing.
- Trade a different symbol that supports margin on the desired side.
Defensive patterns
Strategy: validation
Validate before calling
let tiers = client.leverage_tiers_for(symbol).ok_or("no leverage tiers cached")?;
let (buy, sell) = tiers;
let valid = if side == OrderSide::Buy { buy } else { sell };
if valid.is_empty() {
return Err(format!("{symbol} has no {side:?}-side leverage tiers"));
} Try / catch
match client.submit_order(req) {
Err(e) if e.to_string().contains("Leverage not supported") => {
// resubmit without leverage or switch instrument
}
r => r?,
} Prevention
- Load Kraken leverage tiers at startup and gate leveraged orders on them.
- Handle symbols/sides with empty tier tables explicitly in strategy sizing logic.
- Refresh tier caches periodically so listings and tier changes are picked up.
When it happens
Trigger: Submitting a Kraken Spot margin order with leverage Some(n) where the leverage tiers cache for raw_symbol contains no buy-side (or sell-side) tiers applicable to the requested OrderSide — e.g. asking for leverage on an instrument/side Kraken does not permit margin trading on.
Common situations: Trading a low-liquidity or newly listed pair that has no margin tiers for one side; requesting leverage on a side where Kraken only allows spot value; stale or absent tier data for the symbol.
Understand the failure class
Background: "value must be between 0 and 1" / "out of range" / "must not be negative" errors: fixing range-validation failures across open-source libraries — this error's family across 42 libraries.
Related errors
- Leverage {n}:1 not supported for {raw_symbol} on {side_label
- leverage requires spot_account_type=Margin (current: Cash)
- Kraken Spot trailing stops do not support activation trigger
- Unsupported trigger type for Kraken Spot: {other:?} (only La
- reduce_only requires spot_account_type=Margin (current: Cash
AI-assisted analysis of nautechsystems/nautilus_trader@18893faf8b (2026-09-08).
Data as JSON: /api/errors/1ec87f5aa956a259.
Report an issue: GitHub.