Part I, Foundations Chapter 2

Market Structure: Trend, Range, and Regime

The trade has to be right, but the regime has to be right first.

2.0Why this chapter exists

The single largest source of loss for retail-trained traders entering futures is regime mismatch, applying a tool that is correct for one market state to a market that is in a different state. Mean-reversion oscillators in a trend day cost you the trend. Trend-following indicators in a range cost you the chop. The error is rarely "I read the chart wrong"; it is "I read the chart correctly for a regime that wasn't in effect."

Market structure, the language of higher-highs and higher-lows, the classification of trend versus range, the identification of which volatility regime we are in, is the chassis on which every later setup is built.

The work below makes that chassis mechanical. Swing structure first, defined formally enough that two traders looking at the same chart will label the same pivots. Regime second, classified into five distinguishable states (Trend-Vol, Trend-Calm, Range-Vol, Range-Calm, Squeeze) so that "what kind of day is this?" has an answerable answer. And finally a composite score, built from ATR percentile, Bollinger Band Width percentile, the Kaufman Efficiency Ratio, and ADX, that the rest of the book leans on for nearly every setup decision.

The composite is not a magic indicator. It is a discipline device. It forces you to commit to a regime classification before you select a setup, which is the opposite of the natural retail tendency: first see the setup, then rationalise the regime around it.


2.1Swing structure, formally

Open any chart in any timeframe and you will see swings, local highs and lows that bound the price action. The first job is to make those swings mechanical rather than subjective.

The naive definition

A swing high is a bar whose high is greater than the high of the N bars before it and the N bars after it. A swing low is the symmetric statement. N is called the pivot strength (or fractal strength, in some pedagogies). On a 5-minute ES chart, N = 3 to 5 is typical.

This definition has a known problem: N is fixed, but volatility is not. On a quiet GC session, N=5 produces dozens of swing labels per hour because every wiggle qualifies as a pivot. On a volatile NQ trend day, N=5 produces almost no labels until the trend exhausts because the bar-to-bar range overwhelms the pivot test.

The ATR-conditioned ZigZag

The fix is to make the pivot definition volatility-aware. We require not only that the pivot bar's high (or low) be greater than its neighbours, but that the move from the prior pivot to the current pivot exceeds a multiple of ATR. A typical specification:

A new swing high is established when: (a) bar t is a local maximum within ±N bars (N = 3 by default); (b) the price rise from the prior swing low to bar t's high exceeds k × ATR(14), where k ≈ 1.5 to 3.0 depending on timeframe; and (c) any subsequent decline from bar t exceeds k × ATR(14) before another higher-high is printed (which "confirms" the swing).

Symmetric definition for swing lows.

Two consequences:

  • The number of swings per session becomes bounded by ATR, quiet days produce few swings, volatile days produce more, but the ratio is regime-conditioned, not arbitrary.
  • A swing is only confirmed retrospectively (after the k × ATR retrace), so the most recent swing is always provisional. This is honest. Retail traders frequently treat the most recent local extreme as a confirmed swing; on the desk, we annotate it with a lower confidence weight until the retrace confirms.

The ATR-conditioned formulation is what most serious indicator stacks use under the hood, including the author's own Trend & Levels series. The exercises at the end ask you to implement one in pseudocode; the value is in seeing how often "obvious" swings are not actually qualifying swings under a strict definition, and how often "trivial" wiggles deceive the eye in low-volatility regimes.

Higher-highs, higher-lows: the trend definition

Once swings are formally defined, the canonical definitions of trend follow:

  • Up-trend: sequence of higher-highs (HH) and higher-lows (HL).
  • Down-trend: sequence of lower-highs (LH) and lower-lows (LL).
  • Range: mixed sequence, at least one HH followed by an LH at similar levels, or symmetrically.

The minimum length for a "trend" classification is two confirmed swings of each type, i.e. four pivots in the correct sequence. Anything shorter is either noise or pre-trend.

Two further structural events matter:

  • Break of Structure (BoS): in an up-trend, the most recent HL is broken to the downside. This is the first signal that the trend may be transitioning. By itself, a BoS is consistent with a continuation pullback that overshoots, it does not confirm a reversal.
  • Change of Character (CHoCH): in an up-trend, after a BoS, price fails to make a new HH and instead prints a lower-high. The structure is now LH/LL, i.e. the up-trend has flipped to a down-trend. This is the formal reversal signal.

The BoS / CHoCH distinction is borrowed from ICT pedagogy, but the underlying concept is older, Wyckoff used the same idea in his "Sign of Weakness / Sign of Strength" framework. Whatever you call it, the distinction is real: a single broken swing is not a reversal; a sequence change is.

A worked example

Imagine an ES 5-min chart from 09:30 to 12:00 ET on a typical session. The session opens at 6,250, drives up to 6,258 (HH-1), pulls back to 6,253 (HL-1), pushes up to 6,261 (HH-2), pulls back to 6,256 (HL-2), pushes up to 6,265 (HH-3). At 11:15 the price drops sharply through 6,256 (BoS, the prior HL is broken). It rallies to 6,260, which is below the most recent HH of 6,265 (LH printed), then drops to 6,254 (now LL, below 6,256). The structure has flipped: the morning up-trend is now a down-trend. CHoCH has occurred.

A trader watching only the most recent local extreme might have bought 6,256 expecting a hold; the structure-aware trader recognises the BoS as a flag and the LH/LL sequence as confirmation, and either flips short or stays flat. The information was visible in real time; the discipline of formal structure makes it actionable.


Regime quadrant: trend versus range, calm versus volatile Trend Calm Slow grinder Continuation pullbacks to AVWAP Trend Vol High-energy trend day Open Drive continuation IB-extension targets Range Calm Textbook range Sweep-and-fade at value-area extremes Range Vol Chop saw Hardest regime; tighter stops, less size Squeeze Coiled spring Wait for breakout Volatility Calm Expanded Directionality Trend Range Each cell selects a different framework. Squeeze is its own state, not a quadrant.
Figure D2.2.Regime quadrant. The 2x2 (trend or range, calm or volatile) plus a center Squeeze cell. Each cell selects a different framework.

2.2The regime taxonomy

A trader needs a small, distinguishable set of regime labels to make playbook-selection mechanical. We use five:

  1. Trend-Vol, directional, expanded volatility (the high-energy trend day).
  2. Trend-Calm, directional, normal volatility (the slow grinder).
  3. Range-Vol, non-directional, expanded volatility (the chop-saw).
  4. Range-Calm, non-directional, normal volatility (the textbook range).
  5. Squeeze, compressed volatility, no clear direction (the coiled-spring pre-expansion).

Each regime has a characteristic playbook, and an anti-playbook (setups that systematically fail in it). We will tabulate these in Chapter 21; for now, the point is that classification precedes setup selection.

A quick orientation:

  • Trend-Vol: trend-following continuation setups dominate. Mean-reversion fades against the trend lose money in distribution. Targets are open-ended (use trailing stops or ATR-multiple targets). The day is often classified by Dalton as a Trend Day.
  • Trend-Calm: slower trend-following continuation. Pullbacks are shallow and frequent. AVWAP from the open often acts as a magnet for re-entries.
  • Range-Vol: the most challenging regime to trade. Mean reversion at the range extremes works if and only if the range edges are confirmed by structure; otherwise the volatility punches through both ends of the range repeatedly.
  • Range-Calm: classic range-trading regime. Fade the extremes, target the median or the opposite extreme. Stops at the structural high/low of the range.
  • Squeeze: flat the position, trade only an explicit breakout (with confirmation), or skip. Most squeeze breakout setups fail in a single direction and reverse hard, sequencing matters.

The five-state classifier is intentionally coarse. Finer classifications (Dalton's day types, for example, distinguish six day types in the Trend/Range space) are valuable, but they require multi-hour intraday observation to lock in. The five-state classifier is computable from a small number of indicators and is therefore a real-time tool.


2.3The composite regime score

No single indicator classifies regime reliably. ATR is lagging. Bollinger Band Width is mean-reverting. ADX is direction-blind. The Kaufman Efficiency Ratio is sensitive to lookback period. A composite is mandatory.

We will use four components, all standardised to a percentile of their own recent history.

Component 1: ATR percentile

Definition. True range per bar, Wilder-smoothed with period 14. The percentile is computed over a rolling window, typically 252 bars on a daily chart, 78 bars (≈one week of RTH) on a 5-min chart.

Interpretation. ATR percentile > 70th = expanded volatility. ATR percentile < 30th = compressed volatility. Between is normal.

Why this is included. ATR captures the magnitude dimension: how big a typical bar is relative to recent history. It is necessary for distinguishing Trend-Vol (high ATR percentile, directional) from Trend-Calm (normal ATR, directional).

Failure mode. ATR is lagging. A regime change that has just happened (the breakout from a squeeze, for example) takes 10–20 bars to register in the ATR percentile.

Component 2: Bollinger Band Width (BBW) percentile

Definition. BBW = (upper band − lower band) / middle band, where the bands are 2σ on close, period 20. The percentile is computed over the same rolling window as ATR.

Interpretation. BBW percentile < 20th = squeeze. BBW percentile > 80th = expanded. Between is normal. The classic Bollinger Squeeze trades the BBW < 20th condition; we use it more conservatively, as one of four regime inputs.

Why this is included. BBW captures the dispersion dimension and is particularly good at flagging squeeze regimes early, earlier than ATR, often by 5–10 bars, because BBW responds to the standard deviation of close prices, which compresses faster than the true range.

Failure mode. BBW is mean-reverting by construction. After a sharp expansion, BBW will compress mechanically as the moving baseline catches up, even if volatility remains elevated. Always cross-check with ATR.

Component 3: Kaufman Efficiency Ratio (KER)

Definition. KER = |close(t) − close(t − N)| / Σ|close(i) − close(i−1)| over the same N-bar window. N = 10 to 20 is typical. The result is bounded between 0 (pure noise, sum of moves equals total path with no net change) and 1 (perfect linear trend, net change equals total path).

Interpretation. KER > 0.6 = strong trend. KER < 0.3 = range / chop. Between is "directional drift."

Why this is included. KER captures the directionality dimension cleanly. Unlike ADX, which trends-up during both up-trends and down-trends and tells you nothing about which, KER plus the sign of (close(t) − close(t−N)) tells you trend strength and direction in a single computation.

Failure mode. KER is quite lookback-sensitive. KER on N=10 will read very differently from KER on N=20 in the same regime. Fix N at the timeframe-appropriate value (10 on intraday, 20 on daily) and respect the lookback noise.

Component 4: ADX (Average Directional Index)

Definition. Wilder's ADX, period 14. ADX is direction-blind, it captures trend strength via the difference between +DI and −DI smoothed over the period.

Interpretation. ADX > 25 = trending. ADX < 20 = ranging. Between is transitional.

Why this is included. ADX is the most-widely-used trend-strength measure in the practitioner community, which means a lot of automated stacks reference it. Including it gives you a measure that is meaningful relative to widely-published threshold levels and is correlated with, but not redundant against, KER.

Failure mode. ADX is more lagging than KER and gives ambiguous readings (20 < ADX < 25) that span a wide regime range. Treat it as a tiebreaker rather than a primary input.

The composite

Combine the four into a single classification:

trend_strength = max(KER, scale(ADX, 0, 50))         # both in [0, 1]
volatility_pct = mean(ATR_pct, BBW_pct)              # in [0, 100]

if BBW_pct < 20:                              regime = "Squeeze"
elif trend_strength > 0.6:
    regime = "Trend-Vol"   if volatility_pct > 60 else "Trend-Calm"
elif trend_strength < 0.3:
    regime = "Range-Vol"   if volatility_pct > 60 else "Range-Calm"
else:                                          regime = "Transitional"

The exact thresholds are tunable; what matters is the structure. Each regime label corresponds to a different playbook, and the Transitional label exists explicitly to acknowledge that ~15% of sessions are not classifiable in real time. Those are skip days. This is non-negotiable.

A few notes on the composite:

  • The components are not fully independent. ATR and BBW are correlated (both measure volatility); KER and ADX are correlated (both measure trend strength). The composite uses their correlation, you want all four to point the same way for a high-confidence regime label.
  • Disagreement among components is informative. If KER is high but ADX is low, the trend has just started and ADX hasn't caught up yet, be alert for early-trend setups. If ATR is high but BBW is low, you have just had an expansion that compressed mechanically, expect volatility to decay further.
  • The classifier is a real-time tool, but the certainty of the classification depends on the bars elapsed in the session. By 09:45 ET on ES, you have one IB period of data; by 10:30, you have an entire IB; by 11:30, the regime is usually firmly established. Don't trade the 09:35 classification as if it were the 11:30 classification.

2.4Volatility regimes within trend and range

The trend/range axis is the primary classification; volatility (calm vs. expanded) is the secondary. A third axis, crisis volatility, is rare enough to be worth flagging separately rather than embedded in the composite.

Crisis volatility is when the volatility percentile breaks above the 95th and the daily ATR is more than 2× the trailing 30-day ATR median. Examples in recent history:

  • Feb 5, 2018 (Volmageddon): VIX spiked from 17 to 50 in two sessions; ES daily ATR went from ~25 points to >100. Mean-reversion strategies built on calm-regime statistics were destroyed.
  • March 9–18, 2020 (COVID): VIX traded as high as 85; daily ES ATRs of 200+ points; circuit breakers; basis dislocations between cash and futures of 30+ points intraday.
  • August 5, 2024 (yen carry unwind): NQ gapped down hard at the Asia open; cascading liquidations across correlated markets; multiple-day vol regime.

In crisis volatility:

  • Spreads widen, slippage explodes.
  • Correlations between markets converge to ±1; everything moves together (or in mirror).
  • Stop-loss orders cascade, you can't reliably get filled at your stop price.
  • Almost every backtested edge inverts: trends are violent and short, mean-reversion targets the volatility median rather than the price median, and "support" becomes "support that would have held under normal liquidity", meaningless in a liquidity hole.

The institutional response to crisis volatility is to cut size first, ask questions second. Drop position size by 50–80% until volatility normalises. This is the rule that saves accounts; everything else is rationalisation.

We treat crisis volatility in detail in Chapter 19.


2.5Regime transitions: when the market changes its mind

Most trading errors at the regime boundary come from transitioning late, the trader was right about the old regime and stays in the playbook past the regime change. Regime transitions to watch for:

  • Range → Trend. Often signalled by a failed range fade: the trader fades the upper edge, the position goes nowhere for a few bars, then the upper edge is broken decisively with expanding volume. Failed mean-reversion is breakout confirmation.
  • Trend → Range. Signalled by a CHoCH (formal sequence change), often coinciding with declining volume on continuation attempts and an inability to print a new HH for two consecutive sessions.
  • Calm → Vol expansion. Signalled by a BBW squeeze breakout, BBW < 20th percentile resolving with a large directional bar that closes outside the bands. Volatility regime has shifted before ATR fully registers.
  • Vol expansion → Calm. Slower transition; volatility decays gradually. Mean-reversion strategies start working again about 2–3 sessions after the volatility peak.

The composite score shifts gradually through transitions rather than flipping. A real-time trader watches the trend of the composite components, not just the latest reading. If KER is rising from 0.2 to 0.5 over five bars, you are in a trend that hasn't fully formed yet. That is when continuation setups are highest expected value.


2.6Worked walkthroughs

Two short examples of the composite in action.

Example 2.6.1: NQ Trend-Vol day (April 2026, hypothetical setup matching the regime)

NQ opens with an Open Drive, a forceful directional move from the cash open in one direction with no probe of the opposite extreme. By 09:45 ET:

  • KER on 5-min closes (N=10) = 0.78 (strong trend).
  • ATR percentile (78-bar lookback) = 84th (volatility expanded vs. last week).
  • BBW percentile = 65th (above normal but not at extreme).
  • ADX = 32 (firmly in trending territory).

Composite output: Trend-Vol. Playbook: continuation pullbacks to AVWAP from the open, targets at IB extension levels, stops behind the most recent swing low. Anti-playbook: do not fade the IB high; do not enter mean-reversion at the high of the day. The composite has not just told you what to do; it has told you what not to do.

Example 2.6.2: ES Range-Calm day (May 2026, hypothetical)

ES opens around the prior settlement, drives 4 points up, fails, drops 6 points, recovers 3 points. By 10:30 ET, the IB has formed at a 6-point range and there is no momentum to extend.

  • KER (N=10) = 0.18 (no trend).
  • ATR percentile = 28th (compressed).
  • BBW percentile = 35th.
  • ADX = 14 (firmly ranging).

Composite output: Range-Calm. Playbook: fade the IB extremes back to the median (or the other extreme), tight stops behind the IB high or low, target the opposite IB edge for 1.5–2× R. Anti-playbook: do not chase breakouts of the IB without explicit breakout confirmation; most "breakouts" in this regime fail back into the range within two bars.

The two examples are deliberately different regimes producing different setups from the same chart and the same indicator stack. The composite tells you which playbook to load.


2.7 What this chapter does not claim

  • That the composite is the only valid regime classifier. It is one defensible composite; you may build a better one. The discipline of using a composite is more important than the specific composite chosen.
  • That the regime, once classified, is stable for the rest of the session. It is not. Re-evaluate at IB completion (10:30 ET on ES), at lunch (12:00 ET), and at the cash close countdown (15:30 ET). Each of those is a structural inflection point.
  • That correctly classifying the regime is sufficient to make money. It is necessary but not sufficient. The right setup in the right regime, with the wrong sizing or the wrong entry, still loses money.
  • That the threshold values (KER 0.6, BBW 20th percentile, ADX 25) are correct in any deep sense. They are defensible defaults drawn from practitioner consensus and sanity-checked on liquid futures. Tune them for your contract and timeframe. Walk-forward validate (see Chapter 16).

2.8Diagram concepts referenced in this chapter

  • D2.1, Swing structure annotated chart. A 5-min ES chart with all swing highs and lows labelled per the ATR-conditioned definition, BoS and CHoCH events highlighted, comparison panel showing the same chart with naive N=3 swings (visibly noisier).
  • D2.2, Regime quadrant. A 2×2 plus 1 grid (Trend-Vol, Trend-Calm, Range-Vol, Range-Calm, with Squeeze as a center cell). Each cell labelled with its characteristic playbook and anti-playbook.
  • D2.3, Composite component traces. Four time-series subplots (ATR percentile, BBW percentile, KER, ADX) over a single trading week, with regime labels banded across the top, showing how the components co-move and disagree.
  • D2.4, Transition signature. A panel of three small-multiples showing the canonical signatures of (a) Range → Trend, (b) Trend → Range, (c) Calm → Vol expansion.
  • D2.5, Crisis volatility comparison. A two-panel chart of a normal session and a crisis session (e.g. Aug 5 2024) at the same scale, showing how spreads, correlations, and ATR explode.


2.10Exercises

Exercise 2.1, Manual swing tagging. On a recent ES 5-min RTH session, tag every swing high and swing low using the ATR-conditioned definition (k = 1.5, ATR period 14). Annotate every BoS and CHoCH. Note the count: how many BoS events resolved into CHoCH (i.e. confirmed reversals) and how many were just continuation pullbacks?

Exercise 2.2, Composite by hand. For ten consecutive ES sessions, manually compute (or pull from your platform) the four composite components at 11:00 ET each day. Tag each session with the composite regime label. Then write your own assessment of which regime was actually in effect by end of day. Where did the 11:00 classification differ from the end-of-day truth?

Exercise 2.3, Anti-playbook journal. For each of the five regime labels, write down two setups you would normally take that are anti-playbook for that regime, i.e. setups that systematically fail in it. For one trading week, after each loss, classify the loss as either (a) right setup, wrong regime, (b) right setup, right regime, but bad execution, or (c) just bad luck. Tally the categories. Most retail traders find (a) dominates by 2:1 or more. Confirming this on your own data is the diagnostic that motivates everything else in the book.

Exercise 2.4, Threshold tuning. Take the composite as specified, but vary the KER threshold from 0.3 to 0.8 in steps of 0.1. For each threshold, count the number of "Trend" labels produced over a 60-session window. Plot the result. Identify the plateau (the range of thresholds over which the count is roughly stable), that is the parameter region where the classifier is robust. The midpoint of the plateau is your defensible default.


Next chapter: liquidity and order flow, the layer beneath price that makes every level and every regime more legible.