OPEN-SOURCE SCRIPT
تم تحديثه Liquidity Pools Pro [WillyAlgoTrader]

💧 Liquidity Pools Pro is a fully free overlay indicator that automatically detects liquidity zones (equal highs and equal lows), scores them on a 4-factor strength model, catches sweeps (liquidity grabs) with reversal confirmation, and instantly delivers a complete trade plan: entry, stop-loss, three take-profits, and automatic break-even on TP1.
It unifies into a single coherent engine what traders usually have to assemble from 5–7 separate scripts: an adaptive pivot detector, a 4-factor pool scoring system (touches + recency + volume + HTF), sweep detection with close-back confirmation, an ATR-based risk calculator, risk presets, and an informative dashboard.
Works on any instrument (BTC, EURUSD, stocks, indices, futures) and any timeframe without retuning — every threshold is scaled through ATR.
🧩 WHY THESE COMPONENTS WORK TOGETHER
A simple pivot detector just plots dots. A simple sweep signal fires on every wick. A plain ATR stop-loss ignores context. Individually these are noise. Combined, they form a complete mechanism for identifying zones where smart money harvests liquidity, and trading the reversal from them.
Integration chain:
Adaptive Pivot Detection → ATR-based Equality Tolerance → Pool Matching & Clustering → 4-Factor Strength Scoring → HTF Confluence Boost → Sweep Detection (wick + close-back) → Risk Engine (SL/TP/BE) → Position Lock + State Machine → Dashboard + Alerts
— The pivot detector adapts to volatility: length grows when ATR is high (less noise on crypto) and shrinks when ATR is low (faster reaction on forex).
— Tolerance in ATR units lets the engine treat highs/lows as "equal" on any instrument — no manual tick configuration.
— Matching clusters pivots into pools (multiple touches at one zone = thicker liquidity).
— Scoring filters out weak pools and highlights exactly the ones price returns to for stop-runs.
— HTF Confluence adds +20 to strength when a pivot on the higher timeframe aligns — a filter against lower-timeframe traps.
— Sweep is identified as a wick beyond the level + close back inside (classic failed breakout / liquidity grab).
— The risk engine builds a complete trade plan for each signal and trails the stop to break-even after TP1.
— Position Lock prevents opposite signals from silently overwriting the SL/TP of an open position.
Remove any one link and the chain breaks. Sweeps without scoring = noise. Scoring without sweeps = pretty boxes that never trigger. Risk engine without position lock = silent overwrite of an open trade. This pipeline solves all three problems.
🔍 WHAT MAKES IT ORIGINAL
1️⃣ Adaptive Pivot Length — pivot length that adjusts itself to the market.
Most indicators use a fixed pivot length (5, 10, 20). That works on one timeframe of one instrument — and breaks on anything else.
Here the length is computed dynamically:
— volRatio = ATR(14) / ATR(50)
— adaptiveLen = round( clamp( 10 / max(0.5, volRatio), 4, 16 ) )
In high-volatility regimes (volRatio > 1) length shrinks to 4–6 bars — the indicator reacts faster. In low-volatility regimes (volRatio < 1) length grows to 14–16 bars — small noise is filtered out. Can be disabled and set manually (default 8 when Adaptive is OFF).
2️⃣ ATR Equality Tolerance — scale-invariant definition of "equal" levels.
Two pivots are treated as touches of the same liquidity zone if the distance between them ≤ ATR × tolerance (default 0.25).
— 0.15 = strict (tight pools, fewer matches)
— 0.25 = balanced (recommended)
— 0.50 = loose (wider pools, more matches)
This solves a fundamental problem: on BTCUSD, "equal within $50" is normal; on EURUSD the same value is huge. ATR-based tolerance gives one setting that works across all instruments.
3️⃣ 4-factor Strength Score — pool weight on a 0–100 scale.
Every pool is scored as the sum of four components, clamped to 0–100:
— 🎯 Touches (up to 35 points): (touchCount − 1) × 9, capped at 35. One pivot = 0, two = 9, three = 18, four = 27, five+ = 35.
— ⏳ Recency (up to 35 points): 35 × 0.5^(ageBars / halfLife). Fresh pool = 35, after one half-life = 17.5, after two = 8.75. Default halfLife = 150 bars.
— 📊 Volume (up to 20 points): log(max(1, cumVol / median)) × 8, capped at 20. Accumulated on every bar that touches the zone — not just the pivot bar.
— 🔭 HTF Confluence (+20 bonus): if a higher-timeframe pivot exists within tolerance × 1.5 — +20 added to the total.
Examples:
— Fresh 1-touch pool, no volume, no HTF: 0 + 35 + 0 + 0 = 35
— Fresh 2-touch pool: 9 + 35 + 0 + 0 = 44
— Fresh 3-touch pool with 2× median volume: 18 + 35 + 5.5 + 0 = 58.5
— Old (1 half-life) 2-touch pool: 9 + 17.5 + 0 + 0 = 26.5
4️⃣ Sweep Detection with close-back confirmation — real liquidity grabs, not false wicks.
Pool state transitions follow strict logic:
— STATE_ACTIVE → STATE_SWEPT: wick pierced the level but bar closed beyond it (this is a breakout, not a reversal)
— STATE_ACTIVE → STATE_MITIGATED: wick pierced AND bar closed back inside (real liquidity sweep)
The default signal (Require Body Reversal = ON) only fires on MITIGATED. This is classic SMC "fakeout → reversal" logic. Disable it and any wick sweep will fire (more aggressive, more noise).
5️⃣ Volume-at-Level Accumulation — real volume at the level, not just at the pivot.
Most indicators count volume only on the pivot bar. That's misleading — true liquidity accumulates across all the touches.
Here, on every confirmed bar the engine checks for a zone touch (high or low inside levelBot–levelTop), and if found, adds the bar's volume to the pool's cumVol. Across 40 active pools this is O(P) per bar — fast.
6️⃣ HTF Confluence Engine — higher-timeframe pivots as a filter.
When enabled, pivots from the configured HTF (default 4H) are requested via request.security with lookahead_on on a closed bar (no repaint). If a pool aligns with an HTF pivot within tolerance × 1.5 — +20 is added to its score.
Used to filter signals: HTF-confluent pools cross the strength threshold faster.
7️⃣ 5 Risk Presets + Custom — ready-made SL/TP per trading style.
— Conservative: SL 2.5×ATR, TP 1R/2R/4R
— Balanced: SL 1.5×ATR, TP 1R/2R/3R (default)
— Aggressive: SL 1.0×ATR, TP 1.5R/2.5R/4R
— Scalping: SL 0.8×ATR, TP 0.8R/1.5R/2R
— Custom: manual multipliers
Calculation:
— slDistance = ATR(14) × slMult
— entry = close on the signal bar
— SL = entry ∓ slDistance
— TP1/2/3 = entry ± slDistance × tpMult
8️⃣ Automatic Break-Even after TP1 — stop trails to entry on its own.
After TP1 is touched (and SL didn't fire on the same bar), the active SL is moved to entry. From that point on, any pullback to entry = break-even exit. TP2/TP3 logic continues to track.
Edge case is handled: if both TP1 and SL fire on the same bar, the stop is evaluated against the ORIGINAL value (effectiveSL captured before the BE update). No "magic" loss-saving.
9️⃣ Position Lock — protection against silent trade overwrites.
While a trade is active (activeDir ≠ 0), new signals are blocked. Exception: if the current bar is closing the position (SL or TP3 hit), it's treated as "closing now" and an opposite signal is allowed through.
Without this protection, a fresh signal would silently overwrite the SL/TP of an open position — critical for both manual trading and webhook-based autotrading.
🔟 Pro-style visuals with adaptive contrast.
— Liquidity zones: colored boxes with transparency tied to strength (transparency = 88 − strength × 0.33)
— Mid-line: dotted line through the center of each zone
— Pool labels: SSL/BSL × touch count [strength] volume
— SL: solid red line (dims when BE activates)
— Entry: dotted blue
— TP1/2/3: dashed green (turn cyan + ✓ when hit)
— Themes: Auto/Dark/Light with WCAG AA contrast on every background
1️⃣1️⃣ Full alert suite for autotrading — JSON or plain text.
Every signal and trade event triggers alert() in one of two formats:
— Plain text: "🟢 SWEEP BUY | TICKER | TF | Price: X | Pool: 58/100 | SL: ... | TP1: ... | TP2: ... | TP3: ... | R:R: 1.0"
— JSON for webhooks: {"action":"buy","ticker":...,"tf":...,"price":...,"sl":...,"tp1":...,"tp2":...,"tp3":...,"rr":...,"pool_strength":...}
All alerts use alert.freq_once_per_bar_close (no intra-bar duplicates).
⚙️ HOW IT WORKS — CALCULATION FLOW
Step 1 — Pivot detection: on each bar, ta.pivothigh and ta.pivotlow are evaluated with the dynamic left length (adaptiveLen) and the configured right confirmation.
Step 2 — Matching: each new pivot is compared against all active pools of the same type (high/low). If distance ≤ tolerance AND age ≤ maxLookback, it's added as a new touch (level is recalculated as a weighted average).
Step 3 — Pool creation: if no match is found, a new pool is created with touchCount = 1 and the current volume. The HTF bonus is applied if confluent.
Step 4 — Volume accumulation: on each confirmed bar, if high or low touches an active zone, the bar's volume is added to that pool's cumVol.
Step 5 — Strength compute: on demand (lazy), the final strength is calculated using the 4-factor formula.
Step 6 — Sweep check: for every active pool, wickSweep (wick beyond the level) and closeBack (close back inside) are evaluated. State becomes MITIGATED if both true; SWEPT if only wickSweep.
Step 7 — Signal generation: if pool strength ≥ minStrengthSignal AND mitigation is confirmed (or Body Reversal is OFF) AND signals are enabled — a BUY/SELL fires.
Step 8 — Risk setup: on a confirmed signal, entry/SL/TP1/TP2/TP3 are constructed, position lock is engaged, and lines + labels are drawn.
Step 9 — Trade tracking: every bar, SL/TP1/TP2/TP3 hits are evaluated with same-bar-misfire protection (justOpened flag).
Step 10 — Break-even: on TP1 first touch (without simultaneous SL hit), SL is moved to entry, the original SL line dims, and the ENTRY label gets a "→ SL (BE)" suffix.
Step 11 — Auto-reset: on SL hit or TP3 hit, all trade-state variables reset, lines are deleted, position = FLAT.
Step 12 — Pruning: when active pools > maxActivePools (default 40), the oldest swept pool is removed first, then the weakest active pool.
📖 HOW TO USE — STEP-BY-STEP FOR NEWCOMERS
🎯 Quick start (5 minutes):
1. Add the indicator to any instrument and any timeframe.
2. Wait 50–100 bars for the warmup period — the indicator needs to accumulate ATR and pivot history.
3. Keep the dashboard ON (default position: Top Right) — it shows how many pools are tracked.
4. Pick a Risk Preset for your style: Scalping for M1–M5, Balanced for M15–H1, Conservative for H4–D1.
5. Create an alert: right-click on the chart → Add alert → Condition: Liquidity Pools Pro → Any alert() function call → Frequency: Once per bar close.
👁️ Reading the chart:
— 🔴 Red box = Sell-Side Liquidity (SSL) = equal highs where long stops sit. Price tends to wick into them to harvest stops.
— 🟢 Green box = Buy-Side Liquidity (BSL) = equal lows where short stops sit.
— 🔢 Number in brackets [58] = pool strength, 0–100. Higher = thicker liquidity.
— ✖ ×3, ×4 = number of touches at this zone. More touches = more reliable.
— 📊 2.5M, 850K = cumulative volume traded at the level.
— ⚪ Dimmed gray box = swept or mitigated pool (already triggered).
— 🟢 "Long" below the bar = buy signal (BSL sweep + reversal).
— 🔴 "Short" above the bar = sell signal (SSL sweep + reversal).
— 🔵 Blue dotted line = ENTRY.
— 🔴 Red solid line = SL (stop-loss).
— 🟢 Green dashed lines = TP1/TP2/TP3. Cyan with ✓ = already hit.
— 🟠 Amber ENTRY label with "→ SL (BE)" = stop has been moved to break-even.
📊 Dashboard fields:
— Symbol / TF: current instrument and timeframe.
— Pivot Len: pivot length (with "(adapt)" tag when Adaptive is ON).
— Active Pools: total active pools and side breakdown (↑ highs, ↓ lows).
— Strong SSL ↑ / Strong BSL ↓: price and strength of the strongest pool on each side.
— Nearest Above / Below: pools closest to current price.
— Stats: Mit:N Sig:M/T — number of mitigations, signals, total pools. If Sig = 0 — lower the sensitivity (see Tuning).
— Position: current trade state (LONG/SHORT/FLAT).
— SL / TP1 / TP2 / TP3: levels of the active trade. ✓ = hit. "BE @" = stop at break-even.
— Plan R:R: TP1 multiplier (1.0R, 1.5R, 2.0R, etc.).
— Risk %: percent risk from entry to SL.
🔧 Tuning guide — when something feels off:
— Too few signals (Stats Sig: 0/N): lower Min Pool Strength for Signal from 25 to 15. Or disable Require Body Reversal — pure wick sweeps will fire.
— Too many signals, lots of noise: raise Min Pool Strength to 40 (only 2-touch pools) or 60 (only strong multi-touch with volume). Enable HTF Confluence.
— Too many zones, chart is crowded: raise Min Strength to Display to 30–40 — weak pools will be hidden but still tracked internally.
— Zones too narrow, false equality: increase Equality Tolerance from 0.25 to 0.40.
— Zones too wide, catching everything: decrease Equality Tolerance to 0.15.
— Stops getting hit too often: switch from Balanced to Conservative (SL 2.5×ATR instead of 1.5×ATR).
— Signals appear but no position opens: a trade is already active (Position Lock). Check the Position row in the dashboard.
— Strange scoring on forex: disable Volume-Weighted Strength (forex often lacks reliable volume data).
💡 TRADING IDEAS
— Manual trading on signals: only take trades where pool strength ≥ 50 and HTF Confluence is enabled.
— Zones only, no signals: disable Enable Sweep Signals and use the indicator as a pure liquidity map for manual setups.
— Scalping setup: preset Scalping + M1–M5 + Min Strength 15 + Adaptive Pivot ON.
— Swing setup: preset Conservative + H4–D1 + Min Strength 50 + HTF Confluence ON (Daily HTF).
— Webhook autotrading: enable Webhook JSON Format + alert.freq_once_per_bar_close + connect a bot to the JSON payload.
— Confluence with other indicators: combine signals with a trend filter (EMA50, SuperTrend) — only longs above EMA50, only shorts below.
⚙️ KEY SETTINGS
🎯 Liquidity Detection:
— Adaptive Pivot Length (default ON): auto-adjust pivot length to volatility.
— Manual Pivot Length (8): used when Adaptive is OFF.
— Right Confirmation Bars (2): bars to the right needed to confirm a pivot.
— Equality Tolerance ×ATR (0.25): level equality threshold.
— Max Pivot Lookback (200): how far back to search for matches.
— Max Active Pools (40): hard cap on simultaneously tracked pools.
💪 Strength Scoring:
— Min Strength to Display (0): pools below this score are hidden (visual only).
— Strength Half-Life (150): bars after which the recency factor halves.
— Volume-Weighted Strength (ON): include the volume factor in scoring.
📡 Sweep Signals:
— Enable Sweep Signals (ON): generate BUY/SELL signals.
— Min Pool Strength for Signal (25): minimum pool strength to fire.
— Require Body Reversal (ON): require close-back inside the level (recommended).
🔭 HTF Confluence:
— Enable HTF Confluence (default OFF): use higher-timeframe pivots as a filter.
— Higher Timeframe (240 = 4H): which HTF to query.
🛡️ Risk Management:
— Risk Preset (Balanced): Conservative / Balanced / Aggressive / Scalping / Custom.
— ATR Length (Risk) (14): ATR period for SL distance.
— Custom SL/TP1/TP2/TP3 ×ATR / ×Risk: manual multipliers.
— Show SL/TP Lines & Labels (ON): draw trade levels on the chart.
— Break-Even After TP1 (ON): auto-trail stop to entry.
— Show % Distance on Labels (ON): append % from entry to SL/TP labels.
🎨 Visual:
— Theme (Auto): Auto / Dark / Light with adaptive contrast.
— Show Liquidity Zones / Strength Bar / Labels / Volume / Swept Zones / Buy-Sell Markers / Watermark: visual toggles.
— Label Font Size / Signal Marker Size: Tiny → Huge.
📊 Dashboard:
— Show Dashboard (ON), Position (Top Right): corner placement.
🔔 Alerts:
— Webhook JSON Format (OFF): JSON or plain text.
— Alert on SL Hit (ON), Alert on TP Hits & BE (OFF): alert toggles.
🎨 Colors:
— Bullish (Demand) Color / Bearish (Supply) Color: zone colors.
🔔 ALERTS
— 🟢 SWEEP BUY — BSL sweep + reversal, payload: ticker, tf, price, sl, tp1, tp2, tp3, rr, pool_strength
— 🔴 SWEEP SELL — SSL sweep + reversal, same payload structure
— 🛑 SL HIT — stop-loss triggered (or 🛡️ BE STOP-OUT when Break-Even is active)
— 🎯 TP1 HIT / 🎯 TP2 HIT / 🏆 TP3 HIT — take-profit hits (only fired when SL didn't trigger on the same bar)
— 🛡️ BREAK-EVEN — stop moved to entry
All alerts support both plain text and JSON webhook formats. All fire on alert.freq_once_per_bar_close — no intra-bar duplicates and no repaint.
⚠️ IMPORTANT NOTES
— 🚫 No repainting. Signals are generated only on barstate.isconfirmed (closed bar). Pivots are confirmed with a right window of rightConfirmInput bars (default 2) — meaning the actual swing point is in the past by N bars, but the indicator does not redraw already-drawn pools. HTF data via request.security uses lookahead_on on the [1] offset bar — a standard non-repainting technique.
— 📐 Warmup period: the first 50+ bars (max(50, atrLenRisk + 10)) the indicator does not generate signals — it accumulates ATR and pivot history.
— ⚖️ Position Lock is not absolute against opposite signals: if the active trade closes on the current bar (SL or TP3 hit), an opposite signal will pass. This is by design — instant two-way blocking is impossible.
— 📊 Volume factor is optional: on forex instruments without reliable volume, disable Volume-Weighted Strength.
— 🛠️ This is an analysis tool, not a trading bot. The indicator detects liquidity zones, scores them, identifies sweeps, and proposes a trade plan — but the decision to open a position is yours. Past performance does not guarantee future results. Test on demo before trading live.
— 🌐 Universal compatibility: works on any instrument (crypto, forex, stocks, indices, futures) and any timeframe (M1 → M).
Version v1.1.5. Fully free. Open-source.
It unifies into a single coherent engine what traders usually have to assemble from 5–7 separate scripts: an adaptive pivot detector, a 4-factor pool scoring system (touches + recency + volume + HTF), sweep detection with close-back confirmation, an ATR-based risk calculator, risk presets, and an informative dashboard.
Works on any instrument (BTC, EURUSD, stocks, indices, futures) and any timeframe without retuning — every threshold is scaled through ATR.
🧩 WHY THESE COMPONENTS WORK TOGETHER
A simple pivot detector just plots dots. A simple sweep signal fires on every wick. A plain ATR stop-loss ignores context. Individually these are noise. Combined, they form a complete mechanism for identifying zones where smart money harvests liquidity, and trading the reversal from them.
Integration chain:
Adaptive Pivot Detection → ATR-based Equality Tolerance → Pool Matching & Clustering → 4-Factor Strength Scoring → HTF Confluence Boost → Sweep Detection (wick + close-back) → Risk Engine (SL/TP/BE) → Position Lock + State Machine → Dashboard + Alerts
— The pivot detector adapts to volatility: length grows when ATR is high (less noise on crypto) and shrinks when ATR is low (faster reaction on forex).
— Tolerance in ATR units lets the engine treat highs/lows as "equal" on any instrument — no manual tick configuration.
— Matching clusters pivots into pools (multiple touches at one zone = thicker liquidity).
— Scoring filters out weak pools and highlights exactly the ones price returns to for stop-runs.
— HTF Confluence adds +20 to strength when a pivot on the higher timeframe aligns — a filter against lower-timeframe traps.
— Sweep is identified as a wick beyond the level + close back inside (classic failed breakout / liquidity grab).
— The risk engine builds a complete trade plan for each signal and trails the stop to break-even after TP1.
— Position Lock prevents opposite signals from silently overwriting the SL/TP of an open position.
Remove any one link and the chain breaks. Sweeps without scoring = noise. Scoring without sweeps = pretty boxes that never trigger. Risk engine without position lock = silent overwrite of an open trade. This pipeline solves all three problems.
🔍 WHAT MAKES IT ORIGINAL
1️⃣ Adaptive Pivot Length — pivot length that adjusts itself to the market.
Most indicators use a fixed pivot length (5, 10, 20). That works on one timeframe of one instrument — and breaks on anything else.
Here the length is computed dynamically:
— volRatio = ATR(14) / ATR(50)
— adaptiveLen = round( clamp( 10 / max(0.5, volRatio), 4, 16 ) )
In high-volatility regimes (volRatio > 1) length shrinks to 4–6 bars — the indicator reacts faster. In low-volatility regimes (volRatio < 1) length grows to 14–16 bars — small noise is filtered out. Can be disabled and set manually (default 8 when Adaptive is OFF).
2️⃣ ATR Equality Tolerance — scale-invariant definition of "equal" levels.
Two pivots are treated as touches of the same liquidity zone if the distance between them ≤ ATR × tolerance (default 0.25).
— 0.15 = strict (tight pools, fewer matches)
— 0.25 = balanced (recommended)
— 0.50 = loose (wider pools, more matches)
This solves a fundamental problem: on BTCUSD, "equal within $50" is normal; on EURUSD the same value is huge. ATR-based tolerance gives one setting that works across all instruments.
3️⃣ 4-factor Strength Score — pool weight on a 0–100 scale.
Every pool is scored as the sum of four components, clamped to 0–100:
— 🎯 Touches (up to 35 points): (touchCount − 1) × 9, capped at 35. One pivot = 0, two = 9, three = 18, four = 27, five+ = 35.
— ⏳ Recency (up to 35 points): 35 × 0.5^(ageBars / halfLife). Fresh pool = 35, after one half-life = 17.5, after two = 8.75. Default halfLife = 150 bars.
— 📊 Volume (up to 20 points): log(max(1, cumVol / median)) × 8, capped at 20. Accumulated on every bar that touches the zone — not just the pivot bar.
— 🔭 HTF Confluence (+20 bonus): if a higher-timeframe pivot exists within tolerance × 1.5 — +20 added to the total.
Examples:
— Fresh 1-touch pool, no volume, no HTF: 0 + 35 + 0 + 0 = 35
— Fresh 2-touch pool: 9 + 35 + 0 + 0 = 44
— Fresh 3-touch pool with 2× median volume: 18 + 35 + 5.5 + 0 = 58.5
— Old (1 half-life) 2-touch pool: 9 + 17.5 + 0 + 0 = 26.5
4️⃣ Sweep Detection with close-back confirmation — real liquidity grabs, not false wicks.
Pool state transitions follow strict logic:
— STATE_ACTIVE → STATE_SWEPT: wick pierced the level but bar closed beyond it (this is a breakout, not a reversal)
— STATE_ACTIVE → STATE_MITIGATED: wick pierced AND bar closed back inside (real liquidity sweep)
The default signal (Require Body Reversal = ON) only fires on MITIGATED. This is classic SMC "fakeout → reversal" logic. Disable it and any wick sweep will fire (more aggressive, more noise).
5️⃣ Volume-at-Level Accumulation — real volume at the level, not just at the pivot.
Most indicators count volume only on the pivot bar. That's misleading — true liquidity accumulates across all the touches.
Here, on every confirmed bar the engine checks for a zone touch (high or low inside levelBot–levelTop), and if found, adds the bar's volume to the pool's cumVol. Across 40 active pools this is O(P) per bar — fast.
6️⃣ HTF Confluence Engine — higher-timeframe pivots as a filter.
When enabled, pivots from the configured HTF (default 4H) are requested via request.security with lookahead_on on a closed bar (no repaint). If a pool aligns with an HTF pivot within tolerance × 1.5 — +20 is added to its score.
Used to filter signals: HTF-confluent pools cross the strength threshold faster.
7️⃣ 5 Risk Presets + Custom — ready-made SL/TP per trading style.
— Conservative: SL 2.5×ATR, TP 1R/2R/4R
— Balanced: SL 1.5×ATR, TP 1R/2R/3R (default)
— Aggressive: SL 1.0×ATR, TP 1.5R/2.5R/4R
— Scalping: SL 0.8×ATR, TP 0.8R/1.5R/2R
— Custom: manual multipliers
Calculation:
— slDistance = ATR(14) × slMult
— entry = close on the signal bar
— SL = entry ∓ slDistance
— TP1/2/3 = entry ± slDistance × tpMult
8️⃣ Automatic Break-Even after TP1 — stop trails to entry on its own.
After TP1 is touched (and SL didn't fire on the same bar), the active SL is moved to entry. From that point on, any pullback to entry = break-even exit. TP2/TP3 logic continues to track.
Edge case is handled: if both TP1 and SL fire on the same bar, the stop is evaluated against the ORIGINAL value (effectiveSL captured before the BE update). No "magic" loss-saving.
9️⃣ Position Lock — protection against silent trade overwrites.
While a trade is active (activeDir ≠ 0), new signals are blocked. Exception: if the current bar is closing the position (SL or TP3 hit), it's treated as "closing now" and an opposite signal is allowed through.
Without this protection, a fresh signal would silently overwrite the SL/TP of an open position — critical for both manual trading and webhook-based autotrading.
🔟 Pro-style visuals with adaptive contrast.
— Liquidity zones: colored boxes with transparency tied to strength (transparency = 88 − strength × 0.33)
— Mid-line: dotted line through the center of each zone
— Pool labels: SSL/BSL × touch count [strength] volume
— SL: solid red line (dims when BE activates)
— Entry: dotted blue
— TP1/2/3: dashed green (turn cyan + ✓ when hit)
— Themes: Auto/Dark/Light with WCAG AA contrast on every background
1️⃣1️⃣ Full alert suite for autotrading — JSON or plain text.
Every signal and trade event triggers alert() in one of two formats:
— Plain text: "🟢 SWEEP BUY | TICKER | TF | Price: X | Pool: 58/100 | SL: ... | TP1: ... | TP2: ... | TP3: ... | R:R: 1.0"
— JSON for webhooks: {"action":"buy","ticker":...,"tf":...,"price":...,"sl":...,"tp1":...,"tp2":...,"tp3":...,"rr":...,"pool_strength":...}
All alerts use alert.freq_once_per_bar_close (no intra-bar duplicates).
⚙️ HOW IT WORKS — CALCULATION FLOW
Step 1 — Pivot detection: on each bar, ta.pivothigh and ta.pivotlow are evaluated with the dynamic left length (adaptiveLen) and the configured right confirmation.
Step 2 — Matching: each new pivot is compared against all active pools of the same type (high/low). If distance ≤ tolerance AND age ≤ maxLookback, it's added as a new touch (level is recalculated as a weighted average).
Step 3 — Pool creation: if no match is found, a new pool is created with touchCount = 1 and the current volume. The HTF bonus is applied if confluent.
Step 4 — Volume accumulation: on each confirmed bar, if high or low touches an active zone, the bar's volume is added to that pool's cumVol.
Step 5 — Strength compute: on demand (lazy), the final strength is calculated using the 4-factor formula.
Step 6 — Sweep check: for every active pool, wickSweep (wick beyond the level) and closeBack (close back inside) are evaluated. State becomes MITIGATED if both true; SWEPT if only wickSweep.
Step 7 — Signal generation: if pool strength ≥ minStrengthSignal AND mitigation is confirmed (or Body Reversal is OFF) AND signals are enabled — a BUY/SELL fires.
Step 8 — Risk setup: on a confirmed signal, entry/SL/TP1/TP2/TP3 are constructed, position lock is engaged, and lines + labels are drawn.
Step 9 — Trade tracking: every bar, SL/TP1/TP2/TP3 hits are evaluated with same-bar-misfire protection (justOpened flag).
Step 10 — Break-even: on TP1 first touch (without simultaneous SL hit), SL is moved to entry, the original SL line dims, and the ENTRY label gets a "→ SL (BE)" suffix.
Step 11 — Auto-reset: on SL hit or TP3 hit, all trade-state variables reset, lines are deleted, position = FLAT.
Step 12 — Pruning: when active pools > maxActivePools (default 40), the oldest swept pool is removed first, then the weakest active pool.
📖 HOW TO USE — STEP-BY-STEP FOR NEWCOMERS
🎯 Quick start (5 minutes):
1. Add the indicator to any instrument and any timeframe.
2. Wait 50–100 bars for the warmup period — the indicator needs to accumulate ATR and pivot history.
3. Keep the dashboard ON (default position: Top Right) — it shows how many pools are tracked.
4. Pick a Risk Preset for your style: Scalping for M1–M5, Balanced for M15–H1, Conservative for H4–D1.
5. Create an alert: right-click on the chart → Add alert → Condition: Liquidity Pools Pro → Any alert() function call → Frequency: Once per bar close.
👁️ Reading the chart:
— 🔴 Red box = Sell-Side Liquidity (SSL) = equal highs where long stops sit. Price tends to wick into them to harvest stops.
— 🟢 Green box = Buy-Side Liquidity (BSL) = equal lows where short stops sit.
— 🔢 Number in brackets [58] = pool strength, 0–100. Higher = thicker liquidity.
— ✖ ×3, ×4 = number of touches at this zone. More touches = more reliable.
— 📊 2.5M, 850K = cumulative volume traded at the level.
— ⚪ Dimmed gray box = swept or mitigated pool (already triggered).
— 🟢 "Long" below the bar = buy signal (BSL sweep + reversal).
— 🔴 "Short" above the bar = sell signal (SSL sweep + reversal).
— 🔵 Blue dotted line = ENTRY.
— 🔴 Red solid line = SL (stop-loss).
— 🟢 Green dashed lines = TP1/TP2/TP3. Cyan with ✓ = already hit.
— 🟠 Amber ENTRY label with "→ SL (BE)" = stop has been moved to break-even.
📊 Dashboard fields:
— Symbol / TF: current instrument and timeframe.
— Pivot Len: pivot length (with "(adapt)" tag when Adaptive is ON).
— Active Pools: total active pools and side breakdown (↑ highs, ↓ lows).
— Strong SSL ↑ / Strong BSL ↓: price and strength of the strongest pool on each side.
— Nearest Above / Below: pools closest to current price.
— Stats: Mit:N Sig:M/T — number of mitigations, signals, total pools. If Sig = 0 — lower the sensitivity (see Tuning).
— Position: current trade state (LONG/SHORT/FLAT).
— SL / TP1 / TP2 / TP3: levels of the active trade. ✓ = hit. "BE @" = stop at break-even.
— Plan R:R: TP1 multiplier (1.0R, 1.5R, 2.0R, etc.).
— Risk %: percent risk from entry to SL.
🔧 Tuning guide — when something feels off:
— Too few signals (Stats Sig: 0/N): lower Min Pool Strength for Signal from 25 to 15. Or disable Require Body Reversal — pure wick sweeps will fire.
— Too many signals, lots of noise: raise Min Pool Strength to 40 (only 2-touch pools) or 60 (only strong multi-touch with volume). Enable HTF Confluence.
— Too many zones, chart is crowded: raise Min Strength to Display to 30–40 — weak pools will be hidden but still tracked internally.
— Zones too narrow, false equality: increase Equality Tolerance from 0.25 to 0.40.
— Zones too wide, catching everything: decrease Equality Tolerance to 0.15.
— Stops getting hit too often: switch from Balanced to Conservative (SL 2.5×ATR instead of 1.5×ATR).
— Signals appear but no position opens: a trade is already active (Position Lock). Check the Position row in the dashboard.
— Strange scoring on forex: disable Volume-Weighted Strength (forex often lacks reliable volume data).
💡 TRADING IDEAS
— Manual trading on signals: only take trades where pool strength ≥ 50 and HTF Confluence is enabled.
— Zones only, no signals: disable Enable Sweep Signals and use the indicator as a pure liquidity map for manual setups.
— Scalping setup: preset Scalping + M1–M5 + Min Strength 15 + Adaptive Pivot ON.
— Swing setup: preset Conservative + H4–D1 + Min Strength 50 + HTF Confluence ON (Daily HTF).
— Webhook autotrading: enable Webhook JSON Format + alert.freq_once_per_bar_close + connect a bot to the JSON payload.
— Confluence with other indicators: combine signals with a trend filter (EMA50, SuperTrend) — only longs above EMA50, only shorts below.
⚙️ KEY SETTINGS
🎯 Liquidity Detection:
— Adaptive Pivot Length (default ON): auto-adjust pivot length to volatility.
— Manual Pivot Length (8): used when Adaptive is OFF.
— Right Confirmation Bars (2): bars to the right needed to confirm a pivot.
— Equality Tolerance ×ATR (0.25): level equality threshold.
— Max Pivot Lookback (200): how far back to search for matches.
— Max Active Pools (40): hard cap on simultaneously tracked pools.
💪 Strength Scoring:
— Min Strength to Display (0): pools below this score are hidden (visual only).
— Strength Half-Life (150): bars after which the recency factor halves.
— Volume-Weighted Strength (ON): include the volume factor in scoring.
📡 Sweep Signals:
— Enable Sweep Signals (ON): generate BUY/SELL signals.
— Min Pool Strength for Signal (25): minimum pool strength to fire.
— Require Body Reversal (ON): require close-back inside the level (recommended).
🔭 HTF Confluence:
— Enable HTF Confluence (default OFF): use higher-timeframe pivots as a filter.
— Higher Timeframe (240 = 4H): which HTF to query.
🛡️ Risk Management:
— Risk Preset (Balanced): Conservative / Balanced / Aggressive / Scalping / Custom.
— ATR Length (Risk) (14): ATR period for SL distance.
— Custom SL/TP1/TP2/TP3 ×ATR / ×Risk: manual multipliers.
— Show SL/TP Lines & Labels (ON): draw trade levels on the chart.
— Break-Even After TP1 (ON): auto-trail stop to entry.
— Show % Distance on Labels (ON): append % from entry to SL/TP labels.
🎨 Visual:
— Theme (Auto): Auto / Dark / Light with adaptive contrast.
— Show Liquidity Zones / Strength Bar / Labels / Volume / Swept Zones / Buy-Sell Markers / Watermark: visual toggles.
— Label Font Size / Signal Marker Size: Tiny → Huge.
📊 Dashboard:
— Show Dashboard (ON), Position (Top Right): corner placement.
🔔 Alerts:
— Webhook JSON Format (OFF): JSON or plain text.
— Alert on SL Hit (ON), Alert on TP Hits & BE (OFF): alert toggles.
🎨 Colors:
— Bullish (Demand) Color / Bearish (Supply) Color: zone colors.
🔔 ALERTS
— 🟢 SWEEP BUY — BSL sweep + reversal, payload: ticker, tf, price, sl, tp1, tp2, tp3, rr, pool_strength
— 🔴 SWEEP SELL — SSL sweep + reversal, same payload structure
— 🛑 SL HIT — stop-loss triggered (or 🛡️ BE STOP-OUT when Break-Even is active)
— 🎯 TP1 HIT / 🎯 TP2 HIT / 🏆 TP3 HIT — take-profit hits (only fired when SL didn't trigger on the same bar)
— 🛡️ BREAK-EVEN — stop moved to entry
All alerts support both plain text and JSON webhook formats. All fire on alert.freq_once_per_bar_close — no intra-bar duplicates and no repaint.
⚠️ IMPORTANT NOTES
— 🚫 No repainting. Signals are generated only on barstate.isconfirmed (closed bar). Pivots are confirmed with a right window of rightConfirmInput bars (default 2) — meaning the actual swing point is in the past by N bars, but the indicator does not redraw already-drawn pools. HTF data via request.security uses lookahead_on on the [1] offset bar — a standard non-repainting technique.
— 📐 Warmup period: the first 50+ bars (max(50, atrLenRisk + 10)) the indicator does not generate signals — it accumulates ATR and pivot history.
— ⚖️ Position Lock is not absolute against opposite signals: if the active trade closes on the current bar (SL or TP3 hit), an opposite signal will pass. This is by design — instant two-way blocking is impossible.
— 📊 Volume factor is optional: on forex instruments without reliable volume, disable Volume-Weighted Strength.
— 🛠️ This is an analysis tool, not a trading bot. The indicator detects liquidity zones, scores them, identifies sweeps, and proposes a trade plan — but the decision to open a position is yours. Past performance does not guarantee future results. Test on demo before trading live.
— 🌐 Universal compatibility: works on any instrument (crypto, forex, stocks, indices, futures) and any timeframe (M1 → M).
Version v1.1.5. Fully free. Open-source.
ملاحظات الأخبار
v1.2.0🐛 FIXES
• Exit alerts now actually fire. "SL Hit" and "BE Stop-Out" alerts were never sent: position state was cleared before the alert block was evaluated. The TP3 alert had the same root cause and could print a zeroed price. All exit alerts now use pre-reset snapshots and carry correct prices.
• A trade closed on the same bar a new signal appears is no longer silently swallowed — its close-out is reported before the new entry.
• When a buy and a sell signal land on the same bar (two opposite pools swept), only the alert for the trade that actually opens is sent. Previously both fired, and the second one described a position that did not exist.
⚙️ NEW: SL PLACEMENT MODE
• New "SL Placement" input: ATR (classic, unchanged default) or Sweep Wick.
• Sweep Wick puts the stop behind the wick of the sweep bar plus a buffer, tying invalidation to structure instead of a fixed ATR distance: if price violates the swept extreme again, the failed-breakout idea is broken.
• New "Wick Buffer (×ATR)" input (default 0.25) protects from stop-runs that pierce the wick by a hair.
• TP1/TP2/TP3 remain R-multiples of the ACTUAL stop distance in both modes, so the "×Risk" semantics of the TP inputs is preserved.
• Safety floor: if the wick distance comes out below 0.1×ATR, the ATR distance is used instead.
🔔 NEW: WEBHOOK-READY EXIT ALERTS
• Webhook JSON Format now applies to every event, not just entries. A bot that opened a position from an entry alert can now manage and close it.
• Every alert carries a trade "id", linking exits back to their entry.
• Exit events (sl_hit, be_stop, tp3_hit) are sent as "action":"exit"; running-trade events (tp1_hit, tp2_hit, break_even) as "action":"update" — a bot can route on one field.
• Entry JSON now includes a "qty" field with the calculated position size.
Entry payload:
{"action":"buy","event":"entry","id":12,"qty":0.0154,"ticker":"BYBIT:BTCUSDT.P","tf":"60","price":64200,"sl":63700,"tp1":64700,"tp2":65200,"tp3":65700,"rr":1.0,"pool_strength":58}
Exit payload:
{"action":"exit","event":"sl_hit","id":12,"ticker":"BYBIT:BTCUSDT.P","tf":"60","entry":64200,"price":63700}
📊 NEW: POSITION SIZE ON THE DASHBOARD
• New "Account Size ($)" and "Risk per Trade (%)" inputs feed a new "Pos Size" dashboard row showing the position size and the cash at risk, e.g. 0.0154 ($100).
• Size is derived from the original entry-to-stop distance, so it stays correct after the stop moves to break-even.
• These inputs affect the dashboard and the alert "qty" field only — signal logic is untouched.
⚠️ PLEASE NOTE
• The two alert toggles were reorganized by meaning: "Alert on Position Close" (SL / BE stop-out / TP3 — ON by default) and "Alert on TP1/TP2 & BE Updates" (OFF by default). Previously the TP3 exit was hidden behind the noisy TP toggle, which is off by default — a bot could be left holding a position that had already closed on the chart. Because these inputs were renamed, your saved values for them reset to defaults: re-check them once after updating.
• Existing setups are unaffected otherwise — with SL Placement left on "ATR", signal and trade logic is identical to v1.1.5.
نص برمجي مفتوح المصدر
بروح TradingView الحقيقية، قام مبتكر هذا النص البرمجي بجعله مفتوح المصدر، بحيث يمكن للمتداولين مراجعة وظائفه والتحقق منها. شكرا للمؤلف! بينما يمكنك استخدامه مجانًا، تذكر أن إعادة نشر الكود يخضع لقواعد الموقع الخاصة بنا.
10 years in trading. For all inquiries, contact me on my Telegram channel: t.me/WillyAlgoTrader or Instagram: @willytraderbtc
إخلاء المسؤولية
لا يُقصد بالمعلومات والمنشورات أن تكون، أو تشكل، أي نصيحة مالية أو استثمارية أو تجارية أو أنواع أخرى من النصائح أو التوصيات المقدمة أو المعتمدة من TradingView. اقرأ المزيد في شروط الاستخدام.
نص برمجي مفتوح المصدر
بروح TradingView الحقيقية، قام مبتكر هذا النص البرمجي بجعله مفتوح المصدر، بحيث يمكن للمتداولين مراجعة وظائفه والتحقق منها. شكرا للمؤلف! بينما يمكنك استخدامه مجانًا، تذكر أن إعادة نشر الكود يخضع لقواعد الموقع الخاصة بنا.
10 years in trading. For all inquiries, contact me on my Telegram channel: t.me/WillyAlgoTrader or Instagram: @willytraderbtc
إخلاء المسؤولية
لا يُقصد بالمعلومات والمنشورات أن تكون، أو تشكل، أي نصيحة مالية أو استثمارية أو تجارية أو أنواع أخرى من النصائح أو التوصيات المقدمة أو المعتمدة من TradingView. اقرأ المزيد في شروط الاستخدام.