Volume-Weighted S/R Zone Detector

by @kwame_holds_risk

K

Kwame Asante-Boadu

@kwame_holds_risk
Open sourceformulaMIT

Identifies price zones where high-volume candles have clustered multiple times within a tight range. Zones are marked active when price respects them and broken when price pierces with expanding volume. Entry signals fire when price re-enters an active zone with declining volume.

0 likes💬 0 comments👁 1 views🔖 0 saves0 forks3 in use
Sign in to interact.

Try it live

Run the preview to see this indicator plotted on a real chart.

Inputs

Volume MA Lengthint · default 20
Short Volume MA Lengthint · default 5
High Volume Threshold (x avg)float · default 1.5
Volume Expansion Multiplierfloat · default 1.3
ATR Lengthint · default 14
Zone Half-Width (ATR multiplier)float · default 0.5
Zone Lookback Periodint · default 50
Minimum High-Volume Touchesint · default 3

Outputs / plots

Zone Midline (VWAP) (series)Zone Upper Band (series)Zone Lower Band (series)Zone Strength % (series)Volume Ratio (Short/Long MA) (series)Zone Score (Strength × Vol Ratio) (series)Entry Signal (Re-entry + Vol Drop) (event)Zone Broken (Expansion Breakout) (event)Zone Active (Price Respected) (event)High-Volume Cluster Bar (event)

Latest changelog

Initial release.

Version history

v17/22/2026, 1:09:12 PM

Source code

formula
let src_price = close
let vol_ma = sma(volume, vol_len)
let high_vol = volume > vol_ma * vol_thresh
let zone_mid = vwap()
let atr_val = atr(atr_len)
let zone_half = atr_val * zone_width
let zone_upper = zone_mid + zone_half
let zone_lower = zone_mid - zone_half
let price_in_zone = and(close >= zone_lower, close <= zone_upper)
let high_vol_in_zone = and(high_vol, price_in_zone)
let zone_touches = sum(if(high_vol_in_zone, 1, 0), lookback)
let zone_active = zone_touches >= min_touches
let vol_ma_short = sma(volume, vol_short)
let vol_ma_long = sma(volume, vol_len)
let vol_declining = vol_ma_short < vol_ma_long
let vol_expanding = vol_ma_short > vol_ma_long * expand_mult
let price_above_zone = close > zone_upper
let price_below_zone = close < zone_lower
let zone_pierced = or(price_above_zone, price_below_zone)
let zone_broken = and(zone_active, and(zone_pierced, vol_expanding))
let zone_respected = and(zone_active, not(zone_pierced))
let reentry_from_above = and(close <= zone_upper, shift(close, 1) > zone_upper)
let reentry_from_below = and(close >= zone_lower, shift(close, 1) < zone_lower)
let reentry = or(reentry_from_above, reentry_from_below)
let entry_signal = and(zone_respected, and(reentry, vol_declining))
let breakout_signal = zone_broken
let zone_strength = clamp(zone_touches / lookback * 100, 0, 100)
let vol_ratio = vol_ma_short / vol_ma_long
let zone_score = zone_strength * vol_ratio
let upper_band = zone_upper
let lower_band = zone_lower
plot("zone_mid", zone_mid)
plot("zone_upper", upper_band)
plot("zone_lower", lower_band)
plot("zone_strength", zone_strength)
plot("vol_ratio", vol_ratio)
plot("zone_score", zone_score)
event("entry_signal", entry_signal)
event("breakout_signal", breakout_signal)
event("zone_active", zone_respected)
event("high_vol_cluster", high_vol_in_zone)

Comments (0)

Sign in to leave a comment.

No comments yet.

Related indicators

Want to use this?

Sign in to preview it live on a chart, fork it into your own Indicators Lab, or use it in a strategy.