Reaction Level Matrix [WillyAlgoTrader]

📊 Reaction Level Matrix is an overlay indicator that builds support and resistance levels from the swings where price actually reacted, grades every level on an absolute 0–100 score, and fires rejection signals only at the levels nearest to price. Each signal is turned into a complete trade plan: entry, stop-loss, three take-profits, break-even management and live statistics.
Ever drawn a "strong" level, only to notice later that price barely reacted there? Or kept watching a level that quietly stopped mattering months ago? Most level tools simply count touches. A wick that grazed a price once weighs the same as a swing that launched a multi-ATR rally, and a level from five hundred bars ago looks as important as yesterday's.
The core insight: a level is only as strong as the reactions it produced. Reaction Level Matrix weighs every swing by how far price moved away from it, lets strength fade when a level is no longer defended, penalizes it when price closes through, and rewards levels that have worked as both support and resistance. What stays on your chart is a short list of levels that earned their place, plus a clear rule for when price is actually rejecting them.
🧩 WHY THESE COMPONENTS WORK TOGETHER
Swing-based support and resistance tools answer "where did price turn?", but not "how much did it matter?", "does it still matter?" or "is price rejecting it right now?". Touch counters overrate noisy levels, fixed-lookback tools forget history abruptly, and signal tools fire at every line on the chart.
Reaction Level Matrix links these questions into one pipeline:
Swing confirmation → Reaction measurement → Online level clustering → Strength aging & cross penalty → Absolute 0–100 score → Nearest-level selection → Rejection signal → Trade engine → Statistics
The reaction measurement gives every touch a meaningful weight. Online clustering turns weighted swings into a band whose center and width follow the actual touches. Aging and the cross penalty keep the score current, so it reflects what a level has done lately, not only what it did once. Nearest-level selection keeps attention on the levels price can reach. The rejection rule requires price to approach from the correct side, enter the band and leave it with a strong close. The trade engine converts each confirmed rejection into a full plan, and the statistics show how those plans played out on the loaded history.
Without reaction weights, a noise level scores like a major one. Without aging, stale levels crowd out fresh ones. Without the approach and close rules, every wick into a band would be a signal. Without the trade engine, a signal would tell you where to look, but not where you are wrong or where to take profit.
🔍 WHAT MAKES IT ORIGINAL
1️⃣ Reaction-weighted touches — not every swing counts the same.
When a swing is confirmed, the indicator measures how far price travelled away from it during the confirmation bars, in ATR at the swing bar:
— Swing high: reaction = (swing high − lowest low of the next N bars) / ATR
— Swing low: reaction = (highest high of the next N bars − swing low) / ATR
— Touch weight: w = 1 + min(reaction, 2.5)
N is the Swing Length (default 6). The structure ATR uses a fixed 34-bar period. A swing that price abandoned by 2.5 ATR or more adds 3.5 to its level; a swing that barely moved adds about 1.
Why this matters: the size of the reaction is the market's own vote on how important a price was.
2️⃣ Online level engine — levels grow, move and merge as the market prints swings.
Every confirmed swing either joins the level whose center is nearest within the Level Tolerance (default 0.6 × ATR) or opens a new level. Each level keeps weighted sums of its member swings:
— Center = sum(w × price) / sum(w)
— Band half-width = sqrt(sum(w × price^2) / sum(w) − center^2), clamped between 0.15 × ATR and Level Tolerance × ATR
When a touch widens a band so that it overlaps another level, the two merge: touches, weights and history add up. Memory is capped at 60 levels; when it is full, the weakest level is dropped.
Why this matters: the band shows where the swings actually are, pulled toward the strongest reactions, instead of a fixed-width box around one price.
3️⃣ Absolute 0–100 level score — with aging and a cross penalty.
Each level carries a strength S:
— every touch: S = S + w
— every bar: S = S × 0.5^(1 / H), where H is the Level Half-Life (default 500 bars)
— every close through an active level: S = S × 0.7
— a level that decays below 0.25 is forgotten
The score maps strength onto a fixed scale:
Score = 100 × (1 − exp(−S × P / 6))
where P is the polarity bonus (see 4️⃣). Without polarity: S = 4 → 49, S = 6 → 63, S = 10 → 81.
Why this matters: the score is absolute, not relative to other levels on the chart. A 70 means the same on BTC 5M and on EURUSD Daily, and a weak level cannot look like the "strongest" just because its neighbours are weaker still.
4️⃣ Polarity levels ⇅ — levels that were both floor and ceiling.
A level touched by both swing highs and swing lows has worked as support and as resistance. Such levels get P = 1.25 in the score and are marked ⇅ on the chart. Example: S = 6 scores 63 as a one-sided level and 71 as a polarity level.
Why this matters: role-reversal levels are the ones traders watch hardest, so they are highlighted instead of being counted like any other touch.
5️⃣ Role by price position — support and resistance are not fixed labels.
A level has no permanent type. Its role follows the last close outside its band:
— 🟢 close above the band → the level acts as support
— 🔴 close below the band → the level acts as resistance
— 🟡 close inside the band → the role stays as it was
A change of role is a level break. Breaks of the levels shown on the chart set the dashboard Trend (up through resistance = Bullish, down through support = Bearish) and can trigger informational alerts.
6️⃣ Nearest-level focus — only the levels price can actually reach.
Out of all active levels (default: at least 2 touches), the indicator shows the N nearest above price and the N nearest below (default 3 + 3). Only shown levels can produce signals.
Why this matters: a strong level far from price is information, not a trade. Six levels on the chart keep your attention on the ones in play.
7️⃣ Rejection signal — four conditions on a confirmed bar.
A 🟢 Long ▲ fires at a shown support level when, on bar close:
— Approach: the level was already support before this bar, so price came from above
— Touch: low ≤ top of the band
— Hold: close > top of the band
— Strong close: (close − low) / (high − low) ≥ Rejection Close Strength (default 0.6)
The level must also score at least the Min Level Score (default 50), and at least Cooldown bars (default 10) must have passed since the last signal at that level. A 🔴 Short ▼ is the exact mirror at resistance.
A bar that breaks a level cannot signal a retest of that level on the same bar, and one bar cannot produce both a long and a short.
8️⃣ Built-in trade engine — every signal becomes a complete plan.
— One position at a time. A signal opens a trade when flat, reverses an opposite trade, and is ignored while a trade in the same direction is open.
— Stop-loss, Wick-Anchored (default): min(low − 0.25 × ATR, close − 0.5 × ATR) for longs, mirrored for shorts. ATR mode: entry ∓ SL Multiplier × ATR. The risk ATR has its own length (default 14).
— Take-profits: TPn = entry ± risk × multiple, where risk is the actual stop distance. Presets: Conservative 1R / 2R / 4R, Balanced 1R / 2R / 3R, Aggressive 1.5R / 2.5R / 4R, Scalping 0.8R / 1.5R / 2R, or Custom.
— Break-even: after TP1 the stop moves to entry (plus an optional offset in ATR). A stop moved on a bar cannot close the trade on that same bar.
— Levels are never checked on the entry bar. TP1 and TP2 are recorded; only TP3, the stop or a reversal close the trade.
9️⃣ Transparent statistics — defined, disclosed, filterable.
A trade counts as a win once TP1 is touched: a TP3 exit, a break-even stop after TP1, or a reversal after TP1. A trade closed before TP1 is a loss. Win rate = wins / (wins + losses) × 100, shown with a ▰▱ gauge, a Form strip of the last 10 trades, and a period switch: 24 Hours, 30 Days or All-Time. When TP and SL are both touched inside one bar, TP gets priority; this optimistic fill model is disclosed in the notes below.
🧠 HOW IT WORKS — CALCULATION FLOW
Step 1 — Swing confirmation: A swing high or low is confirmed Swing Length bars after its extreme, with equal left and right lookback. All state updates happen on bar close.
Step 2 — Level maintenance: Every stored level decays by its half-life factor, updates its role from the close and registers a break if the role changed. A broken active level loses 30% of its strength.
Step 3 — Reaction and weight: The newly confirmed swing gets its reaction measured and its weight w calculated.
Step 4 — Clustering: The swing joins the nearest level within tolerance, the band is refit and overlapping levels are merged; otherwise a new level starts. When memory is full, the weakest level is dropped.
Step 5 — Scoring and selection: Scores are recalculated and the nearest active levels above and below price are selected for display and signals.
Step 6 — Signal check: The rejection rules run against the selected levels.
Step 7 — Trade management: TP touches, break-even, stop-outs, TP3 exits and reversals are resolved in a fixed order, then a new trade opens if a signal fired.
Step 8 — Output: Levels, entry markers, trade lines, dashboard and alerts are updated.
📖 HOW TO USE
🎯 Quick start:
1. Add the indicator. The defaults are a balanced starting point on any symbol and timeframe.
2. Look at the levels above and below price and hover a label to see how each level earned its score.
3. Wait for a Long ▲ or Short ▼ on bar close: entry, stop and three targets appear right away.
4. Pick the Risk Preset that fits your style.
5. Create one alert with "Any alert() function call" to receive every event.
👁️ Reading the chart:
— 🟢 Green bands = levels below price acting as support
— 🔴 Red bands = levels above price acting as resistance
— Label "71 · 5T ⇅" = score 71/100, 5 touches, polarity level
— Hover a level label = score, touches from highs and lows, number of breaks, band limits, date of the first touch
— Dotted center line = weighted center of the level
— 🟢 Long ▲ / 🔴 Short ▼ = trade entries; hover for score, level, RSI, SL and TP1
— Filled ENTRY / SL / TP1–TP3 labels with % distance from entry
— ✓ Teal TP label = target reached
— 🛡️ Dimmed SL and orange "ENTRY → SL (BE)" = stop moved to break-even
— Trade lines stay on the chart after the trade closes, as a record, until the next entry
📊 Dashboard fields:
— Header: current trend, colored by direction
— Market: Trend, Age (bars since the trend changed), HTF Bias, Position, Last Signal with score and bars ago, Timeframe
— Levels: nearest Resistance and Support with distance and score, number of Shown levels, Last Break
— Trade: Entry, SL (or "BE @"), TP1–TP3 with ✓, R:R, SL distance in %; "Flat · waiting for signal" when no trade is open
— Stats: Trades, Wins, Losses, Win Rate with gauge, Form, for the selected period
Every section can be switched off individually.
🔧 Tuning guide:
— Nearby swings merge into wide bands: lower Level Tolerance to 0.4–0.5
— Levels look noisy: raise Swing Length to 8–10 or Touches to Activate to 3
— Older levels disappear too fast: raise Level Half-Life to 1000 or more
— Too many signals: raise Min Level Score to 60–70 or Rejection Close Strength to 0.7
— Too few signals: lower Min Level Score to 40 or show more levels per side
— Stops feel too tight: switch SL Mode to ATR and use the Conservative preset
💡 Trading ideas:
— Polarity retest: watch ⇅ levels right after a break, when former resistance is tested as support or the other way round
— Stricter on lower timeframes: swings are noisier there, so a higher Min Level Score keeps only the cleaner levels
— Higher-timeframe context: set an HTF Bias timeframe and give more attention to signals in its direction; the bias is shown, not used as a filter
⚙️ KEY SETTINGS
⚙️ Main Settings:
— Swing Length (default 6): bars on each side of a swing, equals the confirmation delay
— Level Tolerance (default 0.6 × ATR): join distance and maximum band half-width
— Touches to Activate (default 2): swings needed before a level is shown
— Level Half-Life (default 500 bars): strength halves after this many bars without touches
— Levels Above / Below Price (default 3): shown levels per side
— HTF Bias Timeframe (default off): higher-timeframe bias in the dashboard
🎨 Visual Settings:
— Theme (default Auto): Auto, Dark or Light palette
— Show Levels (on), Draw Levels From First Touch (on), Show Level Score (on)
— Level Transparency (default 0 = Auto: 88 on dark, 82 on light)
— Show Buy/Sell Labels (on) and font sizes for signal, SL/TP and level labels
— Show Watermark (on)
🔍 Filters:
— Min Level Score for Signals (default 50)
— Rejection Close Strength (default 0.6)
— Cooldown per Level (default 10 bars)
🛡️ Risk Management:
— Risk Preset (default Balanced)
— SL Mode (default Wick-Anchored) and ATR Length (default 14)
— SL / TP1 / TP2 / TP3 Multipliers (Custom preset: 1.5 × ATR, 1R / 2R / 3R)
— Break-Even After TP1 (on) and BE Offset (default 0 × ATR)
— Show SL/TP Lines, Labels and % Distance (on); line styles: Entry dotted, SL solid, TP dashed
📊 Dashboard:
— Show Dashboard (on), Position (default Top Right), Font Size (default Small)
— Market, Levels, Trade and Stats section toggles
— Win Rate Period (default All-Time)
🔔 Alerts:
— Webhook JSON Format (off), Alert on Level Breaks (on), Alert on SL Hit & Reversal (on), Alert on TP & Break-Even (on)
Invalid combinations, such as TP1 ≥ TP2 in the Custom preset or an HTF below the chart timeframe, stop the script with a clear message instead of silently producing wrong results.
🔔 ALERTS
Create one alert with the condition "Any alert() function call". Alerts fire once per bar close, in the order the events happen inside the bar:
— 🛡️ BREAK-EVEN — direction and new stop
— 🎯 TP1 HIT / 🎯🎯 TP2 HIT — direction and target
— 🏆 TP3 HIT — entry and final target
— 🛑 SL HIT / 🛡️ BE STOP-OUT — entry and stop
— 🔄 REVERSAL — old and new direction, win or loss, exit price
— 🟢 LONG / 🔴 SHORT — ticker, timeframe, price, score, SL, TP1–TP3, R:R
— 🔼 LEVEL BROKEN UP / 🔽 LEVEL BROKEN DOWN — level and price (informational)
Entry alerts support plain text and JSON webhook format. All alerts are bar-close confirmed.
⚠️ IMPORTANT NOTES
— 🚫 No repainting of signals. Swings are confirmed with equal left and right lookback, so a swing is registered Swing Length bars after its extreme. This is delayed confirmation, not repainting of future values. Level updates, breaks, signals, trades and alerts run only on confirmed bars, and alerts fire once per bar close. The HTF bias reads the previous closed higher-timeframe bar.
— 📐 Levels are drawn on the last bar with their current geometry. A historical signal was calculated with the levels known at that moment, so an older marker can sit next to a level that was refined later.
— ⏳ No signals appear during the warm-up period: the first 34 bars, or 2 × Swing Length + 1 if that is longer.
— 📊 Statistics are calculated on the loaded chart history and reset when the chart reloads or settings change. They use an optimistic intrabar fill model (TP priority) and include no fees, slippage or position sizing. They describe how the rules behaved, not a backtest. Past performance does not guarantee future results.
— ⚖️ The score describes how a level behaved in the past, not the probability that it will hold next time.
— 🛠️ This is a level analysis and trade-planning tool, not an automated trading bot. It builds and scores levels, marks rejections and lays out the stop and targets — trade decisions remain yours.
— 🌐 Works on all markets and timeframes. The level engine uses price only, so instruments without volume data work the same way.
Ever drawn a "strong" level, only to notice later that price barely reacted there? Or kept watching a level that quietly stopped mattering months ago? Most level tools simply count touches. A wick that grazed a price once weighs the same as a swing that launched a multi-ATR rally, and a level from five hundred bars ago looks as important as yesterday's.
The core insight: a level is only as strong as the reactions it produced. Reaction Level Matrix weighs every swing by how far price moved away from it, lets strength fade when a level is no longer defended, penalizes it when price closes through, and rewards levels that have worked as both support and resistance. What stays on your chart is a short list of levels that earned their place, plus a clear rule for when price is actually rejecting them.
🧩 WHY THESE COMPONENTS WORK TOGETHER
Swing-based support and resistance tools answer "where did price turn?", but not "how much did it matter?", "does it still matter?" or "is price rejecting it right now?". Touch counters overrate noisy levels, fixed-lookback tools forget history abruptly, and signal tools fire at every line on the chart.
Reaction Level Matrix links these questions into one pipeline:
Swing confirmation → Reaction measurement → Online level clustering → Strength aging & cross penalty → Absolute 0–100 score → Nearest-level selection → Rejection signal → Trade engine → Statistics
The reaction measurement gives every touch a meaningful weight. Online clustering turns weighted swings into a band whose center and width follow the actual touches. Aging and the cross penalty keep the score current, so it reflects what a level has done lately, not only what it did once. Nearest-level selection keeps attention on the levels price can reach. The rejection rule requires price to approach from the correct side, enter the band and leave it with a strong close. The trade engine converts each confirmed rejection into a full plan, and the statistics show how those plans played out on the loaded history.
Without reaction weights, a noise level scores like a major one. Without aging, stale levels crowd out fresh ones. Without the approach and close rules, every wick into a band would be a signal. Without the trade engine, a signal would tell you where to look, but not where you are wrong or where to take profit.
🔍 WHAT MAKES IT ORIGINAL
1️⃣ Reaction-weighted touches — not every swing counts the same.
When a swing is confirmed, the indicator measures how far price travelled away from it during the confirmation bars, in ATR at the swing bar:
— Swing high: reaction = (swing high − lowest low of the next N bars) / ATR
— Swing low: reaction = (highest high of the next N bars − swing low) / ATR
— Touch weight: w = 1 + min(reaction, 2.5)
N is the Swing Length (default 6). The structure ATR uses a fixed 34-bar period. A swing that price abandoned by 2.5 ATR or more adds 3.5 to its level; a swing that barely moved adds about 1.
Why this matters: the size of the reaction is the market's own vote on how important a price was.
2️⃣ Online level engine — levels grow, move and merge as the market prints swings.
Every confirmed swing either joins the level whose center is nearest within the Level Tolerance (default 0.6 × ATR) or opens a new level. Each level keeps weighted sums of its member swings:
— Center = sum(w × price) / sum(w)
— Band half-width = sqrt(sum(w × price^2) / sum(w) − center^2), clamped between 0.15 × ATR and Level Tolerance × ATR
When a touch widens a band so that it overlaps another level, the two merge: touches, weights and history add up. Memory is capped at 60 levels; when it is full, the weakest level is dropped.
Why this matters: the band shows where the swings actually are, pulled toward the strongest reactions, instead of a fixed-width box around one price.
3️⃣ Absolute 0–100 level score — with aging and a cross penalty.
Each level carries a strength S:
— every touch: S = S + w
— every bar: S = S × 0.5^(1 / H), where H is the Level Half-Life (default 500 bars)
— every close through an active level: S = S × 0.7
— a level that decays below 0.25 is forgotten
The score maps strength onto a fixed scale:
Score = 100 × (1 − exp(−S × P / 6))
where P is the polarity bonus (see 4️⃣). Without polarity: S = 4 → 49, S = 6 → 63, S = 10 → 81.
Why this matters: the score is absolute, not relative to other levels on the chart. A 70 means the same on BTC 5M and on EURUSD Daily, and a weak level cannot look like the "strongest" just because its neighbours are weaker still.
4️⃣ Polarity levels ⇅ — levels that were both floor and ceiling.
A level touched by both swing highs and swing lows has worked as support and as resistance. Such levels get P = 1.25 in the score and are marked ⇅ on the chart. Example: S = 6 scores 63 as a one-sided level and 71 as a polarity level.
Why this matters: role-reversal levels are the ones traders watch hardest, so they are highlighted instead of being counted like any other touch.
5️⃣ Role by price position — support and resistance are not fixed labels.
A level has no permanent type. Its role follows the last close outside its band:
— 🟢 close above the band → the level acts as support
— 🔴 close below the band → the level acts as resistance
— 🟡 close inside the band → the role stays as it was
A change of role is a level break. Breaks of the levels shown on the chart set the dashboard Trend (up through resistance = Bullish, down through support = Bearish) and can trigger informational alerts.
6️⃣ Nearest-level focus — only the levels price can actually reach.
Out of all active levels (default: at least 2 touches), the indicator shows the N nearest above price and the N nearest below (default 3 + 3). Only shown levels can produce signals.
Why this matters: a strong level far from price is information, not a trade. Six levels on the chart keep your attention on the ones in play.
7️⃣ Rejection signal — four conditions on a confirmed bar.
A 🟢 Long ▲ fires at a shown support level when, on bar close:
— Approach: the level was already support before this bar, so price came from above
— Touch: low ≤ top of the band
— Hold: close > top of the band
— Strong close: (close − low) / (high − low) ≥ Rejection Close Strength (default 0.6)
The level must also score at least the Min Level Score (default 50), and at least Cooldown bars (default 10) must have passed since the last signal at that level. A 🔴 Short ▼ is the exact mirror at resistance.
A bar that breaks a level cannot signal a retest of that level on the same bar, and one bar cannot produce both a long and a short.
8️⃣ Built-in trade engine — every signal becomes a complete plan.
— One position at a time. A signal opens a trade when flat, reverses an opposite trade, and is ignored while a trade in the same direction is open.
— Stop-loss, Wick-Anchored (default): min(low − 0.25 × ATR, close − 0.5 × ATR) for longs, mirrored for shorts. ATR mode: entry ∓ SL Multiplier × ATR. The risk ATR has its own length (default 14).
— Take-profits: TPn = entry ± risk × multiple, where risk is the actual stop distance. Presets: Conservative 1R / 2R / 4R, Balanced 1R / 2R / 3R, Aggressive 1.5R / 2.5R / 4R, Scalping 0.8R / 1.5R / 2R, or Custom.
— Break-even: after TP1 the stop moves to entry (plus an optional offset in ATR). A stop moved on a bar cannot close the trade on that same bar.
— Levels are never checked on the entry bar. TP1 and TP2 are recorded; only TP3, the stop or a reversal close the trade.
9️⃣ Transparent statistics — defined, disclosed, filterable.
A trade counts as a win once TP1 is touched: a TP3 exit, a break-even stop after TP1, or a reversal after TP1. A trade closed before TP1 is a loss. Win rate = wins / (wins + losses) × 100, shown with a ▰▱ gauge, a Form strip of the last 10 trades, and a period switch: 24 Hours, 30 Days or All-Time. When TP and SL are both touched inside one bar, TP gets priority; this optimistic fill model is disclosed in the notes below.
🧠 HOW IT WORKS — CALCULATION FLOW
Step 1 — Swing confirmation: A swing high or low is confirmed Swing Length bars after its extreme, with equal left and right lookback. All state updates happen on bar close.
Step 2 — Level maintenance: Every stored level decays by its half-life factor, updates its role from the close and registers a break if the role changed. A broken active level loses 30% of its strength.
Step 3 — Reaction and weight: The newly confirmed swing gets its reaction measured and its weight w calculated.
Step 4 — Clustering: The swing joins the nearest level within tolerance, the band is refit and overlapping levels are merged; otherwise a new level starts. When memory is full, the weakest level is dropped.
Step 5 — Scoring and selection: Scores are recalculated and the nearest active levels above and below price are selected for display and signals.
Step 6 — Signal check: The rejection rules run against the selected levels.
Step 7 — Trade management: TP touches, break-even, stop-outs, TP3 exits and reversals are resolved in a fixed order, then a new trade opens if a signal fired.
Step 8 — Output: Levels, entry markers, trade lines, dashboard and alerts are updated.
📖 HOW TO USE
🎯 Quick start:
1. Add the indicator. The defaults are a balanced starting point on any symbol and timeframe.
2. Look at the levels above and below price and hover a label to see how each level earned its score.
3. Wait for a Long ▲ or Short ▼ on bar close: entry, stop and three targets appear right away.
4. Pick the Risk Preset that fits your style.
5. Create one alert with "Any alert() function call" to receive every event.
👁️ Reading the chart:
— 🟢 Green bands = levels below price acting as support
— 🔴 Red bands = levels above price acting as resistance
— Label "71 · 5T ⇅" = score 71/100, 5 touches, polarity level
— Hover a level label = score, touches from highs and lows, number of breaks, band limits, date of the first touch
— Dotted center line = weighted center of the level
— 🟢 Long ▲ / 🔴 Short ▼ = trade entries; hover for score, level, RSI, SL and TP1
— Filled ENTRY / SL / TP1–TP3 labels with % distance from entry
— ✓ Teal TP label = target reached
— 🛡️ Dimmed SL and orange "ENTRY → SL (BE)" = stop moved to break-even
— Trade lines stay on the chart after the trade closes, as a record, until the next entry
📊 Dashboard fields:
— Header: current trend, colored by direction
— Market: Trend, Age (bars since the trend changed), HTF Bias, Position, Last Signal with score and bars ago, Timeframe
— Levels: nearest Resistance and Support with distance and score, number of Shown levels, Last Break
— Trade: Entry, SL (or "BE @"), TP1–TP3 with ✓, R:R, SL distance in %; "Flat · waiting for signal" when no trade is open
— Stats: Trades, Wins, Losses, Win Rate with gauge, Form, for the selected period
Every section can be switched off individually.
🔧 Tuning guide:
— Nearby swings merge into wide bands: lower Level Tolerance to 0.4–0.5
— Levels look noisy: raise Swing Length to 8–10 or Touches to Activate to 3
— Older levels disappear too fast: raise Level Half-Life to 1000 or more
— Too many signals: raise Min Level Score to 60–70 or Rejection Close Strength to 0.7
— Too few signals: lower Min Level Score to 40 or show more levels per side
— Stops feel too tight: switch SL Mode to ATR and use the Conservative preset
💡 Trading ideas:
— Polarity retest: watch ⇅ levels right after a break, when former resistance is tested as support or the other way round
— Stricter on lower timeframes: swings are noisier there, so a higher Min Level Score keeps only the cleaner levels
— Higher-timeframe context: set an HTF Bias timeframe and give more attention to signals in its direction; the bias is shown, not used as a filter
⚙️ KEY SETTINGS
⚙️ Main Settings:
— Swing Length (default 6): bars on each side of a swing, equals the confirmation delay
— Level Tolerance (default 0.6 × ATR): join distance and maximum band half-width
— Touches to Activate (default 2): swings needed before a level is shown
— Level Half-Life (default 500 bars): strength halves after this many bars without touches
— Levels Above / Below Price (default 3): shown levels per side
— HTF Bias Timeframe (default off): higher-timeframe bias in the dashboard
🎨 Visual Settings:
— Theme (default Auto): Auto, Dark or Light palette
— Show Levels (on), Draw Levels From First Touch (on), Show Level Score (on)
— Level Transparency (default 0 = Auto: 88 on dark, 82 on light)
— Show Buy/Sell Labels (on) and font sizes for signal, SL/TP and level labels
— Show Watermark (on)
🔍 Filters:
— Min Level Score for Signals (default 50)
— Rejection Close Strength (default 0.6)
— Cooldown per Level (default 10 bars)
🛡️ Risk Management:
— Risk Preset (default Balanced)
— SL Mode (default Wick-Anchored) and ATR Length (default 14)
— SL / TP1 / TP2 / TP3 Multipliers (Custom preset: 1.5 × ATR, 1R / 2R / 3R)
— Break-Even After TP1 (on) and BE Offset (default 0 × ATR)
— Show SL/TP Lines, Labels and % Distance (on); line styles: Entry dotted, SL solid, TP dashed
📊 Dashboard:
— Show Dashboard (on), Position (default Top Right), Font Size (default Small)
— Market, Levels, Trade and Stats section toggles
— Win Rate Period (default All-Time)
🔔 Alerts:
— Webhook JSON Format (off), Alert on Level Breaks (on), Alert on SL Hit & Reversal (on), Alert on TP & Break-Even (on)
Invalid combinations, such as TP1 ≥ TP2 in the Custom preset or an HTF below the chart timeframe, stop the script with a clear message instead of silently producing wrong results.
🔔 ALERTS
Create one alert with the condition "Any alert() function call". Alerts fire once per bar close, in the order the events happen inside the bar:
— 🛡️ BREAK-EVEN — direction and new stop
— 🎯 TP1 HIT / 🎯🎯 TP2 HIT — direction and target
— 🏆 TP3 HIT — entry and final target
— 🛑 SL HIT / 🛡️ BE STOP-OUT — entry and stop
— 🔄 REVERSAL — old and new direction, win or loss, exit price
— 🟢 LONG / 🔴 SHORT — ticker, timeframe, price, score, SL, TP1–TP3, R:R
— 🔼 LEVEL BROKEN UP / 🔽 LEVEL BROKEN DOWN — level and price (informational)
Entry alerts support plain text and JSON webhook format. All alerts are bar-close confirmed.
⚠️ IMPORTANT NOTES
— 🚫 No repainting of signals. Swings are confirmed with equal left and right lookback, so a swing is registered Swing Length bars after its extreme. This is delayed confirmation, not repainting of future values. Level updates, breaks, signals, trades and alerts run only on confirmed bars, and alerts fire once per bar close. The HTF bias reads the previous closed higher-timeframe bar.
— 📐 Levels are drawn on the last bar with their current geometry. A historical signal was calculated with the levels known at that moment, so an older marker can sit next to a level that was refined later.
— ⏳ No signals appear during the warm-up period: the first 34 bars, or 2 × Swing Length + 1 if that is longer.
— 📊 Statistics are calculated on the loaded chart history and reset when the chart reloads or settings change. They use an optimistic intrabar fill model (TP priority) and include no fees, slippage or position sizing. They describe how the rules behaved, not a backtest. Past performance does not guarantee future results.
— ⚖️ The score describes how a level behaved in the past, not the probability that it will hold next time.
— 🛠️ This is a level analysis and trade-planning tool, not an automated trading bot. It builds and scores levels, marks rejections and lays out the stop and targets — trade decisions remain yours.
— 🌐 Works on all markets and timeframes. The level engine uses price only, so instruments without volume data work the same way.
10 years in trading. For all inquiries, contact me on my Telegram channel: t.me/WillyAlgoTrader or Instagram: @willytraderbtc
Pernyataan Penyangkalan
Informasi dan publikasi ini tidak dimaksudkan, dan bukan merupakan, saran atau rekomendasi keuangan, investasi, trading, atau jenis lainnya yang diberikan atau didukung oleh TradingView. Baca selengkapnya di Ketentuan Penggunaan.
10 years in trading. For all inquiries, contact me on my Telegram channel: t.me/WillyAlgoTrader or Instagram: @willytraderbtc
Pernyataan Penyangkalan
Informasi dan publikasi ini tidak dimaksudkan, dan bukan merupakan, saran atau rekomendasi keuangan, investasi, trading, atau jenis lainnya yang diberikan atau didukung oleh TradingView. Baca selengkapnya di Ketentuan Penggunaan.