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
- Ensure register_msgbus_handlers() is called on the DataEngine before any subscribe_continuous_future_bars call.
- If using a trader/node, only subscribe from strategy.on_start or later, after the node is fully initialized.
- 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
- Always call register_msgbus_handlers immediately after constructing a DataEngine
- Subscribe only from strategy.on_start, never during engine construction
- Mirror the node/trader init sequence in custom harnesses and tests
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
- Continuous future bar subscriptions require an internally ag
- No continuous future subscription state for {target_bar_type
- Continuous future bar subscriptions must not include `bar_ty
- Continuous future target {primary_bar_type} must be internal
- Continuous future transitions must not be empty
AI-assisted analysis of nautechsystems/nautilus_trader@18893faf8b (2026-09-08).
Data as JSON: /api/errors/7a052b4be7033285.
Report an issue: GitHub.