Nicolas Darvas described the box pattern in 1960. He made millions trading it.
But he traded US growth stocks in a raging bull market. Does the pattern hold up on Thai data, in a market that behaves differently?
I tested it. 3,289 signals. 21 years of SET + MAI data. The result surprised me.
What a Darvas Box Is (One Paragraph)
A stock runs to a new high, then consolidates sideways. The original high becomes a ceiling — tested repeatedly, never decisively broken. Each attempt quieter than the last. When it finally clears on volume, that's the entry. Stop goes at the bottom of the box.
The defining feature is the flat ceiling. Unlike a contracting base (which requires declining recovery highs), the Darvas Box allows the ceiling to be flat or slightly exceeded. The repeated test of the same level is what matters — it means overhead supply is being absorbed each time.
Where It Fits in a Three-Pattern System
My scanner identifies three types of contracting setups:
Type A — Contracting Base: price contracts in space. Highs walk down, lows walk up. Each recovery high lower than the last.
Type B — Anchor Run + Zigzag: price contracts in swing amplitude after a strong first leg (≥22% advance). Each swing smaller than the previous.
Type C — Darvas Box / Flat Base: price forms a flat rectangle. Ceiling tested ≥2 times within 5%. Box depth ≤15%.
These are not three versions of the same pattern. They identify different stocks. In 2005–2026 Thai data, a stock could only be tagged as one type per episode — if it qualified as TypeA, it wasn't reassigned TypeC.
The Numbers (RS≥80 + Confirmed Uptrend, 2005–2026)
All three tested under the same conditions: RS Rating ≥80, SET market in Confirmed Uptrend, entry at pivot break, stop at pattern low.
| Pattern | n | Median R (30d) | ≥2R Hit Rate | Stop Rate | % Positive |
|---|---|---|---|---|---|
| Type A — Contracting Base | 2,910 | +0.11R | 18.1% | 31.6% | 52% |
| Type B — Anchor Zigzag | 602 | +0.06R | 23.6% | 40.2% | 50% |
| Type C — Darvas Box | 3,289 | +0.19R | 15.7% | 26.8% | 55% |
TypeC has the highest median R (+0.19 vs +0.11 TypeA), the lowest stop rate (26.8% vs 31.6% TypeA), and the highest percentage of positive outcomes (55%).
TypeB has the highest ≥2R rate — it finds the biggest runners, but at the cost of a much higher stop rate (40.2%).
Why TypeC Wins on Median R
The repeated ceiling test is doing real work.
When a stock tests the same resistance level three times, the traders who bought near that high have had multiple chances to exit. By the third test, most overhead supply has either been absorbed by patient buyers or flushed out. When the stock finally clears, there are fewer sellers waiting above.
This is the original Darvas insight: the box doesn't just mark resistance. It uses resistance to clean up the supply problem before the breakout happens.
TypeA contracts with declining highs — it's compressing energy. TypeC contracts with a flat ceiling — it's absorbing supply. Different mechanism, different result.
The One Thing TypeC Is Not
TypeC has the lowest ≥2R rate (15.7%). It is not a setup that tends to produce explosive, multi-R breakouts.
The pattern breaks out reliably (55% positive, 26.8% stop rate), but then often grinds steadily upward rather than surging. Holding for a 2R explosion that never comes is the most common mistake with this setup.
The right exit strategy for TypeC: take partial profit at 1R–1.5R. Trail the remaining position behind recent swing lows. If a new box starts forming above the pivot, that's continuation — stay. If it breaks back into the old box, that's the stop.
Using a "hold for 2R" rule on TypeC will underperform. The edge is in the consistent, lower-volatility advance — not the occasional large winner.
A Real Example: CCET (Apr–May 2026)
| Date | Price | Event |
|---|---|---|
| Apr 16 | 5.30 | Crosses above 200-EMA |
| Apr 27 | 6.40 | First ceiling established |
| May 5 | 5.75 | Floor test |
| May 6 | 6.50 | Ceiling test #2 (1.6% above — TypeC allows small exceeds) |
| May 12 | 5.70 | Floor test #2 — this becomes the box floor |
| May 14 | 6.45 | Ceiling test #3 |
| May 19 | 5.85 | Volume dry-up floor touch |
| May 20 | 6.60 / 6.45 close | Breakout on volume |
Box: ceiling 6.40, floor 5.70, depth 10.9%. Three ceiling tests. Volume contracted to minimum on May 19, then expanded sharply on the break. Classic Darvas.
Stop was at 5.70 (box floor). Risk was 11% of price. TypeC sets wide stops — this is intentional. The box must have room to breathe. Position size accordingly.
Current Signals (Jun 12, 2026)
From the live scanner (RS≥80 + CU filter):
- KCE RS=92 — TypeC confirmed, currently +8.1% above pivot. (In progress)
- TSE RS=89 — TypeC near-signal, -3.8% below pivot. (Watching)
- TFG RS=88 — TypeC near-signal, -7.8% below pivot. (Watching)
Chart-check required before acting. Scanner identifies candidates; human chart-read confirms quality.
What This Means for How I Trade
My scanner now identifies all three pattern types. TypeA, TypeB, and TypeC find different stocks — they are additive, not overlapping.
Combined across 6,801 signals (all three types, RS≥80, CU): median +0.15R at 30d, 30.0% stop rate.
TypeC contributes 48% of total signals while producing the best risk-adjusted outcome of the three. It earns its place in the scanner, but with a specific exit approach that matches its character: partial profit early, trail the rest, don't wait for a move it rarely produces.
Darvas's 1960 insight holds up on Thai data 65 years later. Not because markets are the same — but because the underlying mechanism (supply absorption through repeated resistance tests) works across markets.
Entry filter applied: RS Rating ≥80 + SET Confirmed Uptrend (IBD state machine: FTD-based). Without both filters, stop rate rises significantly and median R turns negative. These results do not apply to random-market or low-RS stocks.
Scanner source: scan_contracting_breakouts.py, detector: detect_darvas_box(). Backtest: backtest_zigzag_v2.py --rs-min 80 --regime. Thai universe: 882 symbols, 2.87M price rows, 2005–2026.