nautechsystems/nautilus_trader · error

Unsupported trigger type for Kraken Futures: {other:?} (only

Error message

Unsupported trigger type for Kraken Futures: {other:?} (only LastPrice, MarkPrice, and IndexPrice supported)

What it means

Kraken Futures triggers only support LastPrice, MarkPrice, and IndexPrice signals. The adapter maps Nautilus TriggerType to KrakenTriggerSignal and bails for any other TriggerType variant (e.g. BidPrice, AskPrice, or conditional trigger types) rather than silently substituting.

Source

Thrown at crates/adapters/kraken/src/http/futures/client.rs:2712

            | KrakenSendStatus::ReduceOnlyWouldIncreasePosition)
    )
}

fn is_futures_modify_rejection(status: &str) -> bool {
    status.parse::<KrakenSendStatus>().is_ok_and(|status| {
        status == KrakenSendStatus::NotFound || is_futures_submit_rejection(status.as_ref())
    })
}

fn map_futures_trigger_signal(
    trigger_type: Option<TriggerType>,
) -> anyhow::Result<Option<KrakenTriggerSignal>> {
    match trigger_type {
        None => Ok(None),
        Some(TriggerType::Default | TriggerType::LastPrice) => Ok(Some(KrakenTriggerSignal::Last)),
        Some(TriggerType::MarkPrice) => Ok(Some(KrakenTriggerSignal::Mark)),
        Some(TriggerType::IndexPrice) => Ok(Some(KrakenTriggerSignal::Index)),
        Some(other) => anyhow::bail!(
            "Unsupported trigger type for Kraken Futures: {other:?} (only LastPrice, MarkPrice, and IndexPrice supported)"
        ),
    }
}

fn parse_multi_collateral_balances(account: &FuturesAccount, balances: &mut Vec<AccountBalance>) {
    for (currency_code, currency_info) in &account.currencies {
        if currency_info.quantity.is_zero() {
            continue;
        }

        let currency = Currency::new(
            currency_code.as_str(),
            8,
            0,
            currency_code.as_str(),
            CurrencyType::Crypto,
        );

View on GitHub (pinned to 18893faf8b)

Solutions

  1. Change the order's trigger type to MarkPrice (Kraken Futures default) or LastPrice/IndexPrice.
  2. Remove the explicit trigger_type so it defaults to Kraken's Last signal.
  3. If bid/ask triggering is required, implement trigger detection locally and submit plain orders when the condition is met.

Example fix

// before
let order = order_factory.stop_market(
    ..., TriggerType::BidPrice,
);

// after
let order = order_factory.stop_market(
    ..., TriggerType::MarkPrice,
);
Defensive patterns

Strategy: validation

Validate before calling

use nautilus_model::enums::TriggerType;
const SUPPORTED: [TriggerType; 4] = [TriggerType::Default, TriggerType::LastPrice, TriggerType::MarkPrice, TriggerType::IndexPrice];
if let Some(t) = trigger_type {
    if !SUPPORTED.contains(t) {
        return Err(format!("trigger {t:?} unsupported on Kraken Futures"));
    }
}

Type guard

fn is_kraken_futures_trigger(t: &TriggerType) -> bool {
    matches!(t, TriggerType::Default | TriggerType::LastPrice | TriggerType::MarkPrice | TriggerType::IndexPrice)
}

Try / catch

match client.submit_order(order).await {
    Err(e) if e.to_string().contains("Unsupported trigger type") => {
        log::error!("use MarkPrice/LastPrice/IndexPrice triggers on Kraken Futures");
    }
    Err(e) => return Err(e),
    Ok(r) => r,
}

Prevention

When it happens

Trigger: Submitting a stop/conditional order whose TriggerType is anything other than None, Default, LastPrice, MarkPrice, or IndexPrice — e.g. TriggerType::BidPrice or TriggerType::AskPrice from a strategy ported from another venue adapter.

Common situations: Strategies copied from FX/spot venues that use bid/ask triggers; configuration specifying conditional triggers Kraken Futures does not offer; cross-venue abstractions assuming all trigger types exist everywhere.

Related errors


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