4. The Bar Resolution Problem

Bar Resolution··Updated ·backtesting, bt-series, bar-resolution, ohlc

4.1 Why Every Bar Conceals Information

Every OHLC bar, regardless of its timeframe, is a lossy compression of the true price path. A bar records the open, the high, the low, and the close, but nothing about the trajectory between them. Any order that could have been triggered at some point within the bar (a stop-loss, a limit entry, a profit target) must be evaluated against a price path that the bar does not fully describe. The backtesting engine must therefore make assumptions about what happened inside the bar, and those assumptions may or may not correspond to reality.

This problem exists at every level of aggregation, but its severity is a direct function of bar size. At fine granularity (one-minute or five-minute bars) the price range within each bar is typically small, the number of plausible intra-bar paths is tightly constrained, and the assumptions required to evaluate orders introduce only modest error. For the vast majority of retail systematic trading, backtesting with bars of this granularity provides results that sufficiently approximate reality. The exception is high-frequency scalping, where even sub-minute price movements and order book position matter, but this is generally outside the domain of the retail trader. Finer bars settle some questions and leave others open. On one-second data for the E-mini S&P 500 futures (ES), for instance, the order in which the day’s high and low were made is effectively certain, because the two extremes almost never sit close together in time. But whether a resting limit inside the range would actually have filled, and at what price a stop would have filled after the market gapped through it, are still assumptions at one second, and bar data of any resolution understates them, because every bar hides the jumps between its observations.

As bar size increases, so does the divergence between what the backtest assumes and what would have occurred in live trading. An hourly bar conceals more than 12 five-minute bars; a daily bar conceals far more than all its hourly bars. The high-to-low range of a daily bar in a liquid futures contract can easily span two or three percent, a range within which stops and profit targets may both have been triggered, but the bar provides no information about the sequence in which prices were visited. Over thousands of trades across a multi-year backtest, these guesses compound into a systematic bias. The intuition that these errors should cancel out (that random guesses about intra-bar paths would overstate some trades and understate others in roughly equal measure) is understandable, and people defend it in practice: the documentation of at least one current commercial daily-bar backtester argues that the error on any single trade can be large but that the differences cancel over a large sample. On ES the intuition turns out to be wrong: on one-second data covering 4,986 trading days from June 2010 to June 2026, the errors of the daily-bar path model are signed, and they push results towards the optimistic side (the measurement is set out in Section 4.2), so the net effect is an overstatement of performance.

Part of the mechanism is survivorship within the backtest itself: when the engine guesses that a stop was not triggered (because it can’t see the intraday breach), the position survives and participates in subsequent price recovery. The symmetric error (guessing that a profitable target was not reached) is less consequential, because the position simply remains open and is eventually closed by another signal. On balance, errors on the loss side tend to be eliminated from the record while errors on the profit side tend to be deferred rather than eliminated, producing a directional bias that systematically flatters the equity curve. Three further biases in the bar model push the same way: on choppy days both a stop and a target are swept and the engine books the target, every limit inside the range is assumed to fill at its exact price, and every stop fills at its trigger even when the market gapped through it. This error is most visible on systems that can have a profitable exit or stop loss triggered on the same bar.

This failure is most acute, and most widespread, at the daily bar level, because a large number of retail traders use end-of-day (EOD) daily bars data as the foundation for their backtesting. Many do so in the belief that, because they are developing longer-term strategies with weekly or monthly signals, the intraday price path is irrelevant.

For most of those traders the belief is wrong, and it is wrong for any strategy whose stops and targets can sit inside the same bar, for any rule that acts within the session, and for any result that came out of an optimiser. There is a narrow case in which daily bars are close enough: a daily or longer horizon, a liquid instrument traded in small size, entries made with market-on-open orders, and stops and targets that rarely sit inside the same day’s range. A book like that can treat its daily-bar backtest as an optimistic sketch and size conservatively. Most strategies that people test on end-of-day data fall outside that case.

A strategy’s signal generation timeframe and its order evaluation timeframe are separate concerns. A trader may generate signals from daily or weekly bars, but the orders those signals produce (stops, limits, targets) interact with the market continuously, not at daily intervals. Any strategy that places a stop-loss is implicitly asking the market a question about the intraday path: “did price reach this level at any point during the session?” A clean daily high and low can answer that question on their own, but end-of-day data can’t reliably answer the ones that follow from it: whether the level was reached before or after another level inside the same range, whether a resting limit at a price the market touched actually filled, and what price a stop filled at when the market gapped through it.

Consider a long-term trend-following system that uses a trailing stop. The daily close may show a price comfortably above the stop level, but the intraday low may have breached it. If the strategy is implemented live with a resting stop order, the stop will be triggered by the intraday breach; if the backtest only sees the daily close, it will show the position as still open. The discrepancy accumulates over a multi-year test, and the backtest will show a strategy that holds through intraday volatility and captures the subsequent recovery, while the live strategy will have been stopped out. The result is a systematic positive bias in the backtested equity curve relative to achievable performance. The specific failure mode this creates (the OHLC sequence ambiguity, in which multiple orders could all have been triggered within a single bar but in an unknowable order) is examined in detail in Section 4.2.

The stop-concealment problem is compounded on some platforms by the complete absence of out-of-session order evaluation. In TradeStation, for example, a stop order placed at the session close is simply not evaluated until the next session opens. Most CME Globex futures, including the equity-index, energy, metals, and interest-rate contracts, trade 23 hours a day, with a 60-minute maintenance halt each weekday afternoon that most traders forget exists until it catches them.1 For those contracts, overnight price movement through a stop level is invisible to such an engine: the stop is never triggered, the position survives, and the backtest records a different outcome than would have been produced in live trading. The overnight hours carry much of the day’s movement: on ES one-minute bars from June 2010 to September 2026 (Databento), the overnight session set the full session’s high or low on 71–86% of days in every year, and its range was 58–69% of the full session’s range. On most days, then, at least one of the day’s extremes is printed while an engine of this kind isn’t looking.

Not every futures market keeps that schedule, and the schedules move. CME’s cryptocurrency futures have traded around the clock since 29 May 2026, apart from short maintenance windows.2 The livestock contracts now trade only from 8:30am to 1:05pm CT, after cuts from about 97 hours a week in 2014 to about 23 in 2016.3 The grains trade a split session, an overnight leg from 7:00pm to 7:45am CT and a day session from 8:30am to 1:20pm CT, with a pause between them.1 A session template copied from ES is wrong for all of them.

This limitation would not arise if the backtest were configured to use the full trading session, the entire period during which the exchange accepts orders. But many traders do not want to execute entries outside of regular trading hours (RTH), preferring to restrict their algorithms to a subset of the full trading day, such as the equity regular session from 9:30am to 4:00pm Eastern time. This is a legitimate design choice: RTH sessions typically offer deeper liquidity and more representative price discovery. Restricting entries to the RTH session while still evaluating protective exits across the full session is, in fact, the way most traders would operate in live markets. But implementing this distinction (entries only during RTH, exits active at all times) requires the platform to treat entry and exit orders differently with respect to session boundaries, and platforms that lack this capability force the trader to choose between two unsatisfactory alternatives: use the full session for everything (accepting entries at potentially illiquid overnight prices) or restrict the entire strategy to RTH (leaving stops unevaluated outside those hours).

The trader who chooses the latter, restricting the session to RTH, eliminates the need for complex time-of-day management in the strategy code. Without this restriction, the code must determine whether the current bar falls within the desired trading window, whether the next bar will be the last bar before the window closes, and so on. This is already non-trivial for a single instrument, but it becomes especially difficult when trading symbols across multiple time zones, where the RTH windows in the trader’s local time shift with daylight saving transitions in both the trader’s location and the exchange’s location.

The equity regular session is itself about to change its meaning. Nasdaq has announced 23-hour trading in US equities, five days a week, from 6 December 2026, and NYSE Arca plans the same start. The 9:30am to 4:00pm session and its closing auction remain, but they become the core of a longer trading day rather than the whole of it, and a strategy that holds stocks overnight will have to decide in which of those hours its stops are live, as a futures trader already does.4

Platforms like TradeStation make this difficulty worse still by requiring all time references in strategy code to be expressed in the user’s local computer time, regardless of where the traded instrument’s exchange is located. This means the researcher must manually convert every session boundary and time-based condition from the exchange’s native time zone to their own, and must track the daylight saving schedules of both zones to ensure the conversion remains correct throughout the year. The variations are large enough to matter: depending on whether the local user’s time zone and the exchange’s time zone are independently entering or leaving daylight saving time, the apparent start time of a session can shift by one hour or, in some cases, two hours relative to the user’s clock. This can be the difference between evaluating a bar at 9:00am and evaluating one at 11:00am, a distinction with material consequences for any strategy that references time of day. The issue can be worked around with careful coding, but it represents an extra source of logic errors and needless overhead, one that is entirely a platform artefact rather than an inherent difficulty of the problem. In practice, most traders either give up on strategies that require this kind of cross-timezone session management, or proceed without realising that the underlying time-conversion issues exist at all, silently corrupting their backtest results in ways that may never be detected.

Some sessions are anchored to a clock that isn’t the exchange’s own. ICE’s New York softs (sugar, coffee, and cocoa) open and settle on London time, and because the US and Europe change their clocks on different dates, ICE issues notices moving the New York opening times by an hour for the few weeks a year when the two are out of step.5 A session written as a fixed range of New York times is right for about 48 weeks a year and wrong for the rest.

4.2 The OHLC Sequence Ambiguity

The information loss described above produces a specific and well-defined failure mode when a strategy generates multiple price-contingent orders that could both trigger within a single bar. A bar compresses an entire continuous price path into four numbers: open, high, low, close. The true tick-by-tick sequence between the open and the close is destroyed, but during the bar price visited some ordered path that touched both the high and the low. At least two paths are consistent with any given OHLC quadruple:

  • Path A (OHLC, high first): open →\to high →\to low →\to close.
  • Path B (OLHC, low first): open →\to low →\to high →\to close.

The two paths give different answers for a strategy that has both a profit target and a stop loss live inside the bar. On Path A the target fills first; on Path B the stop fills first. The realised profit and loss from those two paths can have opposite signs, yet the bar looks identical in the data file.

Consider a concrete example: a system enters long at the open at 100, with a stop at 98 and a target at 104. The day’s OHLC is 100/105/97/103, so both the stop and the target were reached during the session, and the system’s result depends entirely on which was hit first. If the market rallied to 105 before declining to 97, the target was achieved and the trade is a winner. If the market dropped to 97 first, the stop was triggered and the trade is a loser. The daily bar does not contain this information.

4.2.1 Why engines have to guess, and why they guess optimistically

Without tick or sub-bar data, a backtester cannot know in which order the high and the low occurred, so it has to adopt a convention. Five conventions are common, and each is unsatisfactory in its own way:

  1. Assume low-before-high on up bars (close ≥\geq open) and high-before-low on down bars. The intuition is that an up bar opened near its low, dipped to the low early, and then rallied. The rule reads only the sign of the bar’s body and ignores where the open sat within the range, which is the clue the next convention uses. I haven’t measured it, so I give it no numbers here.
  2. Assume the extreme nearer the open came first. If the open sits in the bottom half of the range (O<(H+L)/2O < (H+L)/2), assume the path was O→L→H→CO \to L \to H \to C; otherwise assume O→H→L→CO \to H \to L \to C. This is the most defensible of the guessing conventions, and I have measured it (see below). It is right far more often than chance, and it fails on the bars where a bracket order is a race.
  3. Assume the favourable level is hit first (target before stop on a long trade, stop before target where the stop is the upside). This is wishful thinking, and it inflates equity curves more than any other convention.
  4. Assume the unfavourable level is hit first. This is conservative, and the only safe default. Its error is towards under-reporting profitability, which is the right direction for the error to point.
  5. Fill both orders on the same bar in entry order, or net them out. This is incoherent, because both orders cannot have executed at their respective trigger prices on the same realised path unless the path order is known.

Most retail engines end up at something close to one of the first three conventions in their default configuration. Backtrader, for example, processes intra-bar orders in queue submission order, with the consequence that an entry, target, and stop submitted together cannot all be honoured correctly within the entry bar; the limitation is discussed further in Section 7. The practical effect of the default behaviour is the same regardless of how it is rationalised: when a bar’s range straddles both the target and the stop, the engine tends to book the winner.

A small number of better-designed engines surface the choice as an explicit setting on the strategy, with four typical values. A “best-guess” mode uses the close-versus-open heuristic of convention 1: if the bar closed above its open the low is assumed to have come first, and vice versa. A “stop-first” mode hard-wires convention 4: whenever a bar’s range contains both levels, the stop is assumed to have been hit, regardless of where the bar closed. A “target-first” mode hard-wires convention 3, assuming the favourable level was hit first. A “neither” mode declines to resolve the ambiguity at all: if the sequence cannot be inferred without guessing, the bar simply produces no exit, and the position carries forward to be resolved by the next bar or by some other exit rule. Exposing the choice as a strategy parameter is a marked improvement over silently encoding it as a default, because it forces the researcher to think about which assumption is being made and to live with the consequences. The “stop-first” and “neither” modes are the only defensible choices. The “best-guess” mode rests on a real regularity, but it fails on the bars that matter, for the reasons set out below. The “target-first” mode is an active misrepresentation of the strategy’s performance and should never be used.

Other engines offer no setting and build convention 2 into their fill logic. The manual of at least one current daily-bar backtester says that stops and limits inside the day can still be simulated without intraday data, provided the engine is smart about the order in which levels are touched. The smartness it has in mind is convention 2.

4.2.2 How good the best guess is

I measured convention 2 directly on continuous ES futures (Databento) over 4,986 trading days, from 6 June 2010 to 30 June 2026, with the price path sampled once a second through the roughly 23-hour session. For each day the recorded path gives the true order of the high and the low, and the heuristic sees only the day’s four OHLC numbers. It called the order correctly on 81.0% of days, against 52% for always guessing that the low came first. Cohen’s κ\kappa is 0.62, and the open’s position scores an AUC of 0.90 as a predictor of which extreme came first. This is one instrument, but on it the effect is real, and calling it folklore would be wrong.

The skill depends on where the open sits, which I measure as f=(O−L)/(H−L)f = (O - L)/(H - L), the open’s position in the range:

Where the open satP(high was actually first)Heuristic accuracy
Bottom decile (open near the low)2%98%
Lower-middle26%74%
Dead centre (ff between about 0.45 and 0.55)about 48%about 53%
Upper-middle68%68%
Top decile (open near the high)98%98%

The calibration rises steadily from 2% to 98% across the deciles, the pattern you would expect from a real market regularity and not from a curve-fit. In effect the rule detects trend days: on a day that trends up, the open ends up near the low and the low really was made early; on a choppy day the open lands mid-range, the order of the extremes is close to random, and the guess is about 53% right, a coin flip, against 98% when the open is pinned to an extreme. Only 8% of days fall in that dead zone, which is why the headline figure holds up. Moving the threshold doesn’t help, because the accuracy-optimal cut is 0.51 against 0.50. Accuracy is about 72% on narrow-range days and 84% on wide ones, and it held in every one of the 16 years, at 76–86% a year.

So the rule is reliable on trend days and close to useless on choppy ones, and the choppy days are exactly the ones on which a stop below and a target above, both inside the range, are a race. Its errors also run in one direction, for the reasons in the next subsection. That is why it isn’t a defensible default, despite the 81%.

4.2.3 Why this overstates profitability rather than just adding noise

If the convention were unbiased (equivalent to flipping a fair coin per bar to decide which level was hit first), the resulting error would be noise around the true expectancy and would shrink with sample size. The trap is that the bias is systematically in the strategy’s favour, for three independent and compounding reasons.

The first is conditional sampling: the path assumption only matters on bars whose range contains both the target and the stop. On every other bar the outcome is unambiguous and the convention is irrelevant. The engine’s guess is therefore not being averaged over all bars but over the subset of bars where reality is itself a coin flip between +kR+kR and −R-R, where RR is the risk per unit and kk is the reward-to-risk ratio. On ES the coin-flip description is close to right on the days when the open sits mid-range: on those days the high came first about 48% of the time. An unbiased engine would make an error of “+kR+kR half the time, −R-R half the time, mean zero” on each ambiguous bar. If the engine resolves all of those ambiguous bars as wins, it books “+kR+kR every time, when truth is +kR+kR half the time and −R-R half the time”, and the expected error per ambiguous bar is:

E[error]=12(+kR−(+kR))+12(+kR−(−R))=12(k+1)R.\mathbb{E}[\text{error}] = \tfrac{1}{2}\bigl(+kR - (+kR)\bigr) + \tfrac{1}{2}\bigl(+kR - (-R)\bigr) = \tfrac{1}{2}(k+1)R.

That is strictly one-signed (positive) and scales with the strategy’s reward-to-risk ratio. It does not cancel across bars because every draw is biased in the same direction, so running more bars tightens the estimate around a positive number. Worse, the cleaner the strategy looks, the more acute the problem: a tight stop and a tight target relative to typical bar range increase the fraction of bars that are ambiguous, and therefore the fraction of trades that are subject to the bias. Scalping systems on hourly bars and mean-reversion systems on daily bars are the worst offenders, because the daily range routinely engulfs both bracket levels.

The second reason is asymmetric, discontinuous payoffs. Even if the engine’s path guess were genuinely unbiased (a fair coin per ambiguous bar), the payoffs themselves are not symmetric around the entry. A bracket trade pays +kR+kR on a target hit and −R-R on a stop hit, where kk is generally not 1 and the distribution of which level is closer to entry is itself skewed by how the strategy was designed. Strategies are almost never built with target and stop equidistant from entry in tick terms; they are built around an asymmetric reward-to-risk ratio that the trader believes carries positive expectancy. The engine’s guess interacts with that asymmetry, and the interaction has a non-zero mean unless the path distribution is exactly the inverse of the payoff asymmetry, which would require knowing the true intra-bar process. Even an unbiased coin produces biased profit and loss, because the expectation of a product is not the product of expectations when the terms are correlated with the strategy’s structure.

The third reason is survivorship through the optimisation loop, and it is the one that turns a small per-bar bias into a catastrophic equity-curve illusion. A strategy is backtested across hundreds of parameter combinations, and the best of them is kept. The path-assumption bias is largest for parameter sets with tight stops and tight targets relative to bar range, which are exactly the parameter sets that look most attractive on the inflated metric. The optimiser therefore preferentially selects strategies whose apparent edge is the most contaminated. Beyond being positive on average, the bias is concentrated in the region of parameter space the search is going to pick. This is a close cousin of the Bailey and López de Prado backtest-overfitting argument discussed in Section 5, with a sharper edge, because the search is data-mining a systematically positive artefact as well as noise. Even an honest, non-overfit search procedure will be pulled towards the contaminated region because that region has the highest reported Sharpe ratio by construction.

The symmetry intuition that “the errors should cancel” implicitly assumes the error is additive Gaussian noise on a fixed underlying signal: engine profit and loss equals true profit and loss plus an independent zero-mean disturbance. Under that model the disturbance averages out and its standard error shrinks like 1/N1/\sqrt{N}. The actual error model is multiplicative and conditional: the error is non-zero only on ambiguous bars, the indicator for “bar is ambiguous” is not independent of the strategy’s parameters, the bracketed payoff difference has strictly non-negative mean under any optimistic convention, and the whole expression is then maximised over a parameter grid. None of those three properties is present in the additive-noise mental model that makes “it averages out” feel obvious. Stated formally, the path assumption is a biased estimator of a path-dependent functional, and bias doesn’t vanish with sample size. The variance shrinks as the sample grows while the bias stays put, so averaging over more days hands you a very precise estimate of the wrong number, and a long backtest of a path-sensitive strategy on OHLC data converges, with high confidence, to the wrong answer.

The ES measurement adds two things to this argument, and the first is that the order of the extremes is the easy part. At the exact high and low, 99.3% of days can be represented as two clean swings, each extreme touched once in some order, but that says nothing about stop and target levels inside the range, which is where most of them sit. A clean O→L→H→CO \to L \to H \to C path crosses any interior level at most twice. On a noise-filtered count that ignores one-tick jitter, price crossed the midpoint of the range a median of three times a day, and only 44% of days crossed it twice or fewer. For two levels inside the range, the order in which they were hit has little to do with the order of the extremes.

The second is that the bar model carries three further biases, and all of them favour the backtest. On choppy days, which are the days the path heuristic gets wrong, price sweeps through both the stop and the target, and an engine that resolves the bar to the target books a win that never happened. An engine that treats every price in the range as traded fills every resting limit inside it, at its exact price, and that assumption can only add favourable fills and remove slippage. And an engine that fills every stop exactly at its trigger has no concept of gapping through a level, so it can only understate losses. None of the three can cost the backtest money, so they add to the conditional-sampling bias instead of offsetting it.

4.2.4 What it looks like in equity

A strategy that is genuinely break-even after costs can show a smooth, monotonic equity curve in a naive event-driven backtest with intra-bar exits enabled. Sharpe ratios in the 2 to 4 range on daily bars for a mean-reversion system with tight stops are almost always this artefact. When the same logic is re-run against tick data, or against minute data honestly resampled, the curve typically collapses to a random walk or worse. For an engine that resolves ambiguous bars to the target, honest resolution redistributes those bars roughly 50/50, at least on the days when the open sat mid-range and for stop and target levels inside the range, and the cost structure (commissions, the real fill price on stops) accounts for the rest. An engine using convention 2 gets the order of the extremes right 81% of the time on ES, so honest resolution would flip far fewer than half its bars; its losses come from the dead-centre days, from levels inside the range, from limit fills that never happened, and from stops that gapped. Either way, the backtest produces an equity curve that is smoother, a Sharpe ratio that is higher, and a worst drawdown that is shallower than anything the live account will print. The diagnostic in Section 4.5, which compares a daily-bar backtest of a strategy to the same strategy run with orders evaluated against the underlying minute data, is the direct empirical manifestation of this bias.

4.2.5 Honest mitigations

The trader who acknowledges the ambiguity has several options, ordered roughly from cheapest to most rigorous:

  • Pessimistic resolution. When a bar contains both bracket levels, always assume the stop was hit first. This is the “stop-first” mode described above. It produces a lower bound on strategy profit and loss and is the only convention that does not lie to the researcher. Where the engine also offers a “neither” mode that declines to resolve the ambiguity at all, that is more conservative still: it produces no exit from the ambiguous bar and defers resolution to a subsequent bar or exit rule, at the cost of holding the position through an interval the strategy may have intended to close.
  • Sub-bar data. Drop to a granularity at which the ambiguity is rare. If the target and the stop are 50 basis points apart, the backtest needs bars whose typical range is much smaller than 50 basis points, not larger. For ordering the day’s high and low, one-second paths are enough: across 4,986 ES days the two extremes sat a median of about 12 hours apart, and never closer than about 22 seconds, so a one-second grid can’t reorder them. Finer data can’t rescue fill realism, though, and one-second data understates that problem. 71% of one-second ES samples simply repeat the previous price (about 591 million raw points against about 171 million distinct observations), so the real tape moves in bursts and jumps that a once-a-second grid smooths over.
  • Tick or quote replay on ambiguous bars. A hybrid approach that keeps the bulk of the backtest cheap by running at bar resolution, while resolving the ambiguous bars honestly against the recorded intra-bar path.
  • Explicit bracket-order semantics. Model the bracket as a single atomic construct rather than as two independent orders that the engine arbitrates between, and acknowledge that on the entry bar itself most retail engines cannot honour an intra-bar exit at all (the Backtrader IBOG limitation discussed in Section 7).
  • A matching engine for size and turnover. Where position size, turnover, or tight brackets make queue position and partial fills matter, run the actual path, tick or sub-second, through a real matching engine that models queues, slippage, and gaps, which no bar convention can stand in for.
  • Report the spread. Run the backtest twice, once with the optimistic convention and once with the pessimistic one. If the two equity curves diverge meaningfully, the strategy’s edge is inside the simulator’s measurement error, and no edge has actually been demonstrated. Whichever convention you use, measure the direction of its errors as well as their rate.

The deeper point is that the problem lies in the data and would survive a switch to any backtesting engine, because it is an information-theoretic limit: OHLC is a lossy compression of the price process, and any strategy whose payoff is sensitive to intra-bar ordering is computing a function the input data cannot support. The engine is forced to fabricate the missing information, and the fabrication is not neutral. For the trader constrained to coarse bar data, the operational conclusion is simple: either move to intra-bar order evaluation along the lines discussed in Section 4.5, or design strategies whose order logic does not generate multiple price-contingent orders that could both trigger within a single bar.

4.3 Settlement Price versus Last Trade

In futures markets, a further subtlety arises from the distinction between the settlement price and the last traded price. The daily settlement price is determined by the exchange using a methodology that may incorporate trades, bids, offers, and spread relationships during a defined settlement window. It can differ from the last trade of the day, and it comes from a tiered procedure with staff discretion at the bottom. For the E-mini S&P 500, CME’s procedure as filed with the CFTC in January 2018 settled the contract on the volume-weighted average price of trades between 3:14:30pm and 3:15:00pm CT; where that couldn’t be calculated, on the midpoint of the bid and offer; and where there was no two-sided market, on a carry calculation from the cash index. CME staff can set a different settlement price when the calculations can’t be made or trading is anomalous.6 CME’s Special Executive Report SER-8591 of 22 September 2020 then moved the ES daily settlement window from 3:14:30pm to 3:15:00pm CT to 2:59:30pm to 3:00:00pm CT, to line it up with the cash equity close.7 An ES “close” from 2019 and one from 2021 are therefore struck 15 minutes apart, and since the Globex day runs on to 4:00pm CT, today’s settlement comes an hour before the end of the session.

Other products have their own windows, set by exchange rule:8

ProductSession close (CT)Settlement window (CT)
Live cattle, feeder cattle, lean hogs1:05pm12:59:30pm to 1:00pm
CBOT corn, soybeans, wheat1:20pm1:14pm to 1:15pm
E-mini S&P 5004:00pm2:59:30pm to 3:00pm (3:14:30pm to 3:15pm until September 2020)

CME’s SER-7395R moved the grain close from 1:15pm to 1:20pm CT on 6 July 2015 and left the settlement window where it was.8

In illiquid contracts or far-dated maturities, the settlement price may differ significantly from any price at which a trade actually occurred. A backtest that treats the settlement price as an achievable execution level is implicitly assuming liquidity that may not have existed. Vendors also differ on whether the “close” field of a daily bar holds the settlement or the last print, and the difference is largest on thin contract months, where the two diverge most. Databento, for example, supplies official settlement prices and open interest in its statistics schema, separately from its OHLCV bars.9 Your broker marks your account at settlement, so a backtest that takes its close from the last bar of the session will disagree with your statements.

This distinction is particularly important for calendar spread strategies and relative-value approaches, where the settlement prices of individual legs are used to calculate spread values. Because settlement prices are determined by a formulaic process, the implied spread may never have been directly tradable at the reported level.

Equity markets have an analogous problem with the close: the official closing price of a US stock comes from its primary listing exchange’s 4:00pm closing auction, but the “close” in a daily bar may be the last print across all venues unless the vendor has gone out of its way to reconcile the two. Trades outside regular hours carry the Form T sale condition, so they can’t set the official close, high, or low, although they do count towards consolidated volume.10 The closing auction is a discrete price-setting mechanism whose fills behave differently from those in continuous trading. Closing auctions concentrate a large share of the day’s volume into a narrow window, and participation requires submitting orders that compete for priority in the auction’s matching algorithm. A backtest that assumes the strategy can execute at the official closing price is implicitly assuming the strategy has priority in an auction that may be dominated by index funds, ETF creation/redemption flows, and institutional rebalancing activity. For strategies that generate signals from the daily close and assume execution at or near that price, the gap between the auction print and the price achievable by a retail participant submitting a market order in the final minutes of continuous trading can be material, particularly on days with large index reconstitution or options expiry flows. This is one of the most common institutional-versus-retail backtest discrepancies, and it is almost never modelled in retail backtesting engines.

Listed options add another layer: OCC marks closing and settlement prices for equity options from the 4:00pm national best bid and offer, and decides whether an option is in or out of the money from the underlying’s 4:00pm close. Since August 2026, expiring single-stock options on Cboe’s eligible list keep trading until 4:15pm in the Curb session, after the prices that govern their exercise have been fixed. Cboe also publishes smoothed NBBO files, built from 4:00pm and 4:15pm snapshots, for the equity options it trades after 4:00pm, which gives a third price that is neither the tape nor the OCC mark.11

4.4 Volatility and Risk Estimation

Position sizing in many systematic strategies is based on volatility estimates, commonly derived from daily close-to-close returns. But close-to-close volatility understates true intraday risk exposure. A daily bar that is up 2% can be a quiet grind or a halt followed by a spike. A market that opens sharply against a position, trades at extreme levels during the session, and then recovers to close near the prior day’s level will appear benign in a close-to-close volatility calculation. The position holder, however, experienced a deep mark-to-market drawdown and, if leveraged, may have faced margin calls that forced liquidation at the worst possible time. Strategies sized on close-to-close volatility will systematically underestimate risk and overstate risk-adjusted returns.

Parkinson (1980) and Garman and Klass (1980) proposed range-based volatility estimators that incorporate the high and low of each bar, offering a more accurate picture of true volatility. However, these estimators are rarely used in standard backtesting practice, and even they cannot capture the gap risk between sessions or the path-dependent risk experienced during the session. For strategies with leverage or nonlinear payoff profiles, the underestimation of intraday volatility can lead to dangerously oversized positions.

Range estimators and the average true range also inherit whatever the bar definition puts into each bar. CME’s cryptocurrency futures have traded through the weekend since 29 May 2026, and trading from Friday evening to Sunday evening carries Monday’s trade date, so a Monday daily bar on those contracts holds about 70 hours of range and volume, against about 24 for Tuesday’s.2 Any range estimator or volume average computed on them now carries a day-of-week artefact that the exchange put there. The opposite happened before 1952, when the NYSE also held short Saturday sessions. In the daily market returns of Ken French’s data library, built from CRSP, Saturday moves were about two-thirds the size of weekday moves, so an average true range that mixes the two is pulled down.12 The level moves too: in the same data, the annualised volatility of the CRSP value-weighted market ranged from 9.8% in the 1960s to 30.2% in the 1930s, so a volatility estimate calibrated in one decade describes a different market in another.

The problem extends beyond position sizing to the way that strategy performance is reported and evaluated. The vast majority of backtested performance metrics, including drawdown statistics and risk-adjusted return ratios, are computed on a close-to-close or monthly-close basis. These figures describe the strategy’s behaviour as observed through the narrow lens of periodic snapshots. But the trader’s lived experience is a continuous exposure to intraday price movement, not a series of snapshots. A strategy that reports a maximum drawdown of 15% on a close-to-close basis may have experienced intraday mark-to-market drawdowns of 25% or more, drawdowns that triggered real margin calls, real psychological distress, real risk of forced liquidation, and potentially real capitulation, none of which appear in the published performance summary. The intraday volatility at the smallest observable resolution is the actual experience of the position holder, and any performance reporting that smooths over this reality by measuring only at periodic intervals is presenting an incomplete and systematically flattering picture of the strategy’s risk profile. The damage is greatest where these numbers set the size of the position. A systematically optimistic Sharpe ratio flatters the curve and also justifies over-sizing, and over-sizing on a fantasy drawdown is how desks blow up.

4.5 The Rationalisation of Coarse Data

The technical problems described above (concealed stop triggers, OHLC sequence ambiguity, settlement price artefacts, and understated volatility) grow more severe as bar size increases, and are at their worst with end-of-day data. Yet many retail systematic traders continue to develop and evaluate strategies using exclusively daily bars, and most of that persistence is motivated reasoning. The trader who lacks access to intraday data, or who does not wish to pay for it, or who lacks the storage and computational resources to process it, faces a choice: acknowledge a material limitation in their research infrastructure, or construct a narrative in which the limitation doesn’t matter, and most choose the latter.

The narrative takes a characteristic form, in which the trader argues that their strategy operates on a sufficiently long timeframe (weekly signals, monthly rebalancing) that intraday price movements are irrelevant noise. Decisions are made at the daily close; orders are placed at or near the next open; the intraday path between one close and the next is, on this account, immaterial. The argument sounds reasonable, and it is usually delivered with considerable confidence, sometimes with a note of indignation at the suggestion that more granular data might be necessary. It often comes with an appeal to the professionals: funds make money on daily data, so daily data must be enough. Some funds do trade the close on purpose and size for auction liquidity, while still refusing to trust an inferred path for anything that can stop out inside the session.

The argument is almost never tested empirically by those who make it. The trader who asserts that daily data is sufficient for their medium-term strategy has, in most cases, never run that same strategy on minute-level data to verify the claim.

This is the critical omission, because the claim can be tested, and on ES it has been. On one-second ES data covering 4,986 trading days from June 2010 to June 2026 (Databento), I scored the standard daily-bar path heuristic against the recorded path. It got the order of the day’s high and low right on 81% of days, and its errors were one-sided: they fell on the choppy days where a bracket is a race, and together with the bar model’s assumptions about fills and gaps, they all favoured the backtest. The defence that the differences cancel doesn’t survive that measurement. It is one instrument, but the fill and gap assumptions can only help a backtest on any instrument, because of the way they are built. The defence persists partly for social reasons: among the users of at least one daily-bar product it is treated as settled science, in a forum open only to customers, so a prospective user can’t read the arguments before buying and nobody outside can challenge them afterwards.

When someone does run the comparison, the two versions often look like different strategies. The equity curves diverge, sometimes dramatically, because the guesswork required to interpolate prices within daily bars compounds across thousands of simulated trades over a multi-year backtest. Every time the backtesting engine must resolve an ambiguous fill (did the stop or the target get hit first? was the limit order reached before or after the reversal?), it is making an assumption that may or may not correspond to what actually happened. With intraday data, many of these assumptions become unnecessary: the price path is observed rather than inferred, and fills can be evaluated against actual traded prices at actual times. The accumulated difference can change the equity curve beyond recognition, turning apparent winners into losers, and causing trades that would have been taken to be missed, transforming smooth upward trajectories into sequences interrupted by drawdowns that the daily-bar version never revealed.

A concrete diagnostic is available to any trader with access to both daily and minute-level data: take any strategy that uses stop-loss or profit-target orders, run it once with signals generated from daily bars and orders evaluated against daily OHLC using the platform’s default bar-resolution convention, then run the identical strategy with signals still generated from daily bars but orders evaluated against the underlying minute-level data within each bar. Compare the trade-by-trade outcomes. The distribution of mismatches (trades classified as winners in the daily-bar version that are losers in the minute-resolution version, and vice versa) and the net direction of the aggregate performance difference provide a direct, reproducible measure of the bias introduced by coarse-bar order evaluation. In practice, this comparison almost invariably reveals a systematic optimistic bias in the daily-bar version, consistent with the stop-concealment mechanism described above.13 Any trader who has not performed this comparison on their own strategies is operating on an untested assumption about the fidelity of their simulation.

The technology to eliminate this problem already exists and is simple in design. A properly architected backtesting engine stores (at least) minute-level data as its foundational layer and aggregates upward to whatever bar interval the strategy requests. When the trader specifies daily bars, the engine builds each daily bar from the underlying minute records, presents the aggregated bar to the strategy logic for signal generation, and then evaluates all resulting orders against the original minute-level data within that bar. The trader writes and thinks in terms of daily bars (daily closes, daily ranges, and daily indicators), but the execution simulation operates at minute resolution behind the scenes, without any additional effort from the user. This architecture means that even a strategy designed around weekly signals and monthly rebalancing benefits from intra-bar order resolution: stops are evaluated against the actual intraday path, limit orders are filled at the price and time they would have been reached in the real market, and the OHLC sequence ambiguity described earlier is resolved by observation rather than convention. The computational overhead of this approach is modest for the typical retail use case: a decade of one-minute bars for a single liquid futures contract occupies a few hundred megabytes, and even a diversified portfolio of 20 to 30 instruments remains well within consumer-grade storage and processing capacity.14 (Tick-level or Level 2 depth-of-book data, and large multi-asset universes, can become operationally heavier, but these are not required for the order-evaluation improvements described here.) The gain in accuracy is large, and the technical constraints are minor, so the resistance many traders still put up comes from motivated reasoning.

Building daily bars from minute data needs explicit rules of its own. The engine has to know which session a daily bar covers and which trade date each minute belongs to, because an overnight futures session crosses midnight, and grouping by calendar date gives different bars from grouping by exchange trade date. Databento’s own daily OHLCV bars, for example, are cut on UTC dates,15 and vendors differ in whether they report holiday half-sessions separately, fold them into an adjacent trade date, or drop them. Minute data can also be defective in ways that pass every routine check. Databento’s issue D-8175, published in August 2026, covered a list of CME days between 2010 and 2015 on which most of a day’s activity had been folded into a single one-minute bar.16 A bar like that is well formed, and it invites the simulation to fill an order at a price the market only reached hours later.

Daily-data advocates ask “why would I need anything more granular?”, which puts the burden of proof on the wrong side; if more granular data is available, the question to answer is why you would not use it. The downside cost of using minute-level data (somewhat larger storage requirements and modestly longer processing times) is trivial relative to the capital at risk. The downside cost of not using it (a backtest whose results may diverge badly from achievable live performance) is potentially catastrophic. In an era when minute-bar data for most liquid futures and equities is readily available at modest cost (though the history is shorter than it looks: Databento’s CME data, for example, begins in mid-2010),17 and when even consumer-grade hardware can store and process decades of minute-level history without difficulty, the case for relying exclusively on daily data is far weaker than most traders assume. Many sound approaches to systematic trading can be designed around the constraints of daily data, provided the researcher understands what those constraints are and designs their strategy accordingly. But the trader who uses daily data without acknowledging its limitations, who does not verify their results against more granular data when it is available, and who rationalises the omission as a principled choice rather than a convenience, is accepting an unnecessary and unquantified source of error.


  1. CME Group, Holiday and Trading Hours, as at September 2026. CME Group, The Origins of the E-mini S&P 500: nearly 24-hour trading from Sunday 6:00pm to Friday 5:00pm ET with a 60-minute daily halt. ↩︎ ↩︎

  2. CME Group press releases of 19 February 2026 (announcement) and 1 June 2026 (launch). CME’s 24/7 trading page gives the maintenance windows (Monday to Friday 4:00pm to 4:02pm CT, and Saturday 2:00am to 4:00am CT) and the rule that trades from Friday evening through Sunday evening carry the next business day’s trade date, with clearing, settlement and regulatory reporting on that day. ↩︎ ↩︎

  3. CME Group press release, CME Group Announces Reduced Electronic Trading Hours for CME Livestock Products, 3 October 2014; CME Globex Notices of 6 and 13 October 2014, Reduction of CME Globex Trading Hours for CME Livestock Contracts, which tabulate the current and new Globex schedules (before 27 October 2014: Monday 9:05am open, a 4:00–5:00pm halt Monday to Thursday, Friday 1:55pm close); CME Group press release, CME Group Announces Measures to Further Enhance Livestock Markets, 10 February 2016, certified with the CFTC on 25 February 2016 as CME Submission No. 16-064. The hours per week are computed from those schedules. ↩︎

  4. Nasdaq Equity Trader Alert 2026-46, 17 August 2026, and the Nasdaq Global Trading Hours FAQ. The NYSE Extended-Hours Trading FAQ, version 4.0, August 2026, covers Arca’s plans, leaving other NYSE Group equity exchanges’ schedules unchanged. The FAQs retain applicable approval and infrastructure conditions. ↩︎

  5. ICE Futures U.S. exchange notices on temporary opening-time changes during the US/UK daylight-saving mismatch: 4 October 2010 (for trade dates 1–5 November 2010), and the equivalent notices for 31 October to 4 November 2022 and 27 to 31 October 2025. The 2025 notice also moved the Coffee “C” and Cocoa settlement windows for the week. ↩︎

  6. CME Group, CME S&P & E-Mini S&P 500 Futures Daily Settlement Procedure, CFTC rule filing of 26 January 2018, Exhibits A to C. Exhibit A gives the ES three-tier procedure over 15:14:30 to 15:15:00 CT; Exhibit C lists the equity index products that already settled over 14:59:30 to 15:00:00 CT. Both carry the note that CME staff may determine an alternative settlement price where the calculations cannot be made or activity is anomalous. ↩︎

  7. CME Group, Special Executive Report SER-8591, Amendments to the Daily Settlement Procedure Documents, 22 September 2020, moving the daily settlement window for the E-mini S&P 500 and related equity index futures from 15:14:30–15:15:00 CT to 14:59:30–15:00:00 CT to synchronise with the cash equity close. The current procedure is on the CME Client Systems Wiki. ↩︎

  8. Livestock: CME Group Client Systems Wiki, daily settlement procedures for LE, GF, HE and PRK (VWAP over 12:59:30–13:00:00 CT), read against the 13:05 CT close set in February 2016. Grains: CME SER-7395R, effective 6 July 2015, moved the day-session close for non-expiring grain and oilseed futures from 13:15 to 13:20 CT with settlement unchanged at 13:14–13:15 CT. Equity index: CME SER-8591 (22 September 2020) moved the daily settlement window to 14:59:30–15:00:00 CT. ↩︎ ↩︎

  9. Databento, Retrieving open interest and settlement prices. ↩︎

  10. CTA Extended Trading Hours FAQ, version 1.1, 6 July 2026, Q11 and Q12. The Form T (‘T’ sale condition) treatment described there is a continuation of current practice, not a December change. ↩︎

  11. Cboe, Equity Options Extended Trading Hours FAQ: Regular Trading Hours vs. Global/Curb Trading Hours: Q1 (session table), Q3 (eligibility list), Q5 (expiring option close times; OCC marks from the 4:00pm NBBO and in/out-of-the-money determination from the 4:00pm underlying close), and Q6 (smoothed NBBO snapshot files). The single-stock Curb session launched on 17 August 2026, per Cboe notice 61230. ↩︎

  12. Kenneth R. French Data Library, daily market returns built from the 202608 CRSP database, 1 July 1926 to 31 August 2026, whose last Saturday is 24 May 1952. The market is CRSP’s value-weighted index, which until July 1962 covers only the NYSE. Volatility is annualised with each period’s actual number of sessions a year. ↩︎

  13. In one test across a diversified futures portfolio, the daily-bar version showed a Sharpe ratio roughly 40% higher than the minute-resolution version of the identical strategy. The trade count was the same; only the fill prices and stop triggers differed. ↩︎

  14. Having said the overhead is modest, it is not so modest that TradeStation can deal with it. Turning on look-inside-bar-backtesting with 1-minute granularity quickly renders TradeStation inoperable. ↩︎

  15. Databento: Aggregate bars (OHLCV), on UTC daily-bar boundaries. ↩︎

  16. Databento issue tracker: CME Globex MDP2 data has incomplete bars for many days, posted by Databento staff on 10 August 2026. Its status was “Fix in progress” on 14 September 2026 and “Closed” on 26 September 2026, the date of its last update. The issue lists 25 affected dates between 15 July 2010 and 18 November 2015, 19 of them on the 15th of a month, and gives the internal reference D-8175. ↩︎

  17. Databento’s GLBX.MDP3 history begins in mid-2010, per its dataset documentation. ↩︎