{"record":{"id":"3a2fc53823f9cb3d","repo":"nautechsystems/nautilus_trader","slug":"continuous-future-bar-subscription-requires-conti","errorCode":null,"errorMessage":"Continuous future bar subscription requires `continuous_future_transitions`, was {cmd:?}","messagePattern":"Continuous future bar subscription requires `continuous_future_transitions`, was (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/data/src/engine/mod.rs","lineNumber":5184,"sourceCode":"\n    fn subscribe_continuous_future_bars(&mut self, cmd: &SubscribeBars) -> anyhow::Result<()> {\n        let target_bar_type = cmd.bar_type;\n        let target_key = target_bar_type.standard();\n\n        if !target_bar_type.is_internally_aggregated() {\n            anyhow::bail!(\n                \"Continuous future bar subscriptions require an internally aggregated target, was {target_bar_type}\"\n            );\n        }\n\n        if self.continuous_future_roller.is_none() {\n            anyhow::bail!(\n                \"Cannot subscribe continuous future bars for {target_bar_type}: roller is not initialized; ensure `register_msgbus_handlers` runs before subscribing\"\n            );\n        }\n\n        let request = continuous_future_subscription_from_bars(cmd)?.ok_or_else(|| {\n            anyhow::anyhow!(\n                \"Continuous future bar subscription requires `continuous_future_transitions`, was {cmd:?}\"\n            )\n        })?;\n\n        self.ensure_continuous_future_target_instrument(&request);\n\n        if self\n            .continuous_future_subscriptions\n            .contains_key(&target_key)\n        {\n            log::warn!(\"Continuous future bars already subscribed for {target_bar_type}\");\n            return Ok(());\n        }\n\n        let aggregator_key = bar_aggregator_key(target_bar_type, None);\n        if let Some(aggregator) = self.bar_aggregators.get(&aggregator_key)\n            && aggregator.borrow().is_running()\n        {","sourceCodeStart":5166,"sourceCodeEnd":5202,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/data/src/engine/mod.rs#L5166-L5202","documentation":"Subscribing to continuous future bars requires the SubscribeBars command to carry continuous_future_transitions data. continuous_future_subscription_from_bars(cmd) returns None when the command's transitions payload is absent, meaning the command cannot describe how the continuous future rolls between contracts. The engine bails rather than silently aggregating bars without roll definitions.","triggerScenarios":"Sending a SubscribeBars command for a continuous future symbol (e.g. ES.CME with roll rules) where cmd.continuous_future_transitions is None — typically when the command was built without fetching transitions from the cache/extrema, or when the roller was not initialized (see the preceding roller check).","commonSituations":"Custom or scripted subscription paths constructing SubscribeBars manually without populating transitions; register_msgbus_handlers not run so the roller/transition machinery is uninitialized; subscribing to continuous futures before the instrument provider has loaded transitions.","solutions":["Ensure register_msgbus_handlers has run and the continuous future roller is initialized before subscribing.","Use the standard subscribe_bars API on the DataEngine/TradingNode instead of hand-building the SubscribeBars command, so transitions are populated automatically.","Load continuous future transitions into the cache (via the instrument provider / request) before subscribing to the continuous bar type.","If only regular bars are intended, use a non-continuous BarType (standard instrument ID) — continuous subscription support is limited to commands carrying transitions."],"exampleFix":"// before\nlet cmd = SubscribeBars::new(bar_type, client_id, None); // no transitions\n// after\nlet transitions = cache.continuous_future_transitions(&bar_type.instrument_id());\nlet cmd = SubscribeBars::new(bar_type, client_id, None)\n    .with_continuous_future_transitions(transitions);","handlingStrategy":"validation","validationCode":"let is_continuous = matches!(&bar_type, BarType::Continuous(_));\nif is_continuous {\n    let transitions = cache.continuous_future_transitions(&bar_type.instrument_id());\n    assert!(transitions.is_some(), \"continuous future transitions must be loaded before subscribing\");\n}","typeGuard":"fn has_transitions(cmd: &SubscribeBars) -> bool {\n    cmd.continuous_future_transitions.is_some()\n}","tryCatchPattern":"if let Err(e) = engine.subscribe_bars(&bar_type) {\n    if e.to_string().contains(\"continuous_future_transitions\") {\n        // load transitions / initialize roller, then retry\n    }\n}","preventionTips":["Subscribe to continuous futures only through the public engine/node APIs, not hand-built commands.","Confirm register_msgbus_handlers ran before any subscription.","Load transition data from the instrument provider before subscribing.","Use standard (non-continuous) bar types when roll handling is not needed."],"tags":["rust","data-engine","continuous-futures","subscribe"],"backgroundTag":"missing-required-config-field","analyzedSha":"18893faf8b356be3320add8de2f861b0b647cf06","analyzedAt":"2026-09-08T20:49:34.690Z","contentChangedAt":"2026-09-08T20:49:34.690Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}