Every inverse fair value gap in seven futures markets, 2019 to mid-2026 — 4,732,295 of them — against a fake zone matched to each one and run through the same code. Built on 2019–2024, then checked once on 2025–2026, kept sealed until the end.
A fair value gap is three candles where the first candle’s high sits below the third’s low, or the mirror of that — a stretch of price the market skipped through (tested separately here). It becomes an inverse fair value gap once a candle closes through it the other way; a wick poking through does not count. The claim is that the gap’s job flips: what was support becomes resistance.
| IFVGs found · one-minute to daily charts | In sample · 2019–24 | Out of sample · 2025–26 | Total |
|---|---|---|---|
| Loose — every gap | 3,728,876 | 1,003,419 | 4,732,295 |
| Strict — furthest gap of a stack | 2,568,527 | 675,221 | 3,243,748 |
Loose counts every gap on its own. Strict is the stacked rule: when gaps run one after another in the same direction with no pullback, only a close through the furthest counts. Markets: NQ, ES, YM, GC, SI, CL and RTY; one event per candle per direction, everything measured on one-minute bars.
The fake zone. For every real gap we built a zone on a different day at the same time of day — same width, same distance from price, same market and chart, edges on real tradable prices. Then we looked for a candle closing through it, using the same code that finds the real ones.
The bar. Every test was written down before the data was touched. To count, a gap had to beat the fake zone by 2 percentage points (52% against 50% is 2 points) in sample and out of sample, against the zone both on and off real tradable prices. That is 17,383 tests in sample and 14,999 out of sample. One disclosure: the 2025–2026 data had already been opened by our fair value gap study, but inverse gaps had never been measured on it.
A bug that finds nothing looks exactly like a pattern that predicts nothing, so the measuring equipment was checked before any answer was trusted. 29 checks on the code, 0 failures: nothing is counted before its gap is complete; every event really does close beyond the far edge; the count matches a second, independently written version; events do not change when we delete the candles that came after them; and every fake zone sits on real tradable prices.
The stacked rule needed rewriting. We found this before running any data: the version in our own pattern library could erase a close-through when a later gap in the same direction joined the stack. In other words, whether a candle counted depended on candles that came after it — something no trader could know at the time. The study used a rewrite that only ever looks backwards. On real data the two disagree on 0.06% of candles, and every result is the same to within 0.02 points.
Three problems with the comparison, all flattering the gap, found and removed. Fake zones for stacked gaps were first built from the final shape of the stack, which used information from after the event. The first replay of those zones still followed the real price path instead of its own. And in the sweep model, the “nearest opposing liquidity” target used overnight highs and lows before they had finished forming, which invented a +0.30R result. Each fix made the test harder for the gap to pass, never easier.
The shuffled-price world. We shuffled each day’s one-minute price moves into a random order — so there is no real buying and selling left in them, only the same raw ingredients — and found every gap and zone again. Anything that still shows up there is produced by the test, not by the market. Continuation came back clean: 20 of 20 comparisons showed nothing. The retest measured on candle closes did not: with nothing real going on, stacked gaps still “held” 2–3 points more than their fake zones, and every gap held 2–6 points more than a zone whose edges sat between tradable prices. We wrote that amount into the pass rule before any retest result existed, so it would have to be subtracted.
The other comparisons. Besides the fake zone on and off real tradable prices, we also ran a plain broken level — the real high or low of a matched candle with no gap. And every comparison was repeated inside groups of similar candle size, in case real gaps are simply broken by bigger candles than fake zones are.
Two more details. Each fake zone is matched to a day of similar volatility, and sits on the same side of price as the gap it stands in for. And an earlier, smaller look at inverse gaps inside our fair value gap study (126 tests in sample, nothing found) is replaced by this one.
The final audit. Every decision is rebuilt using only the data that existed at that minute, and has to come out identical. The result is at the end of this page.
ATR — how far the market typically moves in one candle on the chart being measured. Using it instead of dollars puts the Nasdaq and gold on the same scale.
A point — one percentage point. If real gaps work 51% of the time and the fake zone 50%, the gap is one point ahead.
R — the amount risked on a trade. “−0.10R per trade” means the average trade lost a tenth of what it risked. A 2R target aims to make twice the risk.
In sample / out of sample — the study was built on 2019–2024. Everything from January 2025 was left sealed until the end, then opened once. A result that only works on the data it was built from is not a result.
No difference / too few to tell — “no difference” means there was enough data to rule out an edge as big as 2 points. “Too few to tell” means there were not enough events to say either way.
Costs — commission plus one tick of slippage on the entry and on every exit. A tick is the smallest step a market’s price moves in.
From the close of the candle that closed through the gap we set a target and a stop the same distance away — one ATR, how far the market normally moves in one candle on that chart. Does price reach the target in the new direction before the stop? Both are checked only from the next minute on; a tie counts as a loss.
| One candle range onward before the same distance back · loose gaps | After a real gap | After a fake zone | Difference · in sample | Difference · out of sample |
|---|---|---|---|---|
| One-minute | 47.3% | 47.1% | +0.1 · no difference | +0.0 · no difference |
| Five-minute | 48.9% | 48.9% | +0.0 · no difference | +0.2 · no difference |
| Fifteen-minute | 49.6% | 49.9% | −0.2 · no difference | +0.0 · no difference |
| One-hour | 50.4% | 50.8% | −0.4 · no difference | −0.5 · too few to tell |
None of the 8 headline comparisons show an edge — the four above, plus the same four under the stacked rule. Every difference in sample is inside ±0.4 points, and there was enough data to have spotted an edge as small as 0.1 to 1.7 points. A measured zero, not a shortage of data.
Stacked (strict) gaps land in the same place. The percentages are from in sample, and on every row the fake zone is within 0.3 points of the gap. A plain broken level — the real high or low of a matched candle with no gap — gives the same numbers again. The one-hour row out of sample covers 4.5 thousand events, which is too few to be sure of.
| Strict · furthest gap of a stack | After a real gap | After a fake zone | Difference · in sample | Difference · out of sample |
|---|---|---|---|---|
| One-minute | 47.3% | within 0.3 pts | +0.2 | +0.1 |
| Five-minute | 49.1% | within 0.3 pts | +0.2 | +0.1 |
| Fifteen-minute | 49.9% | within 0.3 pts | +0.3 | −0.1 |
| One-hour | 50.7% | within 0.3 pts | −0.2 | +1.1 |
The flip itself points the other way on one-minute charts. Take the same moment and trade it both ways. Price reaches the target in the “flipped” direction 47.3% of the time, against 51.6% when you trade it the other way in sample, and 48.4% against 50.6% out of sample. Real gaps, fake zones and plain broken levels all behave the same. Three- and five-minute charts show about 2 points of the same thing in sample, fading out of sample; fifteen-minute and above show nothing. It is a small snap-back after any close-through on the fastest charts.
Gaps get closed through about as often as fake zones do. Out of sample the same rates repeat within 0.5 points.
| Closed through the same day · in sample | Real gap | Fake zone |
|---|---|---|
| One-minute | 92.1% | 91.9% |
| Five-minute | 82.6% | 82.3% |
| Fifteen-minute | 71.4% | 71.0% |
| One-hour | 49.0% | 48.8% |
One small real difference: on one-minute charts, an inverted gap gets closed straight back through on the very next candle a little less often than a fake zone does — 21.0% against 23.7% in sample, 23.7% against 25.8% out of sample. It shrinks to about 1.7 points on five-minute charts and is gone by the one-hour. It never turns into price actually continuing.
Price sits right at the broken edge after a close-through, so more than 99% get retested almost immediately. At that first touch the gap pushes price one candle range away before it goes the same distance through 50.8% of the time on five-minute charts; a fake zone broken the same way, 50.7%. None of the 12 headline retest comparisons show an edge.
Two ways of scoring the first touch of the broken edge. The race: does price move one normal candle range away from the gap before it moves the same distance through it? That is checked tick by tick, and the stop can be hit inside the touch minute. The body-close rule: the gap counts as holding until a candle actually closes beyond its far side, so a wick through it is forgiven; the question is whether price reaches the target first.
| Loose gaps · first touch | Scored by | Real gap | Fake zone | Difference · in sample | Difference · out of sample |
|---|---|---|---|---|---|
| Five-minute | the race | 50.8% | 50.7% | +0.1 · no difference | +0.2 · no difference |
| Five-minute | body-close | 47.2% | 46.6% | +0.6 · no difference | +0.2 · no difference |
| Fifteen-minute | the race | 51.0% | 50.9% | +0.2 · no difference | −0.3 · no difference |
| Fifteen-minute | body-close | 46.2% | 45.9% | +0.3 · no difference | +0.3 · no difference |
| One-hour | the race | 51.1% | 50.4% | +0.7 · no difference | −1.5 · too few to tell |
| One-hour | body-close | 46.3% | 46.3% | +0.0 · no difference | −1.1 · too few to tell |
An inverted gap holds on the retest about as often as a coin lands heads, and no more often than a fake zone broken the same way.
Stacked gaps and the body-close rule. The only tests that met the pass rule as first written were stacked gaps scored by the body-close rule, at +2.0 to +2.7 points. But the same difference shows up in the shuffled-price world, where there is no real buying and selling at all — so it comes from the shape of a stack and the way the rule is scored, not from anything the market did. Subtract what the test produces on shuffled prices, as the rule written in advance required, and those results come to −0.3 to +0.8 points.
| Strict · stacked gaps | Scored by | Real gap / fake zone | Difference · in sample | Difference · out of sample |
|---|---|---|---|---|
| Five-minute | the race | — | +0.2 · no difference | −0.1 |
| Fifteen-minute | the race | — | +0.5 · no difference | +0.3 |
| One-hour | the race | — | +0.5 · no difference | +1.7 |
| Five-minute | body-close | 52.6% / 49.9% | +2.7 | +2.3 |
| Fifteen-minute | body-close | 50.7% / 48.4% | +2.3 | +2.2 |
| One-hour | body-close | 49.3% / 47.3% | +2.0 | +2.3 |
| Shuffled prices · the same stacked body-close tests | ||||
| Five-minute | body-close | no real trading | +2.9 | +3.0 |
| Fifteen-minute | body-close | no real trading | +2.0 | +3.0 |
| One-hour | body-close | no real trading | +1.4 | +1.3 |
Compared with a fake zone whose edges sit between real tradable prices, most body-close results look like a 2–6 point edge. That is exactly the size of the head start such a zone gives itself in the shuffled world, because a price that cannot be traded at is harder to close beyond. That is why the gap also had to beat a zone placed on real tradable prices.
Every filter was written down in advance and tested one at a time — time of day, trend, gap size, the candle that closed through, how quickly it happened, stacking, retest number and age, volatility, news, market, period of years, and the rest — against both fake zones, then again out of sample. The more filters you try, the more flukes you find, so the bar rises with the number tried.
| Filters tested one at a time | Tests | Looked good in sample | Repeated out of sample |
|---|---|---|---|
| Price continuing after the close-through | 684 | 2 | 0 |
| The retest · loose gaps | all of them | 0 | 0 |
| The retest · stacked gaps, body-close rule | 85 | 85 | not counted — they carry the test’s own head start |
No filter survived. The two that looked good were stacked one-hour inversions against the higher-timeframe trend (+5.8 points, then too few events to measure) and the fastest stacked fifteen-minute inversions (+2.3 points, which turned into −2.2).
The full list, each tested on its own, on both the continuation and the retest: time of day (session, hour, and the popular “killzone” windows, both when the gap inverted and when it was retested), with or against the trend on the higher timeframe, sitting inside a bigger unfilled gap, gap size, the size of the candle that closed through, how quickly the inversion came, stacked or single, how many gaps that candle broke, which retest it was and how old, what the previous day did, volatility, news days and the 30 minutes either side of a release, oil inventory days, weekday, day of the month, market, and period of years.
| What looked good in sample | In sample | Out of sample |
|---|---|---|
| Continuation · 684 filter tests · 2 looked good · 0 repeated | ||
| Stacked, one-hour, against the higher-timeframe trend | +5.8 pts · 1,248 events | under 400 events — too few to measure |
| Stacked, fifteen-minute, fastest inversions | +2.3 pts | −2.2 pts |
| Others we named in advance as worth checking | ||
| Stacked, fifteen-minute, New York open | +2.7 pts | +2.6 pts on 1.1 thousand events — too few to tell, and it never beat the second fake zone |
| Four-hour, held for 50 and 100 candles | +2.5 to +3.7 pts | +1.7 to +3.0 pts · too few to tell |
| The retest · loose gaps · nothing passed on either set of data | ||
| Fifteen-minute inversions at 8:00 | +2.0 pts | −4.0 pts — a real difference, the wrong way |
Fourteen retest standouts we named in advance — the 16:00 hour on five-minute charts, 8:00 on fifteen-minute, some thin one-hour hours, candles breaking two or more gaps at once, retests one to four hours old, crude oil, news days — all fell apart out of sample. On stacked gaps scored by the body-close rule, 85 filter tests passed on both sets of data, but each one carries the same 2–3 point head start its parent test has (the biggest of them, stacks of 2 or 3+ gaps, at +8–10 points, is that head start). The shuffled-price world does not produce a figure for each filter separately, so there is no way to subtract it, and they are not counted.
Stacked against loose. On continuation and on the retest race the two are identical, within 0.4 points. The stacked rule changes nothing you could trade.
The close rule. Everything on this page uses the definition above: a candle has to close beyond the far edge. As a check, we also ran the looser version where a wick through the edge counts, and it changed no conclusion.
How the gaps are counted. Letting a gap wait 20 days to be inverted instead of the same day, counting every gap a candle breaks instead of one per candle, and four different rules for overlapping gaps all change nothing in sample. Out of sample the only movement is on one-hour charts when we keep the largest overlapping gap — and there it was the fake zones that got 2 points worse, while the gaps did not move.
Price runs past an obvious high or low, turns back, and within two hours a gap is closed through in that new direction. We traded every combination of entry chart, entry price, stop, target and session — 360 versions, each paying commission plus a tick of slippage on the entry and every exit. Results are in R — the amount risked per trade, so −0.10R is the average trade losing a tenth of its risk.
| 360 versions of the model | In sample · 2019–24 | Out of sample · 2025–26 |
|---|---|---|
| Made money after costs | 0 / 360 | 15 / 360 · what luck produces |
| Versions meeting every rule set in advance | 0 | 0 |
| Target twice the risk, stop beyond the sweep · per trade | −0.04 to −0.32R | −0.01 to −0.21R |
Costs decide it, and the gap adds nothing. Before costs those entries make between −0.03 and +0.08R per trade; costs turn every version in sample negative. A fake zone closed through after the same sweep does as well or better.
The model in full. The level swept has to be finished before it counts — the Asia or London session high or low, the previous day’s, or a one-hour or four-hour swing. Within two hours a gap is closed through in the fade direction on the one-, three- or five-minute chart. Enter at that close, at the broken edge, or at the gap’s midpoint. Stop beyond the swept high or low, or beyond the gap’s far edge. Target the risk once, twice or three times over, or the next obvious high or low on the other side, or hold to the session close. All day, or the New York morning only. Loose and stacked gaps. That is 360 combinations.
| 360 versions · the rest of the rows | In sample · 2019–24 | Out of sample · 2025–26 |
|---|---|---|
| Gap beats the fake zone after the same sweep, before and after costs | 1 / 360 | 9 / 360 |
| Still profitable if you shift the target up or down | 0 | 0 |
| Score of the best version once you penalise trying 360 | 0.0 | — |
| Target twice the risk · stop beyond the swept high or low | ||
| After a real gap · per trade | −0.04 to −0.32R | −0.01 to −0.21R |
| After a real gap · win rate | 33–39% | 33–39% |
| After a fake zone, same sweep · per trade | −0.05 to −0.18R | −0.14 to +0.00R |
Waiting for a break of the last swing high or low after the same sweep, instead of a gap, makes −0.07 to −0.15R on those versions. Taking the gap with no sweep in front of it is worse again, at −0.10 to −0.69R.
What the sweep contributes is direction. Trading back against the sweep beats taking the same entry the other way in 346 of the 360 versions in sample and 327 of 360 out of sample. That belongs to the sweep, not to the gap — and it is still not enough to pay for the trade.
Price continues no more often than after a matched fake zone, the gap holds no better on the retest once you subtract what the test itself produces on shuffled prices, and the sweep model loses after costs in all 360 versions. An inverse fair value gap behaves like any other level price closes through: a close through a gap is a close through a level.
| What we predicted | What happened |
|---|---|
| 1 · Price continues after an inversion about as often as after a fake zone is broken | right — 0 of 8, with enough data on both sets to say so |
| 2 · The retest holds about as often as a broken fake zone | right — 0 of 12, after subtracting what the test produces on shuffled prices |
| 3 · The stacked rule works about as well as taking every gap | right on continuation and on the retest race; the stacked body-close difference is the test’s own head start |
| 4 · Sweep then gap loses after costs, and the gap adds nothing over a fake zone | right — 0 of 360 survive on either set of data |
| 5 · A gap confirms no better than a break of the last swing | right — the swing break makes −0.07 to −0.15R, the gap −0.04 to −0.32R |
| 6 · A close through any level keeps going (the one prediction in the pattern’s favour) | wrong, and backwards — on one-minute charts price snaps back instead (4.4 points in sample, 2.2 out of sample); from fifteen-minute up there is nothing either way |
The same brutal test — matched controls, real costs, one honest out-of-sample shot — run on what we sell: edges that survive it, on your TradingView charts.
View our strategies