ProRealCode - Trading & Coding with ProRealTime™
Chiedo se è possibile tradurre questo indicatore di Tradingview.
Grazie
https://it.tradingview.com/script/oA9rDnQB-Luxy-BOSS-MODE-Support-Resistance/
ecco qui:
//-----------------------------------------------//
// PRC_Boss Mode S/R
// Multi-source S/R zone detector with composite scoring
// Sources: Swing pivots, Order Blocks, Fair Value Gaps, Liquidity Pools
// Inspired by "Boss Mode S/R" by OrenLuxy (TradingView, MPL 2.0)
// version = 1
// 30.04.2026
// Iván González @ www.prorealcode.com
// Sharing ProRealTime knowledge
//-----------------------------------------------//
//-----INPUTS-----------------------------------//
prdLeft = 5 // Bars left for pivot
prdRight = 5 // Bars right for pivot (no-repaint delay)
zoneAtrPct = 0.5 // Zone half-width as fraction of ATR
maxZones = 30 // Max zones in memory
topN = 10 // Render only top N by score
obMinMovePct = 1.5 // Min impulse % to qualify Order Block
obVolMult = 1.5 // Min volume ratio at OB formation
fvgMinPct = 0.3 // Min gap size % of price for FVG
liqLength = 20 // Lookback for equal highs/lows
liqTolPct = 0.1 // Equal-tolerance % for Liquidity
// Scoring weights
wTouch = 12
wTouchVol = 18
wCreateVol = 12
wConf = 18
wFresh = 8
wRegime = 12
// Source toggles
useSwing = 1
useOB = 1
useFVG = 1
useLiq = 1
// Filters
showGradeC = 1 // 0 = render only Grade A and B
warnAtrDist = 0.5 // ATR distance for zone-approach warning
//-----STATE-----------------------------------//
once zCount = 0
prdTotal = prdLeft + prdRight + 1
atrV = averagetruerange[14]
avgVol20 = average[20](volume)
avgVol60 = average[60](volume)
avgVolLiq = average[liqLength](volume)
zoneW = atrV * zoneAtrPct
//-----REGIME CLASSIFIER-----------------------//
adxV = ADX[14]
ema50 = exponentialaverage[50](close)
emaSlope5 = 0
if barindex >= 5 and ema50[5] <> 0 then
emaSlope5 = (ema50 - ema50[5]) / ema50[5] * 100
endif
// regime: 1=STRONG_BULL 2=WEAK_BULL -1=STRONG_BEAR -2=WEAK_BEAR 0=RANGE
regime = 0
if adxV > 25 and emaSlope5 > 0.5 then
regime = 1
elsif adxV > 18 and emaSlope5 > 0.1 then
regime = 2
elsif adxV > 25 and emaSlope5 < -0.5 then
regime = -1
elsif adxV > 18 and emaSlope5 < -0.1 then
regime = -2
endif
//-----CANDIDATE COLLECTOR---------------------//
// Each detector pushes 0..1 candidates into $cand* arrays
// A single processor pass at the end resolves overlap and stores the zone
candCount = 0
// --- Detector 1: SWING pivots ---
if useSwing and barindex >= prdTotal then
if high[prdRight] >= highest[prdTotal](high) then
$candTop[candCount] = high[prdRight] + zoneW * 0.5
$candBot[candCount] = high[prdRight] - zoneW * 0.5
$candIsSup[candCount] = 0
$candSrc[candCount] = 1
$candVol[candCount] = volume[prdRight]
candCount = candCount + 1
endif
if low[prdRight] <= lowest[prdTotal](low) then
$candTop[candCount] = low[prdRight] + zoneW * 0.5
$candBot[candCount] = low[prdRight] - zoneW * 0.5
$candIsSup[candCount] = 1
$candSrc[candCount] = 1
$candVol[candCount] = volume[prdRight]
candCount = candCount + 1
endif
endif
// --- Detector 2: ORDER BLOCKS ---
if useOB and barindex >= 6 then
isBearPrev = close[1] < open[1]
bullMove = (close - open[1]) / open[1] * 100
bullDisp = close > max(high[2], max(high[3], max(high[4], high[5])))
if isBearPrev and bullMove >= obMinMovePct and volume >= avgVol60 * obVolMult and bullDisp then
obT = max(open[1], close[1])
obB = min(open[1], close[1])
$candTop[candCount] = obT
$candBot[candCount] = obB
$candIsSup[candCount] = 1
$candSrc[candCount] = 2
$candVol[candCount] = volume[1]
candCount = candCount + 1
endif
isBullPrev = close[1] > open[1]
bearMove = (open[1] - close) / open[1] * 100
bearDisp = close < min(low[2], min(low[3], min(low[4], low[5])))
if isBullPrev and bearMove >= obMinMovePct and volume >= avgVol60 * obVolMult and bearDisp then
obT = max(open[1], close[1])
obB = min(open[1], close[1])
$candTop[candCount] = obT
$candBot[candCount] = obB
$candIsSup[candCount] = 0
$candSrc[candCount] = 2
$candVol[candCount] = volume[1]
candCount = candCount + 1
endif
endif
// --- Detector 3: FAIR VALUE GAPS ---
if useFVG and barindex >= 2 then
minGap = close * fvgMinPct / 100
bullMidImp = close[1] > open[1] and (close[1] - open[1]) >= atrV * 0.3
if low > high[2] and (low - high[2]) >= minGap and bullMidImp then
$candTop[candCount] = low
$candBot[candCount] = high[2]
$candIsSup[candCount] = 1
$candSrc[candCount] = 3
$candVol[candCount] = volume[1]
candCount = candCount + 1
endif
bearMidImp = close[1] < open[1] and (open[1] - close[1]) >= atrV * 0.3
if low[2] > high and (low[2] - high) >= minGap and bearMidImp then
$candTop[candCount] = low[2]
$candBot[candCount] = high
$candIsSup[candCount] = 0
$candSrc[candCount] = 3
$candVol[candCount] = volume[1]
candCount = candCount + 1
endif
endif
// --- Detector 4: LIQUIDITY POOLS ---
if useLiq and barindex >= liqLength then
tol = close * liqTolPct / 100
liqH = highest[liqLength](high)
liqL = lowest[liqLength](low)
eqHcount = 0
eqLcount = 0
for k = 0 to liqLength - 1 do
if abs(high[k] - liqH) <= tol then
eqHcount = eqHcount + 1
endif
if abs(low[k] - liqL) <= tol then
eqLcount = eqLcount + 1
endif
next
if eqHcount >= 2 then
$candTop[candCount] = liqH + tol
$candBot[candCount] = liqH - tol
$candIsSup[candCount] = 0
$candSrc[candCount] = 4
$candVol[candCount] = avgVolLiq
candCount = candCount + 1
endif
if eqLcount >= 2 then
$candTop[candCount] = liqL + tol
$candBot[candCount] = liqL - tol
$candIsSup[candCount] = 1
$candSrc[candCount] = 4
$candVol[candCount] = avgVolLiq
candCount = candCount + 1
endif
endif
//-----PROCESS CANDIDATES (overlap + add)------//
if candCount > 0 then
for c = 0 to candCount - 1 do
cTop = $candTop[c]
cBot = $candBot[c]
cMid = (cTop + cBot) / 2
cWidth = cTop - cBot
cIsSup = $candIsSup[c]
cSrc = $candSrc[c]
cVol = $candVol[c]
// Overlap with existing zones?
overlap = 0
if zCount > 0 then
for q = 0 to zCount - 1 do
if abs($zoneMid[q] - cMid) < cWidth * 2 then
overlap = 1
endif
next
endif
if overlap = 0 then
// Slot: append, or evict lowest score
if zCount < maxZones then
idx = zCount
zCount = zCount + 1
else
minS = 999
minIdx = 0
for q = 0 to maxZones - 1 do
if $zoneScore[q] < minS then
minS = $zoneScore[q]
minIdx = q
endif
next
idx = minIdx
endif
$zoneTop[idx] = cTop
$zoneBot[idx] = cBot
$zoneMid[idx] = cMid
$zoneIsSup[idx] = cIsSup
$zoneSrc[idx] = cSrc
$zoneCreated[idx] = barindex
$zoneLastTouch[idx] = barindex
$zoneTouches[idx] = 0
$zoneViol[idx] = 0
$zoneFresh[idx] = 1
cv = 1
if avgVol20 > 0 then
cv = cVol / avgVol20
endif
$zoneCreateVol[idx] = cv
$zoneTouchVol[idx] = 0
$zoneConf[idx] = 1
$zoneScore[idx] = 50
endif
next
endif
//-----TOUCH & VIOLATION TRACKER---------------//
if zCount > 0 then
for q = 0 to zCount - 1 do
zT = $zoneTop[q]
zB = $zoneBot[q]
zIs = $zoneIsSup[q]
// Touch (bar entered the zone)
if low <= zT and high >= zB and barindex > $zoneCreated[q] then
$zoneFresh[q] = 0
tc = $zoneTouches[q] + 1
$zoneTouches[q] = tc
tvr = 1
if avgVol20 > 0 then
tvr = volume / avgVol20
endif
if tc = 1 then
$zoneTouchVol[q] = tvr
else
$zoneTouchVol[q] = ($zoneTouchVol[q] * (tc - 1) + tvr) / tc
endif
$zoneLastTouch[q] = barindex
endif
// Violation: close beyond the zone in the wrong direction
viol = 0
if zIs = 1 and close < zB then
viol = 1
endif
if zIs = 0 and close > zT then
viol = 1
endif
if viol = 1 then
$zoneViol[q] = $zoneViol[q] + 1
endif
next
endif
//-----CONFLUENCE COUNT------------------------//
if zCount > 0 then
for q = 0 to zCount - 1 do
cnt = 1
for r = 0 to zCount - 1 do
if r <> q then
if $zoneTop[q] >= $zoneBot[r] and $zoneBot[q] <= $zoneTop[r] then
cnt = cnt + 1
endif
endif
next
$zoneConf[q] = cnt
next
endif
//-----COMPOSITE SCORE ENGINE------------------//
totalW = wTouch + wTouchVol + wCreateVol + wConf + wFresh + wRegime
if zCount > 0 then
for q = 0 to zCount - 1 do
touchN = min($zoneTouches[q], 5) / 5
volConv = min($zoneTouchVol[q], 3) / 3
createVn = min($zoneCreateVol[q], 3) / 3
confN = min($zoneConf[q], 5) / 5
freshN = 0
if $zoneFresh[q] = 1 then
freshN = 1
else
decay = 1 - (barindex - $zoneLastTouch[q]) / 300
if decay > 0 then
freshN = decay
endif
endif
violPen = min($zoneViol[q] * 0.25, 1)
rf = 0.5
if $zoneIsSup[q] = 1 then
if regime = 1 then
rf = 1
elsif regime = 2 then
rf = 0.8
elsif regime = 0 then
rf = 0.5
elsif regime = -2 then
rf = 0.3
else
rf = 0.2
endif
else
if regime = -1 then
rf = 1
elsif regime = -2 then
rf = 0.8
elsif regime = 0 then
rf = 0.5
elsif regime = 2 then
rf = 0.3
else
rf = 0.2
endif
endif
raw = (touchN * wTouch + volConv * wTouchVol + createVn * wCreateVol + confN * wConf + freshN * wFresh + rf * wRegime - violPen * 6) / totalW * 100
sc = max(0, min(100, raw))
$zoneScore[q] = sc
next
endif
//-----WARNINGS--------------------------------//
// 0=none 1=approach A 2=approach B 3=trap suspected
warning = 0
if zCount > 0 then
for q = 0 to zCount - 1 do
zScore = $zoneScore[q]
zMid2 = $zoneMid[q]
zViol2 = $zoneViol[q]
dist = abs(zMid2 - close)
if zScore >= 80 and dist < atrV * warnAtrDist then
warning = 1
elsif zScore >= 65 and dist < atrV * warnAtrDist and warning = 0 then
warning = 2
endif
if zViol2 >= 1 and dist < atrV * 0.3 and volume < avgVol20 * 0.7 and warning < 3 then
warning = 3
endif
next
endif
//-----LAST-BAR RENDERING----------------------//
if islastbarupdate then
if zCount > 0 then
// Top-N selection (partial selection sort)
for q = 0 to zCount - 1 do
$drawFlag[q] = 0
next
for k = 0 to topN - 1 do
bestS = -1
bestIdx = -1
for q = 0 to zCount - 1 do
if $drawFlag[q] = 0 and $zoneScore[q] > bestS then
bestS = $zoneScore[q]
bestIdx = q
endif
next
if bestIdx >= 0 then
$drawFlag[bestIdx] = 1
endif
next
// Draw selected zones
for q = 0 to zCount - 1 do
if $drawFlag[q] = 1 then
zScoreD = $zoneScore[q]
zIsD = $zoneIsSup[q]
if zScoreD >= 50 or showGradeC = 1 then
if zIsD = 1 then
if zScoreD >= 80 then
r = 0
g = 200
b = 100
a = 90
elsif zScoreD >= 65 then
r = 30
g = 180
b = 90
a = 60
else
r = 80
g = 160
b = 100
a = 35
endif
else
if zScoreD >= 80 then
r = 230
g = 30
b = 30
a = 90
elsif zScoreD >= 65 then
r = 220
g = 90
b = 50
a = 60
else
r = 200
g = 130
b = 130
a = 35
endif
endif
drawrectangle($zoneCreated[q], $zoneBot[q], barindex + 5, $zoneTop[q]) coloured(r, g, b, 200) fillcolor(r, g, b, a)
endif
endif
next
// Nearest support and resistance
nsLow = 0
nsScore = 0
nrHigh = 0
nrScore = 0
bestSupDist = 999999
bestResDist = 999999
for q = 0 to zCount - 1 do
if $zoneIsSup[q] = 1 and $zoneTop[q] < close then
dS = close - $zoneTop[q]
if dS < bestSupDist then
bestSupDist = dS
nsLow = $zoneTop[q]
nsScore = $zoneScore[q]
endif
endif
if $zoneIsSup[q] = 0 and $zoneBot[q] > close then
dR = $zoneBot[q] - close
if dR < bestResDist then
bestResDist = dR
nrHigh = $zoneBot[q]
nrScore = $zoneScore[q]
endif
endif
next
// Highlighted nearest S/R: saturated horizontal segment + price label at the level
srLeft = barindex - 30
srRight = barindex + 30
if nsLow <> 0 then
drawsegment(srLeft, nsLow, srRight, nsLow) coloured(0, 230, 100, 255)
drawtext("#nsLow#", srRight + 2, nsLow+0.15*atrV, sansserif, bold, 11) coloured(0, 230, 100)
endif
if nrHigh <> 0 then
drawsegment(srLeft, nrHigh, srRight, nrHigh) coloured(230, 30, 30, 255)
drawtext("#nrHigh#", srRight + 2, nrHigh+0.15*atrV, sansserif, bold, 11) coloured(230, 30, 30)
endif
// Compact panel: regime + warning only
panelX = -200
topY = -100
if regime = 1 then
drawtext("Regime: STRONG BULL", panelX, topY, sansserif, bold, 11) coloured(0, 200, 100)anchor(topright,xshift,yshift)
elsif regime = 2 then
drawtext("Regime: WEAK BULL", panelX, topY, sansserif, bold, 11) coloured(80, 180, 120)anchor(topright,xshift,yshift)
elsif regime = -1 then
drawtext("Regime: STRONG BEAR", panelX, topY, sansserif, bold, 11) coloured(220, 50, 50)anchor(topright,xshift,yshift)
elsif regime = -2 then
drawtext("Regime: WEAK BEAR", panelX, topY, sansserif, bold, 11) coloured(220, 120, 80)anchor(topright,xshift,yshift)
else
drawtext("Regime: RANGE", panelX, topY, sansserif, bold, 11) coloured(150, 150, 150)anchor(topright,xshift,yshift)
endif
if warning = 1 then
drawtext("Approaching A-zone", panelX, topY - 30, sansserif, bold, 11) coloured(255, 100, 0)anchor(topright,xshift,yshift)
elsif warning = 2 then
drawtext("Approaching B-zone", panelX, topY - 30, sansserif, standard, 10) coloured(220, 150, 60)anchor(topright,xshift,yshift)
elsif warning = 3 then
drawtext("Trap suspected", panelX, topY - 30, sansserif, bold, 11) coloured(255, 50, 50)anchor(topright,xshift,yshift)
endif
endif
endif
return
This topic contains 1 reply,
has 2 voices, and was last updated by
Iván González
4 weeks, 1 day ago.
| Forum: | TradingView to ProRealTime Translation Center Forum |
| Started: | 04/30/2026 |
| Status: | Active |
| Attachments: | No files |
The information collected on this form is stored in a computer file by ProRealCode to create and access your ProRealCode profile. This data is kept in a secure database for the duration of the member's membership. They will be kept as long as you use our services and will be automatically deleted after 3 years of inactivity. Your personal data is used to create your private profile on ProRealCode. This data is maintained by SAS ProRealCode, 407 rue Freycinet, 59151 Arleux, France. If you subscribe to our newsletters, your email address is provided to our service provider "MailChimp" located in the United States, with whom we have signed a confidentiality agreement. This company is also compliant with the EU/Swiss Privacy Shield, and the GDPR. For any request for correction or deletion concerning your data, you can directly contact the ProRealCode team by email at privacy@prorealcode.com If you would like to lodge a complaint regarding the use of your personal data, you can contact your data protection supervisory authority.