{"record":{"id":"5da008ea6f894269","repo":"nautechsystems/nautilus_trader","slug":"binance-futures-gtd-requires-an-expire-time","errorCode":null,"errorMessage":"Binance Futures GTD requires an expire_time","messagePattern":"Binance Futures GTD requires an expire_time","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/adapters/binance/src/futures/execution.rs","lineNumber":1510,"sourceCode":"    }\n\n    anyhow::ensure!(\n        matches!(\n            order_type,\n            OrderType::Limit | OrderType::StopLimit | OrderType::LimitIfTouched\n        ),\n        \"Binance Futures does not support GTD for order type {order_type:?}\"\n    );\n    anyhow::ensure!(!post_only, \"Binance Futures GTD cannot be post-only\");\n\n    anyhow::ensure!(\n        product_type == BinanceProductType::UsdM,\n        \"Binance {product_type:?} Futures does not support native GTD\"\n    );\n\n    let expire_time = expire_time.context(\"Binance Futures GTD requires an expire_time\")?;\n    let expire_ns = expire_time.as_u64();\n    anyhow::ensure!(\n        expire_ns.is_multiple_of(NANOSECONDS_IN_SECOND),\n        \"Binance Futures goodTillDate requires whole-second precision\"\n    );\n\n    let minimum_ns = ts_now\n        .as_u64()\n        .checked_add(BINANCE_GTD_MIN_LEAD_SECS * NANOSECONDS_IN_SECOND)\n        .context(\"Binance Futures GTD minimum timestamp overflow\")?;\n    anyhow::ensure!(\n        expire_ns > minimum_ns,\n        \"Binance Futures goodTillDate must be strictly greater than current time plus {BINANCE_GTD_MIN_LEAD_SECS} seconds\"\n    );\n\n    let good_till_date = expire_ns / NANOSECONDS_IN_MILLISECOND;\n    anyhow::ensure!(\n        good_till_date < BINANCE_GTD_MAX_MILLIS,\n        \"Binance Futures goodTillDate must be smaller than {BINANCE_GTD_MAX_MILLIS}\"\n    );","sourceCodeStart":1492,"sourceCodeEnd":1528,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/binance/src/futures/execution.rs#L1492-L1528","documentation":"A GTD order with use_gtd=true must carry an expire_time (UnixNanos); determine_futures_order_lifetime uses anyhow's context to convert a None expire_time into this error. Without a timestamp the adapter cannot compute Binance's goodTillDate parameter.","triggerScenarios":"validate_order / build_futures_order_list_batch with TimeInForce=Gtd, use_gtd=true, post_only=false, product_type UsdM, order type Limit/StopLimit/LimitIfTouched — but the order/request has expire_time=None (e.g. order factory called without the expiry argument).","commonSituations":"Order factory calls where the expire_time argument was omitted or defaulted to None; strategies where time_in_force is Gtd but expiry handling was delegated away (no manage_gtd_expiry) losing the timestamp; deserialized orders that dropped the expire field.","solutions":["Pass the expire_time (UnixNanos) when creating the GTD order in the OrderFactory.","Enable manage_gtd_expiry on the submitting strategy so expiries are tracked and supplied.","Use TimeInForce Gtc if no expiry timestamp is available.","Verify the order's expire_time was not lost during serialization/replay before submission."],"exampleFix":"// before\norder_factory.limit(instrument_id, Side::Buy, price, qty, TimeInForce::Gtd, None);\n// after\norder_factory.limit(instrument_id, Side::Buy, price, qty, TimeInForce::Gtd, Some(expire_time_ns));","handlingStrategy":"validation","validationCode":"if tif == TimeInForce::Gtd && use_gtd && expire_time.is_none() {\n    return Err(\"GTD order submitted without expire_time\");\n}","typeGuard":null,"tryCatchPattern":"match exec_client.generate_order_status_reports(None, ts_now).await {\n    Ok(_) => {},\n    Err(e) if e.to_string().contains(\"expire_time\") => log::warn!(\"order missing GTD expiry\"),\n    Err(e) => return Err(e),\n}","preventionTips":["Always pass expire_time when creating GTD orders","Enable manage_gtd_expiry on the strategy","Verify expire_time survives order serialization/replay"],"tags":["gtd","missing-expire-time","binance-futures","order-validation"],"backgroundTag":"missing-required-argument","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"}