The contracting-base breakout method uses a simple rule: the stock must make a higher low before the breakout. That's the structural contraction gate.
A reasonable question: would adding ATR — Average True Range, a measure of daily volatility — make the filter smarter? Tighter ATR before the breakout should mean the base is quieter, which should mean fewer false breakouts.
We tested it three ways on Thai and US data. The answer was no.
What we tested
Test 1: ATR-contraction filter
Split RS≥80 + Confirmed Uptrend breakout trades into buckets by how much ATR contracted during the base:
| ATR at breakout vs base start | Median net R | Win rate |
|---|---|---|
| Strong contraction (<0.70×) | 0.335 | 37% |
| Moderate contraction (0.70–0.90×) | 0.314 | 40% |
| Flat (0.90–1.10×) | 0.244 | 42% |
| Expanding (>1.10×) | 0.442 | 40% |
The CIs between the contracting (<0.90) and flat/expanding (≥0.90) buckets overlap completely. No real difference. The expanding bucket even shows the highest net R.
Why: The higher-low detector already requires the swing lows to contract. ATR contraction is already embedded structurally. Adding an explicit ATR gate is redundant — it screens for something the method already screens for.
Test 2: ATR-based stop vs structural stop
Compare the current structural stop (higher low or 7% hard cap) against an ATR-based stop (entry minus 2.5×ATR):
| Structural stop | ATR stop | |
|---|---|---|
| RS≥80 | 0.237 net R | 0.236 net R |
| RS≥80 + Confirmed Uptrend | 0.350 net R | 0.352 net R |
Dead heat in both conditions. The structural stop already approximates a volatility-adaptive stop. There is no reason to switch.
Test 3: ATR level as a filter
Does trading only high-volatility names (high ATR) or only low-volatility names improve results?
| Thai (RS≥80 + CU): | ||
|---|---|---|
| ----------- | ------- | --------- |
| Low-vol (<3%) | 0.276 | 42% |
| Mid-vol (3–5%) | 0.336 | 41% |
| High-vol (>5%) | 0.661 | 29% |
The high-vol Thai names show the highest net R — but the win rate drops to 29%. This is a fat right-tail signature: rare big wins dragging the mean up while most trades stop out. Not a clean filter. n=66 for the high-vol bucket — too thin to act on.
The cross-market reversal
The more interesting finding came from running the same test on US data.
| US (RS≥80 + CU): | |
|---|---|
| ----------- | ------- |
| Low-vol (<3%) | 0.157 |
| Mid-vol (3–5%) | 0.091 |
| High-vol (>5%) | 0.063 |
US completely reverses Thai. In the US, stable low-volatility leaders carry the edge. In Thailand, volatile momentum names carry the fat right tail.
This is consistent with a broader pattern: US markets are more efficient, so quiet institutional accumulation before a breakout (low ATR = tight base = institutions absorbing) is the real signal. Thai markets have more retail participation and thinner liquidity, so the edge lives in the names that make sudden explosive moves — higher underlying volatility.
This reversal is a genuine cross-market insight. But it is an observation about market character, not a tradeable filter. The sample sizes by ATR bucket are too small to rely on, and the effect reverses by market — making it impossible to apply universally.
The verdict
ATR does not improve the contracting-base breakout method in either market: - Contraction filter: already captured structurally by the higher-low detector - ATR stop: equivalent to the structural stop - ATR level: reverses by market, sample too small for production use
The method stays simple: higher-low structural contraction, structural stop, RS≥80 + regime gate. Adding ATR = complexity without payoff.
Per the focus principle: a few rules tested thoroughly beat many rules stacked loosely. If a tool doesn't add signal that isn't already there, leave it out.
What this means for the scanner
Nothing changes in production. The current scan_contracting_breakouts.py uses:
- Higher-low structural detection
- Entry − (higher low) as the base stop
- 7% hard cap as the ceiling
No ATR layer. The test confirmed that's correct.
For a broader look at three filters that failed the same type of rigorous testing — including ATR-based sizing, volume dry-up, and filter stacking — see [Three Filters That Looked Smart and Failed Testing](/articles/three-filters-that-failed.html).
Backtest: Thai market 1990–2026 + US market 2005–2026, RS≥80 + Confirmed Uptrend filter. Structural stop = higher low in the base or hard cap at 7%, whichever is tighter. n per ATR bucket varies (Thai high-vol n=66, US high-vol n=88). Completed 2026-06-09.