Hope all is well. I have a question, and perhaps others may be wondering the same thing.
Let’s say you are working with a liquidity grab on the 15-minute time frame, and let’s say you have the ability to drill down to the 1-minute time frame. What would you look for? ATR expansion/contraction? CVD? Volume pressure?
Yes, I’d drill into the 1-minute for exactly those things, but I would not use just one. On a 15-minute liquidity grab, I want the 1-minute to answer one question:
Was that sweep actual acceptance through the level, or a stop-run that immediately lost sponsorship?
That means I’m looking for a short list of very specific confirmations.
What I care about most on the 1-minute
1. Immediate response after the sweep
This is the biggest one.
After the liquidity grab, does price:
snap back inside the prior range quickly or
keep accepting beyond the level?
If it re-enters fast and cannot continue, that is your first real clue the sweep was a trap, not a breakout.
2. Volume spike on the sweep, then failure to continue
I want to see:
large volume on the grab
but poor follow-through on the next 1 to 3 candles
That often means:
stops got triggered
aggressive traders chased
but real continuation demand/supply was not there
3. 1-minute ATR expansion into the sweep, then contraction
Yes, ATR matters.
A good reversal-style liquidity grab often looks like:
volatility expands sharply into the stop-run
then immediately compresses as the move stalls
then price rotates back
If ATR keeps expanding after the sweep and price keeps accepting, that is less likely to be a clean fade.
4. CVD / delta divergence
This is useful if you have good data.
What I want to see is:
price makes the sweep
CVD pushes hard with it
but price cannot hold the extension
That tells me aggressive market orders hit, but they were absorbed.
So yes, CVD divergence / absorption is one of the best confirms if your feed is reliable.
5. Tape speed / candle efficiency
I care a lot about whether the candles after the sweep are:
large and directional or
wicky, overlapping, hesitant
A real trap often gives:
impulsive sweep
then messy, inefficient candles
then reversal back through micro structure
6. Micro reclaim / breakdown level
After the grab, I want a 1-minute structure trigger, like:
reclaim of the pre-sweep high/low
reclaim of VWAP or a micro pivot
failure of the last impulse leg
That is often the actual execution trigger.
My priority order
If I rank them:
Price acceptance vs rejection after the sweep
Volume spike with poor follow-through
Micro structure reclaim / failure
CVD / delta absorption
ATR expansion then stall/contraction
What I’d want for a bullish reversal after a downside liquidity grab
flush below the 15m low
1m volume spike
little or no downside continuation
fast reclaim back above the swept low / prior micro range
CVD still negative or heavy selling, but price holds anyway
then 1m higher low
That is a much better long than just buying the first flush.
For a bearish reversal after an upside liquidity grab
Same thing flipped:
poke above the 15m high
1m volume spike
no clean continuation
quick rejection back below the level
aggressive buying absorbed
lower high on 1m, then breakdown
So, yes, I’d look at ATR expansion/contraction, CVD, and volume pressure, but the most important thing is still whether the 1-minute accepts or rejects the sweep. The best liquidity grabs show volume/volatility expansion into the stop-run, weak follow-through, absorption, and then a fast reclaim of micro structure.
Try this rewritten Liquidity trap detector that looks for what we just talked about. TOS has some limitations so this is as close to "perfect" I can get.
Code:
# =========================================
# Liquidity Trap Detector v2 - Price Overlay
# Filtered stop-hunt / sweep markers on price chart
# Adds volume, ATR/range expansion, reclaim quality, and confirmation
# =========================================
declare upper;
input sweepLookback = 10;
input volumeLength = 20;
input volumeSpikeMult = 1.5;
input atrLength = 14;
input rangeExpansionMult = 1.2;
input minReclaimPercent = 0.20;
input showLabels = yes;
input showConfirmation = yes;
input confirmationLookback = 3;
def na = Double.NaN;
def c = close;
def o = open;
def h = high;
def l = low;
def v = volume;
# -------------------------
# Reference liquidity
# -------------------------
def sweepRefHigh = Highest(high[1], sweepLookback);
def sweepRefLow = Lowest(low[1], sweepLookback);
# -------------------------
# Volatility / range filters
# -------------------------
def tr = TrueRange(h, c, l);
def atr = Average(tr, atrLength);
def barRange = h - l;
def rangeExpanded = barRange > atr * rangeExpansionMult;
# -------------------------
# Volume filter
# -------------------------
def avgVol = Average(v, volumeLength);
def volSpike = v > avgVol * volumeSpikeMult;
# -------------------------
# Reclaim depth / rejection quality
# -------------------------
def reclaimAmountHigh = sweepRefHigh - c;
def reclaimAmountLow = c - sweepRefLow;
def reclaimHighOK =
h > sweepRefHigh and
reclaimAmountHigh >= barRange * minReclaimPercent;
def reclaimLowOK =
l < sweepRefLow and
reclaimAmountLow >= barRange * minReclaimPercent;
# -------------------------
# Core sweep logic
# -------------------------
def rawSweepHigh =
h > sweepRefHigh and
c < sweepRefHigh and
c < o;
def rawSweepLow =
l < sweepRefLow and
c > sweepRefLow and
c > o;
def sweepHigh =
rawSweepHigh and
volSpike and
rangeExpanded and
reclaimHighOK;
def sweepLow =
rawSweepLow and
volSpike and
rangeExpanded and
reclaimLowOK;
# -------------------------
# Confirmation logic
# -------------------------
def recentMicroLow = Lowest(low[1], confirmationLookback);
def recentMicroHigh = Highest(high[1], confirmationLookback);
def highTrapArmed =
if sweepHigh then 1
else if highTrapArmed[1] == 1 and !sweepLow then 1
else 0;
def lowTrapArmed =
if sweepLow then 1
else if lowTrapArmed[1] == 1 and !sweepHigh then 1
else 0;
def confirmHighTrapRaw =
highTrapArmed[1] == 1 and
c < recentMicroLow;
def confirmLowTrapRaw =
lowTrapArmed[1] == 1 and
c > recentMicroHigh;
def confirmHighTrap =
confirmHighTrapRaw and !confirmHighTrapRaw[1];
def confirmLowTrap =
confirmLowTrapRaw and !confirmLowTrapRaw[1];
# -------------------------
# Plot prior sweep reference levels (optional visual context)
# -------------------------
plot RefHigh = sweepRefHigh;
plot RefLow = sweepRefLow;
RefHigh.SetDefaultColor(Color.DARK_RED);
RefLow.SetDefaultColor(Color.DARK_GREEN);
RefHigh.SetStyle(Curve.SHORT_DASH);
RefLow.SetStyle(Curve.SHORT_DASH);
# -------------------------
# Sweep arrows on price chart
# -------------------------
plot StopHuntAbove =
if sweepHigh then h + atr * 0.15 else na;
plot StopHuntBelow =
if sweepLow then l - atr * 0.15 else na;
StopHuntAbove.SetPaintingStrategy(PaintingStrategy.ARROW_DOWN);
StopHuntBelow.SetPaintingStrategy(PaintingStrategy.ARROW_UP);
StopHuntAbove.SetDefaultColor(Color.RED);
StopHuntBelow.SetDefaultColor(Color.GREEN);
StopHuntAbove.SetLineWeight(3);
StopHuntBelow.SetLineWeight(3);
# -------------------------
# Confirmation arrows on price chart
# -------------------------
plot ConfirmShort =
if showConfirmation and confirmHighTrap then h + atr * 0.30 else na;
plot ConfirmLong =
if showConfirmation and confirmLowTrap then l - atr * 0.30 else na;
ConfirmShort.SetPaintingStrategy(PaintingStrategy.ARROW_DOWN);
ConfirmLong.SetPaintingStrategy(PaintingStrategy.ARROW_UP);
ConfirmShort.SetDefaultColor(Color.ORANGE);
ConfirmLong.SetDefaultColor(Color.CYAN);
ConfirmShort.SetLineWeight(3);
ConfirmLong.SetLineWeight(3);
# -------------------------
# Optional labels
# -------------------------
AddLabel(showLabels,
if sweepHigh then "FILTERED STOP HUNT ABOVE"
else if sweepLow then "FILTERED STOP HUNT BELOW"
else if confirmHighTrap then "CONFIRMATION: SHORT BIAS"
else if confirmLowTrap then "CONFIRMATION: LONG BIAS"
else "NO FILTERED LIQUIDITY SWEEP",
if sweepHigh then Color.RED
else if sweepLow then Color.GREEN
else if confirmHighTrap then Color.ORANGE
else if confirmLowTrap then Color.CYAN
else Color.GRAY
);
AddLabel(showLabels,
"Lookback: " + sweepLookback +
" | Vol x" + volumeSpikeMult +
" | Range x" + rangeExpansionMult,
Color.DARK_GRAY
);
useThinkScript is the #1 community of stock market investors using indicators and other tools to power their trading strategies. Traders of all skill levels use our forums to learn about scripting and indicators, help each other, and discover new ways to gain an edge in the markets.
How do I get started?
We get it. Our forum can be intimidating, if not overwhelming. With thousands of topics, tens of thousands of posts, our community has created an incredibly deep knowledge base for stock traders. No one can ever exhaust every resource provided on our site.
If you are new, or just looking for guidance, here are some helpful links to get you started.
VIP members get exclusive access to these proven and tested premium indicators: Buy the Dip, Advanced Market Moves 2.0, Take Profit, and Volatility Trading Range. In addition, VIP members get access to over 50 VIP-only custom indicators, add-ons, and strategies, private VIP-only forums, private Discord channel to discuss trades and strategies in real-time, customer support, trade alerts, and much more. Learn all about VIP membership here.
How can I access the premium indicators?
To access the premium indicators, which are plug and play ready, sign up for VIP membership here.