MOEasymmetry← All articles
Methodology · 2026-06-13 · 6 min read

Three Ways a Stock Contracts Before It Breaks Out

Track. Study. Wait. Strike.
English อ่านภาษาไทย (Thai)

Most traders learn one contraction pattern. I track three — because they're built differently, they attract different stocks, and they perform differently depending on what you're optimizing for.

What All Three Share

The same foundation: - Stock is above its 200-day moving average (Stage 2 uptrend) - RS Rating ≥ 80 (relative strength vs the market) - Volume dries up during the base - A recovery-high pivot forms: the entry trigger is a close above it

Type A: Contraction in Space (Horizontal Coil)

The stock has been building — a quiet sideways range where each swing gets narrower. Highs walk down, lows walk up, the range converges like a spring being compressed.

You see: - Range getting tighter bar by bar - Highs declining, lows rising (classic triangle or flat base) - Volume going to sleep - Then: pivot break with a volume pop

GUNKUL 2023 is a clean example — 8 weeks of narrowing range before a 40% breakout.

Entry trigger: Close above the highest recovery high within the base. Stop: Last higher-low swing low within the base. Scanner: detect_contracting_pivot() — contracting horizontal base.

Type B: Contraction in Swing Amplitude (Zigzag After Anchor Run)

The stock has already proven demand with a big first leg (≥22%). Then it does a visible zigzag where each swing is smaller than the last. Not tighter in space — smaller in cycle size.

The structure: 1. Anchor run — ≥22% gain from a base low (proves institutional interest) 2. Swing 1: first pullback → first bounce (amplitude A1) 3. Swing 2: second pullback → second bounce (amplitude A2, where A2 < A1) 4. Pivot = the last recovery high (below the anchor peak) 5. Stop = SL2, the last swing low (higher than SL1)

The key: each zigzag cycle is smaller than the last. Supply is being absorbed; the stock is coiling for continuation.

COM7 — The Teaching Example (Jan–May 2026)

DateEventPrice
Jan 14Base low (above 200-MA)฿18.2
Feb 19Anchor peak (+42.9% from low)฿26.0
Mar 4SL1 — first pullback฿20.6 low
Mar 16SH1 — first bounce high฿24.3 high
Mar 23SL2 — second pullback฿21.3 low
Apr 1Pivot (recovery high)฿22.7
Apr 7Final test, holds above SL2฿21.2 low
Apr 22Breakout (3.4× normal volume)฿22.8

Swing amplitude: A1 = 18% (20.6 → 24.3). A2 = 6.6% (21.3 → 22.7). Contraction: 3× smaller.

What invalidates it: second low breaks below first low (floor is falling), OR second recovery exceeds the anchor peak (no compression), OR swing amplitudes aren't shrinking.

Scanner: detect_zigzag_after_run() — shows ⟳ Zigzag label in orange.

Type C: Rectangle Range (Darvas Box / Flat Base)

Nicolas Darvas described this in 1960. The stock makes a new high after an advance, then consolidates in a flat rectangle: ceiling is tested repeatedly (within ~5%), floor holds. Volume dries up on the last floor test, then breaks above the ceiling on volume.

The structure: 1. Advance — stock crosses above the 200-EMA and runs to a new high 2. Ceiling — that first high becomes resistance, tested ≥2 more times within 5% 3. Floor — the lowest point of the entire rectangle (box depth ≤15%) 4. Volume dry-up — each ceiling test quieter than the last 5. Pivot = the original ceiling high (first established resistance) 6. Stop = box floor

What distinguishes TypeC from TypeA: TypeA requires declining recovery highs (lower ceiling each test). TypeC allows ceiling tests to equal or slightly exceed the original — the flat ceiling is the pattern, not a declining one.

CCET — The Teaching Example (Apr–May 2026)

DateEventPrice
Apr 16Cross above 200-EMA฿5.30 close
Apr 27First ceiling (pivot)฿6.40 high
May 5Floor test฿5.75 low
May 6Ceiling test #2฿6.50 high (within 1.6% of ceiling)
May 12Floor test #2฿5.70 low
May 14Ceiling test #3฿6.45 high
May 19Volume dry-up floor touch฿5.85 low
May 20Breakout with volume฿6.60 high, ฿6.45 close

Box: ceiling ฿6.40, floor ฿5.70, depth = 10.9%. Three ceiling tests. Volume dried to minimum on May 19, then exploded on the break. Classic Darvas.

Scanner: detect_darvas_box() — shows □ Box label in teal.

Backtest Results (Thai Market, RS≥80 + SET Confirmed Uptrend, 2005–2026)

After testing all three pattern types across 880 Thai stocks:

MetricTypeA (Coil)TypeB (Zigzag)TypeC (Darvas Box)Combined
Signals (filtered)2,9106023,2896,801
Median R at 30d+0.11+0.06+0.19+0.15
Hit ≥2R at 30d18.1%23.6%15.7%17.4%
Stop rate31.6%40.2%26.8%30.0%
% Positive at 30d52.3%50.5%55.0%53.4%

Reading the table:

TypeC leads on three of four metrics. Highest median R (+0.19), lowest stops (26.8%), highest % positive (55.0%). The flat ceiling — tested repeatedly — means overhead supply has been absorbed before the break. When it finally clears, there's less resistance immediately above it.

TypeC has the fewest ≥2R hits. It's a "grinding" pattern. The breakout tends to follow through reliably but not explosively. TypeC works best with partial TP at 1R–1.5R and a trail, not a hold-for-full-run strategy.

TypeB is the highest-variance pattern. Most stops (40.2%), but the highest ≥2R hit rate (23.6%). The anchor run selects for momentum stocks that can make big moves — but the zigzag structure also appears in declining stocks having dead-cat bounces. Quality filtering is essential; the RS+regime filter cuts TypeB stops from ~49% to ~40%.

TypeA is the baseline. Balanced profile: 31.6% stops, 18.1% ≥2R, +0.11 median. No special quality signal, just a clean contracting range. Broad applicability — highest signal count before filtering.

Combined (6,801 signals): median +0.15, 30.0% stops. Adding TypeC to the scanner portfolio is additive — it identifies setups TypeA and TypeB miss, and it performs the best of the three on median terms.

Pattern Selection: When to Use Which

QuestionTypeATypeBTypeC
Stock had a big prior run?Doesn't matterRequired (≥22%)Helpful but not required
Looking for consistent gainsOKToo many stopsBest
Looking for potential 2R+ runnersOKBestHarder to catch
Base has flat ceiling tested ≥2×Not applicableNot applicableRequired

Current Signals (Jun 12, 2026)

From today's scanner:

Broke out: KCE (RS=92, TypeC Darvas Box — broke May 29, now +8.1% above pivot)

Near-signal: TSE (RS=89, TypeC, -3.8% below pivot), TFG (RS=88, TypeC, -7.8% below pivot)

TypeC is the newest detector. As with all pattern types: the scanner finds candidates; the chart confirms quality.


Backtest data: Thai market 2005–2026, 880 symbols, RS≥80 + SET close>200-EMA gate. All results: entry at breakout-day close, exit at t+30d close or stop (whichever first). Stop = base floor. R = (exit − entry) / (entry − stop).

Get new research by email
Tested across decades. Failures published. Real money.
Subscribe — free
📊 See the live dashboards, the breakout scanner, and the real track record at the MOEasymmetry hub — research, not advice.
← Previous
The Anchor Run + Zigzag: A TypeB Breakout Study
งานวิจัยและบันทึกการเทรดส่วนบุคคล ไม่ใช่คำแนะนำการลงทุน · Personal research & trading journal — not investment advice. The author does not provide licensed advisory services.
Home · Articles · Methodology · Track record