Support and resistance are the most universally watched levels in technical analysis, but drawing them by hand is subjective and slow. The Support and Resistance Levels with Breaks indicator automates the whole job: it detects swing pivots, plots the most recent high pivot as resistance and the most recent low pivot as support, and then flags the exact bar where price breaks through one of them, filtered by a volume surge.
This indicator was originally written in PineScript for TradingView by LuxAlgo, where it is one of the most downloaded support/resistance scripts on the platform. It has been adapted to ProBuilder for ProRealTime as a single self-contained indicator..
The indicator combines three simple building blocks:
A break is only marked B (a clean break) when the close crosses the level, the volume oscillator is above the threshold, and the candle is not a rejection wick. If price pierces the level but closes with a dominant wick against the move, it is labelled Bull Wick or Bear Wick instead — a warning that the break may be false.
The indicator overlays directly on the price chart:
A level that price keeps respecting reinforces the current structure; the moment a volume-backed B prints, the structure has shifted.
//---------------------------------------------//
// PRC_Support and Resistance Levels with Breaks [LuxAlgo]
// version = 1
// Iván González @ www.prorealcode.com
// Sharing ProRealTime knowledge
//---------------------------------------------//
toggleBreaks = 1
leftBars = 15
rightBars = 15
volumeThresh = 20
win = leftBars + rightBars + 1
//---------------------------------------------//
// Pivote HIGH confirmado → cierra el tramo anterior y abre el nuevo
IF high[rightBars] = highest[win](high) THEN
IF resLevel > 0 THEN
DRAWSEGMENT(xRes, resLevel, barindex - rightBars, resLevel) style(line,2)COLOURED(255,0,0)
ENDIF
resLevel = high[rightBars]
xRes = barindex - rightBars
ENDIF
// Pivote LOW confirmado
IF low[rightBars] = lowest[win](low) THEN
IF supLevel > 0 THEN
DRAWSEGMENT(xSup, supLevel, barindex - rightBars, supLevel)style(line,2) COLOURED(35,61,238)
ENDIF
supLevel = low[rightBars]
xSup = barindex - rightBars
ENDIF
//---------------------------------------------//
// Oscilador de volumen EMA5 vs EMA10
shortV = average[5,1](volume)
longV = average[10,1](volume)
IF longV > 0 THEN
osc = 100 * (shortV - longV) / longV
ELSE
osc = 0
ENDIF
//---------------------------------------------//
bearWick = (open - close) < (high - open)
bullWick = (open - low) > (close - open)
atrUnit = averagetruerange[14]
brkUp = close CROSSES OVER resLevel
brkDown = close CROSSES UNDER supLevel
IF toggleBreaks THEN
IF brkUp AND osc > volumeThresh AND NOT bullWick THEN
DRAWTEXT("B", barindex, low - atrUnit) COLOURED(0,180,0)
ENDIF
IF brkUp AND bullWick THEN
DRAWTEXT("Bull Wick", barindex, low - atrUnit) COLOURED(0,180,0)
ENDIF
IF brkDown AND osc > volumeThresh AND NOT bearWick THEN
DRAWTEXT("B", barindex, high + atrUnit) COLOURED(255,0,0)
ENDIF
IF brkDown AND bearWick THEN
DRAWTEXT("Bear Wick", barindex, high + atrUnit) COLOURED(255,0,0)
ENDIF
ENDIF
//---------------------------------------------//
// Extiende el nivel vigente hasta la barra actual (tramo aún sin cerrar)
IF ISLASTBARUPDATE THEN
IF resLevel > 0 THEN
DRAWSEGMENT(xRes, resLevel, barindex, resLevel) style(line,2)COLOURED(255,0,0)
ENDIF
IF supLevel > 0 THEN
DRAWSEGMENT(xSup, supLevel, barindex, supLevel) style(line,2)COLOURED(35,61,238)
ENDIF
ENDIF
//---------------------------------------------//
RETURN