ICT Buy-Side / Sell-Side Liquidity: An Empirical Test

Test period: January 2019 – August 2026 (primary test) · Instruments: EURUSD, GBPUSD, USDJPY, AUDUSD, XAUUSD, BTCUSD (M1, bid) · Published: August 2026

1. Objective

ICT (Inner Circle Trader) methodology holds that buy-side and sell-side liquidity — clusters of stop-loss and breakout orders resting just beyond recent swing highs and lows — draw price toward them, and that price tends to reverse shortly after “raiding” that liquidity. This study tests whether that claim holds up statistically.

1.1 Decomposing the claim

Before testing, we split the concept into three layers:

LayerDescriptionEvidentiary status
① Passive cascadeClustered stop orders mechanically accelerate price once triggered — no intent requiredSupported by market microstructure research (Osler, 2002, 2005; NY Fed staff reports)
② Deliberate triggeringDealer banks use knowledge of client order books to move price intentionallyDocumented in narrow, institutional contexts (e.g., the 2013–15 FX-fixing enforcement actions) — not evidence of a daily, retail-wide phenomenon
③ The ICT narrative“Smart money” deliberately hunts retail stops every day, across every market, on a fixed session scheduleUnsubstantiated; heavily reliant on after-the-fact chart interpretation

This study isolates layer ① — the testable, mechanical claim that structural liquidity levels are more likely to reverse than an arbitrary price point — and builds a fully rule-based test for it.

2. Methodology

2.1 Data

  • Source: Dukascopy (via the dukascopy-node CLI)
  • Timeframe: M1 (1-minute), bid
  • Cleaning: weekend-closure / flat bars (OHLC all equal) removed
  • Range: 2019-01-01 to 2026-08-19 (~7.6 years)

2.2 Stage 1 — Level definition (defined before any sweep, no lookahead)

M1 data is resampled to M15. Every level carries a confirmed_at timestamp — the earliest moment it could actually have been known and traded against.

  • Swing High/Low: 5-bar fractal (higher/lower than the 2 bars on each side)
  • Equal High/Low: two or more swing points within tolerance (3 pips for FX/XAU; 0.05% of price for BTC) inside a 24-hour lookback, clustered together
  • PDH/PDL: previous day’s high/low (from daily bars)

2.3 Stage 2 — Sweep detection and reversal classification

  • Sweep: price wicks beyond the level by at least the defined threshold
  • Reversal: price closes back inside the level within the reversal window (30 minutes)
  • Continuation: price does not close back inside within the window
  • Untested: the level is never reached within 5 trading days
InstrumentSweep threshold
EUR / GBP / AUD1 pip (0.0001)
JPY1 pip (0.01)
XAU$0.10 (fixed) and 20% of 14-period ATR (dynamic) — both tested
BTC$10 (fixed) and 20% of 14-period ATR (dynamic) — both tested

2.4 Stage 3 — Random baseline test (the core test)

Null hypothesis: being a structural level carries no information — a random price point, matched on time and distance from market, reverses just as often.

For every real level, we keep its confirmed_at timestamp (preserving the session and volatility regime) and replace only the price with a randomized value — the same-direction distance-from-market is shuffled across levels, destroying the “this was a real structural extreme” property while preserving everything else. We repeat this 50 times to build a null distribution and compute:

z = (observed reversal rate − mean of null distribution) / (std. dev. of null distribution)

z < 0 means real levels reverse less often than random points (the opposite of the ICT claim); z > 0 would support the claim.

2.5 P&L-based verification

Every Stage 2 “reversal” event is treated as an actual counter-trend trade signal:

  • Entry: close of the bar where the reversal is confirmed (short after an upper sweep, long after a lower sweep)
  • Stop: the worst excursion reached between the sweep and the reversal, plus a buffer
  • Target: tested at 1R, 2R, and 3R
  • Costs: a realistic spread is deducted per instrument
  • Max hold: 2 trading days (2,880 minutes); undecided trades are excluded from the tally
InstrumentAssumed spreadStop buffer
EUR1.5 pips2 pips
GBP2.0 pips2 pips
JPY1.5 pips2 pips
AUD1.8 pips2 pips
XAU$0.35$0.20
BTC$25$10

3. Results

3.1 Stage 2 — Reversal rate (1-pip-equivalent threshold, 30-minute window)

InstrumentPDHPDLEqual HighEqual LowSwing HighSwing Low
EUR73.81%73.75%74.74%74.50%75.41%75.37%
GBP76.38%76.67%78.15%79.44%78.76%79.22%
JPY74.41%74.97%74.46%77.20%75.29%78.18%
AUD70.56%73.92%74.11%75.22%74.26%75.81%
XAU (fixed $0.1)79.23%84.85%82.76%86.75%83.94%86.74%
XAU (ATR 20%)73.34%79.68%73.11%78.61%72.10%77.42%
BTC (fixed $10)64.78%71.21%70.67%75.97%72.73%76.98%
BTC (ATR 20%)61.68%69.09%68.18%73.97%68.77%73.71%

These reversal rates look high in isolation, but mean nothing without the baseline comparison below.

3.2 Stage 3 — Random baseline comparison (z-scores)

InstrumentSwingEqualPDH/PDL
EUR-16.08-10.29-5.14
GBP-15.64-8.58-5.74
JPY-22.39-12.86-7.72
AUD-11.18-7.06-5.41
XAU (fixed $0.1)-20.75-7.95-7.38
XAU (ATR 20%)-14.23-4.90-4.89
BTC (fixed $10)-46.08-22.32-19.99
BTC (ATR 20%)-18.94-11.07-13.54

All 6 instruments × 3 categories = 18 tests came back z < 0, with no exceptions. BTC’s fixed-$10 numbers are inflated by price-scale drift ($3,283 in 2019 → over $126,000 in 2026); the ATR% version is the more trustworthy read, and the direction still holds.

3.3 Sensitivity analysis (EURUSD, threshold and window varied independently)

1 year (Aug 2025 – Aug 2026)

ThresholdWindowObservedRandomz
0.5 pips30 min79.69%82.12%-7.64
1 pip30 min73.94%76.14%-6.19
2 pips30 min62.55%64.32%-4.04
3 pips30 min51.92%53.67%-4.26
5 pips30 min35.62%36.64%-1.69
1 pip15 min64.00%67.56%-10.09
1 pip60 min81.56%82.57%-5.51
1 pip120 min85.99%86.92%-5.81

7.6 years (Jan 2019 – Aug 2026)

ThresholdWindowObservedRandomz
0.5 pips30 min80.73%83.36%-23.27
1 pip30 min75.10%77.82%-21.02
2 pips30 min64.15%66.72%-16.57
3 pips30 min54.55%56.79%-13.86
5 pips30 min39.49%40.92%-12.44
1 pip15 min65.91%69.52%-22.06
1 pip60 min82.20%83.93%-13.03
1 pip120 min87.15%88.30%-10.02

The z-scores grow larger in magnitude as the sample grows from 1 year to 7.6 years — the effect gets more statistically certain, not less. All 16 parameter combinations across both windows agree on direction.

3.4 Kill Zone analysis (EURUSD)

SessionUTC
Asia KZ23:00–03:00
London KZ07:00–10:00
NY KZ12:00–15:00
SessionObservedRandomz
Asia73.10%75.19%-5.55
London76.75%79.57%-7.16
NY79.24%81.36%-4.43

The NY session shows the highest raw reversal rate, but still falls short of its own session-matched random baseline. Restricting to kill-zone hours did not change the conclusion.

3.5 P&L-based verification (all 6 instruments, by R-multiple)

Every Stage 2 “reversal” event, traded as a counter-trend signal with a stop at the worst excursion and a target set in R-multiples. exp(gross) is expectancy before spread; exp(net) is after the assumed spread for that instrument; null is the expectancy of the matched random baseline; z is the real-vs-null statistical gap.

InstrumentRWin ratePFexp (gross)exp (net)nullz
EUR1R51.61%1.067+0.032R-0.194R0.034R-0.64
EUR2R34.13%1.036+0.024R-0.202R0.023R0.11
EUR3R25.31%1.017+0.012R-0.214R0.019R-0.90
GBP1R52.08%1.087+0.042R-0.217R0.047R-1.81
GBP2R34.54%1.055+0.036R-0.222R0.042R-1.41
GBP3R25.60%1.032+0.024R-0.234R0.033R-1.52
JPY1R52.05%1.086+0.041R-0.138R0.045R-1.07
JPY2R33.95%1.028+0.019R-0.160R0.039R-3.86
JPY3R25.40%1.021+0.016R-0.163R0.037R-2.79
AUD1R51.69%1.070+0.034R-0.251R0.031R0.60
AUD2R34.64%1.060+0.039R-0.245R0.030R1.56
AUD3R25.89%1.048+0.036R-0.249R0.024R1.53
XAU1R51.25%1.051+0.025R-0.101R0.029R-1.37
XAU2R33.83%1.023+0.015R-0.111R0.021R-1.19
XAU3R25.37%1.020+0.015R-0.111R0.019R-0.56
BTC1R51.69%1.070+0.034R-0.141R0.048R-5.27
BTC2R34.89%1.072+0.047R-0.128R0.061R-3.42
BTC3R26.50%1.081+0.060R-0.115R0.068R-1.29

Average risk (stop distance): EUR 6.64 pips / GBP 7.74 pips / JPY 8.38 pips / AUD 6.33 pips / XAU $2.78 / BTC $142.9

4. Conclusion

Across the tested scope — four major FX pairs, gold, and Bitcoin, 2019–2026, under multiple threshold, window, and R-multiple definitions — three findings held consistently:

  • ① Stage 2/3: the hypothesis that structural levels (swing highs/lows, equal highs/lows, PDH/PDL) reverse more often than a time- and distance-matched random price point was not supported. All 18 tests came back in the opposite direction (z < 0).
  • ② Sensitivity / Kill Zone: varying the threshold, reversal window, or restricting to kill-zone hours did not overturn this conclusion.
  • ③ P&L basis: once stop and target are sized off actual excursion in R-multiples, the real-vs-random gap largely disappears (z mostly between -5 and +2, no clear edge). Net of realistic spread, expectancy is clearly negative across every instrument and every R-multiple tested (-0.10R to -0.25R per trade).

In short: across six instruments, 7.6 years, and multiple parameter settings, we found no statistical or economic support for the core ICT claim that fading a liquidity sweep produces a tradeable edge.

5. Limitations

  • The reversal definition is loose — “closes back inside within N minutes” also captures simple mean-reversion noise, not necessarily a genuine structural reversal.
  • Levels and events are not fully independent (multiple levels move together within the same market cycle), so z-scores and p-values may be somewhat optimistic. Block bootstrapping by day would be a more conservative re-check.
  • Kill-zone windows use fixed UTC boundaries with no US/UK daylight-saving adjustment — a simplification.
  • Spread and stop-buffer assumptions in the P&L test are representative estimates, not a specific broker’s live conditions.
  • The entire study is bid-price based; ask-side spread dynamics are not modeled directly.
  • Entries are conditioned on a reversal that has already been confirmed — not lookahead bias in the strict sense, but the entry rule is conditioned on a pattern that has already begun to play out, which is worth keeping in mind when generalizing to live execution.

6. Next Steps

  • Sensitivity testing on Equal High/Low and PDH/PDL definition parameters (tolerance, lookback window)
  • Block bootstrapping to address the independence caveat
  • Extending the Kill Zone analysis to GBP/JPY/AUD/XAU/BTC
  • Revisiting EA design in light of these results — a standalone fade-the-sweep rule does not appear viable; combining it with additional confirmation criteria may be worth testing

Appendix — Technical notes: Stage 1’s Equal High/Low detection initially used an unbounded O(n²) search with no lookback limit; this was fixed to an early-exit, time-windowed search once the 7.6-year dataset made the original approach computationally infeasible. The Stage 2/3/P&L sweep search was JIT-compiled with Numba for performance (71,447 levels × up to 7,200 bars scanned in 0.1s). Full methodology and scripts available on request.