{"record":{"id":"3c43319d8cdbfa5a","repo":"nautechsystems/nautilus_trader","slug":"derive-only-supports-1-week-interval-bars","errorCode":null,"errorMessage":"Derive only supports 1 WEEK interval bars","messagePattern":"Derive only supports 1 WEEK interval bars","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/adapters/derive/src/websocket/parse.rs","lineNumber":674,"sourceCode":"            _ => anyhow::bail!(\n                \"Derive only supports minute intervals 1, 5, 15, 30 (use HOUR for >= 60)\"\n            ),\n        },\n        BarAggregation::Hour => match step {\n            1 => Ok(3600),\n            4 => Ok(14400),\n            8 => Ok(28800),\n            _ => anyhow::bail!(\"Derive only supports hour intervals 1, 4, 8\"),\n        },\n        BarAggregation::Day => {\n            if step != 1 {\n                anyhow::bail!(\"Derive only supports 1 DAY interval bars\");\n            }\n            Ok(86400)\n        }\n        BarAggregation::Week => {\n            if step != 1 {\n                anyhow::bail!(\"Derive only supports 1 WEEK interval bars\");\n            }\n            Ok(604800)\n        }\n        _ => anyhow::bail!(\"Derive does not support {aggregation:?} bars\"),\n    }\n}\n\nfn timestamp_seconds_to_nanos(value: u64, field: &str) -> anyhow::Result<UnixNanos> {\n    let nanos = value\n        .checked_mul(NANOSECONDS_IN_SECOND)\n        .with_context(|| format!(\"Derive {field} overflows nanoseconds\"))?;\n    Ok(UnixNanos::from(nanos))\n}\n\n/// Parses an option ticker payload into [`OptionGreeks`].\n///\n/// Returns `Ok(None)` when the ticker does not carry option pricing.\n///","sourceCodeStart":656,"sourceCodeEnd":692,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/derive/src/websocket/parse.rs#L656-L692","documentation":"Derive's API only supports weekly candlestick intervals with a step of exactly 1; the adapter converts NautilusTrader BarSpecification values into Derive period seconds and rejects any WEEK aggregation whose step is not 1 (e.g. 2W). The bail produces an anyhow error which request_bars propagates to the caller.","triggerScenarios":"Calling request_bars with a BarSpecification whose aggregation is BarAggregation::Week and whose step is anything other than 1 (e.g. step=2 or 4).","commonSituations":"Configuring a 2-week or 4-week bar aggregation in a config file or strategy definition while using the Derive adapter for historical/data subscription.","solutions":["Change the bar specification to BarAggregation::Week with step 1","Request a larger time window of 1-week bars instead of multi-week bars","Switch to a different adapter/exchange that supports multi-week aggregation"],"exampleFix":"// before\nlet spec = BarSpecification::new(2.into(), BarAggregation::Week, PriceType::Last);\n// after\nlet spec = BarSpecification::new(1.into(), BarAggregation::Week, PriceType::Last);","handlingStrategy":"validation","validationCode":"fn is_derive_bar_spec_supported(spec: &BarSpecification) -> bool {\n    match spec.aggregation {\n        BarAggregation::Minute | BarAggregation::Hour | BarAggregation::Day => true,\n        BarAggregation::Week => spec.step.get() == 1,\n        _ => false,\n    }\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Only configure 1x Minute/Hour/Day/Week bar specs for Derive","Centralize bar-spec construction so venue support is checked in one place"],"tags":["rust","bars","unsupported-interval","derive-exchange"],"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"}