The lie hidden inside daily bars
OHLC is a story your backtest tells itself
The convenient lie
Almost every backtesting engine has to guess the answer to a vitally important question: within this bar, in what order did price visit the high and the low? While many traders don’t even think about this and just leave their backtesting engine to guess, others believe that they have given this due consideration and have concluded that there is no problem with this approach. But are they right?
A daily bar gives you four numbers (open, high, low, close) and nothing about the journey between them. Yet the order of that journey is often the whole game. If you were long with a stop below and a target above, and both sat inside the day’s range, then “low first” and “high first” are the gap between a losing trade and a winning one. Four numbers can’t tell you which happened.
So the industry reached for a heuristic. It’s old, it’s everywhere, and it sounds reasonable:
- If the open is in the bottom half of the range (
O < (H+L)/2), assume the path was O → L → H → C (OLHC, the low made first). - If the open is in the top half, assume O → H → L → C (OHLC, the high made first).
The intuition: open near the low, and the market probably dipped to the low early before rallying; open near the high, and it probably spiked to the high first. It’s a guess about the tick path built from the one clue a daily bar leaves behind: where the open sits.
Reasonable is cheap. What matters is whether the guess is true, and which way it lies when it’s wrong. Let’s find out.
The data: five thousand days, second by second
We took a continuous ES (E-mini S&P 500) futures series and, for every trading day, recorded the actual intraday price path, sampled once a second across the full ~23-hour CME session. We kept the whole path, every step of it: the ordered list of prices the market traversed from open to close.
- 4,986 trading days, from 2010-06-06 to 2026-06-30 (about 16 years).
- One sample per second over a 23-hour session (82,800 seconds a day).
- Around 591 million raw one-second price points. Without double-counting the moments where one second’s close equals the next second’s open (collapse those consecutive identical values) we’re left with about 171 million distinct observations. So 71% of the one-second samples just repeat the previous price. On this grid the market stands still far more often than it moves, and the real information lives in the roughly 34,000 price changes on an average day.
That last point matters more than it looks, and we’ll come back to it. One caveat up front: sampling once a second is itself a proxy for the true, trade-by-trade tick path. Whether that substitution is safe is something we’ll settle near the end, with an actual measurement.
For each day we did something the heuristic can never do: we read the path and asked what really happened first. Because the path is the ground truth, the high is exactly its maximum, the low exactly its minimum, and “which came first” reduces to which extreme’s first-touch index is smaller. Data quality was pristine: across all 4,986 days the path’s first value equalled the open, its last equalled the close, its max the high and its min the low. Zero exceptions.
Then we let the heuristic guess from the four OHLC numbers alone, with no peeking at the path, and scored it. Every headline figure below was re-derived by a second, adversarial pass that re-parsed 20 random days straight from the raw file. Everything reconciled.
The verdict: better than a coin toss, but worse than it looks
Across the non-trivial days, the heuristic called the order of the high and low correctly 81.0% of the time.
That’s genuinely good. Always guessing the more common “low first” gets you only 52%, so the heuristic adds nearly 29 percentage points of real skill (Cohen’s κ = 0.62; the open’s position scores an area-under-the-curve score of 0.90 as a predictor of which extreme comes first). There’s genuine signal here, and it’s worth pinning down where it comes from.
But the average hides the whole story. All of the skill is conditional on how far the open sits from the middle of the range. Bin the days by the open’s normalised position f = (O−L)/(H−L) and the picture turns stark:
| Where the open sat | P(high was actually first) | Heuristic accuracy |
|---|---|---|
| Bottom decile (open near the low) | 2% | 98% |
| Lower-middle | 26% | 74% |
Dead centre (f ≈ 0.45–0.55) | ~48% | ~53%, a coin flip |
| Upper-middle | 68% | 68% |
| Top decile (open near the high) | 98% | 98% |
When the open is pinned near an extreme, the guess is almost always right. When it sits in the middle, the guess is worthless. What the heuristic is really doing is detecting a trend day wearing a disguise. On a day that trends up, the open ends up near the low, the low genuinely was made early, and the guess nails it. On a choppy, mean-reverting day the open lands mid-range, the order of the extremes is close to random, and so is the guess.
The headline number survives only because days cluster toward the extremes: just 8% land in the coin-flip dead zone. And the midpoint threshold sits almost perfectly (the accuracy-optimal cut is 0.51 against 0.50), so no clever tuning rescues it. It’s a strong classifier of an easy majority and a coin flip on the hard minority.
Three ways the guess goes wrong, and none is symmetric
Getting the order of the two extremes right 81% of the time sounds like most of the battle. It’s barely half of it. The heuristic smuggles in two further assumptions far shakier than the ordering, and a third it can’t even represent.
1. The order is only the order of the extremes
The 81% applies to the day’s high and low. A real trade’s stop and target rarely sit at those extremes. They sit somewhere inside. And inside the bar, the clean two-leg picture falls apart.
At the level of the exact high and low, 99.3% of days really are “two-swing representable”: each extreme touched once, in some order. Now watch what happens at an intermediate level. Using a noise-filtered measure (counting only genuine traversals, with a hysteresis band to ignore one-tick jitter), price crosses the midpoint of the range a median of three times a day, and only 44% of days cross it twice or fewer. A clean O → L → H → C path crosses any interior level at most twice. Real days routinely cross it three, four, five times.
So the tidy story, price gliding smoothly down to the low, up to the high, then home to the close, is not reality. For a stop and a target both living inside the range, price is bouncing back and forth across them, and the order in which they were hit has little to do with the order the extremes were hit. Most traders probably instinctively know this but conveniently ignore it when backtesting their ideas, usually for reasons no more complex than their data provider not letting them.
2. “Assume every tick was hit”
The path model treats the range as fully traversed. If a price sits between the low and the high, the engine assumes the market traded there and your resting order filled, at your exact limit price. The real market never gives that gift.
Even our ground truth is sampled only once a second, and recall that 71% of those samples were repeats. The actual moves happen in bursts, and between them price can jump. Between two one-second snapshots it can leap past a level without trading there in any size you could have hit. The naive engine doesn’t see the jump. It sees a low and a high and assumes a continuous ribbon of tradeable prices connecting them. Every limit entry inside the range comes back filled, at the best possible price, every single time.
3. No concept of gapping through a level
The flip side is the stop, assumed to fill at the stop price. But price gaps: over the weekend, over the 60-minute session break, on a number, on a headline. When it gaps through your stop you fill worse, sometimes far worse. The daily-bar model has no vocabulary for this. It caps your loss at the stop and moves on.
Why the errors don’t cancel: they compound in your favour
Here’s the part that turns an academic curiosity into a career risk. If these errors were symmetric, sometimes helping and sometimes hurting and averaging to zero, then 5,000 days would wash them out and you could trust the bottom line even when a single trade was mis-resolved. The law of large numbers would have your back.
They aren’t symmetric. All three distortions push the same way, toward results better than you’d actually have lived through.
- The ambiguous days are the whipsaw days. The heuristic fails precisely on choppy, mid-open sessions, and those are exactly the sessions where price sweeps through both your stop and your target. When both were hit in reality and your engine resolves to the target, it books a win that never happened. The stop, the bad outcome, is the one that quietly gets dropped.
- “Every tick filled” only ever helps. Assuming a resting limit always fills at its price can only add favourable fills and remove slippage. No version of that error costs you money in the backtest. It’s one-sided optimism.
- Ignoring gap-through only ever helps. Filling every stop exactly at its trigger can only understate losses. Reality fills stops worse; the model never does.
Three biases, all pointing at higher returns and shallower drawdowns. Averaging over more days doesn’t fix a biased estimator. It just hands you a very precise estimate of the wrong number. Then the real killer shows up: selection. You don’t deploy a random strategy, you deploy the one that backtested best. Optimisation hunts the parameter space for the settings these optimistic assumptions flatter most, and gives them back as your “edge.” So the bias survives the averaging, and then gets amplified and dressed up as your most promising system.
The result is a backtest whose equity curve is smoother, whose Sharpe is higher, and whose worst drawdown is shallower than anything the live account ever prints.
So is the heuristic good enough?
For a retail trader: maybe.
Trade a liquid instrument like ES in small size, take a handful of positions a week, work the daily timeframe or higher with a stop and target that rarely sit inside the same bar, and the distortion may stay small next to your edge and your costs. The heuristic is right 81% of the time and wrong mostly on marginal, choppy days where your strategy probably wasn’t going to make clean money anyway. Your fills land near the touch, your size doesn’t move the market, and the daily bar is one of many in a longer trade. Treat the backtest as an optimistic sketch, size conservatively, and you can live with it.
Where it breaks down: tight brackets with stop and target inside single bars, anything intraday, and above all any number you got by optimising on the backtest itself. There, even a retail account stands on the biased side of all three errors at once.
For a professional firm: probably not.
A firm runs high turnover, tight in-bar brackets, and real size, which brings market impact, queue position, and partial fills the “assume the fill” model doesn’t even acknowledge. Worse, a firm sets capital allocation and leverage from these numbers. A systematically optimistic Sharpe doesn’t just flatter a curve. It justifies over-sizing, and over-sizing on a fantasy drawdown is how desks blow up. Firms also run, disproportionately, the fast intraday strategies where the daily bar is the entire trade and the path is the P&L.
For that world, four numbers and a heuristic is simply the wrong tool for the job. The fix is the thing this analysis leaned on as its yardstick: the actual path, tick or sub-second, run through a real matching engine that models queues, slippage and gaps. If you can measure the truth, don’t guess it.
What the data quietly teaches
A few things worth keeping beyond the immediate question.
- The open’s position is a trend-day detector in disguise. The near-perfect monotonic calibration, climbing from 2% to 98% across the deciles, is a real market regularity rather than a curve-fit. On trending days the open really does sit next to the extreme that formed first. The heuristic works to exactly the extent a day is directional, and stops working to exactly the extent it isn’t.
- It’s a lossy compression that fails where it threw away the most. Four numbers a day, and roughly 171 million price observations discarded. The errors concentrate on the choppy days, which are precisely the days whose discarded detail mattered.
- Every layer of aggregation loses information the same way. Ticks to seconds to daily OHLC, each step drops detail, and each step drops it optimistically, hiding the jumps and micro-reversals that would have hurt.
- Range scales confidence. Accuracy climbs from about 72% on narrow-range days to about 84% on wide-range (trend) days, and it holds across all 16 years (76%–86% a year, a standard deviation of roughly two points). A solid effect, and a solidly conditional one.
A note on the proxy: is one second close enough?
One honest limitation runs under everything above. Our “ground truth” is itself a sample. We logged the path once a second, not trade by trade, so strictly we tested the heuristic against a one-second proxy for the true tick path. Good enough? Or could real tick data change the verdict?
For the headline finding, the order in which the high and low were made, one second is plenty, and we can show it rather than claim it. First-touch order is a coarse feature. It can only flip if the true tick high and true tick low happened in the opposite order to the ones we sampled, which needs the two extremes to be almost simultaneous. They essentially never are. Across all 4,986 days the session high and low sit a median of roughly 12 hours of session time apart. The closest they ever come, on the single most compressed day in 16 years, is about 22 seconds. Not one day in the sample has its high and low within 10 seconds of each other. A one-second grid has nothing to alias; you can’t scramble the order of two events that are minutes to hours apart. The 81% would survive a switch to real tick data essentially untouched.
Where would tick data differ? Only in the direction that sharpens the critique. Every secondary finding (that price re-crosses interior levels several times a session, that “every level traded” is a fiction, that gaps punish stops) is understated at one-second resolution, because a one-second grid already smooths over every sub-second jump and micro-oscillation between snapshots. Remember that 71% of our samples didn’t move at all; the real tape is burstier and gappier than a once-a-second window can show. Genuine tick data would surface more crossings, more gaps, more phantom fills. The intermediate-level problem, the “assume the fill” problem and the gap-through problem all get worse when you zoom in.
That’s a comfortable place to be with a proxy. The one place tick data could move the answer, the ordering, holds by construction, and everywhere else the leftover error runs in a single known direction that only tightens the conclusion. Real tick data overturning the finding? Unlikely. Real tick data softening the warning? Essentially nil.
The lesson
It feels reassuring to know that the guess is right 81% of the time. But this accuracy hides the thing that actually bites. When the guess is wrong, which way does it move your results?
An error that’s frequent but symmetric is survivable. An error that’s rare but one-directional is not. The OHLC path heuristic is the second kind. Its mistakes aren’t especially common, they land on the trades where the path matters most, and every one of them, the mis-ordered extreme, the phantom fill, the un-gapped stop, tips your equity curve the same way. Up. More data won’t help, because the bias doesn’t shrink with n. Optimisation won’t help, because it feeds on the bias.
Know what your backtest assumes. Measure the direction of its errors, not just their rate. And when there’s real capital riding on what happened inside the bar, stop guessing the path. The data is out there, you just have to get serious enough to go and get it.
Method note: continuous ES futures, 4,986 daily sessions (2010–2026), one sample per second across the ~23-hour session, standing in for the true tick path. Guesses came from daily OHLC only; ground truth (first-touch order of the session high and low) came from the path. Predictive value via decile calibration and area-under-the-curve; path complexity via hysteresis-filtered level-crossing counts; structural adequacy by counting exact-extreme touch alternations. The proxy was checked directly: the session high and low sit a median of about 12 hours apart and never closer than about 22 seconds, so per-second sampling can’t reorder them. Every headline figure was reproduced independently, including a raw re-parse of 20 random days.