Combines four signals into one number: how a stock is performing versus the market, whether volume backs up the move, how close it is to its own highs, and whether it's trending. Each input is scored 0-100 on its own, then combined with these weights:
How the stock has performed versus the S&P 500 (SPY) over the same period — outperformance scores higher.
Today's trading volume compared to its own 20-day average — a way of checking whether a price move has real participation behind it.
How close the stock is trading to its own recent high — the closer, the higher the score.
Whether price is above or below its own moving average — a simple read on whether the stock is currently in an uptrend or downtrend.
This same structure runs at three timeframes — short-term (~2 weeks), overall (~3 months), and long-term (~1 year) — using a shorter or longer lookback window and moving average for each, so a stock can look strong short-term but weak long-term, or vice versa.
The Theme Watchlist ranks the 11 SPDR sector ETFs (XLK, XLF, XLV, XLE, XLI, XLY, XLP, XLB, XLU, XLRE, XLC) using the exact same momentum score model above — applied to each ETF's own price action instead of a single stock. This is intentional: one scoring methodology across the whole site, not a second competing one for sectors.
This is a completed-bar snapshot, not a live scanner — a deliberate difference from the Daily Scan and Movers pages. The Daily view uses the previous completed trading day's close as its latest input; "today" is excluded even after the market has closed, until the calendar date actually changes. The Weekly view uses the previous fully completed week's close (through Friday) — the current in-progress week is excluded even late on a Friday before the close. Neither view ever fetches intraday (1m/5m/15m) data, and both are cached by calendar period rather than a short timer, so reloading the page repeatedly during the same day (or week) never triggers a fresh fetch — the "as of" date shown on the page is exactly the session or week the numbers reflect.
Clicking a sector shows a curated list of that sector's largest and most liquid names, sorted by the same last-completed-session's volume. This list is a hand-picked representative set of well-known companies per sector — not a live index-constituents feed. If a company changes sectors or a better representative name should replace one on the list, it's updated directly in the code.
A separate rating built from company financials rather than price action. The long-term score leans heavily on this, since a year of price trend alone doesn't capture whether a company is actually fundamentally healthy.
Growth averages year-over-year revenue and earnings growth. Valuation uses the PEG ratio (P/E adjusted for growth rate) rather than raw P/E, since a high P/E can still be reasonable for a fast-growing company. Profitability averages profit margin and operating margin. Analyst view blends the consensus rating with how far the current price sits from the average analyst price target.
Stock is trending up, dips down and taps its 8, 21, or 50 EMA, then rejects — closes back above that same line on a green candle. Any of the three counts.
Stock has been consolidating in a tight range — tight relative to that stock's own average daily range, not a flat percentage — then closes above the previous day's high on volume meaningfully above average. This is the daily rule; see below for how the interactive chart's intraday views confirm breakouts differently.
Price dips below the previous day's low (a shakeout) but rallies back above that same low by the close — often a sign of a failed breakdown and a shift back to buyers.
Each setup's historical performance (win rate, average R, trade count, max drawdown) is shown per-ticker on the scanner page, based on how that setup has actually performed on that specific stock over the past ~2 years. Trades target 1:1 R — a deliberate trade-off favoring a higher win rate over a larger payoff per winning trade.
Breakout's stop-loss sits slightly below the signal day's low (a small buffer sized to that stock's own average daily range, so it isn't stopped out by a single tick of noise). On a day the breakout candle gaps up above the previous day's high, the stop instead sits that same buffer below the previous day's high — the signal day's own low isn't a meaningful reference point on a gap day, since it can sit far below the level that was actually broken.
MA Bounce, Undercut & Rally, and the daily Breakout rule above decide what counts as a signal on the Daily Scan, the single-ticker scanner, and the historical win-rate stats shown per ticker. The interactive chart's daily and weekly views mark exactly these same daily signals.
The chart's intraday views (1m through 4h) work differently for Breakout only. Each intraday timeframe independently evaluates its own candles against the same PDH-based level the daily rule uses — a close above the level with volume above that timeframe's own 20-bar average — without waiting for the daily candle to close, and without requiring the full daily rule to have fired that day. A breakout confirmed on one timeframe does not imply it's confirmed on another. A candle that trades above the level but closes back below it is shown as a separate, muted "sweep" marker — informational only, never counted as a signal or included in any backtest.
The win rate, average R, trade count, and max drawdown shown per ticker are the daily strategy's results only. They describe the daily Breakout rule, not the chart's timeframe-specific intraday confirmations, which are a separate strategy with its own (currently unpublished) backtest.
The scanner's per-setup "Execution Backtest" is a separate, more realistic simulation from the historical stats above: instead of entering at the next day's open, it finds the actual intraday candle where a setup genuinely confirmed and uses that real timestamp, preferring 5-minute data first, then 15-minute, then 1-hour, and finally daily precision only for signals too old for any intraday history to reach. Trades hold as long as needed — overnight, across multiple days — with no artificial timeout, and an unresolved trade is marked Open rather than force-closed. Headline stats reflect 5-minute-confirmed trades only; anything resolved on a lower-precision timeframe is shown separately, never blended into the same numbers.