nautechsystems/nautilus_trader · error

Cannot subscribe continuous future bars for {target_bar_type

Error message

Cannot subscribe continuous future bars for {target_bar_type}: roller is not initialized; ensure `register_msgbus_handlers` runs before subscribing

What it means

The continuous future roller component must be registered (during register_msgbus_handlers) before continuous future bars can be subscribed. When subscribe_continuous_future_bars runs and engine.continuous_future_roller is None, the engine cannot stitch contract segments, so it fails with this initialization-order error.

Source

Thrown at crates/data/src/engine/mod.rs:5178

                }
            }
        }

        Ok(())
    }

    fn subscribe_continuous_future_bars(&mut self, cmd: &SubscribeBars) -> anyhow::Result<()> {
        let target_bar_type = cmd.bar_type;
        let target_key = target_bar_type.standard();

        if !target_bar_type.is_internally_aggregated() {
            anyhow::bail!(
                "Continuous future bar subscriptions require an internally aggregated target, was {target_bar_type}"
            );
        }

        if self.continuous_future_roller.is_none() {
            anyhow::bail!(
                "Cannot subscribe continuous future bars for {target_bar_type}: roller is not initialized; ensure `register_msgbus_handlers` runs before subscribing"
            );
        }

        let request = continuous_future_subscription_from_bars(cmd)?.ok_or_else(|| {
            anyhow::anyhow!(
                "Continuous future bar subscription requires `continuous_future_transitions`, was {cmd:?}"
            )
        })?;

        self.ensure_continuous_future_target_instrument(&request);

        if self
            .continuous_future_subscriptions
            .contains_key(&target_key)
        {
            log::warn!("Continuous future bars already subscribed for {target_bar_type}");
            return Ok(());

View on GitHub (pinned to 18893faf8b)

Solutions

  1. Ensure register_msgbus_handlers() is called on the DataEngine before any subscribe_continuous_future_bars call.
  2. If using a trader/node, only subscribe from strategy.on_start or later, after the node is fully initialized.
  3. In tests, replicate the production init sequence: construct engine then call register_msgbus_handlers before subscriptions.

Example fix

// before
let mut engine = DataEngine::new(...);
engine.subscribe_continuous_future_bars(&cmd)?; // roller is None
// after
let mut engine = DataEngine::new(...);
engine.register_msgbus_handlers();
engine.subscribe_continuous_future_bars(&cmd)?;
Defensive patterns

Strategy: validation

Validate before calling

if engine.continuous_future_roller.is_none() {
    engine.register_msgbus_handlers();
}

Try / catch

if let Err(e) = engine.subscribe_continuous_future_bars(&cmd) {
    if e.to_string().contains("roller is not initialized") {
        engine.register_msgbus_handlers();
        engine.subscribe_continuous_future_bars(&cmd)?;
    } else { return Err(e); }
}

Prevention

When it happens

Trigger: Subscribing to continuous future bars on a DataEngine whose register_msgbus_handlers() has not been called yet (or was not called at all), e.g. an engine constructed manually in a test or custom setup.

Common situations: Hand-constructed DataEngine in unit tests or custom nodes skipping register_msgbus_handlers; calling subscribe before the node finishes initialization; a custom builder that wires msgbus handlers later than subscriptions.

Understand the failure class

Background: "Invalid state transition" errors: "status must be X, actually Y", "already rejected/charging/uninstalled", "cannot ... while running" — what they mean when a library rejects your call — this error's family across 31 libraries.

Related errors


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