An objective scanner for stocks breaking out of a tight, volatility-contracting base near 52-week highs on expanding volume — only while the market is risk-on.
Real internal-backtest statistics from the registry — Internal universe backtest · 42 US large-caps, regime-gated entries, 50-day-MA exit · 459 trades · 2005–2026 (Yahoo Finance).
CAGR and exposure are not published for the library yet — we show “—” rather than invent them. Max drawdown, best year and worst year are undefined for the pooled Momentum universe backtest. Win rate is a share of trades, average return is per trade, and holding period is in trading days.
No fixed-window historical pattern is published for this strategy — its holding period is variable (or, for a market-wide read, there is no single held window), so a single averaged return path would misrepresent it. Use the backtest for its full trade-by-trade history instead. We never fabricate a curve.
Momentum Breakout looks for the classic footprint of institutional accumulation: a durable uptrend, a tight volatility-contracting base near the highs, and a volume-backed breakout — but only in a healthy (risk-on) market. It is primarily a scanner (GET /api/scan?strategy=momentum_breakout) returning today's matching stocks, each with a full trade plan.
Healthy, risk-on, trending markets with clear leadership, where clean breakouts follow through.
Choppy or risk-off markets and low-liquidity names, where breakouts fail and reverse. The market-regime filter suppresses signals in risk-off tapes to mitigate this.
Institutional accumulation — buyers stepping in with size after a quiet consolidation tend to keep pushing price.
Durable uptrends, tight bases and volume expansion cluster around real accumulation. Requiring all of them — plus a rising 200-day trend and a risk-on market — filters out most low-quality breakouts. Inspired by the shared principles of classic momentum traders (Minervini, Kullamägi, O'Neil, Darvas) without copying any one method; every rule is a fixed numeric test.
evaluateMomentumBreakout)Entry = the breakout close; stop = the base low (an objective structural stop, reported with a risk %). The live scanner defines no timed exit.
Because it is cross-sectional with no single-symbol timed exit, the backtest:
Deterministic, from buildConfidence. confidenceScore is a setup-quality measure (0–100), not a probability of profit. On /api/scan it is populated per match; the live /api/strategies state is neutral (null) and points you to the scanner.
| Component | Max | Driven by |
|---|---|---|
marketTrend | 15 | risk-on market |
trendQuality | 20 | above 50-MA, 50>200, 200 rising |
relativeStrength | 15 | proximity to the 52-week high |
volumeConfirmation | 20 | breakout volume vs average |
volatilityContraction | 15 | tight base + contracting ATR |
breakoutQuality | 15 | close above the base high |
A bare BUY ≈ 73 (Good); a textbook breakout → 100 (Exceptional). Bands: <70 Weak · 70–79 Good · 80–89 Strong · 90–100 Exceptional.
The scanner returns the labels of the rules that passed (a full BUY shows all of):
| Dimension | Ideal |
|---|---|
| Market | Risk-on, trending US equities with clear sector leadership. |
| Trader | Active momentum/breakout swing trader who can take many small losses to catch the big winners, and manages exits. |
| Timeframe | Daily bars; swing-to-position holds (weeks). |
| Avoid when | Risk-off/choppy markets; illiquid names; or when costs would erode the edge. |
/api/backtest?strategy=momentum_breakout fetches the whole universe, so it is slower than a single-symbol backtest.Real responses from the live endpoints for this strategy.
GET /api/strategies?id=momentum_breakout{
"id": "momentum_breakout",
"name": "Momentum Breakout",
"category": "Technical",
"asset": "US equities",
"description": "WHAT IT IS: Momentum Breakout is Raspberry's own objective, rules-based breakout screen … (full prose)",
"historical": {
"yearsTested": 21, "winRate": 0.3508, "averageReturn": 0.96,
"bestYear": null, "worstYear": null, "maxDrawdown": null,
"averageHoldingPeriod": 35, "profitFactor": 1.37, "totalTrades": 459,
"source": "Internal universe backtest · 42 US large-caps, regime-gated entries, 50-day-MA exit · 459 trades · 2005–2026 (Yahoo Finance)"
},
"historicalPattern": null,
"status": "Active",
"entryDate": "", "exitDate": "", "daysUntilEntry": 0,
"entryPrice": null, "stopLoss": null, "firstTarget": null,
"riskPercent": null, "rewardRiskRatio": null,
"confidenceScore": null, "confidenceBreakdown": null,
"explanation": "Momentum Breakout is a stock-selection screen: it does not evaluate a single instrument here. Call /api/scan?strategy=momentum_breakout to get today's matching stocks, each with a full trade plan.",
"checklist": [],
"score": 15, "recommended": false, "weight": "none"
}GET /api/scan?strategy=momentum_breakout{
"strategy": "momentum_breakout",
"supported": true,
"scanned": 500,
"matches": [
{
"symbol": "NVDA",
"signal": "BUY",
"score": 91,
"reasons": { "marketRiskOn": true, "aboveSma50": true, "sma50AboveSma200": true, "sma200Rising": true, "within10pctOfHigh": true, "tightBase": true, "volatilityContracting": true, "breakoutAboveBase": true, "volumeSurge": true },
"metrics": { "close": 178.42, "breakoutPrice": 176.10, "stop": 168.90, "volumeRatio": 2.11 },
"entryPrice": 178.42,
"stopLoss": 168.90,
"firstTarget": null,
"riskPercent": 5.34,
"rewardRiskRatio": null,
"confidenceScore": 94,
"confidenceBreakdown": { "marketTrend": 15, "trendQuality": 20, "relativeStrength": 14, "volumeConfirmation": 18, "volatilityContraction": 12, "breakoutQuality": 15 },
"explanation": "NVDA rates 94/100 — an exceptional setup by the Momentum Breakout rules…",
"checklist": ["Market risk-on", "Above 50-day MA", "50-day MA above 200-day MA", "200-day MA rising", "Within 10% of 52-week high", "Tight consolidation base", "Volatility contracting", "Breaking out above base", "Volume surge (≥1.5× average)"]
}
],
"skipped": []
}GET /api/backtest?strategy=momentum_breakout{
"strategy": "momentum_breakout",
"symbol": "42 US large-caps (fixed universe)",
"range": { "requestedFrom": null, "requestedTo": null, "testedFrom": "2005-01-03", "testedTo": "2026-08-04", "barsTested": 5430 },
"metrics": {
"totalTrades": 459, "winningTrades": 161, "losingTrades": 298,
"winRate": 0.3508, "averageReturn": 0.0096, "medianReturn": -0.0186,
"bestTrade": 0.6832, "worstTrade": -0.1579, "averageHoldingPeriod": 35.36,
"profitFactor": 1.3713, "totalReturn": 10.5001, "maxDrawdown": 0.8821
},
"sampleTrades": [
{ "entryDate": "2026-05-20", "exitDate": "2026-07-28", "entryPrice": 982.12, "exitPrice": 1033.34, "return": 0.0522, "holdingDays": 46 }
],
"openTradeEntryDate": null
}lib/market-data/prices.ts); regime gate from SPY + QQQ.*Past behaviour does not ensure future results. confidenceScore measures setup quality, not the probability of profit.*