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.
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_avgis 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 Variable | Smart Money Concepts (SMC) | Retail Trading Strategy |
|---|---|---|
| Market Invalidation View | Invalidation occurs when structural highs/lows are broken by displacement. | Invalidation occurs when static support/resistance lines are breached. |
| Entry Timing | Wait for pullbacks to Discount/Premium zones (61.8%-78.6% OTE). | Buy immediate breakout candle opens or moving average crossovers. |
| Stop-Loss Philosophy | Placed tightly below/above the validating Order Block. | Set as a static pip distance or below moving averages. |
| Liquidity View | Identifies retail stop-loss clusters as target exit zones. | Focuses on chart patterns (flags, triangles) to project target exits. |
| Risk-to-Reward Ratio | High; 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
How to Pass the FTMO Challenge: A Math-Backed Trader Blueprint
Passing the FTMO challenge is not about luck; it is about risk management and math. We detail the exact capital sizing, drawdown buffers, and daily reset rules.
Cheapest Prop Firm Challenges compared: Fee vs Account Size Matrix
Looking for the best value prop firm? We compare challenge fees, refund policies, and account sizes across 20+ prop trading firms in 2026.
Instant Funding Prop Firms 2026: Skip Evaluations, Earn Splits from Day 1
Skip the multi-phase evaluation stress. We compare the best direct instant funding prop firms on profit splits, drawdowns, and scaling plans.
Drawdown Calculations Decoded: Equity-based vs Balance-based Drawdowns
Understanding how your daily and total drawdown limits are calculated is the difference between keeping your account and getting breached.