{"record":{"id":"b893d5b66862cdfa","repo":"nautechsystems/nautilus_trader","slug":"gtd-not-supported-by-kraken-futures-use-gtc-inste","errorCode":null,"errorMessage":"GTD not supported by Kraken Futures, use GTC instead","messagePattern":"GTD not supported by Kraken Futures, use GTC instead","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/adapters/kraken/src/http/futures/client.rs","lineNumber":1954,"sourceCode":"        // Map order type and time-in-force to Kraken order type\n        // Kraken Futures encodes TIF in the orderType field:\n        // - lmt = limit (GTC)\n        // - ioc = immediate-or-cancel\n        // - post = post-only (maker only)\n        // - mkt = market\n        let kraken_order_type = match order_type {\n            OrderType::Market => KrakenFuturesOrderType::Market,\n            OrderType::Limit => {\n                if post_only {\n                    KrakenFuturesOrderType::Post\n                } else {\n                    match time_in_force {\n                        TimeInForce::Ioc => KrakenFuturesOrderType::Ioc,\n                        TimeInForce::Fok => {\n                            anyhow::bail!(\"FOK not supported by Kraken Futures, use IOC instead\")\n                        }\n                        TimeInForce::Gtd => {\n                            anyhow::bail!(\"GTD not supported by Kraken Futures, use GTC instead\")\n                        }\n                        _ => KrakenFuturesOrderType::Limit, // GTC is default\n                    }\n                }\n            }\n            OrderType::StopMarket | OrderType::StopLimit => KrakenFuturesOrderType::Stop,\n            OrderType::MarketIfTouched | OrderType::LimitIfTouched => {\n                KrakenFuturesOrderType::TakeProfit\n            }\n            _ => anyhow::bail!(\"Unsupported order type: {order_type:?}\"),\n        };\n\n        let kraken_side = KrakenOrderSide::from(order_side);\n\n        let mut builder = KrakenFuturesSendOrderParamsBuilder::default();\n        builder\n            .cli_ord_id(truncate_cl_ord_id(&client_order_id))\n            .broker(NAUTILUS_KRAKEN_BROKER_ID)","sourceCodeStart":1936,"sourceCodeEnd":1972,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/kraken/src/http/futures/client.rs#L1936-L1972","documentation":"Order-building guard in build_send_order_params: a GTD limit order was submitted, but Kraken Futures encodes time in force inside the orderType field and offers no GTD variant (only lmt/ioc/post/mkt), so the order is rejected and GTC should be used instead.","triggerScenarios":"Submitting a Limit order via submit_order/send_order_batches with time_in_force = Gtd (typically with an expire_time set) on Kraken Futures.","commonSituations":"Strategies that schedule expiring orders per session end; configs shared across venues where GTD is valid elsewhere; adapters migrated from Kraken Spot (which supports GTD) to Futures.","solutions":["Change time_in_force to Gtc.","Cancel stale orders client-side on a timer to emulate GTD.","Filter/translate GTD orders per venue before submission."],"exampleFix":"// before\nbuilder.time_in_force(TimeInForce::Gtd).expire_time(ts)\n// after\nbuilder.time_in_force(TimeInForce::Gtc)","handlingStrategy":"validation","validationCode":"fn tif_futures_supported(tif: TimeInForce) -> bool {\n    !matches!(tif, TimeInForce::Fok | TimeInForce::Gtd)\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Convert GTD orders to GTC plus client-side expiry cancellation.","Specialize strategy config per venue instead of sharing order params.","Re-check venue TIF support when porting adapters from Spot to Futures."],"tags":["kraken","futures","time-in-force","unsupported"],"backgroundTag":"unsupported-enum-value","analyzedSha":"18893faf8b356be3320add8de2f861b0b647cf06","analyzedAt":"2026-09-08T20:49:34.690Z","contentChangedAt":"2026-09-08T20:49:34.690Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}