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:
| Layer | Description | Evidentiary status |
|---|---|---|
| ① Passive cascade | Clustered stop orders mechanically accelerate price once triggered — no intent required | Supported by market microstructure research (Osler, 2002, 2005; NY Fed staff reports) |
| ② Deliberate triggering | Dealer banks use knowledge of client order books to move price intentionally | Documented 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 schedule | Unsubstantiated; 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-nodeCLI) - 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
| Instrument | Sweep threshold |
|---|---|
| EUR / GBP / AUD | 1 pip (0.0001) |
| JPY | 1 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
| Instrument | Assumed spread | Stop buffer |
|---|---|---|
| EUR | 1.5 pips | 2 pips |
| GBP | 2.0 pips | 2 pips |
| JPY | 1.5 pips | 2 pips |
| AUD | 1.8 pips | 2 pips |
| XAU | $0.35 | $0.20 |
| BTC | $25 | $10 |
3. Results
3.1 Stage 2 — Reversal rate (1-pip-equivalent threshold, 30-minute window)
| Instrument | PDH | PDL | Equal High | Equal Low | Swing High | Swing Low |
|---|---|---|---|---|---|---|
| EUR | 73.81% | 73.75% | 74.74% | 74.50% | 75.41% | 75.37% |
| GBP | 76.38% | 76.67% | 78.15% | 79.44% | 78.76% | 79.22% |
| JPY | 74.41% | 74.97% | 74.46% | 77.20% | 75.29% | 78.18% |
| AUD | 70.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)
| Instrument | Swing | Equal | PDH/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)
| Threshold | Window | Observed | Random | z |
|---|---|---|---|---|
| 0.5 pips | 30 min | 79.69% | 82.12% | -7.64 |
| 1 pip | 30 min | 73.94% | 76.14% | -6.19 |
| 2 pips | 30 min | 62.55% | 64.32% | -4.04 |
| 3 pips | 30 min | 51.92% | 53.67% | -4.26 |
| 5 pips | 30 min | 35.62% | 36.64% | -1.69 |
| 1 pip | 15 min | 64.00% | 67.56% | -10.09 |
| 1 pip | 60 min | 81.56% | 82.57% | -5.51 |
| 1 pip | 120 min | 85.99% | 86.92% | -5.81 |
7.6 years (Jan 2019 – Aug 2026)
| Threshold | Window | Observed | Random | z |
|---|---|---|---|---|
| 0.5 pips | 30 min | 80.73% | 83.36% | -23.27 |
| 1 pip | 30 min | 75.10% | 77.82% | -21.02 |
| 2 pips | 30 min | 64.15% | 66.72% | -16.57 |
| 3 pips | 30 min | 54.55% | 56.79% | -13.86 |
| 5 pips | 30 min | 39.49% | 40.92% | -12.44 |
| 1 pip | 15 min | 65.91% | 69.52% | -22.06 |
| 1 pip | 60 min | 82.20% | 83.93% | -13.03 |
| 1 pip | 120 min | 87.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)
| Session | UTC |
|---|---|
| Asia KZ | 23:00–03:00 |
| London KZ | 07:00–10:00 |
| NY KZ | 12:00–15:00 |
| Session | Observed | Random | z |
|---|---|---|---|
| Asia | 73.10% | 75.19% | -5.55 |
| London | 76.75% | 79.57% | -7.16 |
| NY | 79.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.
| Instrument | R | Win rate | PF | exp (gross) | exp (net) | null | z |
|---|---|---|---|---|---|---|---|
| EUR | 1R | 51.61% | 1.067 | +0.032R | -0.194R | 0.034R | -0.64 |
| EUR | 2R | 34.13% | 1.036 | +0.024R | -0.202R | 0.023R | 0.11 |
| EUR | 3R | 25.31% | 1.017 | +0.012R | -0.214R | 0.019R | -0.90 |
| GBP | 1R | 52.08% | 1.087 | +0.042R | -0.217R | 0.047R | -1.81 |
| GBP | 2R | 34.54% | 1.055 | +0.036R | -0.222R | 0.042R | -1.41 |
| GBP | 3R | 25.60% | 1.032 | +0.024R | -0.234R | 0.033R | -1.52 |
| JPY | 1R | 52.05% | 1.086 | +0.041R | -0.138R | 0.045R | -1.07 |
| JPY | 2R | 33.95% | 1.028 | +0.019R | -0.160R | 0.039R | -3.86 |
| JPY | 3R | 25.40% | 1.021 | +0.016R | -0.163R | 0.037R | -2.79 |
| AUD | 1R | 51.69% | 1.070 | +0.034R | -0.251R | 0.031R | 0.60 |
| AUD | 2R | 34.64% | 1.060 | +0.039R | -0.245R | 0.030R | 1.56 |
| AUD | 3R | 25.89% | 1.048 | +0.036R | -0.249R | 0.024R | 1.53 |
| XAU | 1R | 51.25% | 1.051 | +0.025R | -0.101R | 0.029R | -1.37 |
| XAU | 2R | 33.83% | 1.023 | +0.015R | -0.111R | 0.021R | -1.19 |
| XAU | 3R | 25.37% | 1.020 | +0.015R | -0.111R | 0.019R | -0.56 |
| BTC | 1R | 51.69% | 1.070 | +0.034R | -0.141R | 0.048R | -5.27 |
| BTC | 2R | 34.89% | 1.072 | +0.047R | -0.128R | 0.061R | -3.42 |
| BTC | 3R | 26.50% | 1.081 | +0.060R | -0.115R | 0.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.
