Idea in brief
Dhesi Trades trades NQ and ES futures using the ICT model: a chain of conditions across four timeframes. For a short, price first sweeps major liquidity above, for example a monthly high or equal highs. Then it closes down through a bullish 4-hour fair value gap, that is, "inverts" it. Inside the drop, a bearish FVG remains on the 15-minute chart. Price pulls back into it and on the way leaves a bullish gap on the 1- or 5-minute chart. When this gap is broken by a close to the downside, the author enters at market.
The stop goes above the 15-minute high of the pullback, the target at liquidity below. Half of the position is closed at the first technical target, and the stop on the remainder is moved to breakeven. Long mirrored.
The author does not name the exact gap boundaries, the "speed" of the inversion or what counts as equal highs. Below, these concepts are defined on bars and marked.
Why it might work
The author's logic. Above obvious highs sit the stops of sellers and the orders of those buying the breakout. When price takes them out and quickly falls through the gap left by the rally, buyers get trapped and the direction changes. Lower timeframes are needed to enter on a pullback with a clear stop rather than on a big 4-hour candle: inversions on the higher timeframe, according to the author, give direction, not an entry point.
The second part is about regime. The setup, according to the author, works well a few months a year, when VIX is rising and price reacts to monthly and weekly gaps. The author calls a quiet summer a low-probability time.
The author shows no tests. The ICT terms here describe the shape of the chart, not a proven mechanism.
Rules
Definitions on bars
// community (ICT): FVG on three candles k-2, k-1, k
MinGap = 0.1 * ATR(14) of the same TF // Finetiq: small gaps are ignored
BullFVG(k) = Low[k] - High[k-2] > MinGap // zone from High[k-2] to Low[k]
BearFVG(k) = Low[k-2] - High[k] > MinGap // zone from High[k] to Low[k-2]
// inversion: a close through the gap in the opposite direction
InvBull(g) = Close < g.Bottom // author: a gap that price did not close all the way through does not count
InvBear(g) = Close > g.Top
SwingHigh(k) = High[k] above the High of two bars to the left and two to the right // Finetiq
EqualHighs = two SwingHighs within 20 bars with a difference <= 0.1 * ATR(14) // Finetiq
OrderBlock = the last bearish candle before the rally that left the gap // community (ICT)
Steps 1-2. Liquidity sweep and inversion on H4 (short)
// author: pools = session and monthly highs, equal highs; monthly ones take priority
Pool = prior month high | prior week high | EqualHighs on D1 // Finetiq: list of pools
Sweep = High on H4 > Pool // author
FVG4 = last BullFVG on H4 in the move toward Pool // Finetiq: the author mentions both the last and the earliest
Bias = SHORT IF InvBull(FVG4)
AND inversion no later than 3 H4 bars after price enters FVG4 // author: within two or three 4-hour candles
AND no H4 close above Pool after the Sweep // Finetiq
Bias is cancelled by an H4 close above the Sweep high or after 2 sessions // Finetiq
Steps 3-4. Pullback into the 15-minute gap and entry
FVG15 = first BearFVG on M15 after the inversion of FVG4 // author: a gap inside the inversion
Retrace = High on M15 >= FVG15.Bottom // price returned into the gap
NOT (Close on M15 > FVG15.Top) // Finetiq: the pullback did not hold above the gap
// on the pullback, the lower TF (M1 or M5) leaves a bullish gap
LTF = BullFVG on M1 after price enters FVG15
// author: prefer a gap that price has already bounced from
IF LTF has a bullish OrderBlock within 1 ATR(14) of M1
require a close below both // author: two zones nearby, both must be broken
IF Bias = SHORT AND Retrace AND InvBull(LTF)
AND Time between 10:00 and 15:00 ET // author: no trading before 10:00; end of window by Finetiq
SELL SHORT AT NEXT BAR OPEN // author: always at market
StopLoss = M15 high since the start of the pullback + 1 tick // author: above the current 15-minute high
Target = nearest below: equal lows | session low since 09:30 | unfilled H1 or M15 gap // author
IF (EntryPrice - Target) < 1.5 * (StopLoss - EntryPrice) THEN skip // author: takes 1:1.5-1:2, does not take trades of 1R or worse; hard 1.5 threshold by Finetiq
Exit and daily rules
TP1 = nearest unfilled H1 or M15 FVG on the way to Target // author: the first target is always technical
AT TP1: EXIT 50%, StopLoss = EntryPrice // author: always half, then breakeven
remainder: EXIT at Target // author
EXIT everything at 15:55 ET // Finetiq: for the intraday version
// author: if the remainder closed at breakeven after TP1, trading for the day is over
// 2 losses in a day: stop; a win and a loss: a third attempt is allowed
// no averaging down; do not chase a missed entry, wait for the 4H candle at 14:00 ET
Regime filter
// author: trade when VIX has "risen"
VolOK = Close(VIX, D1)[1] > SMA(Close(VIX, D1), 20)[1] // Finetiq: rough proxy
// variant without VIX: ATR(14) of NQ daily bars above its 100-day average // Finetiq
Parameters
| Parameter | Value | Source |
|---|---|---|
| Instruments | NQ, ES | author |
| Timeframe chain | D1 and H4, then M15, then M1 or M5 | author |
| FVG | gap between the first and third candle | community (ICT) |
| Minimum gap | 0.1 × ATR(14) | Finetiq |
| Inversion | close through the gap | author |
| H4 inversion window | up to 3 candles | author (2-3) |
| Liquidity pools | month, week, equal highs | author, list by Finetiq |
| Equal highs | difference ≤ 0.1 ATR within 20 bars | Finetiq |
| Choice of 4H gap | last one before the sweep | Finetiq |
| Choice of minute gap | one that has already worked | author |
| Gap and order block nearby | both broken | author |
| Entry window | 10:00-15:00 ET | author (start), Finetiq (end) |
| Entry | at market | author |
| Stop | above the 15-minute pullback high | author |
| Minimum ratio | 1.5R | author (1:1.5-1:2), hard threshold by Finetiq |
| First target | unfilled H1 or M15 gap | author |
| Partial exit | 50%, stop to breakeven | author |
| Daily stop | 2 losses | author |
| Regime filter | VIX above SMA(20) | Finetiq (author: "VIX has risen") |
What to test
- Is the cascade needed. Compare an entry on a 4H gap inversion without lower timeframes, an entry on a minute gap inversion without higher-timeframe context, and the full chain. The author claims minute inversions without context are noisy.
- Inversion speed. 2, 3 and 6 H4 bars: a slow inversion, according to the author, is worse.
- Which gap to take. The last 4H gap versus the earliest one in the move, a minute gap that has already worked versus the latest one.
- Minimum gap size. 0, 0.1 and 0.25 ATR. Without a threshold, minute bars produce dozens of gaps per hour, and almost any pullback will give a signal.
- Volatility filter. Results by month with and without the VIX filter. If the other months go negative without the filter rather than staying near zero, the filter is mandatory.
- Losing streaks. Calculate the maximum streak and drawdown on history and compare them with the daily limits of a prop account. At a 65% win rate the author calls streaks of 5-6 losses normal.
- Wide stop and costs. A stop above the 15-minute high on NQ can be 40-60 points. Measure trades in R with commission and a tick of slippage on the market entry.
Platform notes
TradingView (Pine Script)
- Get higher timeframes via
request.security(syminfo.tickerid, "240", expr[1], lookahead = barmerge.lookahead_on). Without[1], the H4 inversion will "see" the close of a bar that does not exist yet. Each timeframe and VIX takes a separate request, and the number of requests per script is limited. - Store gaps in arrays and update them on every bar. Evaluate an inversion by Close, not by High.
- The 4-hour candle opening at 10:00 ET matters to the author. Check that the 4H bars on your symbol start at 18:00, 22:00, 02:00, 06:00, 10:00 and 14:00 ET. CFDs and symbols with a different session have different boundaries.
- The stop and the partial exit on minute bars often fall into the same bar:
use_bar_magnifier = trueon paid plans.
MultiCharts and TradeStation (EasyLanguage)
- Data streams: Data1 = 1 minute, Data2 = 15 minutes, Data3 = 240 minutes, Data4 = daily.
Close of Data3on Data1 gives the last closed value. A 240-minute bar is built from the start of the session template, so check that it aligns with the 10:00 and 14:00 ET grid. Timeis the bar's close time: the 4-hour candle that opened at 10:00 ET hasTime = 1400.- Gap arrays across four data streams are cumbersome. Keep the last 5-10 gaps on each timeframe.
- VIX is added as a fifth data stream, only if your data vendor provides the index. Otherwise use the NQ ATR variant.
MetaTrader 5 (MQL5)
- All the required periods are standard (M1, M5, M15, H1, H4, D1). Take higher-timeframe values with shift 1.
- MT5 builds H4 bars on the broker's server time. With a GMT+2 or GMT+3 server, the 4-hour candle boundaries do not align with 10:00 ET, and such a candle has to be assembled from hourly bars yourself.
- Daily, weekly and monthly CFD highs are computed on server days. Short Sunday bars shift the liquidity pools and create false gaps on D1.
- Not every broker offers VIX. Gaps on a CFD and on NQ futures do not match because of different trading hours and the basis.
Where the idea can break
- According to the author, ten ICT traders will take ten different entries from the same picture. Our formalization is one of many.
- The 65% win rate and reward-to-risk up to 1:10 come from manual trading that mixes prop accounts, 0DTE options and a live account. There is no trade report.
- "VIX has risen" is given without a number. A test only on a calm period or only on a volatile one will give a false answer.
- There are many knobs to tune: gap size, inversion window, equal highs, gap selection. Keep a holdout period.
- With a wide stop and a fixed number of contracts, the prop account's daily limit can run out before the stop is hit.
- The video advertises prop firms and platforms, and the payouts are not verified.