◆ New — Strategy Validator, Code Fixer & Prop Compliance Checker are live. Try one free →
Home / Indicators / Smart Money Concepts (SMC)
Price Structure indicator

Smart Money Concepts (SMC)

A modern vocabulary for price action — swing structure, zones, and gaps — that largely relabels ideas classical technical analysis has described for decades.

Illustrative diagram — not live market data.

What it is

Smart Money Concepts (SMC) is a school of price-action analysis, popularized online through ICT (Inner Circle Trader) material, built around the narrative that large institutions ('smart money') leave readable footprints on a chart. Its vocabulary includes Break of Structure (BOS), Change of Character (CHoCH), order blocks, fair value gaps, liquidity sweeps, and premium/discount zones. Read honestly, most of these terms map closely onto classical technical analysis: a BOS is a breakout past a prior swing point, a CHoCH resembles Wyckoff-style trend-change structure and Wilder's failure swings, order blocks are a variant of supply-and-demand zones, fair value gaps are price imbalances or gaps, and a liquidity sweep is what older literature calls a stop run or false breakout. That mapping does not make SMC useless — the framework organizes swing structure systematically, and several of its patterns have fully deterministic definitions that can be coded and tested. But the institutional-intent narrative attached to the labels is unverified: chart patterns do not reveal who traded or why. SMC is a descriptive vocabulary, not a predictive system. This overview is educational only, not financial advice, and all trading involves risk of loss.

How it works

SMC analysis starts from swing structure: identifying swing highs and lows, typically via pivots (a bar whose high or low exceeds its neighbours on both sides). In an uptrend defined as higher highs and higher lows, a close above the most recent confirmed swing high is labeled a bullish BOS — trend continuation. A close through the most recent higher low is labeled a CHoCH — the first structural evidence the trend may be changing. From that skeleton, SMC layers in zones: order blocks (commonly defined as the last opposing candle before a strong displacement move), fair value gaps (three-candle imbalances), liquidity pools (clusters of highs or lows where stop orders plausibly rest), and premium/discount (upper and lower halves of a dealing range measured from swing low to swing high). Each element can be given a mechanical definition, which is what makes SMC testable when done rigorously. The critical implementation detail is confirmation lag: a pivot-based swing point only confirms several bars after it forms, so structure labels drawn at the pivot bar describe the past. Any backtest that reads a BOS or CHoCH before its underlying pivot was confirmable is peeking into the future, which is a common flaw in SMC scripts.

How traders read it

Common settings

SMC itself has no canonical parameters, which is precisely why definitions vary between educators and scripts. Coded implementations typically expose a pivot strength (bars each side of a swing point, commonly 3-10), a choice between wick-based and close-based breaks for BOS/CHoCH, a displacement threshold for order blocks, and the timeframe hierarchy used (many practitioners read structure on a higher timeframe and entries on a lower one). Because every one of these choices changes which structures get labeled, any two 'SMC indicators' can disagree on the same chart while both claiming to be correct.

Strengths

Pitfalls to watch

Pine v6 example

//@version=6
indicator("SMC Structure Example (BOS)", overlay = true)

pivotLen = input.int(5, "Pivot strength (bars each side)", minval = 1)

// Swing points confirm pivotLen bars AFTER they occur — no lookahead
swingHigh = ta.pivothigh(high, pivotLen, pivotLen)
swingLow  = ta.pivotlow(low, pivotLen, pivotLen)

var float lastSwingHigh = na
var float lastSwingLow  = na
if not na(swingHigh)
    lastSwingHigh := swingHigh
if not na(swingLow)
    lastSwingLow := swingLow

// Close-based break of the last CONFIRMED swing (SMC: BOS / classical: breakout)
breakUp   = not na(lastSwingHigh) and ta.crossover(close, lastSwingHigh)
breakDown = not na(lastSwingLow) and ta.crossunder(close, lastSwingLow)

plot(lastSwingHigh, "Last confirmed swing high", color = color.teal, style = plot.style_linebr)
plot(lastSwingLow,  "Last confirmed swing low",  color = color.maroon, style = plot.style_linebr)
plotshape(breakUp and barstate.isconfirmed, "Break above swing high", style = shape.triangleup, location = location.belowbar, color = color.teal, size = size.tiny)
plotshape(breakDown and barstate.isconfirmed, "Break below swing low", style = shape.triangledown, location = location.abovebar, color = color.maroon, size = size.tiny)

Pro tip: Translate every SMC term you use into its classical equivalent and into a line of code. If a concept survives both translations — you can name what old-school TA called it and write an unambiguous rule for it — it is testable and worth studying. If it only survives as a story about what institutions 'must' be doing, treat it as narrative, not analysis. Either way, structure labels describe the past: educational context only, no framework predicts price, and all trading involves risk of loss.

Built an indicator from this? Run it through the Validator to catch look-ahead bias and repainting, or convert a strategy to Pine Script.

Educational only — not financial advice, not a recommendation to trade. No indicator is predictive; trading involves substantial risk of loss.

Catch the bug that compiles.Run auditGet Pro