A modern vocabulary for price action — swing structure, zones, and gaps — that largely relabels ideas classical technical analysis has described for decades.
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.
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.
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.
//@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.
Educational only — not financial advice, not a recommendation to trade. No indicator is predictive; trading involves substantial risk of loss.