nautechsystems/nautilus_trader · error

FOK not supported by Kraken Futures, use IOC instead

Error message

FOK not supported by Kraken Futures, use IOC instead

What it means

Kraken Futures does not support Fill-or-Kill time in force for limit orders. build_send_order_params explicitly rejects TimeInForce::Fok with this message, advising IOC as the closest supported alternative.

Source

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

        let raw_symbol = instrument.raw_symbol().inner();

        // Map order type and time-in-force to Kraken order type
        // Kraken Futures encodes TIF in the orderType field:
        // - lmt = limit (GTC)
        // - ioc = immediate-or-cancel
        // - post = post-only (maker only)
        // - mkt = market
        let kraken_order_type = match order_type {
            OrderType::Market => KrakenFuturesOrderType::Market,
            OrderType::Limit => {
                if post_only {
                    KrakenFuturesOrderType::Post
                } else {
                    match time_in_force {
                        TimeInForce::Ioc => KrakenFuturesOrderType::Ioc,
                        TimeInForce::Fok => {
                            anyhow::bail!("FOK not supported by Kraken Futures, use IOC instead")
                        }
                        TimeInForce::Gtd => {
                            anyhow::bail!("GTD not supported by Kraken Futures, use GTC instead")
                        }
                        _ => KrakenFuturesOrderType::Limit, // GTC is default
                    }
                }
            }
            OrderType::StopMarket | OrderType::StopLimit => KrakenFuturesOrderType::Stop,
            OrderType::MarketIfTouched | OrderType::LimitIfTouched => {
                KrakenFuturesOrderType::TakeProfit
            }
            _ => anyhow::bail!("Unsupported order type: {order_type:?}"),
        };

        let kraken_side = KrakenOrderSide::from(order_side);

        let mut builder = KrakenFuturesSendOrderParamsBuilder::default();

View on GitHub (pinned to 18893faf8b)

Solutions

  1. Change the order's time_in_force to Ioc.
  2. Use Gtc if immediate-or-cancel semantics are not strictly required.
  3. Adjust strategy config so FOK is never emitted for the Kraken Futures venue.

Example fix

// before
builder.time_in_force(TimeInForce::Fok)
// after
builder.time_in_force(TimeInForce::Ioc)
Defensive patterns

Strategy: validation

Validate before calling

fn tif_futures_supported(tif: TimeInForce) -> bool {
    !matches!(tif, TimeInForce::Fok | TimeInForce::Gtd)
}

Prevention

When it happens

Trigger: Submitting a Limit order via submit_order/send_order_batches with time_in_force = Fok on the Kraken Futures adapter.

Common situations: Reusing order parameters tuned for other venues (e.g. FOK-heavy strategies from Binance/Coinbase) against Kraken Futures; strategy config defaulting to FOK.

Related errors


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