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)
| Date | Event | Price |
|---|---|---|
| Jan 14 | Base low (above 200-MA) | ฿18.2 |
| Feb 19 | Anchor peak (+42.9% from low) | ฿26.0 |
| Mar 4 | SL1 — first pullback | ฿20.6 low |
| Mar 16 | SH1 — first bounce high | ฿24.3 high |
| Mar 23 | SL2 — second pullback | ฿21.3 low |
| Apr 1 | Pivot (recovery high) | ฿22.7 |
| Apr 7 | Final test, holds above SL2 | ฿21.2 low |
| Apr 22 | Breakout (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)
| Date | Event | Price |
|---|---|---|
| Apr 16 | Cross above 200-EMA | ฿5.30 close |
| Apr 27 | First ceiling (pivot) | ฿6.40 high |
| May 5 | Floor test | ฿5.75 low |
| May 6 | Ceiling test #2 | ฿6.50 high (within 1.6% of ceiling) |
| May 12 | Floor test #2 | ฿5.70 low |
| May 14 | Ceiling test #3 | ฿6.45 high |
| May 19 | Volume dry-up floor touch | ฿5.85 low |
| May 20 | Breakout 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:
| Metric | TypeA (Coil) | TypeB (Zigzag) | TypeC (Darvas Box) | Combined |
|---|---|---|---|---|
| Signals (filtered) | 2,910 | 602 | 3,289 | 6,801 |
| Median R at 30d | +0.11 | +0.06 | +0.19 | +0.15 |
| Hit ≥2R at 30d | 18.1% | 23.6% | 15.7% | 17.4% |
| Stop rate | 31.6% | 40.2% | 26.8% | 30.0% |
| % Positive at 30d | 52.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
| Question | TypeA | TypeB | TypeC |
|---|---|---|---|
| Stock had a big prior run? | Doesn't matter | Required (≥22%) | Helpful but not required |
| Looking for consistent gains | OK | Too many stops | Best |
| Looking for potential 2R+ runners | OK | Best | Harder to catch |
| Base has flat ceiling tested ≥2× | Not applicable | Not applicable | Required |
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).