QuantConnect/Lean · error · AssertionError
Algorithm should have run on regular hours for {self._es.sym
Error message
Algorithm should have run on regular hours for {self._es.symbol} future, which enabled extended market hours What it means
End-of-algorithm assertion that the ES future (extended hours enabled) produced data during a regular-hours bar at least once. _es_ran_on_regular_hours is set True only when ES is in regular hours AND the slice contains ES data. Failing means the algorithm never saw an ES bar during regular hours across the whole backtest.
Source
Thrown at Algorithm.Python/FuturesExtendedMarketHoursRegressionAlgorithm.py:63
slice_has_e_s_data = self._es.symbol in slice_symbols
self._es_ran_on_regular_hours |= es_is_in_regular_hours and slice_has_e_s_data
self._es_ran_on_extended_hours |= es_is_in_extended_hours and slice_has_e_s_data
gc_is_in_regular_hours = self._gc.exchange.hours.is_open(self.time, False)
gc_is_in_extended_hours = not gc_is_in_regular_hours and self._gc.exchange.hours.is_open(self.time, True)
slice_has_g_c_data = self._gc.symbol in slice_symbols
self._gc_ran_on_regular_hours |= gc_is_in_regular_hours and slice_has_g_c_data
self._gc_ran_on_extended_hours |= gc_is_in_extended_hours and slice_has_g_c_data
time_of_day = self.time.time()
current_time_is_regular_hours = (time_of_day >= time(9, 30, 0) and time_of_day < time(16, 15, 0)) or (time_of_day >= time(16, 30, 0) and time_of_day < time(17, 0, 0))
current_time_is_extended_hours = not current_time_is_regular_hours and (time_of_day < time(9, 30, 0) or time_of_day >= time(18, 0, 0))
if es_is_in_regular_hours != current_time_is_regular_hours or es_is_in_extended_hours != current_time_is_extended_hours:
raise AssertionError("At {Time}, {_es.symbol} is either in regular hours but current time is in extended hours, or viceversa")
def on_end_of_algorithm(self):
if not self._es_ran_on_regular_hours:
raise AssertionError(f"Algorithm should have run on regular hours for {self._es.symbol} future, which enabled extended market hours")
if not self._es_ran_on_extended_hours:
raise AssertionError(f"Algorithm should have run on extended hours for {self._es.symbol} future, which enabled extended market hours")
if not self._gc_ran_on_regular_hours:
raise AssertionError(f"Algorithm should have run on regular hours for {self._gc.symbol} future, which did not enable extended market hours")
if self._gc_ran_on_extended_hours:
raise AssertionError(f"Algorithm should have not run on extended hours for {self._gc.symbol} future, which did not enable extended market hours")
View on GitHub (pinned to d2c3659f87)
Solutions
- Log self.time and slice_symbols on each bar to see whether ES data arrives in regular hours.
- Verify the ES data files cover the regular session for the backtest window.
- Confirm slice_symbols includes both the mapped and canonical ES symbol.
- Check the MarketHoursDatabase regular-session window for CME ES.
Defensive patterns
Strategy: validation
Validate before calling
# Track regular-hours data arrival for ES
if self._es.exchange.hours.is_open(self.time, False) and self._es.symbol in slice_symbols:
self._es_ran_on_regular_hours = True
else:
self.debug(f"No ES regular-hours data yet at {self.time}") Type guard
def slice_has_regular_hours_data(security, slice_symbols, t: datetime) -> bool:
return security.exchange.hours.is_open(t, False) and security.symbol in slice_symbols Prevention
- Ensure slice_symbols includes both canonical and mapped ES symbols.
- Verify ES data files cover the regular session in the window.
- Log slice_symbols during regular hours to confirm subscription.
- Check MarketHoursDatabase regular-session window for ES.
When it happens
Trigger: ES data missing for every regular-hours bar in the window; is_open returning False for all regular times due to a MarketHoursDatabase bug; slice symbol matching failing so slice_has_e_s_data is always False.
Common situations: Data drop covering only extended-hours bars; canonical-vs-mapped symbol mismatch in slice_symbols; resolution/fill-forward settings suppressing regular-hours bars; MarketHoursDatabase entry narrowing the regular session.
Related errors
- Algorithm should have run on extended hours for {self._es.sy
- Algorithm should have run on regular hours for {self._gc.sym
- The Exchange hours was closed, verify 'extended_market_hours
- Never invested in ES futures and FOPs
- At {Time}, {_es.symbol} is either in regular hours but curre
AI-assisted analysis of QuantConnect/Lean@d2c3659f87 (2026-08-13).
Data as JSON: /api/errors/202ff961e4b5b278.
Report an issue: GitHub.