Indicator

Indicator

Scalptastic with zonesScalptastic with Zones is a colorful indicator that combines multiple open source indicators into one and adds further information and trade management levels to help traders working with the Prop Trading Academy (formerly Academy55) method (it is not my method and I am not affiliated – just trying to simplify it for users of their method while learning pinescript).
The method is designed to work on the 1 minute chart on the FX:EURUSD or CAPITALCOM:NAS100 and requires waiting for several indicators to align with buy/sell signals for a valid entry. Scalptastic can also be used on other forex pairs, crypto, indices, though not commodities, funds, stocks, or futures. The indicators Scalptastic incorporates are:
The TRENDLINE, which is based on the Color Hull Moving Average (by SonicTheHedghog ). This trendline switches between green and red to indicate buy/sell (default period 100).
The RIBBON, which is based on the Hull Suite (by InSilico ). Again, this ribbon switches between green and red to indicate buy/sell signals (default period 55, other hardcoded inputs taken from InSilico’s original indicator).
The Heikin Ashi WAVE, which is based on Smoothed Heiken Ashi Candles v1 (by jackvmk ) with default periods of 31 and 1 and wicks made invisible. Again, this indicator switches between green and red to indicate buy/sell signals.
Supertrend (by everget ) with default ATR of 10, Source of (H+L)/2 and ATR Multiplier of 3, taking wicks into account. This shows the Buy/Sell labels.
The built-in Parabolic SAR indicator with default values of Start = 0.02, Increment = 0.02 and Maximum = 0.2. This draws the dots below/above the candles to indicate buy/sell signals.
The method involves waiting for all the above indicators to show the same signal. Scalptastic combines all these indicators into one, along with an EMA (default period of 462, as per the method, though I’ve absolutely no idea why!) and adds a number of enhancements, particularly around trade management levels and ease of use:
DASHBOARD
This gathers the signals from the above indicators to signal when they align. The dashboard also includes other helpful information: the number of bars since the last supertrend signal and since the last time price was in a buy or sell zone, the number of pips to the EMA and the nearest buy and sell zones, as well as the current Average True Range (period 14).
TIME FILTER
During the time filter, the canvas’s background colour changes to green if a buy signal activates or red if a sell signal activates to make the action more obvious. The action is set to OOH (Out of Hours) if outside the filter. The detection window and timezone are set in the settings.
BUY AND SELL ZONES
(adapted from FluidTrades – SMC Lite by pmgjiv )
These have a user-defined timeframe so that 5 min zones can be shown on the 1 min chart. Default values of 10 match the method for sensitivity and size. Waiting to sell in a sell zone and buy in a buy zone increases probability.
FAIR VALUE GAPS
(adapted from spacemanbtc )
Shows FVGs on the chart which may attract price. Increasing the void threshold will highlight the largest gaps and vice versa.
TRADE MANAGEMENT LEVELS
“Line Calculation Mode” offers the options of “Entry at Close”, which places the Entry level at the close of the candle, or “Anchor at Stop Loss”, which positions the Entry, Stop Loss and Take Profit lines based on the stop loss. The method suggests that this stop loss is taken as the closer to price of either the Trendline or Heikin Ashi. This can be configured with the “Base Line Source” – either the closer of the two, or explicitly choose Heikin Ashi or Trendline to anchor the stop loss to. The Entry and Take Profit levels are then calculated from this anchor.
The “Pip Risk” recommended by the method for Forex ( FX:EURUSD ) is 2.2 pips and for indices ( CAPITALCOM:NAS100 ) is 200 points. These can be changed in the settings, or there is the option to use and set an ATR multiplier for levels more appropriate to current candles’ range. “Show Spread Buffer” lines offers the user the ability to set a spread to accommodate the bid/ask spread and draws lines above/below for more realistic take profit and stop loss levels. When scalping on such small price differences, this spread becomes significant so should be taken into consideration.
These price levels will only be drawn during the time filter.
When backtesting the method, these levels for entry, take profit, stop loss and spreads will show how successful (or not) the method can be.
DASHBOARD SETTINGS
"Show Entry Price Markers" shows dotted lines for entry price, stop loss, and take profit. They appear red on a sell signal and green on a buy signal. The entry price is solid and dashed lines show the SL, 1R and 2R take profit. The method recommends aiming for 2R. If "Show Spread Buffer" is checked, these spread buffer lines are also drawn.
"Show Signal Background Color" changes the background to green on an active green signal for that bar and red for an active sell signal.
DISCLAIMER
This script is for informational and educational purposes only. It does not constitute financial, investment, or trading advice. The author is not affiliated with Prop Trading Academy or any other trading academy. Users should backtest the method to understand how it works before using it on a live account. Indicator

aaaaaaaaaaa// ╔══════════════════════════════════════════════════════════════════════════════╗
// ║ SMC PRO — Smart Money Concepts (Supply & Demand + Volume Profile) ║
// ║ Pine Script v6 | Professional Indicator ║
// ║ ║
// ║ Phase 1: Automatic Supply & Demand Zones ║
// ║ Phase 2: Market Structure + Breakout Detection ║
// ║ Phase 3: Retest Confirmation + Long/Short Signals ║
// ║ Phase 4: Risk/Reward, SL, TP, and Alerts ║
// ║ Phase 5: Fixed Range Volume Profile (POC, VAH, VAL, HVN, LVN) ║
// ╚══════════════════════════════════════════════════════════════════════════════╝
//@version=6
indicator("SMC Pro — Supply & Demand + Volume Profile",
overlay = true,
max_boxes_count = 500,
max_lines_count = 500,
max_labels_count = 500,
max_bars_back = 5000)
// ─────────────────────────────────────────────────────────────────────────────
// INPUTS
// ─────────────────────────────────────────────────────────────────────────────
// Zone Detection
string GRP_ZONE = "Zone Detection"
i_pivotLen = input.int(5, "Pivot Length", minval=2, maxval=50, group=GRP_ZONE)
i_zoneAtrMult = input.float(0.5,"Zone Width (ATR ×)", minval=0.1, maxval=3.0, step=0.1, group=GRP_ZONE)
i_minTouches = input.int(2, "Min Touches for Signal", minval=1, maxval=10, group=GRP_ZONE)
i_maxZones = input.int(20, "Max Active Zones", minval=5, maxval=50, group=GRP_ZONE)
i_maxZoneAge = input.int(500, "Max Zone Age (bars)", minval=50, maxval=2000, group=GRP_ZONE)
// Breakout & Volume
string GRP_BO = "Breakout Detection"
i_volMult = input.float(1.5,"Volume Multiplier", minval=1.0, maxval=5.0, step=0.1, group=GRP_BO)
i_atrPeriod = input.int(14, "ATR Period", minval=5, maxval=50, group=GRP_BO)
i_volSmooth = input.int(20, "Volume SMA Length", minval=5, maxval=100, group=GRP_BO)
// Signals
string GRP_SIG = "Signal Filters"
i_minRR = input.float(2.0,"Minimum Risk:Reward", minval=1.0, maxval=10.0, step=0.5, group=GRP_SIG)
i_slBuffer = input.float(0.5,"SL Buffer (ATR ×)", minval=0.1, maxval=2.0, step=0.1, group=GRP_SIG)
i_maxRetestDist = input.int(100,"Max Retest Distance (bars)", minval=10, maxval=500, group=GRP_SIG)
i_noOppZoneDist = input.float(2.0,"No Opposite Zone Within (ATR ×)", minval=0.5, maxval=5.0, step=0.5, group=GRP_SIG)
// Volume Profile
string GRP_VP = "Volume Profile"
i_showVP = input.bool(true,"Show Volume Profile", group=GRP_VP)
i_vpLookback = input.int(200, "VP Lookback Bars", minval=50, maxval=500, group=GRP_VP)
i_vpRows = input.int(50, "VP Row Count", minval=20, maxval=100, group=GRP_VP)
i_vpWidth = input.int(20, "VP Width (bars)", minval=5, maxval=80, group=GRP_VP)
i_vaPercent = input.float(70.0,"Value Area %", minval=50.0,maxval=90.0, group=GRP_VP)
// Display
string GRP_DISP = "Display"
i_showZones = input.bool(true, "Show Zones", group=GRP_DISP)
i_showLabels = input.bool(true, "Show Labels", group=GRP_DISP)
i_showSLTP = input.bool(true, "Show SL/TP Lines", group=GRP_DISP)
i_showStructure = input.bool(true,"Show Market Structure", group=GRP_DISP)
// Colors
string GRP_CLR = "Colors"
i_demandColor = input.color(color.new(#26a69a, 75), "Demand Zone", group=GRP_CLR)
i_supplyColor = input.color(color.new(#ef5350, 75), "Supply Zone", group=GRP_CLR)
i_brokenColor = input.color(color.new(#787b86, 90), "Broken Zone", group=GRP_CLR)
i_pocColor = input.color(color.new(#ff9800, 0), "POC Line", group=GRP_CLR)
i_vahColor = input.color(color.new(#2196f3, 0), "VAH Line", group=GRP_CLR)
i_valColor = input.color(color.new(#2196f3, 0), "VAL Line", group=GRP_CLR)
i_buyVolColor = input.color(color.new(#26a69a, 40), "Buy Volume", group=GRP_CLR)
i_sellVolColor = input.color(color.new(#ef5350, 40), "Sell Volume", group=GRP_CLR)
i_longColor = input.color(color.new(#00c853, 0), "Long Signal", group=GRP_CLR)
i_shortColor = input.color(color.new(#ff1744, 0), "Short Signal", group=GRP_CLR)
// ─────────────────────────────────────────────────────────────────────────────
// TYPE DEFINITIONS
// ─────────────────────────────────────────────────────────────────────────────
type Zone
float top = na
float bottom = na
bool isSupply = false
int birthBar = 0
int touches = 0
float totalVol = 0.0
bool broken = false
int brokenBar = 0
int breakDir = 0 // +1 = broken upward, -1 = broken downward
bool retested = false
float strength = 0.0
box bx = na
type Signal
bool isLong = false
float entry = na
float sl = na
float tp = na
float rr = na
int sigBar = 0
// ─────────────────────────────────────────────────────────────────────────────
// GLOBAL VARIABLES
// ─────────────────────────────────────────────────────────────────────────────
var array zones = array.new()
// Market Structure
var float msSwingHi1 = na // most recent swing high
var float msSwingHi2 = na // previous swing high
var float msSwingLo1 = na // most recent swing low
var float msSwingLo2 = na // previous swing low
var int msBias = 0 // +1 bullish, -1 bearish, 0 neutral
// Signal flags (for alerts — must be global scope)
var bool sigLong = false
var bool sigShort = false
var bool sigBullBO = false
var bool sigBearBO = false
var bool sigRetest = false
var bool sigNewDemand = false
var bool sigNewSupply = false
// Volume Profile drawing storage
var array vpBoxes = array.new()
var array vpLines = array.new()
var array vpLabels = array.new()
// Computed values
float atrVal = ta.atr(i_atrPeriod)
float avgVol = ta.sma(volume, i_volSmooth)
float bodySize = math.abs(close - open)
// Reset per-bar signal flags
sigLong := false
sigShort := false
sigBullBO := false
sigBearBO := false
sigRetest := false
sigNewDemand := false
sigNewSupply := false
// ─────────────────────────────────────────────────────────────────────────────
// HELPER FUNCTIONS
// ─────────────────────────────────────────────────────────────────────────────
// Check if two zones overlap
zonesOverlap(float top1, float bot1, float top2, float bot2) =>
top1 >= bot2 and top2 >= bot1
// Calculate zone strength score (normalized 0–100)
calcStrength(int touches, float vol, float avgV, int age) =>
float touchScore = math.min(touches / 5.0, 1.0) * 40.0
float volScore = math.min(vol / (avgV * 10.0), 1.0) * 35.0
float ageScore = math.min(age / 200.0, 1.0) * 25.0
touchScore + volScore + ageScore
// Check if a nearby opposite zone exists
hasOppositeZoneNearby(bool checkAbove, float refPrice, float maxDist) =>
bool found = false
if zones.size() > 0
for i = 0 to zones.size() - 1
Zone z = zones.get(i)
if z.broken
continue
if checkAbove and z.isSupply and z.bottom - refPrice < maxDist and z.bottom > refPrice
found := true
break
if not checkAbove and not z.isSupply and refPrice - z.top < maxDist and z.top < refPrice
found := true
break
found
// Format price to string
fmtPrice(float price) =>
str.tostring(price, format.mintick)
// ─────────────────────────────────────────────────────────────────────────────
// PHASE 1: AUTOMATIC SUPPLY & DEMAND ZONES
// ─────────────────────────────────────────────────────────────────────────────
// ── 1a. Pivot Detection ──
float pivotHi = ta.pivothigh(high, i_pivotLen, i_pivotLen)
float pivotLo = ta.pivotlow(low, i_pivotLen, i_pivotLen)
// ── 1b. Create Supply Zone from Pivot High ──
if not na(pivotHi) and i_showZones
int pBar = bar_index - i_pivotLen
float zTop = high
float zBot = zTop - nz(atrVal) * i_zoneAtrMult
bool merged = false
// Merge with existing supply zone if overlapping
if zones.size() > 0
for i = 0 to zones.size() - 1
Zone z = zones.get(i)
if z.isSupply and not z.broken and zonesOverlap(zTop, zBot, z.top, z.bottom)
z.top := math.max(z.top, zTop)
z.bottom := math.min(z.bottom, zBot)
z.touches += 1
z.totalVol += nz(volume )
z.strength := calcStrength(z.touches, z.totalVol, nz(avgVol, 1), bar_index - z.birthBar)
if not na(z.bx)
z.bx.set_top(z.top)
z.bx.set_bottom(z.bottom)
merged := true
break
if not merged
Zone newZ = Zone.new()
newZ.top := zTop
newZ.bottom := zBot
newZ.isSupply := true
newZ.birthBar := pBar
newZ.touches := 1
newZ.totalVol := nz(volume )
newZ.strength := calcStrength(1, newZ.totalVol, nz(avgVol, 1), 1)
newZ.bx := box.new(left=pBar, top=zTop, right=bar_index + 20, bottom=zBot,
border_color=color.new(i_supplyColor, 50), border_width=1,
bgcolor=i_supplyColor, border_style=line.style_solid)
zones.push(newZ)
sigNewSupply := true
// ── 1c. Create Demand Zone from Pivot Low ──
if not na(pivotLo) and i_showZones
int pBar = bar_index - i_pivotLen
float zBot = low
float zTop = zBot + nz(atrVal) * i_zoneAtrMult
bool merged = false
if zones.size() > 0
for i = 0 to zones.size() - 1
Zone z = zones.get(i)
if not z.isSupply and not z.broken and zonesOverlap(zTop, zBot, z.top, z.bottom)
z.top := math.max(z.top, zTop)
z.bottom := math.min(z.bottom, zBot)
z.touches += 1
z.totalVol += nz(volume )
z.strength := calcStrength(z.touches, z.totalVol, nz(avgVol, 1), bar_index - z.birthBar)
if not na(z.bx)
z.bx.set_top(z.top)
z.bx.set_bottom(z.bottom)
merged := true
break
if not merged
Zone newZ = Zone.new()
newZ.top := zTop
newZ.bottom := zBot
newZ.isSupply := false
newZ.birthBar := pBar
newZ.touches := 1
newZ.totalVol := nz(volume )
newZ.strength := calcStrength(1, newZ.totalVol, nz(avgVol, 1), 1)
newZ.bx := box.new(left=pBar, top=zTop, right=bar_index + 20, bottom=zBot,
border_color=color.new(i_demandColor, 50), border_width=1,
bgcolor=i_demandColor, border_style=line.style_solid)
zones.push(newZ)
sigNewDemand := true
// ── 1d. Zone Maintenance: Extend, Touch Count, Age-out, Capacity ──
if zones.size() > 0
for i = zones.size() - 1 to 0
Zone z = zones.get(i)
// Remove zones that are too old
if bar_index - z.birthBar > i_maxZoneAge
if not na(z.bx)
z.bx.delete()
zones.remove(i)
continue
// Extend active zone boxes to the right
if not z.broken and not na(z.bx)
z.bx.set_right(bar_index + 20)
// Count touches on active zones (price approaches & rejects)
if not z.broken
if z.isSupply and high >= z.bottom and high <= z.top and close < z.bottom
z.touches += 1
z.totalVol += volume
if not z.isSupply and low <= z.top and low >= z.bottom and close > z.top
z.touches += 1
z.totalVol += volume
// Update strength
z.strength := calcStrength(z.touches, z.totalVol, nz(avgVol, 1), bar_index - z.birthBar)
// Enforce max zone count — remove weakest active zones
if zones.size() > i_maxZones
// Find and remove weakest non-broken zone
float weakest = 999999.0
int weakIdx = -1
for i = 0 to zones.size() - 1
Zone z = zones.get(i)
if not z.broken and z.strength < weakest
weakest := z.strength
weakIdx := i
if weakIdx >= 0
Zone wz = zones.get(weakIdx)
if not na(wz.bx)
wz.bx.delete()
zones.remove(weakIdx)
// ─────────────────────────────────────────────────────────────────────────────
// PHASE 2: MARKET STRUCTURE + BREAKOUT DETECTION
// ─────────────────────────────────────────────────────────────────────────────
// ── 2a. Market Structure ──
if not na(pivotHi)
msSwingHi2 := msSwingHi1
msSwingHi1 := pivotHi
if not na(pivotLo)
msSwingLo2 := msSwingLo1
msSwingLo1 := pivotLo
// Determine bias
bool isHH = not na(msSwingHi1) and not na(msSwingHi2) and msSwingHi1 > msSwingHi2
bool isHL = not na(msSwingLo1) and not na(msSwingLo2) and msSwingLo1 > msSwingLo2
bool isLH = not na(msSwingHi1) and not na(msSwingHi2) and msSwingHi1 < msSwingHi2
bool isLL = not na(msSwingLo1) and not na(msSwingLo2) and msSwingLo1 < msSwingLo2
if isHH and isHL
msBias := 1
else if isLH and isLL
msBias := -1
else
msBias := 0
// Structure label on pivots
if i_showStructure and not na(pivotHi)
string sLabel = isHH ? "HH" : isLH ? "LH" : "SH"
color sColor = isHH ? i_longColor : isLH ? i_shortColor : color.gray
label.new(bar_index - i_pivotLen, high , sLabel,
style=label.style_label_down, color=color.new(sColor, 80),
textcolor=sColor, size=size.tiny)
if i_showStructure and not na(pivotLo)
string sLabel = isHL ? "HL" : isLL ? "LL" : "SL"
color sColor = isHL ? i_longColor : isLL ? i_shortColor : color.gray
label.new(bar_index - i_pivotLen, low , sLabel,
style=label.style_label_up, color=color.new(sColor, 80),
textcolor=sColor, size=size.tiny)
// ── 2b. Breakout Detection ──
bool volFilter = volume > avgVol * i_volMult
bool bodyFilter = bodySize > nz(atrVal)
if zones.size() > 0
for i = 0 to zones.size() - 1
Zone z = zones.get(i)
if z.broken
continue
// Bullish breakout: close above supply zone with confirmation
if z.isSupply and close > z.top and volFilter and bodyFilter
z.broken := true
z.brokenBar := bar_index
z.breakDir := 1
if not na(z.bx)
z.bx.set_bgcolor(i_brokenColor)
z.bx.set_border_color(color.new(i_brokenColor, 50))
z.bx.set_right(bar_index)
sigBullBO := true
if i_showLabels
label.new(bar_index, low, "BO▲",
style=label.style_label_up, color=color.new(i_longColor, 60),
textcolor=i_longColor, size=size.small)
// Bearish breakout: close below demand zone with confirmation
if not z.isSupply and close < z.bottom and volFilter and bodyFilter
z.broken := true
z.brokenBar := bar_index
z.breakDir := -1
if not na(z.bx)
z.bx.set_bgcolor(i_brokenColor)
z.bx.set_border_color(color.new(i_brokenColor, 50))
z.bx.set_right(bar_index)
sigBearBO := true
if i_showLabels
label.new(bar_index, high, "BO▼",
style=label.style_label_down, color=color.new(i_shortColor, 60),
textcolor=i_shortColor, size=size.small)
// ─────────────────────────────────────────────────────────────────────────────
// PHASE 3: RETEST CONFIRMATION + LONG/SHORT SIGNALS
// ─────────────────────────────────────────────────────────────────────────────
if zones.size() > 0
for i = 0 to zones.size() - 1
Zone z = zones.get(i)
if not z.broken or z.retested
continue
// Skip if breakout too old
if bar_index - z.brokenBar > i_maxRetestDist
continue
// Must be at least 2 bars after breakout for retest to form
if bar_index - z.brokenBar < 2
continue
// ── Bullish Retest (supply broken upward → now demand) ──
if z.breakDir == 1
// Previous bar: wick dipped into zone, closed above zone
bool prevRetest = low <= z.top and low >= z.bottom and close > z.top
// Current bar: bullish confirmation
bool confirm = close > open and close > close
bool volOK = volume > avgVol
bool structOK = msBias >= 0
if prevRetest and confirm and volOK and structOK
float entry = close
float sl = z.bottom - nz(atrVal) * i_slBuffer
float risk = entry - sl
float tp = entry + risk * i_minRR
float rr = risk > 0 ? (tp - entry) / risk : 0.0
// Check no supply zone nearby above
bool noOppZone = not hasOppositeZoneNearby(true, entry, nz(atrVal) * i_noOppZoneDist)
if risk > 0 and rr >= i_minRR and noOppZone and z.touches >= i_minTouches
z.retested := true
sigRetest := true
sigLong := true
// Draw entry arrow
label.new(bar_index, low, "▲ LONG " + fmtPrice(entry),
style=label.style_label_up, color=i_longColor,
textcolor=color.white, size=size.normal)
if i_showSLTP
// SL line
line.new(bar_index, sl, bar_index + 20, sl,
color=i_shortColor, width=1, style=line.style_dashed)
label.new(bar_index + 20, sl, "SL " + fmtPrice(sl),
style=label.style_label_left, color=color.new(i_shortColor, 70),
textcolor=i_shortColor, size=size.tiny)
// TP line
line.new(bar_index, tp, bar_index + 20, tp,
color=i_longColor, width=1, style=line.style_dashed)
label.new(bar_index + 20, tp, "TP " + fmtPrice(tp) + " (" + str.tostring(rr, "#.#") + "R)",
style=label.style_label_left, color=color.new(i_longColor, 70),
textcolor=i_longColor, size=size.tiny)
// Entry line
line.new(bar_index, entry, bar_index + 20, entry,
color=i_longColor, width=2, style=line.style_solid)
// ── Bearish Retest (demand broken downward → now supply) ──
if z.breakDir == -1
// Previous bar: wick pushed into zone, closed below zone
bool prevRetest = high >= z.bottom and high <= z.top and close < z.bottom
// Current bar: bearish confirmation
bool confirm = close < open and close < close
bool volOK = volume > avgVol
bool structOK = msBias <= 0
if prevRetest and confirm and volOK and structOK
float entry = close
float sl = z.top + nz(atrVal) * i_slBuffer
float risk = sl - entry
float tp = entry - risk * i_minRR
float rr = risk > 0 ? (sl - entry) / risk * i_minRR : 0.0
bool noOppZone = not hasOppositeZoneNearby(false, entry, nz(atrVal) * i_noOppZoneDist)
if risk > 0 and rr >= i_minRR and noOppZone and z.touches >= i_minTouches
z.retested := true
sigRetest := true
sigShort := true
label.new(bar_index, high, "▼ SHORT " + fmtPrice(entry),
style=label.style_label_down, color=i_shortColor,
textcolor=color.white, size=size.normal)
if i_showSLTP
line.new(bar_index, sl, bar_index + 20, sl,
color=i_shortColor, width=1, style=line.style_dashed)
label.new(bar_index + 20, sl, "SL " + fmtPrice(sl),
style=label.style_label_left, color=color.new(i_shortColor, 70),
textcolor=i_shortColor, size=size.tiny)
line.new(bar_index, tp, bar_index + 20, tp,
color=i_longColor, width=1, style=line.style_dashed)
label.new(bar_index + 20, tp, "TP " + fmtPrice(tp) + " (" + str.tostring(i_minRR, "#.#") + "R)",
style=label.style_label_left, color=color.new(i_longColor, 70),
textcolor=i_longColor, size=size.tiny)
line.new(bar_index, entry, bar_index + 20, entry,
color=i_shortColor, width=2, style=line.style_solid)
// ─────────────────────────────────────────────────────────────────────────────
// PHASE 4: SIGNAL INFO TABLE
// ─────────────────────────────────────────────────────────────────────────────
// Structure bias bar color (subtle background)
barcolor(i_showStructure ? (msBias == 1 ? color.new(i_longColor, 90) : msBias == -1 ? color.new(i_shortColor, 90) : na) : na)
// Info table on last bar
if barstate.islast
var table infoTbl = table.new(position.top_right, 2, 5,
bgcolor=color.new(#1e222d, 10), border_width=1, border_color=color.new(color.gray, 70))
string biasText = msBias == 1 ? "BULLISH" : msBias == -1 ? "BEARISH" : "NEUTRAL"
color biasClr = msBias == 1 ? i_longColor : msBias == -1 ? i_shortColor : color.gray
int activeCount = 0
int brokenCount = 0
if zones.size() > 0
for i = 0 to zones.size() - 1
if zones.get(i).broken
brokenCount += 1
else
activeCount += 1
infoTbl.cell(0, 0, "SMC PRO", text_color=color.white, text_size=size.small, bgcolor=color.new(#363a45, 0))
infoTbl.cell(1, 0, "", bgcolor=color.new(#363a45, 0))
infoTbl.cell(0, 1, "Structure", text_color=color.gray, text_size=size.tiny)
infoTbl.cell(1, 1, biasText, text_color=biasClr, text_size=size.tiny)
infoTbl.cell(0, 2, "Active Zones", text_color=color.gray, text_size=size.tiny)
infoTbl.cell(1, 2, str.tostring(activeCount), text_color=color.white, text_size=size.tiny)
infoTbl.cell(0, 3, "Broken Zones", text_color=color.gray, text_size=size.tiny)
infoTbl.cell(1, 3, str.tostring(brokenCount), text_color=color.white, text_size=size.tiny)
infoTbl.cell(0, 4, "ATR", text_color=color.gray, text_size=size.tiny)
infoTbl.cell(1, 4, fmtPrice(nz(atrVal)), text_color=color.white, text_size=size.tiny)
// ─────────────────────────────────────────────────────────────────────────────
// PHASE 5: FIXED RANGE VOLUME PROFILE
// ─────────────────────────────────────────────────────────────────────────────
if barstate.islast and i_showVP
// ── 5a. Cleanup previous VP drawings ──
if vpBoxes.size() > 0
for i = vpBoxes.size() - 1 to 0
box b = vpBoxes.get(i)
if not na(b)
b.delete()
vpBoxes.clear()
if vpLines.size() > 0
for i = vpLines.size() - 1 to 0
line l = vpLines.get(i)
if not na(l)
l.delete()
vpLines.clear()
if vpLabels.size() > 0
for i = vpLabels.size() - 1 to 0
label lb = vpLabels.get(i)
if not na(lb)
lb.delete()
vpLabels.clear()
// ── 5b. Calculate price range ──
int lookback = math.min(i_vpLookback, bar_index)
float rangeHi = ta.highest(high, lookback)
float rangeLo = ta.lowest(low, lookback)
float rowH = (rangeHi - rangeLo) / i_vpRows
if rowH > 0
// ── 5c. Accumulate volume per row ──
array buyVol = array.new(i_vpRows, 0.0)
array sellVol = array.new(i_vpRows, 0.0)
for b = 0 to lookback - 1
float bHi = high
float bLo = low
float bVol = nz(volume )
bool isBuy = close >= open
int startRow = math.max(0, math.floor((bLo - rangeLo) / rowH))
int endRow = math.min(i_vpRows - 1, math.floor((bHi - rangeLo) / rowH))
if endRow >= startRow
int numRows = endRow - startRow + 1
float volPerRow = bVol / numRows
for r = startRow to endRow
if isBuy
buyVol.set(r, buyVol.get(r) + volPerRow)
else
sellVol.set(r, sellVol.get(r) + volPerRow)
// ── 5d. Find POC, max volume, VAH, VAL ──
float maxVol = 0.0
int pocRow = 0
float totalVol = 0.0
array totalPerRow = array.new(i_vpRows, 0.0)
for r = 0 to i_vpRows - 1
float rv = buyVol.get(r) + sellVol.get(r)
totalPerRow.set(r, rv)
totalVol += rv
if rv > maxVol
maxVol := rv
pocRow := r
// Value Area calculation — expand outward from POC until vaPercent reached
float vaTarget = totalVol * i_vaPercent / 100.0
float vaSum = totalPerRow.get(pocRow)
int vaHiRow = pocRow
int vaLoRow = pocRow
for _step = 0 to i_vpRows - 1
if vaSum >= vaTarget
break
float aboveVol = vaHiRow < i_vpRows - 1 ? totalPerRow.get(vaHiRow + 1) : 0.0
float belowVol = vaLoRow > 0 ? totalPerRow.get(vaLoRow - 1) : 0.0
if aboveVol >= belowVol and vaHiRow < i_vpRows - 1
vaHiRow += 1
vaSum += aboveVol
else if vaLoRow > 0
vaLoRow -= 1
vaSum += belowVol
else if vaHiRow < i_vpRows - 1
vaHiRow += 1
vaSum += aboveVol
else
break
float pocPrice = rangeLo + (pocRow + 0.5) * rowH
float vahPrice = rangeLo + (vaHiRow + 1) * rowH
float valPrice = rangeLo + vaLoRow * rowH
// ── 5e. Draw histogram ──
int vpLeftBar = bar_index + 5
float volScale = maxVol > 0 ? i_vpWidth / maxVol : 0.0
for r = 0 to i_vpRows - 1
float rowBot = rangeLo + r * rowH
float rowTop = rowBot + rowH
float bv = buyVol.get(r)
float sv = sellVol.get(r)
float tv = bv + sv
if tv > 0
int totalWidth = math.max(1, math.round(tv * volScale))
int buyWidth = math.max(0, math.round(bv * volScale))
int sellWidth = totalWidth - buyWidth
// Buy volume box
if buyWidth > 0
box bxBuy = box.new(vpLeftBar, rowTop, vpLeftBar + buyWidth, rowBot,
border_color=color.new(i_buyVolColor, 70), border_width=0,
bgcolor=i_buyVolColor)
vpBoxes.push(bxBuy)
// Sell volume box (stacked after buy)
if sellWidth > 0
box bxSell = box.new(vpLeftBar + buyWidth, rowTop, vpLeftBar + buyWidth + sellWidth, rowBot,
border_color=color.new(i_sellVolColor, 70), border_width=0,
bgcolor=i_sellVolColor)
vpBoxes.push(bxSell)
// Highlight HVN / LVN
bool isHVN = tv > totalVol / i_vpRows * 1.5
bool isLVN = tv < totalVol / i_vpRows * 0.5
// HVN: subtle bright border
if isHVN and totalWidth > 2
box bxHVN = box.new(vpLeftBar, rowTop, vpLeftBar + totalWidth, rowBot,
border_color=color.new(color.white, 70), border_width=1,
bgcolor=color.new(color.white, 97))
vpBoxes.push(bxHVN)
// ── 5f. Draw POC, VAH, VAL lines ──
int lineRight = vpLeftBar + i_vpWidth + 5
line pocLine = line.new(bar_index - lookback, pocPrice, lineRight, pocPrice,
color=i_pocColor, width=2, style=line.style_solid)
vpLines.push(pocLine)
line vahLine = line.new(bar_index - lookback, vahPrice, lineRight, vahPrice,
color=i_vahColor, width=1, style=line.style_dashed)
vpLines.push(vahLine)
line valLine = line.new(bar_index - lookback, valPrice, lineRight, valPrice,
color=i_valColor, width=1, style=line.style_dashed)
vpLines.push(valLine)
// Labels
label pocLbl = label.new(lineRight, pocPrice, "POC " + fmtPrice(pocPrice),
style=label.style_label_left, color=color.new(i_pocColor, 70),
textcolor=i_pocColor, size=size.tiny)
vpLabels.push(pocLbl)
label vahLbl = label.new(lineRight, vahPrice, "VAH " + fmtPrice(vahPrice),
style=label.style_label_left, color=color.new(i_vahColor, 70),
textcolor=i_vahColor, size=size.tiny)
vpLabels.push(vahLbl)
label valLbl = label.new(lineRight, valPrice, "VAL " + fmtPrice(valPrice),
style=label.style_label_left, color=color.new(i_valColor, 70),
textcolor=i_valColor, size=size.tiny)
vpLabels.push(valLbl)
// ─────────────────────────────────────────────────────────────────────────────
// ALERTS
// ─────────────────────────────────────────────────────────────────────────────
alertcondition(sigNewDemand, title="New Demand Zone", message="SMC PRO: New Demand (Support) Zone detected")
alertcondition(sigNewSupply, title="New Supply Zone", message="SMC PRO: New Supply (Resistance) Zone detected")
alertcondition(sigBullBO, title="Bullish Breakout", message="SMC PRO: Bullish Breakout — price closed above supply zone with volume confirmation")
alertcondition(sigBearBO, title="Bearish Breakout", message="SMC PRO: Bearish Breakout — price closed below demand zone with volume confirmation")
alertcondition(sigRetest, title="Successful Retest", message="SMC PRO: Successful Retest confirmed at broken zone")
alertcondition(sigLong, title="Long Entry", message="SMC PRO: LONG Entry — breakout + retest + confirmation + volume + structure aligned")
alertcondition(sigShort, title="Short Entry", message="SMC PRO: SHORT Entry — breakout + retest + confirmation + volume + structure aligned")
// ─────────────────────────────────────────────────────────────────────────────
// END
// ─────────────────────────────────────────────────────────────────────────────
Indicator

NY 10:00 Open MarkerNY 10:00 AM Open Marker
This indicator automatically identifies and marks the candle that opens at 10:00 AM New York time.
Why 10:00 AM NY time matters
In ICT (Inner Circle Trader) methodology, the 10:00 AM New York mark is treated as a key decision point during the trading day. The initial volatility from the 9:30 AM market open has usually settled by this time, and price often begins to reveal its true directional bias for the session. Many traders use this level as a reference point for judging daily trend and structure.
What the indicator does
Detects the exact candle whose open falls at 10:00 AM NY time, automatically adjusting for daylight saving time
Places a small triangle marker below that candle
Optionally draws a dashed horizontal line from the opening price forward
Optionally adds a price label showing the exact open value
Customizable settings
Toggle the marker, line, and label on or off independently
Adjust line color, thickness, and how far the line extends to the right
Works on any symbol, though it requires a low enough timeframe (e.g., 1-min, 5-min) to actually capture a candle opening exactly at 10:00 AM
Best suited for
Traders following ICT or Smart Money Concepts approaches who use the NY 10:00 AM open as a reference level for intraday bias, retracements, or structure shifts. Indicator

HTF Developing Candle🕯️ HTF Developing Candle
Bring Higher Timeframe price action directly onto your current chart without constantly switching timeframes.
This indicator projects Higher Timeframe (HTF) candles onto lower timeframes, allowing you to visualise how each HTF candle develops in real time while maintaining full market context.
━━━━━━━━━━━━━━━━━━━━
✨ FEATURES
━━━━━━━━━━━━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━
⏱️ ⚡ AUTO TIMEFRAME SELECTION
━━━━━━━━━━━━━━━━━━━━
• Automatically chooses the most suitable HTF based on your current chart.
• Manual HTF selection is also supported.
The Auto HTF mode intelligently selects a higher timeframe based on your current chart, eliminating the need to manually configure HTFs every time you switch charts.
Current Chart → Automatic HTF
• 1 Second → 1 Minute
• 5 Seconds → 3 Minutes
• 10 Seconds → 5 Minutes
• 15 Seconds → 15 Minutes
• 30 Seconds → 30 Minutes
• 1 Minute → 1 Hour
• 5 Minutes → 4 Hours
• 15 Minutes → 8 Hours
• 30 Minutes → 1 Day
• 1 Hour → 1 Day
• 4 Hours → 1 Week
• 1 Day → 1 Month
You can also disable Auto HTF at any time and manually select any Higher Timeframe that suits your trading style.
🕯️ HTF Candle Projection
• Display completed HTF candles with no look-ahead bias.
• Display the currently developing HTF candle in real time.
• Optional extension to the end of the HTF period.
🎨 Fully Customisable Candle Style
• Hollow candle bodies
• Adjustable body thickness
• Solid, Dashed, or Dotted wicks
• Bull/Bear or Volume-Based colouring
📊 Volume-Based Colouring
• Instantly identify Low, Normal, High, Very High, and Ultra High Volume HTF candles.
📈 HTF Structure Levels
• HTF High
• HTF Low
• HTF Midpoint
• Optional Previous HTF Midpoint Marker
🔄 Real-Time Updates
• Watch the current HTF candle evolve tick by tick without changing your chart timeframe.
━━━━━━━━━━━━━━━━━━━━
🎯 PERFECT FOR
━━━━━━━━━━━━━━━━━━━━
✅ Multi-Timeframe Analysis
✅ Price Action Trading
✅ Wyckoff Method
✅ Smart Money Concepts (SMC)
✅ ICT Traders
✅ Swing Trading
✅ Intraday Trading
✅ Market Structure Analysis
━━━━━━━━━━━━━━━━━━━━
💡 WHY USE IT?
━━━━━━━━━━━━━━━━━━━━
Instead of constantly switching between multiple charts, this indicator keeps Higher Timeframe structure visible directly on your execution timeframe.
Whether you're analysing market structure, following institutional price action, or waiting for higher timeframe confirmation, HTF Developing Candle helps you stay focused on a single chart while maintaining full HTF context.
⭐ If you find this script useful, please leave a Like 👍 and consider adding it to your favourites! Indicator

Range Play High 1. Favorite the indicator to have it populate in your pine screener indicator dropdown list.
2. Go to www.pulsewire.com select your watchlist, select the indicator.
Using the scan:
Scan 1 = close in the upper 10% of the prior month's range, still below the prior month's high, no candle in the last 5 bars pushed above that high, and the day is red. This is a stock that rallied into resistance, couldn't clear it once in the window, and is selling off today.
Scan 2 = some candle in the last 5 bars did poke above the prior month's high, but close is now back below it and the day is red. Failed breakout / bull trap.
Labels appear above the candle this time since we're at the top of the range: "1" (orange) for the clean rejection, "F" (red) for the failed breakout. In the screener, filter "Scan 1: Rejected the level" or "Scan 2: Failed breakout" equals 1, or "Scan 1 or Scan 2" for both. Indicator

Indicator

Indicator

GProf - Break & RetestGProf - Break & Retest
═══════════════════════════════════════════
OVERVIEW
This indicator detects one complete sequence: consolidation against a key level, a breakout WITH momentum, and the retest of the broken level. It watches the levels for you, stays silent through weak drifts and fakeouts, and speaks at the two moments that matter — when a level breaks with force, and when price comes back to test it.
The core idea is polarity: a level that held for hours gets violated with conviction, and the trade is the market returning to confirm the flip — old support rejecting as new resistance, or old resistance holding as new support.
───────────────────────────────────────────
TWO CONSOLIDATION PATTERNS, ONE CONFIRMATION GATE
PATTERN 1 — TIGHT COIL: a short compressed window pressing directly against the level, with zero closes beyond it. Price knocking on a door.
PATTERN 2 — RANGE-SIT: price spends an extended window entirely on one side of the level, the whole range within a capped height of it, then breaks the boundary. This captures the classic premarket-range breakout or breakdown, where the premarket high or low is the boundary of the consolidation itself.
Either pattern must then be CONFIRMED. A break with no force is fully silent — no label, no alert:
• MOMENTUM CANDLE — the breakout (or a continuation candle within a few bars) has a body of at least a set percentage of the daily ATR; OR
• QUALIFIED FVG — a Fair Value Gap of a set minimum size prints within the confirmation window.
Whichever arrives first arms the setup, and the alert tells you which one it was.
───────────────────────────────────────────
LEVELS AND THE ONE-BREAK DOCTRINE
Tracked levels: PMH/PML, YH/YL, PDC, WH/WL — computed internally, non-repainting, with session boundaries read in exchange time so they hold up through daylight-saving changes and holiday-shortened weeks.
LIFETIME VIRGINITY: a level may signal ONE break per lifetime. The first close beyond it consumes the level; wicks never spend it — sweeps that close back are probes, not violations. A spent level renews when its value changes or at the session roll. This kills re-break noise: a level violated at midday cannot fire again in the evening.
LIVE-LEVEL MATURITY: running levels (WH/WL always; PMH/PML while the premarket window is open) must rest untouched for a set number of bars before they can arm — every new weekly high is technically a "break of WH," and this suppresses that churn while keeping the first quality break.
WHEN "YESTERDAY" ROLLS: Roll Mode is Auto by default — futures roll at the 18:00 ET session open, equities at the next regular-session open — so evening and overnight sessions trade against the levels of the session that just completed.
The full doctrine in one sentence: a level may signal one break per lifetime, provided it has aged while live and is broken with momentum.
───────────────────────────────────────────
THE RETEST — TWO SPECIES
IMMEDIATE KISS-BACK: while the breakout leg is still building, a return to within tolerance of the broken level fires the retest — the fast test-and-reject, often within a bar or two of the break.
SWING 50% RETEST: if price runs instead, the swing confirms, the leg's 50% level is drawn, and the deeper retracement to the 50% or the level — whichever price reaches first — fires the retest.
A+ FLAG: when the leg's 50% coincides with the broken level itself, the retest is tagged A+ — two independent trade logics agreeing on one price.
───────────────────────────────────────────
SIGNALS AND ALERTS
On the chart: the consolidation box, a "B&R " label on the confirmed break, a dotted 50% line once the swing confirms, and a "RETEST " label (with A+ when earned). Breaks that armed but failed are marked with a small x; unconfirmed breaks leave no trace.
Two independent alert stages, each toggleable:
• CONFIRMED BREAKOUT — the level, the direction, and which confirmation fired.
• RETEST ENTERED — the level and price, with the A+ tag when the 50% sits on the level. Off by default; many traders use the breakout alert to get to the chart and watch the retest form.
Alert setup: ONE alert per chart, condition "Any alert() function call", expiration Open-ended. The toggles in settings control what fires. Note: PulseWire alerts snapshot settings at creation — after changing settings, recreate the alert.
───────────────────────────────────────────
HOW TO USE IT
Traders who study break-and-retest setups typically treat the breakout alert as the heads-up and the retest as the decision point — watching for a confirmation candle at the retest before acting. The consolidation box shows you what broke; the tags tell you how it was confirmed.
This indicator identifies structure and sequence. It does not generate buy/sell recommendations, does not place trades, and does not replace your own analysis and risk management.
───────────────────────────────────────────
TECHNICAL NOTES
• Non-repainting: every state transition confirms on bar close; ATR uses completed daily bars; no lookahead anywhere.
• Intraday timeframes only. Built for index and commodity futures but works on any liquid symbol; thresholds are a percentage of daily ATR with tick floors, so they travel across instruments and volatility regimes.
• Coil and range windows, momentum and FVG thresholds, maturity, timeouts, retest tolerance, and session times are fully configurable.
───────────────────────────────────────────
DISCLAIMER
This script is for informational and educational purposes only. It does not constitute financial, investment, or trading advice. A broken level retesting is a pattern, not a guarantee of future price behavior. All trading decisions made using this tool are solely the responsibility of the user. Indicator

Indicator

GProf - Kangaroo TailGProf - Kangaroo Tail
═══════════════════════════════════════════
OVERVIEW
This indicator detects a single, specific reversal event: a liquidity-sweep candle at a meaningful level — the Kangaroo Tail. Price runs an extreme, sweeps through a level where liquidity rests, and is rejected hard within one candle, closing back on the other side.
It is deliberately quiet. Most sessions it prints nothing. It speaks only when a candle sweeps a genuine multi-hour extreme, shows textbook rejection anatomy, and does so at a nameable level. The Kangaroo Tail is not a candle pattern that happens to be near a level — it is a level rejection whose evidence is a candle.
───────────────────────────────────────────
THE CANDLE (KT Short shown — KT Long is the mirror)
1. THE SWEEP — the candle's high prints a new high versus a long lookback (default 78 bars, about 6.5 hours on the 5m). Room to the left, measured in time: the extreme must be genuinely fresh, which excludes signals from inside congestion — you cannot sweep a multi-hour high from within chop.
2. REJECTION ANATOMY — the entire body sits in the bottom third of the range (body position is the filter; color is reported, not required). The opposite wick is capped tightly, and the sweep wick itself must be significant: at least a set percentage of the daily ATR, with a tick floor, so the threshold scales across instruments.
3. CONTEXT — the body sits inside the previous candle's range (toggleable), and a large prior same-direction candle raises a caution tag on the signal rather than suppressing it: the thrust into a level is often strong, and that thrust-sweep-reject sequence is the pattern at its best.
───────────────────────────────────────────
THE LEVEL — REQUIRED, AND MEASURED CORRECTLY
No level, no signal. The confluence set:
• Session levels: PMH/PML, YH/YL, PDC, WH/WL — computed internally, non-repainting.
• Camarilla pivots: R3/R4 for shorts, S3/S4 for longs, from yesterday's RTH high/low/close, DRAWN on the chart (S3/S4 green, R3/R4 red, central pivot marked).
• Up to three custom levels — enter your own higher-timeframe lines and they become part of the confluence set.
Two details most level tools get wrong:
LEVEL-IN-WICK GEOMETRY: the level must lie within the sweep wick's span. A deep sweep THROUGH the level is the pattern at its strongest, not a disqualification. When the wick spans more than one level, the nearest to the wick tip is named.
LIVE-LEVEL MATURITY: a running level (WH/WL always; PMH/PML while the premarket window is open) must rest untouched for a set number of bars before it counts — a sweep candle's own extreme IS the newborn premarket high, and a level seconds old is not structure.
WHEN "YESTERDAY" ROLLS: Roll Mode is Auto by default — futures roll at the 18:00 ET session open, equities at the next regular-session open — so evening and overnight signals test the session that just completed and the Camarilla levels derived from it. Session boundaries are read in exchange time, correct year-round through daylight-saving changes.
───────────────────────────────────────────
SIGNALS AND ALERTS
A qualifying candle prints one label — "KT ▼" or "KT ▲" — carrying its context: the level swept, whether the wick landed inside an unfilled qualified Fair Value Gap, and a caution tag when the prior candle was large.
The alert message includes everything needed to assess without opening the chart: sweep depth in points, the level, FVG confluence, body color, and reference trade geometry — trigger one tick beyond the KT extreme, stop one tick beyond the wick, and the 1:1 target.
Alert setup: add the indicator, create ONE alert with condition "Any alert() function call", expiration Open-ended. Direction is controlled in settings. Note: PulseWire alerts snapshot settings at creation — after changing settings, recreate the alert.
A near-miss diagnostics mode (off by default) is available for investigation: candles at a level that fail exactly one anatomy check print a small marker naming it.
───────────────────────────────────────────
HOW TO USE IT
The Kangaroo Tail marks a completed liquidity event at structure. Traders who study these typically look for entry on a break of the candle's extreme in the rejection direction, with the stop beyond the sweep wick — the geometry the alert pre-computes. Keep your own higher-timeframe levels current in the custom slots: the level set is the heart of the tool.
This indicator identifies a candle pattern at a level. It does not generate buy/sell recommendations, does not place trades, and does not replace your own analysis and risk management.
───────────────────────────────────────────
TECHNICAL NOTES
• Non-repainting: all detection confirms on bar close; ATR uses completed daily bars; levels are built from session windows with no lookahead.
• Intraday timeframes only. Built for index and commodity futures but works on any liquid symbol; size thresholds are a percentage of daily ATR with tick floors, so they travel across instruments.
• Sweep lookback, anatomy thresholds, proximity band, maturity, and session times are fully configurable.
───────────────────────────────────────────
DISCLAIMER
This script is for informational and educational purposes only. It does not constitute financial, investment, or trading advice. A rejection candle at a level is a pattern, not a guarantee of future price behavior. All trading decisions made using this tool are solely the responsibility of the user. Indicator

GProf - Levels, RVOL, ATRGProf - Levels, RVOL, ATR
═══════════════════════════════════════════
OVERVIEW
This indicator answers the three questions an intraday trader asks before and during every session, in one tool:
1. LOCATION — Where is price relative to the structure that matters?
2. PARTICIPATION — Who showed up today, compared to a normal day?
3. RANGE — How much movement is statistically normal, and how much has already been spent?
It combines key session levels, time-of-day Relative Volume (RVOL), and a 14-day ATR with a live Range/ATR reading, shown as clean level lines plus a compact on-chart dashboard. Built with index and commodity futures in mind (NQ, ES, YM, RTY, GC, CL and their micros), it works on any intraday symbol with volume data, and adapts its session logic automatically between futures and equities.
───────────────────────────────────────────
LAYER 1: LOCATION — SESSION LEVELS
• YH / YL — Yesterday's High and Low, RTH-only or full session day.
• PDC — Previous Day Close.
• PMH / PML — Premarket High and Low (4:00am–9:30am ET, or the full overnight session to capture the entire Globex range on futures). Live during the premarket, then frozen at the open.
• WH / WL — The current week's running High and Low, updating in real time.
Each level is a labeled horizontal line with a matching price-scale marker. Colors, width, and labels are configurable, and each group toggles independently.
WHEN "YESTERDAY" ROLLS: by default, Roll Mode is Auto — futures roll yesterday's levels at the 18:00 ET session open (the exchange's own trading-day boundary, so evening and overnight sessions reference the day that just completed), while equities and other symbols roll at the next regular-session open. A manual override is available. Session-day and week boundaries are read in exchange time, so they are correct year-round through daylight-saving changes and hold up across holiday-shortened weeks.
───────────────────────────────────────────
LAYER 2: PARTICIPATION — RVOL
Raw volume comparisons mislead: the first 30 minutes of a session always dwarf lunch hour. This RVOL is time-of-day aware. It records the cumulative session-volume profile for each of the last N sessions, then compares today's cumulative volume to the average at the same elapsed minute of the session.
A reading of 100% means participation is exactly normal for this time of day; 150% means today is running half again above normal. The dashboard colors the reading against a configurable threshold. RVOL is a regular-session metric and reads N/A outside those hours.
───────────────────────────────────────────
LAYER 3: RANGE — ATR(14) AND RANGE/ATR
The dashboard shows the daily ATR (default 14 days), calculated from completed daily bars only — stable all day, never repainting intraday.
More useful than the raw number is Range/ATR: today's range so far as a percentage of the ATR. Under 70% (green), a statistically normal amount of range remains. Between 70–100% (orange), the day is approaching its average. Over 100% (red), the day has already exceeded a normal range, so late continuation attempts are fighting a mostly-spent tape.
Optional ATR Projection Bands (off by default) draw Today's Low + ATR and Today's High − ATR as live exhaustion estimates; when they invert, the day has exceeded its average range — visible at a glance.
───────────────────────────────────────────
HOW TO USE IT
Before the open: note where price sits relative to PMH/PML, YH/YL, and PDC. Confluence between these marks the zones most likely to produce reactions.
At the open: watch RVOL. An opening drive on 130%+ participation behaves very differently from one on 60%.
During the session: use Range/ATR as context for continuation versus exhaustion. A breakout attempt at 95% of ATR deserves more skepticism than the same pattern at 40%.
This indicator draws context only. It does not generate signals, place trades, or replace your own analysis and risk management.
───────────────────────────────────────────
TECHNICAL NOTES
• Non-repainting by design: no lookahead requests, no lower-timeframe data. Levels are built from chart-bar session windows; ATR uses completed daily bars; RVOL uses only accumulated history.
• Best on standard intraday timeframes (1m, 3m, 5m, 15m, 30m). Not intended for daily or higher charts.
• RVOL needs its lookback period of visible chart history to build a full profile; readings in the first sessions after loading are based on fewer samples.
• Session times, timezone, and roll behavior are fully configurable; defaults follow US equities/futures conventions.
───────────────────────────────────────────
DISCLAIMER
This script is for informational and educational purposes only. It does not constitute financial, investment, or trading advice. Past behavior of price, volume, or volatility does not guarantee future results. All trading decisions made using this tool are solely the responsibility of the user. Indicator

GProf - FVG AlertsGProf - FVG Alerts
═══════════════════════════════════════════
OVERVIEW
This indicator detects standard 3-candle Fair Value Gaps (FVGs), draws every gap as a live zone, and fires an alert only when a gap is both large enough to matter and sits in an area with room to the left. It is built to surface displacement worth trading and stay silent on the rest.
Everything confirms on the close of the third candle — nothing is drawn or alerted intrabar, so a gap that appears mid-candle and vanishes before the close never produces a false alert.
───────────────────────────────────────────
DETECTION
• Bullish FVG — the current candle's low is above the high from two bars ago. The zone spans from that prior high (bottom) to the current low (top).
• Bearish FVG — the current candle's high is below the low from two bars ago. The zone spans from the current high (bottom) to that prior low (top).
───────────────────────────────────────────
THE ALERT FILTER — SIZE AND ROOM
Every FVG is drawn. An alert fires only when BOTH conditions are met:
1. SIZE — the gap is at least a set percentage of the daily ATR (default 2%), with a tick floor. Measuring against ATR rather than a fixed point value makes the threshold portable: it means the same thing on a fast index future and a slow one, and it adapts as volatility changes. A fixed-points mode is also available.
2. ROOM TO THE LEFT — the origin of the impulse that created the gap must be in clean territory: the anchor level (the extreme of the move) has few prior candle bodies overlapping it across a lookback window (defaults: 3 bodies over 20 bars). A gap that forms in the middle of prior congestion is drawn but does not alert.
Gaps are shown in three tiers so the chart teaches you over time:
• Full color — qualified on size AND room: these alert.
• Muted gray — big enough, but the anchor lacked room to the left: drawn, silent.
• Faint — below the size threshold: drawn, silent.
Watching which large gaps had room and which did not, and how price treats each, tells you where your own thresholds belong.
───────────────────────────────────────────
ZONE MANAGEMENT
• Zones extend right until fully filled: a bullish gap is removed when price trades down through the bottom of the zone, a bearish gap when price trades up through the top.
• Partial fills leave the zone at its original size — the original boundaries remain the reference, not the shrinking remainder.
• A configurable cap limits how many zones stay on the chart; oldest are removed first.
───────────────────────────────────────────
ALERTS — HOW TO SET UP
1. Add the indicator to your chart.
2. Open the Alert dialog and set the Condition to this indicator.
3. Select "Any alert() function call".
4. Set Expiration to Open-ended and choose your notification methods.
One alert covers everything. The Alert Direction input controls what fires: Both, Bullish Only, Bearish Only, or Off. Alert messages include the symbol, timeframe, direction, gap size in points and as a percentage of ATR, whether room-to-the-left is clean, and the exact zone boundaries.
Note: PulseWire alerts snapshot the indicator's settings when created. If you change the size threshold or other settings later, edit and re-save (or recreate) the alert for the new values to take effect.
───────────────────────────────────────────
HOW TO USE IT
FVGs mark displacement — areas price moved through so fast that an imbalance was left behind. Many traders study them as zones of interest for retracement entries, targets, or invalidation. This indicator identifies and sizes the gaps, flags the significant ones that also have room to the left, and otherwise stays out of the way. Combine it with your own market structure analysis, session context, and risk management.
This indicator identifies a chart pattern. It does not generate buy/sell recommendations, does not place trades, and does not replace your own analysis and risk management.
───────────────────────────────────────────
TECHNICAL NOTES
• Non-repainting: detection, drawing, and alerts occur on confirmed bar closes only.
• Works on any symbol and timeframe. Size thresholds are a percentage of daily ATR with tick floors, so they travel across instruments and volatility regimes; a fixed-points mode is available.
• Colors, transparency, borders, size threshold, and the room-to-the-left lookback are fully configurable.
───────────────────────────────────────────
DISCLAIMER
This script is for informational and educational purposes only. It does not constitute financial, investment, or trading advice. Fair Value Gaps are a chart pattern, not a guarantee of future price behavior. All trading decisions made using this tool are solely the responsibility of the user. Indicator

ATK/DEF HIGH LOW Fibonacci Battlefield ATK/DEF HIGH LOW Fibonacci Battlefield is a multi-factor market structure analysis framework designed to evalua the quality and behavior characte of swing highs and swing lows through the combination of Fibonacci positio, pric behavior, liquidity activity, and market pressure analysis.
Unlike traditional swing high and swing low identification tools that only mark histori tur poin based on pric locatn, this indicator focuses on stu the internal characts behind each detec high and low area.
The purpose of this framework is to provide additional structural context by evalua ho price interact with important swing locatio and how market activity changes around those areas.
The indicator combines three major analytical components into a unified battlefield evalua model:
1. Fibonacci Battlefield Structure
The Fibonacci Battlefield module evalua the position of pric within the current histori rang and analyzes the relationship between swing points and Fibonacci-based pric areas.
This component studies:
• Current pric location within the measured range
• Fibonacci retracement positionin Distance between pric and important Fibonacci lev
• Structural reaction areas around previous highs and lows
Instead of treati Fibonacci leve as isolated horizontal lines, this module uses Fibonacci positioning as a framework to analyze the relative location and condition of pric within a market structure.
The module provides a structural perspecti of whether historical swing areas are located near important Fibonacci zo and how these areas relae to current pric behavior.
2. Whirlpool Pressure Index
The Whirlpool Pressure Index evalua candle behavior and internal pric pressure by analyzing the relationship between bu pressure and se pressure.
This component examines:
• Candle rang distribution
• Closing position within the candle range
• Bu and se pressure balance
• Current pressure intensity around pric areas
The purpose of this calcula is to measure the behavioral characteristics of pric movement and understand the strength of interacti occurring near detec swing highs and swing lows.
It does not attempt to predfuture movement. Instead, it provides a quantimeasurement of current pric behavior based on historical candle information.
3. Liquidity Accelerator / Decelerator
The Liquidity Accelerator / Decelerator module evaluat changes in activity by analyzing volume behavior relative to its historic average.
This component focuses on:
• Relative volume activity
• Changes in market participation
• Liquidity expansion and contrac conditions
• Volume activity intensity around pric movement
The volume calcula is used as a market activity measurement and control reference, helping evalua whether a swing area is formed during stronger or weaker participation conditions.
This module represents volume activity analysis and is not a volume distribution profile or volume profile visualization.
High / Low Behavior Evaluation
The indicator identif swing highs and swing lows and attach multiple analytical measurements to each structural point.
Each detected high and low area can be evaluated through:
• Fibonacci structural position
• Price reaction characteristics
• Pressure condition
• Liquidity activity
• Market behavior context
This allows historical swing locatio to be stubeyond simple pric levels.
The framework focuses on the quality and characteristics of swing points rather than only identifyi where previous highs and lows occurred.
Integrated Battlefield Dashboard
The dashboard combines multiple analytical measurements into a compact information panel.
Displayed information includes:
• Fibonacci structural condition
• Pressure balance measurement
• Liquidity activity condition
• Flow balance characteristics
• Current market environment status
The dashboard is designed to provide a structured overview of market behavior and pric conditions from multiple perspectives.
Market Condition Analysis
The market condition module evaluat the current relationship between pric exten, momentum characteristics, and recent pric range behavior.
It analyzes:
• RSI positioning
• Recent pric extremes
• Momentum condition
• Pric and oscillator relationship
This component is designed to describe the current market environment and highlight changes in pric behavior characteristics.
It is a condition measurement tool based on historical market data rather than a prediction system.
Core Features
• Swing High and Swing Low structural analysis
• Fibonacci-based battlefield framework
• Pric behavior evaluati
• Candle pressure measurement
• Volume activity analysis
• Liquidity condition tracking
• Multi-factor market structure dashboard
• Historical swing point contextual analysis
• Quantitative evaluat of pric areas
• Integrat structural and behavioral analysis framework
Concept
ATK/DEF HIGH LOW Fibonacci Battlefield is designed to stu the relationship between pric structure, market participation, and behavioral characteristics.
Traditional swing tools mainy focus on identifying previous highs and lows. This framework expas the analysis by combining structural position, candle behavior, and volume activity to evalua the characteris behind each swing location.
All calculat are derived from historical market data and are intended for market research, technical analysis, and structural observation purposes.
The displayed values represent analytical measurements of pric behavior, liquidity conditions, and market structure characteristics. Indicator

ATK/DEF High Low Flow Engine ATK/DEF High Low Flow Engine is a market structure analysis tool designed to evaluate the effectives of swing highs and swing lows through the combination of price structure, volume activity, and flow behavior.
Unlike traditional swing high and swing low tools that only display historical turning points, this indicator focuses on analyzing the internal behavior behind each structural high and low area.
The objective is not simply to locate previous price extremes, but to evaluate the quality and characteristics of those points by examining how volume participation and flow conditions developed during the formation of each swing structure.
The engine combines swing point analysis with (CMF) based volume flow evaluation to provide a deeper view of historical price behavior.
Core Analysis Components
1. Swing High / Swing Low Structure Analysis
The indicator processes historical swing points based on pivot structure calculati.
Each detec high and low represents a previous area where price created a local structural extreme.
Instead of treating all swing points equally, the indicator attaches additional behavioral information to each structural point by evaluati the market activity that occurred during its formation.
This allows users to stu the difference between simple pri extremes and pri extremes supported by stronger market participation.
2. CMF Flow Behavior Analysis
The Chaikin Flow (CMF) component evaluates the relationship between clo position, pric range, and volume activity.
By combining price location within the candle range with traded volume, CMF provides a measurement of flow characteristics around the selected period.
This module analyzes whether volume activity around structural highs and lows was associa with stronger inflow conditions, weaker flow conditions, neutral behavior, or declinin participation.
The purpose is to evaluate the internal volume behavior surrounding price structures rather than relying only on the visible price level.
3. Volume Activity Evaluation
The volume analysis component measures current volume participation relative to its historical average.
It provides context regarding whether market activity around price structures is relatively elevated, normal, or reduced.
This evaluation helps distinguish between swing points formed under different lev of market participation.
The volume component is used as a structural measurement factor and does not represent a volume distribution model or market profile visualization.
Structural Effectiveness Evaluation
Traditional swing high and swing low concepts mainly answer:
"Where did price previously create an extreme?"
This indicator expands that concept by analyzing:
"How did volume and money flow behave when that extreme was formed?"
By combining swing structure with CMF-based flow analysis, the indicator provides additional information about the characteristics behind historical highs and lows.
The displayed measurements represent analytical observations of price structure, volume conditions, and money flow behavior.
Dashboard Information
The integrated dashboard provides multiple analytical measurements including:
• CMF flow condition
• CMF moving average relationship
• Volume activity lev
• flow strength classification
• Price location relative to calculated flow reference
• Structural zone activity measurement
These vals are designed to provide a compact overvi of market behavior surrounding the current chart environment.
Key Features
• Swing high and swing low structural analysis
• Volume-based behavior evaluation
• CMF money flow measurement
• Historical high and low quality assessment
• Price structure combined with volume characteristics
• Liquidity activity observation
• Structural behavior dashboard
• Multi-factor market activity analysis
• Historical price extreme evaluation
• Quantitative observation of volume participation
ATK/DEF High Low Flow Engine is designed as a technical analysis and market structure research tool.
The calculat focus on stu the relationship between pric extremes, volume participation, and flow characteristics.
Rather than displaying simple historical highs and lows, this framework provides additional context regarding the behavioral conditions surrounding those structural points.
All displayed values are analytical measurements derived from historical market data and are intended for research and technical analysis purposes. Indicator

Indicator

Indicator

Strategy

Indicator

Indicator

Indicator

Candle Effective POCShort version (one-liner):
Breaks each candle into lower-timeframe sub-bars and marks the price level where the most volume traded — a per-candle Point of Control, color-coded by direction and volume strength.
Full version:
Candle POC
Every chart candle is split into lower-timeframe sub-bars (default 1 min). The script finds the single sub-bar that traded the most volume and draws a horizontal band at its midpoint price — an approximation of that candle's Point of Control, i.e. where the business actually got done inside the bar.
Color coding
The band encodes two things at once:
Direction — did the dominant sub-bar close up or down?
Bull → green palette
Bear → red/purple palette
Doji → neutral gray
Conviction — POC volume vs. its own N-bar average:
Above avg × 1.2 → saturated (bright green / purple)
Normal → mid tone (lime / red)
Below avg × 0.8 → faded
A bright green band means heavy, buyer-dominated trade inside that candle. A faded red band means the POC formed on thin, low-conviction volume.
Inputs
Sub-bar Timeframe — must be lower than chart TF (e.g. 1 min on a 5 min chart)
Height (% of candle range) — band thickness, scales with each candle's own range
Average Volume Length / High / Low Multiplier — intensity thresholds
Six directional colors + neutral
How to read it
POC levels are intrabar value — revisits often produce a reaction
POCs stacking at the same price across several candles = an acceptance zone
POC sitting near the candle extreme rather than the middle shows where initiative came from
Mismatch between candle direction and POC color (down candle, bright green POC) can flag absorption
Notes / limitations
This is an approximation, not a true volume profile — it takes the single fattest sub-bar instead of binning volume across price levels. Finer sub-TF = closer to the real POC.
request.security_lower_tf is capped in history depth and depends on your PulseWire plan, so older bars may show nothing.
The forming bar updates live until close.
max_boxes_count = 1500 limits display to roughly the last 1500 candles.
One thing on the code itself: the version you pasted lost its indentation inside the if blocks. It won't compile until the bodies under if array.size(subVol) > 0, if pocSide == 1, and the final if not na(pocPrice) are indented. Indicator
