Trading Academy27 min read

Smart Money Concepts (SMC): Finding Institutional Order Blocks & Liquidity Voids

Stop retail patterns. Learn how to map institutional market structure, break of structure (BOS), change of character (CHoCH), and liquidity voids.

SC
Sarah Chen
Published August 1, 2026

Smart Money Concepts (SMC): Finding Institutional Order Blocks & Liquidity Voids

When trading financial markets in 2026, understanding Smart Money Concepts SMC represents the absolute line of demarcation between profitable long-term risk managers and short-term retail accounts who trade blind without mapping institutional order blocks and liquidity sweeps. This comprehensive, institutional-grade pillar article covers every technical parameter, mathematical equation, and compliance standard governing SMC structural frameworks.

[!IMPORTANT] Pillar Overview & Key Takeaway This masterclass guide covers: Smart Money Concepts SMC, institutional order blocks, change of character (CHoCH), break of structure (BOS), and liquidity voids. Read this to align your trading setups with the order delivery algorithms of Tier-1 liquidity providers.


1. The Paradigm Shift: Retail vs. Institutional Flow

The retail trading world is built on retail chart patterns: double tops, trendlines, and support/resistance zones.

Smart Money Concepts (SMC) operates on the premise that these retail structures are created by institutional algorithms to accumulate liquidity pools (stop-loss clusters).

                           THE SMC STRUCTURAL CYCLE
                           
   [Accumulation Range] ──► [Liquidity Sweep (Stop Hunt)] ──► [Displacement (BOS)]
                                                                   │
                                                                   ▼
   [New Trend Expansion] ◄── [Mitigation Trade Entry] ◄── [Retracement to OB/Void]

The Liquid Auction Model

Financial markets are not random walks; they are auctions. For a major institution to buy 1,000 standard lots of EUR/USD, they need 1,000 lots of matching sell orders.

  • The Squeeze: If they buy directly at the market, the lack of immediate sell volume will sweep the book, causing massive slippage and raising their average entry cost.
  • The Hunt: To acquire inventory at a discount, their algorithms drive the price down, breaking a well-publicized support level. Just below this support level lie the sell-stop orders (stop-losses) of retail buyers.
  • The Fill: When the support level breaks, the retail sell-stop orders trigger as market sell orders. The institution's buy limit orders execute against these market sells, allowing them to fill their massive positions at a wholesale discount.

2. Structural Pillars: CHoCH, BOS, and Liquidity Voids

To navigate SMC, you must master the structural hierarchy of price delivery:

                         CHoCH VS. BOS COMPARISON
                         
   [Bullish Trend] ──► [New High] ──► [Pullback] ──► [BOS (High Broken - Trend Cont)]
          │
          ▼ (Trend Reversal)
   [Low Swept] ──► [MSS / CHoCH (Prior swing low broken - Trend Reversal)]

2.1 Change of Character (CHoCH)

A Change of Character represents the first sign of a trend reversal.

  • Bullish CHoCH: Prints when the price is in a downtrend making lower highs and lower lows, and then reverses to break the last lower high.
  • Bearish CHoCH: Prints when the price is in an uptrend making higher highs and higher lows, and then reverses to break the last higher low.
  • The Meaning: It signals that the dominant market structure has shifted from supply control to demand control (or vice versa).

2.2 Break of Structure (BOS)

A Break of Structure represents trend continuation.

  • Bullish BOS: Prints when the price breaks above a prior swing high, confirming that the bullish trend remains intact.
  • Bearish BOS: Prints when the price breaks below a prior swing low, confirming that the bearish trend remains intact.

2.3 Liquidity Voids (Fair Value Gaps)

A liquidity void (or Fair Value Gap) is a structural pricing inefficiency caused by rapid, high-impulse price runs. When an algorithm pushes price vertically, it does not allow the market auction to match buy and sell orders balanced at each price step.

  • The Inefficiency: This leaves behind a vertical gap where only one side of the market was delivered (buy-side only in a bullish expansion, sell-side only in a bearish drop).
  • The Rebalance: Auction theory dictates that the market must eventually retrace to auction these prices again, filling the void before continuing the trend.

3. Mathematical Definitions of Market Structure

To remove subjectivity from chart analysis, we define swing points and structural shifts mathematically.

3.1 Mathematical Definition of Swing Points

Let $P_t$ represent the close price of a candle at index $t$.

  • Swing High of Strength $k$: A swing high is confirmed at time step $t$ if and only if $P_t$ is the maximum price within a surrounding window of size $2k$:
P_t = \max_{j \in [-k, k]} P_{t+j}
  • Swing Low of Strength $k$: A swing low is confirmed at time step $t$ if and only if $P_t$ is the minimum price within a surrounding window of size $2k$:
P_t = \min_{j \in [-k, k]} P_{t+j}

For intraday day trading, $k$ is typically set to 5 or 10.

3.2 The Break of Structure (BOS) Invariance

Let S_H_prev represent the highest confirmed Swing High before index $t$. A bullish Break of Structure (BOS) is triggered at time step $t$ if:

P_t > S_{H, prev} \quad \text{and} \quad V_t > 1.5 \times \bar{V}_m

Where:

  • $V_t$ is the volume of the breakout candle.
  • V_m_avg is the moving average of volume over the prior $m$ periods, proving that the structural break was accompanied by displacement (high institutional volume).

4. Python Market Structure & SMC Scanner

This inline Python script acts as an SMC structural engine. It generates multi-day tick data, scans for swing points using strength-based mathematical conditions, identifies breaks of structure (BOS), detects Order Blocks and Liquidity Voids, and simulates trade execution at mitigation zones.

import random
import statistics
import math

# Set random seed for deterministic verification
random.seed(42)

def generate_smc_ticks(num_bars=300):
    """
    Generates synthetic price bars containing structured swings,
    representing a bullish market cycles with consolidation and breakouts.
    """
    price = 1.08500
    bars = []
    
    for t in range(num_bars):
        noise = random.normalvariate(0, 0.0001)
        
        # Inject structural cycles:
        # 0-50: Consolidation
        # 51-100: Bullish expansion
        # 101-180: Retracement
        # 181-250: Secondary expansion
        # 251-300: Late consolidation
        if 50 < t <= 90:
            drift = 0.0004
        elif 100 < t <= 150:
            drift = -0.0003
        elif 180 < t <= 220:
            drift = 0.0005
        else:
            drift = 0.0
            
        price += drift + noise
        
        high = price + abs(random.normalvariate(0.00015, 0.00005))
        low = price - abs(random.normalvariate(0.00015, 0.00005))
        bars.append({"open": price - drift, "high": high, "low": low, "close": price, "volume": random.randint(100, 1000)})
        
    return bars

def scan_smc_structure(bars, k=5):
    """
    Scans bars for swing points, BOS breaks, and valid Order Blocks.
    """
    num_bars = len(bars)
    swing_highs = []
    swing_lows = []
    
    order_blocks = [] # List of validated OBs
    trades = []
    
    # 1. Scan for Swing Highs and Lows
    for i in range(k, num_bars - k):
        # Swing High Condition
        is_high = True
        for j in range(-k, k + 1):
            if bars[i]["high"] < bars[i+j]["high"]:
                is_high = False
                break
        if is_high:
            swing_highs.append({"index": i, "price": bars[i]["high"]})
            
        # Swing Low Condition
        is_low = True
        for j in range(-k, k + 1):
            if bars[i]["low"] > bars[i+j]["low"]:
                is_low = False
                break
        if is_low:
            swing_lows.append({"index": i, "price": bars[i]["low"]})
            
    # 2. Scan for Bullish BOS and Order Block Formations
    for sh in swing_highs:
        sh_idx = sh["index"]
        sh_price = sh["price"]
        
        # Check if price subsequently broke this swing high (BOS)
        for i in range(sh_idx + 1, num_bars):
            if bars[i]["close"] > sh_price:
                # BOS Confirmed. Look for the last down-candle before the move started.
                # Modeled as the lowest close price between the swing high and the breakout
                search_range = bars[sh_idx:i]
                lowest_close = min(b["close"] for b in search_range)
                ob_idx = sh_idx + [b["close"] for b in search_range].index(lowest_close)
                
                ob_candle = bars[ob_idx]
                ob_data = {
                    "index": ob_idx,
                    "open": ob_candle["open"],
                    "low": ob_candle["low"],
                    "breakout_index": i,
                    "mitigated": False
                }
                
                if ob_data not in order_blocks:
                    order_blocks.append(ob_data)
                break
                
    # 3. Simulate Mitigation Trades
    for ob in order_blocks:
        entry_price = ob["open"]
        stop_loss = ob["low"] - 0.0003  # 3 pips below OB low
        target_price = entry_price + 2.5 * (entry_price - stop_loss)  // 1:2.5 R:R
        
        filled = False
        # Scan from breakout point forward
        for t in range(ob["breakout_index"] + 1, num_bars):
            if not filled:
                if bars[t]["low"] <= entry_price:
                    filled = True
                    ob["mitigated"] = True
                    entry_t = t
                    
            if filled:
                if bars[t]["low"] <= stop_loss:
                    trades.append({"entry_index": entry_t, "exit_index": t, "result": "loss", "pnl": -1.0})
                    break
                elif bars[t]["high"] >= target_price:
                    trades.append({"entry_index": entry_t, "exit_index": t, "result": "win", "pnl": 2.5})
                    break
                    
    return swing_highs, swing_lows, order_blocks, trades

if __name__ == "__main__":
    ticks = generate_smc_ticks(300)
    highs, lows, obs, trade_results = scan_smc_structure(ticks, k=5)
    
    print("=== SMART MONEY CONCEPTS STRUCTURAL SCANNER ===")
    print(f"Total Price Bars Scanned: {len(ticks)}")
    print(f"Swing Highs Identified:   {len(highs)}")
    print(f"Swing Lows Identified:    {len(lows)}")
    print(f"Validated Order Blocks:   {len(obs)}")
    print("-" * 80)
    
    print("Order Block Mitigations & Sim Trades:")
    wins_count = sum(1 for t in trade_results if t["result"] == "win")
    losses_count = sum(1 for t in trade_results if t["result"] == "loss")
    
    for t in trade_results:
        print(f"  Trade Filled at Bar {t['entry_index']:<4} | Closed at Bar {t['exit_index']:<4} | Result: {t['result'].upper():<4} | PnL: {t['pnl']:+5.1f}R")
        
    print("-" * 80)
    total_trades = wins_count + losses_count
    if total_trades > 0:
        win_rate = (wins_count / total_trades) * 100
        print(f"Total Trades: {total_trades} | Win Rate: {win_rate:.1f}% | Net return: {sum(t['pnl'] for t in trade_results):+.1f}R")
    else:
        print("No completed trades during simulated period.")

5. Step-by-Step SOPs: Mapping and Trading SMC Setups

To map market structure and trade using SMC principles, implement these standard operating procedures (SOPs).

SOP 1: Mapping the SMC Structure

Identify the dominant trend direction and structural shift points on your charts.

Step 1: Open your platform -> Select a H1 or H4 chart to identify the daily bias.
Step 2: Look at recent swing highs and lows. Ensure they meet the k-candle strength rules.
Step 3: Identify the most recent Break of Structure (BOS) to confirm the trend direction.
Step 4: Locate the most recent Change of Character (CHoCH) on the M15 chart to identify
        potential trend reversals.
Step 5: Define the active dealing range: the space between the lowest swing low and the
        highest swing high that led to the BOS.

SOP 2: Validating an Institutional Order Block (Demand/Supply)

Verify that the order block has institutional backing before placing orders.

Step 1: Look at the Swing Low zone identified in SOP 1.
Step 2: Locate the last bearish candle before the bullish breakout.
Step 3: Draw a horizontal rectangle enclosing the body of this bearish candle (Open to Close).
Step 4: Check for a Fair Value Gap (FVG) immediately above the candle. If no FVG exists,
        discard the block; it represents low-volume retail activity.
Step 5: Confirm that the 61.8% to 78.6% OTE zone overlaps with this rectangle.

SOP 3: Coding a cTrader CHoCH/BOS Visualizer (C# API)

For automated systems, use this C# indicator to plot swing breaks on your charts.

using System;
using cAlgo.API;
using cAlgo.API.Indicators;

namespace cAlgo
{
    [Indicator(IsOverlay = true, TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class SMCStructureScanner : Indicator
    {
        [Parameter("Lookback Period (k)", DefaultValue = 5)]
        public int Lookback { get; set; }

        protected override void Initialize()
        {
            Print("SMC Structure Scanner Initialized.");
        }

        public override void Calculate(int index)
        {
            if (index < Lookback) return;

            // Check if candle index-k is a Swing High
            bool isSwingHigh = true;
            double currentHigh = Bars.HighPrices[index - Lookback];
            for (int i = 0; i < 2 * Lookback + 1; i++)
            {
                if (Bars.HighPrices[index - i] > currentHigh)
                {
                    isSwingHigh = false;
                    break;
                }
            }

            if (isSwingHigh)
            {
                // Draw Swing High resistance line
                Chart.DrawHorizontalLine($"SH_{index - Lookback}", currentHigh, Color.Red, 1, LineStyle.LinesDots);
            }

            // Check if candle index-k is a Swing Low
            bool isSwingLow = true;
            double currentLow = Bars.LowPrices[index - Lookback];
            for (int i = 0; i < 2 * Lookback + 1; i++)
            {
                if (Bars.LowPrices[index - i] < currentLow)
                {
                    isSwingLow = false;
                    break;
                }
            }

            if (isSwingLow)
            {
                // Draw Swing Low support line
                Chart.DrawHorizontalLine($"SL_{index - Lookback}", currentLow, Color.Green, 1, LineStyle.LinesDots);
            }
        }
    }
}

6. Smart Money Concepts (SMC) vs. Retail Strategy Matrix

This matrix compares the core execution parameters of SMC with retail trading strategies:

Execution VariableSmart Money Concepts (SMC)Retail Trading Strategy
Market Invalidation ViewInvalidation occurs when structural highs/lows are broken by displacement.Invalidation occurs when static support/resistance lines are breached.
Entry TimingWait for pullbacks to Discount/Premium zones (61.8%-78.6% OTE).Buy immediate breakout candle opens or moving average crossovers.
Stop-Loss PhilosophyPlaced tightly below/above the validating Order Block.Set as a static pip distance or below moving averages.
Liquidity ViewIdentifies retail stop-loss clusters as target exit zones.Focuses on chart patterns (flags, triangles) to project target exits.
Risk-to-Reward RatioHigh; typically ranges from 1:3 to 1:10 due to tight invalidation.Moderate; ranges from 1:1 to 1:2 due to wide stop placement.

7. Deep-Dive Frequently Asked Questions (FAQ)

Q1: What is the difference between a mitigation block and a breaker block?

  • Mitigation Block: An order block that has been successfully tested by price. The price returns to the block, triggers the remaining limit orders, and continues the trend.
  • Breaker Block: A failed order block. If a bullish order block is broken by a strong bearish movement, the block is not useless. When the price returns to this zone from below, the block flips roles and acts as a bearish resistance level (a bearish breaker), offering a high-probability short entry.

Q2: What is the "dealing range" in SMC?

The dealing range is defined by two structural anchor points: a Swing High and a Swing Low. Once confirmed by a Break of Structure, the dealing range is divided into a Premium Zone (upper 50% where prices are expensive) and a Discount Zone (lower 50% where prices are cheap). SMC traders focus exclusively on buying in the discount zone and selling in the premium zone.

Q3: Why does a Fair Value Gap (FVG) act as a price magnet?

An FVG is created by a rapid price run where orders were not matched balanced at each price step, leaving a liquidity void. Algorithmic pricing engines are programmed to return to these voids to complete the auction process, matching remaining buy and sell orders. This makes FVGs act as natural targets for price pullbacks.

Q4: How do I identify a true Market Structure Shift (MSS) vs. a false breakout?

A true MSS requires displacement—large, high-volume candles that close completely past the prior swing high/low. A false breakout (liquidity sweep) is typically characterized by a wick that sweeps past the swing point but fails to close past it, followed by an immediate reversal.

Q5: Can I trade SMC on stock indices?

Yes, SMC applies to stock indices (such as the S&P 500 and Nasdaq) and major commodities (such as Gold and Crude Oil). These markets are highly driven by algorithmic execution, making them sensitive to order block mitigation and liquidity sweeps.

Q6: What is a "liquidity sweep"?

A liquidity sweep is the execution of stop-loss orders stacked above previous swing highs or below previous swing lows. The algorithm drives the price past these swing points to trigger the stops, filling institutional positions before reversing the price.


8. Professional Risk Guidelines & Conclusion

Disclaimer: Trading derivatives, CFDs, and leveraged assets involves extreme financial risk and is not suitable for all investors. Over 82% of retail trading accounts lose capital under standard market execution. Always implement rigorous risk rules and consult with independent financial advisers before allocating real deposits. Alpha Trade Circle does not act as a licensed broker or investment desk.

In summary, Smart Money Concepts provides a structural framework for navigating market liquidity. By waiting for market structure shifts, identifying valid order blocks and liquidity voids, and trading in alignment with institutional flow, you protect your capital and build a more consistent trading model.

Ready to choose a broker?

Use our tools to find the perfect match for your trading style.

📊

Get Weekly Forex Insights

Join traders who receive our weekly broker reviews, market analysis, and trading tool updates. Free, no spam.

No spam. Unsubscribe anytime. We respect your privacy.

Related Articles