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

  1. Log self.time and slice_symbols on each bar to see whether ES data arrives in regular hours.
  2. Verify the ES data files cover the regular session for the backtest window.
  3. Confirm slice_symbols includes both the mapped and canonical ES symbol.
  4. 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

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


AI-assisted analysis of QuantConnect/Lean@d2c3659f87 (2026-08-13). Data as JSON: /api/errors/202ff961e4b5b278. Report an issue: GitHub.