SMT (Smart Money Technique) divergence is a multi-instrument price-action concept, popularised in the smart-money / ICT community, where two normally-correlated markets stop confirming each other at a swing: one makes a higher high (or lower low) while its correlated partner fails to. Traders read this non-confirmation as a sign that one of the moves may be a liquidity grab rather than a true continuation. This page explains the concept neutrally — how traders define swings, divergence, and how they tend to frame entries, exits, and risk — and provides a VALID Pine v6 illustrative detection/marker script. It does not reduce to a clean mechanical strategy, makes no profit or win-rate claims, and is for education only. Nothing here is predictive; trading involves the risk of loss.
SMT divergence ("Smart Money Technique" divergence) is built on the idea of inter-market correlation. Two instruments that usually move together — common examples discussed in the community include index futures such as ES / NQ / YM, currency pairs that share a quote currency (e.g. EUR/USD vs GBP/USD), or an asset and its inverse (e.g. EUR/USD vs DXY, where they tend to move opposite) — are expected to confirm each other's swing structure.
The concept says: at a meaningful swing point, compare the two correlated charts. - Bearish SMT divergence: Instrument A prints a HIGHER high than its prior swing high, but the correlated Instrument B prints a LOWER high (or fails to make a new high). The new high in A is unconfirmed. - Bullish SMT divergence: Instrument A prints a LOWER low than its prior swing low, but Instrument B prints a HIGHER low (or fails to make a new low). The new low in A is unconfirmed.
For inversely-correlated pairs (e.g. EUR/USD vs DXY) traders flip the comparison: a new high in one should coincide with a new low in the other; when that mirror breaks, it is read as divergence.
The narrative many traders attach to this is "liquidity": a new high/low that isn't confirmed by the partner market is interpreted as a possible stop-run or liquidity sweep above/below a prior swing, rather than a genuine break of structure. Importantly, this is an interpretation, not a guarantee — non-confirmation is a context cue, not a prediction. Correlations also drift and break down, so the comparison only carries meaning while the two instruments are actually correlated over the timeframe being traded.
Because SMT divergence inherently requires comparing TWO data feeds at swing points and then layering discretionary confirmation on top (structure shift, session timing, higher-timeframe bias), it does not reduce cleanly to a single mechanical entry/exit system. The Pine script below is therefore an ILLUSTRATIVE DETECTION / MARKER tool: it flags candidate SMT-divergence swings on the chart so you can study them. It is not a trade-signal generator and includes no profit logic.
//@version=6
// SMT Divergence — ILLUSTRATIVE DETECTION / MARKER (educational only)
// SMT divergence does NOT reduce to a clean mechanical strategy: it needs a
// second correlated feed + discretionary confirmation. This script only MARKS
// candidate divergence swings between the chart symbol and a correlated symbol.
// It is NOT a trade-signal generator and contains NO profit logic.
// Nothing here is predictive. Trading involves risk of loss; past != future.
indicator("SMT Divergence (Illustrative Marker)", overlay = true)
// --- Inputs ---
corrSym = input.symbol("CME_MINI:NQ1!", "Correlated symbol")
inverse = input.bool(false, "Correlated symbol is INVERSELY correlated")
pivLen = input.int(5, "Pivot lookback (left = right bars)", minval = 1)
// --- Pull the correlated symbol's OHLC on the chart timeframe (no look-ahead) ---
// barmerge.lookahead_off + only reading historical/confirmed offsets avoids
// look-ahead bias and repainting.
[cHigh, cLow] = request.security(corrSym, timeframe.period, [high, low], lookahead = barmerge.lookahead_off)
// --- Swing detection on the chart symbol (confirmed pivots only) ---
ph = ta.pivothigh(high, pivLen, pivLen)
pl = ta.pivotlow(low, pivLen, pivLen)
// A non-na pivot value refers to the bar pivLen bars back. Read both feeds at
// that same offset so the chart symbol and the partner are compared on one bar.
selfHighAtPivot = high[pivLen]
selfLowAtPivot = low[pivLen]
corrHighAtPivot = cHigh[pivLen]
corrLowAtPivot = cLow[pivLen]
// Track the previous confirmed pivot of each kind to compare "new" vs "prior".
var float prevSelfHigh = na
var float prevCorrHigh = na
var float prevSelfLow = na
var float prevCorrLow = na
bearSMT = false
bullSMT = false
if not na(ph)
if not na(prevSelfHigh) and not na(prevCorrHigh)
selfHigherHigh = selfHighAtPivot > prevSelfHigh
// Direct correlation: partner should ALSO make a higher high to confirm.
// Inverse correlation: partner mirrors down, so it should make a LOWER
// high to confirm. Divergence = the partner does NOT confirm.
corrConfirms = inverse ? (corrHighAtPivot < prevCorrHigh) : (corrHighAtPivot > prevCorrHigh)
bearSMT := selfHigherHigh and not corrConfirms
prevSelfHigh := selfHighAtPivot
prevCorrHigh := corrHighAtPivot
if not na(pl)
if not na(prevSelfLow) and not na(prevCorrLow)
selfLowerLow = selfLowAtPivot < prevSelfLow
// Direct: partner should also make a lower low to confirm.
// Inverse: partner mirrors up, so it should make a HIGHER low to confirm.
corrConfirms = inverse ? (corrLowAtPivot > prevCorrLow) : (corrLowAtPivot < prevCorrLow)
bullSMT := selfLowerLow and not corrConfirms
prevSelfLow := selfLowAtPivot
prevCorrLow := corrLowAtPivot
// --- Markers (offset back to the pivot bar so the marker sits on the swing) ---
plotshape(bearSMT, title = "Bearish SMT", style = shape.triangledown, location = location.abovebar, color = color.red, size = size.small, offset = -pivLen, text = "SMT")
plotshape(bullSMT, title = "Bullish SMT", style = shape.triangleup, location = location.belowbar, color = color.teal, size = size.small, offset = -pivLen, text = "SMT")
// Educational marker only. Any backtest layered on top would be ILLUSTRATIVE;
// results are not predictive and past behaviour does not indicate future results.No. It is a non-confirmation cue, not a prediction. When one instrument makes a new swing extreme that its correlated partner does not confirm, some traders interpret it as a possible liquidity grab — but it can equally precede continuation. Nothing about the pattern guarantees a reversal or any particular outcome, and trading it involves the risk of loss.
Any two markets that are normally correlated (or inversely correlated) on the timeframe you trade. Examples commonly discussed in the smart-money / ICT community include correlated index futures, currency pairs sharing a common currency, or an asset versus an inverse instrument like a dollar index. The key requirement is that the correlation is genuinely present — verify it before drawing conclusions, since correlations break down.
SMT divergence inherently needs a second correlated data feed AND discretionary confirmation (structure shift, higher-timeframe bias, timing), so it doesn't reduce to a clean mechanical entry/exit system. We provide a valid Pine v6 illustrative detection script that flags candidate divergence swings for study. It uses barmerge.lookahead_off and confirmed pivots to avoid look-ahead bias, and it contains no profit logic. ForexCodes' Validator exists precisely to check that scripts like this don't repaint or peek at future data.
Educational & software only — not financial advice, not a recommendation to trade. Backtests are illustrative; past performance does not predict future results. Trading involves substantial risk of loss.