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);
        }

        builder

View on GitHub (pinned to 18893faf8b)

Solutions

  1. Remove leverage (trade on spot without margin) for that symbol/side.
  2. Check Kraken's published leverage tiers for the symbol and request a level actually offered on that side.
  3. Refresh the leverage tiers cache (reconnect/reload instrument data) if tiers may be stale or missing.
  4. 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

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


AI-assisted analysis of nautechsystems/nautilus_trader@18893faf8b (2026-09-08). Data as JSON: /api/errors/1ec87f5aa956a259. Report an issue: GitHub.