Your bot took a bullish fair value gap on BTC/USDT at 03:00 and the gap was mitigated before you finished your coffee. The same rule, the same code, the same timeframe, running on EUR/USD, left a gap sitting untouched through an entire session — then invalidated on a data candle you never saw coming.
Nothing is broken. You are running one entry rule against two markets that manufacture imbalance for different reasons, on different clocks, using a candle boundary that means two different things.
So: do fair value gaps fill the same way in crypto and forex? No. And the useful part of that answer is not a percentage — it is the mechanism. Once you can name why the two markets build and repair imbalance differently, the config decisions stop being coin flips.
One promise up front: this page will not hand you an FVG fill rate. By the end you will understand why any number you have been quoted is unusable on your pair, and exactly what to measure instead.
Key Takeaways
Crypto and forex build imbalance from different raw materials — a single order book being drained (often by liquidations) versus liquidity providers repricing where flow concentrates — so the gaps they leave behave differently.
No fill-rate percentage transfers between setups. A fill rate is the output of seven free choices (gap definition, mitigation rung, timeframe, symbol, feed, sample window, expiry rule); change one and the number moves.
Target consequent encroachment, the 50% midpoint, rather than the far edge — the far edge is the rarest rung of the mitigation ladder.
Count your wait window in bars, not hours, size the minimum gap in ATR, and define "closed through" explicitly on a market that never closes.
Table of Contents (25 min read)Contents
What "Filled" Actually Means — and Why the Two Markets Disagree
The object itself is identical in both markets: three candles, a large middle body, and an untraded pocket between the first candle's extreme and the third candle's extreme. That structure does not care whether it is drawn on BTC/USDT or GBP/JPY.
What is not identical is the word "filled". It hides four progressively stricter events, and traders — and backtest scripts — silently pick different ones.
The mitigation ladder
Touched
Price returns to the near edge. The loosest definition — a single wick counts, and this is the event that happens most often.
CE tagged
Price reaches the 50% midpoint, the consequent encroachment. This is the level most ICT rules actually trade.
Fully rebalanced
Price trades all the way through to the far edge. The strictest reading of filled, and the rarest of the three.
Closed through
Price closes beyond the far edge instead of respecting it. That is not a fill at all — it is an invalidation.
Four different events all get called "the gap filled" — which one your rule means changes everything downstream.
Consequent encroachment — the 50% midpoint of the gap — is the level worth building a rule around, in both markets. It is deep enough that the imbalance has genuinely been priced back into, and shallow enough that you are not waiting for the rarest outcome. Treating the far edge as your target is what makes an FVG rule feel like it "never fills"; you set the bar at the least frequent event on the ladder.
Now the part that actually separates crypto from forex: the candle boundary that defines the pattern is not the same kind of object in the two markets.
In forex, the boundary is real. Trading genuinely stops. Your broker's server time decides where the daily candle breaks, there is a short daily pause, there is a stub Sunday candle, and there is a hole from Friday's close to Sunday's open. That weekend hole is a true price gap — untraded space caused by a closed market — not a three-candle imbalance, and if your EA's detector does not distinguish the two it will happily "find" a gap that is really just the weekend. Broker server times also differ, so the same week can produce a different set of daily candles on two platforms; that is the same clock drift problem that quietly breaks session logic.
In crypto, the boundary is a convention. A spot exchange never closes, so the 00:00 UTC cut on your chart is a drawing decision, not a market event. Shift the cut and the "daily" gaps change. Worse, the tape itself is venue-specific: a marginal three-candle gap that exists on one exchange's book may simply not exist on another's, because the wick that created it was one exchange's liquidation, not a global price.
The practical consequence is uncomfortable but freeing. "Did the gap fill?" is only answerable relative to two choices you make: which rung of the ladder you mean, and which chart drew the gap. Two honest traders can look at the same move and disagree — and both be right.
Why Crypto and Forex Build Imbalances Differently
A gap is a symptom. To predict how it behaves you have to know what produced it, and the production mechanism is genuinely different.
Crypto: an order book gets eaten. A crypto exchange runs a single, visible central limit order book. When a large market order arrives, it consumes resting depth level by level until it is filled — and away from the mid price, that depth thins out fast. Add perpetual futures and you get the amplifier: as price runs, leveraged positions hit liquidation, and liquidations are forced market orders that must fill at any price. That is a feedback loop, and it produces violent, one-sided displacement with almost no resting orders in the middle of it. The imbalance it leaves behind is wide, wick-heavy, and frequently implied rather than clean — the bodies overlap, but the wick midpoints reveal the untraded pocket anyway.
Forex: liquidity providers step back. Spot forex has no central book. The price your platform shows is an aggregate of quotes from liquidity providers, and a "gap" appears when those providers widen or pull their quotes at the same moment and the aggregate jumps. That happens where flow concentrates: session opens, fixings, and scheduled releases. The displacement is more body-driven and typically smaller in percentage terms, because the aggregate is being repriced rather than a single book being drained.
Same three candles on the screen. Completely different cause.
Formation mechanics
What differs
Crypto — one exchange book
Forex — aggregated LP quotes
What creates the displacement
A market order eating visible book depth, often amplified by liquidations
Liquidity providers widening or pulling quotes as flow concentrates
When it tends to happen
Any hour, with a soft cluster around US hours and unscheduled news
Session opens, the London-New York overlap, and scheduled releases
Where the candle boundary comes from
Convention only — the venue's 00:00 UTC cut
A real pause — broker server time, the daily break, the weekend
Can a true price gap occur?
Essentially never on spot; the tape is continuous
Yes — weekend and holiday reopens leave genuine holes
Typical gap character
Wide, wick-heavy, often implied rather than cleanly separated
Narrower, body-driven, closer to the textbook three-candle shape
Does the same gap exist elsewhere?
Venue-dependent — a marginal gap may not print on another exchange
Feed-dependent — brokers aggregate a different LP mix
What usually invalidates it
A funding- or liquidation-driven continuation with no pullback
A scheduled release landing inside your wait window
The two markets do not just fill gaps differently — they build them from different raw materials.
That table is deliberately about formation, not verdicts. The broader structural comparison — 24/7 tape versus session structure, where liquidity actually sits, what a closing candle even means without a close — is the 24/7 playbook framework for running ICT across crypto and forex, and it sits underneath everything on this page. Here we only need the slice of it that explains gap formation.
Do Crypto and Forex Fair Value Gaps Fill at the Same Speed?
Not in wall-clock terms — but wall-clock is the wrong ruler, and that is the insight most comparisons miss.
Crypto gaps get revisited sooner in clock time, and violated more often. Percentage volatility is simply larger, so price traverses its own recent range faster; a gap that is half an ATR tall can be tagged, ignored, and re-tagged inside a few hours. The same energy cuts the other way: a gap sitting in the path of a liquidation-driven trend gets closed straight through rather than respected. Speed is not reliability.
Crypto's lower timeframes are mostly noise. Because liquidity is fragmented across venues, a 1-minute or 5-minute chart on any single exchange prints a steady drizzle of marginal imbalances — most of them one venue's microstructure, not a footprint anyone else can see. Trading them is a machine for generating false signals. Higher timeframes aggregate across enough flow that the imbalance means something. If you only take one calibration change away from this page: raise your crypto timeframe floor.
Forex gap revisits are session-anchored, not clock-anchored. A gap left in the thin Asian hours frequently waits for the London killzone to be tested at all, because that is when the volume arrives to test it. A London-session gap often sees New York. A Friday-afternoon gap does nothing until Sunday's reopen, and the calendar keeps counting while your chart does not. Measured in elapsed hours, forex gaps look sluggish. Measured in active bars, the difference shrinks dramatically — which is why the wait window in your EA has to be counted in bars, not hours.
Identical gap, two tapes: elapsed hours mean something different when the market stops.
In both markets, trend regime beats market choice. A gap left behind by a genuine breakaway move — the start of a real repricing — tends to stay open in crypto and in forex alike, because the market has no intention of returning. A gap left inside a range gets revisited in both. If you bucket your own observations by regime before you bucket them by market, you will find the regime split explains more of the variance than the crypto-versus-forex split does.
One last practical wrinkle: check when your broker's trading week actually opens before you interpret a Sunday gap; the forex market hours tool makes the boundaries concrete, and they are not the same at every broker.
Why the "84 Percent" and "3-6-9" Fill Rules Don't Survive Contact
You have seen the claims. A fixed percentage of fair value gaps fill. Gaps resolve on the 3rd, 6th, or 9th candle. They circulate because they are memorable, and they are memorable because they are specific.
The problem is not only that they are unsourced. It is that a portable fill-rate percentage is a category error. A fill rate is not a property of a market — it is the output of a measurement, and the measurement has at least seven free parameters:
The gap definition. Minimum height? Wicks or bodies? Are implied gaps counted?
The mitigation definition. Which rung of the ladder above — touch, CE, full rebalance?
The timeframe. A 1-minute gap and a daily gap are not the same animal.
The symbol. A major FX pair and a mid-cap altcoin perpetual behave nothing alike.
The venue or broker feed. As established, the gap may not even exist on another chart.
The sample window and regime. A trending quarter and a ranging quarter give different answers.
The expiry rule. Do unfilled gaps ever stop counting, or does the study wait forever?
Change any one of those and the number moves. Change three and it moves a lot. This is why two careful studies can both be honest and still disagree — and why a number lifted from someone else's dataset cannot be transplanted onto your pair, your timeframe, and your detector's definition of a gap.
A precise-looking number with no stated definition behind it is a gauge with no scale printed on the dial.
The "gaps always fill eventually" version is worse, because with no time cap it is not a claim at all. On a long enough chart, price revisits almost everything. A statement that cannot fail cannot guide a stop-loss.
And the candle-count rules — fill by candle 3, 6, or 9 — quietly assume that a candle is a fixed unit of market activity. It is not. A 4-hour crypto candle at 04:00 UTC and a 4-hour crypto candle during the US session contain wildly different amounts of trading. In forex, one of your "candles" may span a weekend. Counting candles is counting the ruler, not the distance.
None of this means gaps are useless. It means the honest framing is the boring one: some fill within minutes, some sit for weeks, and some never fill because the market repriced and is not coming back. An FVG is a zone where a reaction is more likely than at a random price — not a scheduled event. If your EA's risk model assumes the fill is coming, the model is wrong, no matter which market it is running on. Anything that looks like a guaranteed outcome in this space deserves the same suspicion you would give a bot advertised as "risk-free".
Check yourself
Knowledge check
Your 4H bullish FVG on a crypto pair has been open for six days with no touch, while a similar forex gap filled in one session. What does that difference tell you?
Why
Two observations cannot separate a market effect from a regime effect, a timeframe effect, or a gap-size effect. The overdue answer is the gambler's fallacy in trading clothes: an unfilled gap carries no stored obligation to fill. To say anything about your pair you need many gaps, bucketed by regime and size, measured with one fixed definition.
The most common FVG mistake is not a bad entry — it is drawing a conclusion from two charts.
Sample construction is the whole game here. A handful of gaps read off a chart is anecdote; the difference between anecdote and evidence is sample size and a definition you fixed before you started counting.
When a Gap Never Fills: The Inversion
An unfilled gap is not a failed setup. It is a different setup.
When price closes through an imbalance instead of respecting it, the zone flips polarity: an unfilled bullish gap that gets closed beneath becomes overhead resistance, and vice versa. That flipped zone is the inversion fair value gap, and it is often a cleaner short trade than the original long ever was, because the market has just demonstrated which side it rejected. Your EA needs this as an explicit state, not as an error path.
stateDiagram-v2
state "Fresh gap" as Fresh
state "Near edge touched" as Touched
state "CE tagged at the midpoint" as CE
state "Fully rebalanced" as Rebalanced
state "Inverted, polarity flipped" as Inverted
state "Expired and stale" as Expired
[*] --> Fresh : displacement leaves an imbalance
Fresh --> Touched : price returns to the near edge
Fresh --> Expired : max age passes with no touch
Touched --> CE : trades to the 50% midpoint
Touched --> Fresh : rejects from the near edge
Touched --> Inverted : closes beyond the far edge
CE --> Rebalanced : trades on to the far edge
CE --> Inverted : closes beyond the far edge
Rebalanced --> [*] : imbalance consumed
Inverted --> [*] : now trades as the opposite side
Expired --> [*] : stop watching it
The transition most EAs get wrong is the one into Inverted — they code it as a missed trade instead of a new one.
The definition of that "closes through" transition is exactly where the two markets part company again.
In forex, the close is a real event. A daily or weekly close beyond the far edge carries genuine weight, because the market actually stopped and repriced against the zone. The caveats are the ones you already know: the stub Sunday candle can produce a technically valid close on almost no volume, and your broker's day break decides where the daily candle lands.
In crypto, there is no session close to lean on, so "closed through" has to be constructed. Three ingredients work well together: a close on the gap's own timeframe beyond the far edge, a displacement threshold so a single wick-driven candle does not count, and a minimum time spent beyond the zone. Requiring a confirmation candle in the new direction filters most of the fakeouts that a 24/7 tape produces at 04:00 UTC on nobody's volume. If you skip this and just port the forex "daily close" rule to a crypto chart, you are letting an arbitrary UTC boundary make your invalidation decisions.
Tuning an FVG Entry Rule: Crypto EA vs Forex EA
Here is the translation from mechanism to settings. Every item below is one parameter that should genuinely hold a different value per market — and if your Expert Advisor runs one shared config across both, this is your punch list.
Timeframe floor. Crypto: start at H4 and only go lower if your own logs justify it. Forex: M15 to H1 remains tradable, because session structure gives lower-timeframe gaps a reason to exist. Anchoring both to a higher-timeframe bias through multi-timeframe confirmation matters more in crypto, where the local noise floor is higher.
Minimum gap size, expressed in ATR — never in pips or ticks. A 40-point gap on a major pair and a 40-point gap on a crypto perpetual are not comparable, and neither is comparable across volatility regimes on the same symbol. Normalize by ATR on the gap's own timeframe and you get one threshold that travels.
Wait window, counted in bars. Crypto bars never pause, so a 60-bar window on H4 is ten straight days. Forex bars stop at the weekend, so the same 60 bars is longer in calendar terms and skips the weekend hole entirely. Two different constants, one shared unit.
Target the midpoint, not the far edge. This is the single change with the largest effect on your expectancy, because it swaps the rarest rung of the ladder for a much more frequent one — at the cost of a smaller move per trade. Run that trade-off through a reward-to-risk calculator before you commit; a shorter target needs a correspondingly tighter stop or a higher hit rate to stay ahead.
Invalidation, spelled out. A close-through rule plus a maximum age, and an explicit inverted state as shown above. "The gap is still open" should never be a state your EA can sit in forever.
The market-specific filter. Forex gets a trading session filter — trade the hours you tested, and no others. Crypto has no equivalent boundary, so the substitute is a volatility-state filter plus a guard for the genuinely dead hours on your venue. Do not just leave the session filter switched off and call it 24/7 coverage; replace it with something.
Feed hygiene. In crypto the gap must be detected on the same feed you execute against — if your detector reads one venue's candles and your orders land on another's book, you are trading a gap that does not exist where your money is. That is a symbol mapping problem as much as a strategy one, and it is the main thing a purpose-built crypto MT5 connector exists to keep consistent. In forex, the equivalent discipline is testing on the same broker feed you trade.
Entry mechanics and cost. A resting limit at the midpoint fills at your price or not at all; a market order on touch always fills but pays slippage exactly when the move is fast. Inside a gap, price is by definition moving quickly. Place the stop-loss beyond the gap's origin rather than at a fixed distance, and size it in ATR so the same parameter behaves on both markets.
mql5fvg_profile.mqh
// One rule, two calibrations. Numbers here are starting points to argue with,
// not settings to copy: replace them with what your own logs support.
enum MarketProfile { PROFILE_CRYPTO, PROFILE_FOREX };
input MarketProfile InpProfile = PROFILE_CRYPTO;
input int InpATRPeriod = 14;
input bool InpEnterAtCE = true; // limit at the 50% midpoint
input double InpStopBufferATR= 0.20; // stop beyond the gap origin, in ATR
input bool InpExpireOnClose= true; // close past the far edge kills it
ENUM_TIMEFRAMES gapTF;
int maxAgeBars; // BARS, never hours
double minGapATR; // gap height / ATR(gapTF)
bool useSession;
void ApplyProfile()
{
if(InpProfile == PROFILE_CRYPTO)
{
gapTF = PERIOD_H4; // lower TFs are mostly venue noise
minGapATR = 0.45; // demand a bigger gap: more marginal ones print
maxAgeBars = 90; // bars never pause, so this is ~15 straight days
useSession = false; // no session boundary; use a volatility filter
}
else
{
gapTF = PERIOD_M15; // session structure gives low TFs meaning
minGapATR = 0.30;
maxAgeBars = 40; // the weekend freezes the count, so keep it tight
useSession = true; // trade only the hours you actually tested
}
}
The rule is identical in both branches. Only the calibration moves — and every moved value traces back to a structural difference, not a preference.
Everything above is a hypothesis until your own data supports it, and every parameter you tune is also a chance to fit noise. Read the risk warning before you put a gap-fill rule in front of live capital on either market.
Measure It on Your Own Pair Before You Trust It
Since no borrowed percentage transfers, build the small one that does. This is a weekend of work, not a research project, and it is the only FVG fill rate that will ever apply to your setup.
Fix your definitions first, in writing. Gap detection rule, minimum size in ATR, which rung counts as a fill, and a hard expiry. Deciding these after you look at the data is how a backtest turns into a story.
Log one row per detected gap, not per trade: timestamp, symbol, timeframe, direction, gap high and low, height in ATR, and then four bar-indexed outcomes — bars to first touch, bars to midpoint tag, bars to full rebalance, bars to close-through. Record bars, not hours, so crypto and forex become comparable at all. Add one regime tag per gap (trending or ranging by whatever definition you already use) and one session tag for forex.
Then read it in buckets, never in aggregate. Split by timeframe, by size band, and by regime before you compare markets. The aggregate number across all buckets is the one that looks like a headline percentage — and it is the one that means the least. Run the same script over a period you did not look at while building the rule; if the buckets move wildly, you have measured overfitting, not behavior.
Then finish outside the historical data. A forward test on a demo account catches what a bar-by-bar replay cannot: the spread widening, the thin book, and the missed limit fill that show up precisely when a fast gap is being filled. That gap between replay and reality is also the honest limit of any strategy tester result you generate here.
Watching a Gap Fill in Real Time
Reading about the midpoint is one thing; watching price actually reach for a level is what makes the mechanism stick. If you want a live tape to practice on rather than a replayed chart, our crypto live signals page shows each buy or sell entry with its entry, stop-loss, and take-profit levels as it prints, free to view — and the forex live signals page does the same on the session-driven side, which is a useful way to feel the difference in pacing between the two markets that this whole page is about.
Be clear about what that is and is not. It is a live feed, not a backtesting tool, and the entries are not labeled as fair-value-gap setups — nothing there tags a gap or draws a midpoint for you. If what you want is a fill-rate figure for a specific pair, you still have to log and measure it yourself exactly as described above; watching a feed is how you build intuition for how levels get approached, not how you build evidence.
The Short Answer, Recapped
No, fair value gaps do not fill alike in crypto and forex — but the difference is not a pair of percentages, and anyone offering you one has skipped the hard part.
Crypto gaps are born from a single order book being drained, often with liquidations doing the draining, on a tape with no real boundary. They are wider, wick-heavier, revisited faster in clock time, blown through more often, and meaningless in bulk on low timeframes. Forex gaps are born from liquidity providers repricing where flow concentrates, on a tape with genuine session and weekend boundaries. They are cleaner, more session-anchored in when they get tested, and they come with one gap type — the weekend hole — that crypto simply cannot produce.
What survives the trip between the two markets is the framework, not the numbers: target the midpoint rather than the far edge, count your wait window in bars rather than hours, size your minimum gap in ATR rather than pips, define "closed through" explicitly on a market that never closes, and treat an unfilled gap as an inversion setup rather than a failure. Calibrate each of those per market, measure your own pair, and the question of whether gaps "fill alike" stops mattering — because you will be trading the measurement instead of the myth.
FAQ
Do fair value gaps always fill?
No, and any rule that assumes they do is unfalsifiable rather than useful. Gaps left behind by a genuine repricing — a breakaway move in either market — can stay open indefinitely, because the market has no reason to return to a price it rejected. The honest framing is that a gap marks a zone where a reaction is more likely than at a random price, which is a very different claim from a scheduled fill.
Are crypto fair value gaps more reliable than forex ones?
Neither market wins outright, and the comparison is usually asking the wrong question. Crypto gaps are revisited sooner in clock time but violated more often, and its lower timeframes generate far more marginal gaps that no other venue would even show. Forex gaps are cleaner and their tests cluster in predictable high-volume windows, but they can sit dormant through an entire quiet session. Regime — trending versus ranging — explains more about whether a given gap gets filled than the choice of market does.
What timeframe should an ICT fair value gap bot use on crypto?
Start at H4 or higher and only move down if your own logged data supports it. Crypto liquidity is fragmented across venues, so a 1-minute or 5-minute chart on any single exchange shows a constant stream of imbalances that reflect that one book's microstructure rather than anything broader. Higher timeframes aggregate enough flow that the imbalance is visible to more participants, which is the whole reason the level would be respected.
Why does the same gap appear on one exchange's chart but not another's?
Because in crypto there is no consolidated tape. Each exchange has its own order book, its own participants, and its own liquidation cascades, so a fast wick on one venue may never happen on another. A marginal three-candle gap created by that wick therefore exists only on the chart that recorded it. This is why your gap detector must read the same feed your orders execute against — otherwise you are trading a level that does not exist where your money is.
Should the wait window before invalidating a gap be the same for crypto and forex?
Not in calendar terms, and that is exactly why you should count bars instead of hours. Crypto bars accumulate continuously, so a fixed bar count is a fixed number of days. Forex bars pause at the weekend and at the daily break, so the same bar count spans more calendar time while representing a similar amount of actual market activity. Counting bars makes the two markets comparable; counting hours makes crypto look impatient and forex look lazy.
What is consequent encroachment, and why target it instead of the full gap?
Consequent encroachment is the 50% midpoint of the gap — the level that splits the untraded pocket in half. It earns its place as the working target because it sits in the middle of the mitigation ladder: far enough in that the imbalance is genuinely being priced back into, but reached far more often than the far edge. Targeting the far edge means waiting for the least frequent outcome, which is the main reason an otherwise sound FVG rule can feel like it never triggers.
Sources & Further Reading
Want to go deeper? These independent, authoritative sources shaped this guide — each one is worth reading in full:
The Crypto Desk is the SignalBots editorial team behind our digital-asset coverage. We research and write the guides and explainers on spot and perpetuals, exchange mechanics, funding rates and the 24/7 structure that sets crypto apart from every other market.
Discussions 0
Leave a comment