Smart Money Concepts (SMC) Probability Indicator

Category: Indicators By: Iván González Created: March 2, 2026, 9:30 AM
March 2, 2026, 9:30 AM
Indicators
0 Comments

Smart Money Concepts (SMC) has become one of the most popular methodologies for analyzing price action. However, a common struggle for traders is knowing whether a structural break will lead to a true trend continuation or result in a reversal.

 

What if you could attach historical, statistical probabilities to every structural move?

 

Based on the original concept by Zeiierman, this SMC Probability indicator has been fully adapted for ProRealTime. It doesn’t just map out market structure; it tracks historical outcomes to calculate the real-time probability of a trend continuation versus a trend reversal.

 

Here is a complete breakdown of how it works and how you can use it to enhance your market analysis.

 

Core SMC Concepts Explained

 

To fully utilize this indicator, it helps to understand the three primary structural labels it plots on your chart:

 

  • CHoCH (Change of Character): This is the first sign of a potential trend reversal. It occurs when price breaks a previous significant swing high (in a downtrend) or swing low (in an uptrend).
  • SMS (Shift in Market Structure): Often seen as an early sign of weakness or a minor continuation step, occurring before a major structural break.
  • BMS (Break of Market Structure): This confirms trend continuation. It occurs when price successfully breaks and closes past the previous structural high (in an uptrend) or low (in a downtrend).

How the Probability Engine Works

 

What makes this indicator unique is its built-in state machine and performance tracker. It continuously monitors every CHoCH, SMS, and BMS that occurs on the chart.

 

When a new structural level is established, the indicator projects the next possible levels and displays a percentage (%). This percentage represents the historical probability of that specific event occurring next, based on the asset’s past behavior within the loaded historical data.

 

Additionally, in the top right corner of your chart, you will see a Win/Loss tracker (WR: Win Rate %). This tracks how often the indicator’s “higher probability” bias was actually correct, giving you immediate feedback on whether this asset respects its historical structural patterns.

 

Premium, Discount, and Equilibrium Zones

 

Trading SMC effectively relies heavily on knowing where you are in the current price range. This indicator automatically draws a dynamic channel based on the most recent significant pivots:

 

  • Premium Zone (Red Rectangle): The upper portion of the range. In SMC theory, this is where “Smart Money” looks to sell or distribute positions. It is generally ideal to look for short setups (bearish CHoCH) here.
  • Discount Zone (Green Rectangle): The lower portion of the range. This is where the asset is considered “cheap,” and where institutions look to accumulate. It is ideal to look for long setups (bullish CHoCH) here.
  • Equilibrium / Mid Zone (Grey Rectangle): The middle of the range. Price action here can be choppy, and it is often advised to wait for price to reach the Premium or Discount extremes before acting.

Configuration and Settings

 

The indicator comes with several customizable inputs so you can adapt it to your preferred timeframe and trading style.

  • prd (Pivot Period): Default is 20. This defines the lookback period for identifying major swing highs and swing lows. A lower number will make the indicator highly reactive (identifying micro-structure), while a higher number will focus only on major macroeconomic swings.
  • s1 (Use Response Period): A boolean toggle (1 = true, 0 = false). If set to 1, the indicator uses a secondary, faster period (resp) to validate structural breaks, rather than waiting for the full prd condition.
  • resp (Response Period): Default is 7. Only active if s1 = 1. This allows the indicator to confirm a Shift in Market Structure (SMS) or Break of Market Structure (BMS) slightly faster.
  • Display Toggles:
  • showBull (1/0): Toggle to show or hide bullish structure lines and labels.
  • showBear (1/0): Toggle to show or hide bearish structure lines and labels.
  • showPD (1/0): Toggle to show or hide the colored Premium/Discount/Mid rectangles.

 

ProBuilder Code

 

//----------------------------------------------------------------------//
// PRC_Smart Money Concepts Probability (by Zeiierman)
// version = 0
// 27.02.2026
// Iván González @ www.prorealcode.com
// Sharing ProRealTime knowledge
//----------------------------------------------------------------------//
// --- INPUTS ---
prd = 20        // Periodo de pivots
s1 = 1          // 1 = usar periodo de respuesta, 0 = usar periodo de pivots
resp = 7        // Periodo de respuesta (solo si s1 = 1)
showBull = 1    // 1 = mostrar estructura alcista
showBear = 1    // 1 = mostrar estructura bajista
showPD = 1      // 1 = mostrar Premium & Discount


// --- PERIODO DE COMPROBACION ---
if s1 then
checkP = resp
else
checkP = prd
endif


// --- ATR PARA OFFSET DE LABELS ---
myATR = averagetruerange[14]


// --- INICIALIZACION ---
once pos = 0
once iUp = 0
once iDn = 0
// Contadores totales estructura
once tbuCH = 0
once tbuSM = 0
once tbuBM = 0
once tbeCH = 0
once tbeSM = 0
once tbeBM = 0
// Estadisticas probabilidad alcista
once buCHfailCnt = 0
once buCHfailPct = 0
once buCHcontCnt = 0
once buCHcontPct = 0
once buSMfailCnt = 0
once buSMfailPct = 0
once buSMcontCnt = 0
once buSMcontPct = 0
once buBMfailCnt = 0
once buBMfailPct = 0
once buBMcontCnt = 0
once buBMcontPct = 0
// Estadisticas probabilidad bajista
once beCHfailCnt = 0
once beCHfailPct = 0
once beCHcontCnt = 0
once beCHcontPct = 0
once beSMfailCnt = 0
once beSMfailPct = 0
once beSMcontCnt = 0
once beSMcontPct = 0
once beBMfailCnt = 0
once beBMfailPct = 0
once beBMcontCnt = 0
once beBMcontPct = 0
// Score tracking
once scVal1 = 0
once scVal2 = 0
once scW = 0
once scL = 0
// Probabilidades display
once revPct = 0
once contPct = 0


// =================================================
// DETECCION DE PIVOTS
// =================================================
pvthi = undefined
pvtlo = undefined
pvthiFound = 0
pvtloFound = 0


if barindex >= 2 * prd then
if high[prd] >= highest[prd](high) and high[prd] > highest[prd](high)[prd + 1] then
pvthi = high[prd]
pvthiFound = 1
endif
if low[prd] <= lowest[prd](low) and low[prd] < lowest[prd](low)[prd + 1] then
pvtlo = low[prd]
pvtloFound = 1
endif
endif


// =================================================
// RUNNING HIGH / LOW
// =================================================
if barindex = 0 then
upLvl = high
dnLvl = low
else
upLvl = max(upLvl[1], high)
dnLvl = min(dnLvl[1], low)
endif


if pvthiFound then
upLvl = pvthi
endif
if pvtloFound then
dnLvl = pvtlo
endif


// =================================================
// DETECCION DE ESTRUCTURA (Maquina de estados)
// =================================================


// --- Ruptura alcista ---
if upLvl > upLvl[1] then
iUp = barindex
centerBull = round((iUp[1] + barindex) / 2)


if pos <= 0 then
// CHoCH Alcista
if showBull then
drawtext("CHoCH", centerBull, upLvl[1] + myATR * 0.5) coloured(8, 236, 126)
drawsegment(iUp[1], upLvl[1], barindex, upLvl[1]) coloured(8, 236, 126) style(line, 2)
endif
pos = 1
tbuCH = tbuCH + 1


elsif pos = 1 and upLvl[1] = upLvl[checkP] then
// SMS Alcista
if showBull then
drawtext("SMS", centerBull, upLvl[1] + myATR * 0.5) coloured(8, 236, 126)
drawsegment(iUp[1], upLvl[1], barindex, upLvl[1]) coloured(8, 236, 126) style(line, 2)
endif
pos = 2
tbuSM = tbuSM + 1


elsif pos > 1 and upLvl[1] = upLvl[checkP] then
// BMS Alcista
if showBull then
drawtext("BMS", centerBull, upLvl[1] + myATR * 0.5) coloured(8, 236, 126)
drawsegment(iUp[1], upLvl[1], barindex, upLvl[1]) coloured(8, 236, 126) style(line, 2)
endif
pos = pos + 1
tbuBM = tbuBM + 1
endif


elsif upLvl < upLvl[1] then
iUp = barindex - prd
endif


// --- Ruptura bajista ---
if dnLvl < dnLvl[1] then
iDn = barindex
centerBear = round((iDn[1] + barindex) / 2)


if pos >= 0 then
// CHoCH Bajista
if showBear then
drawtext("CHoCH", centerBear, dnLvl[1] - myATR * 0.5) coloured(255, 34, 34)
drawsegment(iDn[1], dnLvl[1], barindex, dnLvl[1]) coloured(255, 34, 34) style(line, 2)
endif
pos = -1
tbeCH = tbeCH + 1


elsif pos = -1 and dnLvl[1] = dnLvl[checkP] then
// SMS Bajista
if showBear then
drawtext("SMS", centerBear, dnLvl[1] - myATR * 0.5) coloured(255, 34, 34)
drawsegment(iDn[1], dnLvl[1], barindex, dnLvl[1]) coloured(255, 34, 34) style(line, 2)
endif
pos = -2
tbeSM = tbeSM + 1


elsif pos < -1 and dnLvl[1] = dnLvl[checkP] then
// BMS Bajista
if showBear then
drawtext("BMS", centerBear, dnLvl[1] - myATR * 0.5) coloured(255, 34, 34)
drawsegment(iDn[1], dnLvl[1], barindex, dnLvl[1]) coloured(255, 34, 34) style(line, 2)
endif
pos = pos - 1
tbeBM = tbeBM + 1
endif


elsif dnLvl > dnLvl[1] then
iDn = barindex - prd
endif


// =================================================
// CALCULO DE PROBABILIDADES
// =================================================
if pos <> pos[1] then


// --- Win/Loss tracking ---
if (pos > 0 and pos[1] > 0) or (pos < 0 and pos[1] < 0) then
if scVal1 < scVal2 then
scW = scW + 1
else
scL = scL + 1
endif
else
if scVal1 > scVal2 then
scW = scW + 1
else
scL = scL + 1
endif
endif


// --- Estadisticas alcistas ---
if (pos[1] = 1 or pos[1] = 0) and pos < 0 then
buCHfailCnt = buCHfailCnt + 1
if tbuCH > 0 then
buCHfailPct = round(buCHfailCnt / tbuCH * 100, 2)
endif
endif
if (pos[1] = 1 or pos[1] = 0) and pos = 2 then
buCHcontCnt = buCHcontCnt + 1
if tbuCH > 0 then
buCHcontPct = round(buCHcontCnt / tbuCH * 100, 2)
endif
endif
if pos[1] = 2 and pos < 0 then
buSMfailCnt = buSMfailCnt + 1
if tbuSM > 0 then
buSMfailPct = round(buSMfailCnt / tbuSM * 100, 2)
endif
endif
if pos[1] = 2 and pos > 2 then
buSMcontCnt = buSMcontCnt + 1
if tbuSM > 0 then
buSMcontPct = round(buSMcontCnt / tbuSM * 100, 2)
endif
endif
if pos[1] > 2 and pos < 0 then
buBMfailCnt = buBMfailCnt + 1
if tbuBM > 0 then
buBMfailPct = round(buBMfailCnt / tbuBM * 100, 2)
endif
endif
if pos[1] > 2 and pos > pos[1] then
buBMcontCnt = buBMcontCnt + 1
if tbuBM > 0 then
buBMcontPct = round(buBMcontCnt / tbuBM * 100, 2)
endif
endif


// --- Estadisticas bajistas ---
if (pos[1] = -1 or pos[1] = 0) and pos > 0 then
beCHfailCnt = beCHfailCnt + 1
if tbeCH > 0 then
beCHfailPct = round(beCHfailCnt / tbeCH * 100, 2)
endif
endif
if (pos[1] = -1 or pos[1] = 0) and pos = -2 then
beCHcontCnt = beCHcontCnt + 1
if tbeCH > 0 then
beCHcontPct = round(beCHcontCnt / tbeCH * 100, 2)
endif
endif
if pos[1] = -2 and pos > 0 then
beSMfailCnt = beSMfailCnt + 1
if tbeSM > 0 then
beSMfailPct = round(beSMfailCnt / tbeSM * 100, 2)
endif
endif
if pos[1] = -2 and pos < -2 then
beSMcontCnt = beSMcontCnt + 1
if tbeSM > 0 then
beSMcontPct = round(beSMcontCnt / tbeSM * 100, 2)
endif
endif
if pos[1] < -2 and pos > 0 then
beBMfailCnt = beBMfailCnt + 1
if tbeBM > 0 then
beBMfailPct = round(beBMfailCnt / tbeBM * 100, 2)
endif
endif
if pos[1] < -2 and pos < pos[1] then
beBMcontCnt = beBMcontCnt + 1
if tbeBM > 0 then
beBMcontPct = round(beBMcontCnt / tbeBM * 100, 2)
endif
endif


// --- Determinar probabilidad actual ---
curVal1 = 0
curVal2 = 0
if pos >= 0 then
if pos = 1 then
curVal1 = buCHfailPct
curVal2 = buCHcontPct
elsif pos = 2 then
curVal1 = buSMfailPct
curVal2 = buSMcontPct
elsif pos > 2 then
curVal1 = buBMfailPct
curVal2 = buBMcontPct
endif
else
if pos = -1 then
curVal1 = beCHfailPct
curVal2 = beCHcontPct
elsif pos = -2 then
curVal1 = beSMfailPct
curVal2 = beSMcontPct
elsif pos < -2 then
curVal1 = beBMfailPct
curVal2 = beBMcontPct
endif
endif


revPct = curVal1
contPct = curVal2
scVal1 = curVal1
scVal2 = curVal2


endif


// =================================================
// WIN RATE
// =================================================
if scW + scL > 0 then
winRate = round(scW / (scW + scL) * 100, 2)
else
winRate = 0
endif


// =================================================
// CANAL + ZONAS SOLO DESDE ULTIMO PIVOTE
// =================================================
if islastbarupdate and showPD then
// Punto de inicio del canal = ultimo pivote mas reciente
locPD = max(iUp, iDn)


// --- Lineas High y Low ---
drawsegment(locPD, upLvl, barindex, upLvl) coloured(255, 34, 34) style(line, 2)
drawsegment(locPD, dnLvl, barindex, dnLvl) coloured(8, 236, 126) style(line, 2)


// --- Zonas Premium / Discount / Mid ---
xRange = upLvl - dnLvl
premTop = upLvl - xRange * 0.1
premBot = upLvl - xRange * 0.25
discTop = dnLvl + xRange * 0.25
discBot = dnLvl + xRange * 0.1
midTop = upLvl - xRange * 0.45
midBot = dnLvl + xRange * 0.45


// Premium (rojo)
drawrectangle(locPD, premTop, barindex+5, premBot) coloured(255, 34, 34, 200) fillcolor(255, 34, 34, 50)
// Discount (verde)
drawrectangle(locPD, discTop, barindex+5, discBot) coloured(8, 236, 126, 200) fillcolor(8, 236, 126, 50)
// Mid (gris)
drawrectangle(locPD, midTop, barindex+5, midBot) coloured(128, 128, 128, 200) fillcolor(128, 128, 128, 30)


// --- Labels de estructura con % en extremos del canal ---
// Muestran el PROXIMO evento posible + probabilidad
// Sintaxis #variable# para insertar valor numerico en texto
if pos > 0 then
// Tendencia alcista
// Arriba = continuacion (siguiente SMS o BMS)
if pos = 1 then
drawtext("SMS: #contPct#%", barindex + 13, upLvl+0.5*myatr) coloured(8, 236, 126)
else
drawtext("BMS: #contPct#%", barindex + 13, upLvl+0.5*myatr) coloured(8, 236, 126)
endif
// Abajo = reversal (siempre CHoCH)
drawtext("CHoCH: #revPct#%", barindex + 13, dnLvl-0.5*myatr) coloured(255, 34, 34)
elsif pos < 0 then
// Tendencia bajista
// Abajo = continuacion (siguiente SMS o BMS)
if pos = -1 then
drawtext("SMS: #contPct#%", barindex + 13, dnLvl-0.5*myatr) coloured(255, 34, 34)
else
drawtext("BMS: #contPct#%", barindex + 13, dnLvl-0.5*myatr) coloured(255, 34, 34)
endif
// Arriba = reversal (siempre CHoCH)
drawtext("CHoCH: #revPct#%", barindex + 13, upLvl+0.5*myatr) coloured(8, 236, 126)
endif


// --- Stats W/L en esquina superior derecha ---
drawtext("WIN: #scW# | LOSS: #scL# | WR: #winRate#%", -200, -100) anchor(topright, xshift, yshift) coloured(200, 200, 200)
endif


return upLvl coloured(0, 0, 0, 0) as "High", dnLvl coloured(0, 0, 0, 0) as "Low"

Download
Filename: PRC_Smart-Money-Concepts-Prob.itf
Downloads: 94
Iván González Master
This author is like an anonymous function, present but not directly identifiable. More details on this code architect as soon as they exit 'incognito' mode.
Author’s Profile

Comments

Logo Logo
Loading...