Technical analysis scanner — trend, momentum & strike ranges

Type a ticker for a transparent technical read — trend, momentum, participation, location and volatility scored separately — plus a ranked support/resistance map and technically-derived strike ranges for covered calls and cash-secured puts. All indicators are computed in your browser.

Watch: How to use the Technical Analysis Scanner (2 min) Click to expand

Video walkthrough: read the trend/momentum/participation/location/volatility scores, interpret the support-resistance map, and turn TA into actionable CC + CSP strike ranges. No signup required.

Educational screening output — not trade recommendations or projected returns. Strike ranges are technically derived and depend on data quality. End-of-day prices are delayed. Verify executable prices and Greeks with your broker before trading.
SPY Market Regime · Markov 2.0 (stride-sampled)
Loading…
Diagnostics · stride vs rolling
Load a scan to see the side-by-side matrices with the honesty note.
Nasdaq-100 market scan
Rank every name with the same engine — top 30 upside vs top 30 downside potential.
These are opposite trades — never blended into one ranking.
📐 Trade framing · stops · targets · R-multiples Educational framing — not a trade recommendation
Analyze a ticker to see suggested stop, target ladder, R-multiples, tag expectancy, and vol-targeted size hint.
🎯 Confluence Setups Stage-2 trend × Rich VRP × Strong support cluster under short strike
Run a market scan — the top-30 names get paired with their best CSP setup from the site's CSP Optimizer engine. Rows where all three conditions align are marked as Confluence Setups.
What goes into the ranking? (Edge score)
Each name is ranked by a composite Edge score (0–100) blending evidence-based factors from the research literature and proven trader systems. Higher = stronger upside profile; lowest = strongest downside. Weights:
  • Momentum quality — 25%: Clenow exponential-regression slope × R² (how steep and smooth the trend is; choppy trends are penalised).
  • 12−1 momentum — 13%: 12-month return skipping the last month (Jegadeesh–Titman).
  • 52-week-high proximity — 13%: how close price is to its yearly high (George–Hwang).
  • Relative strength vs S&P 500 — 13%: 6-month outperformance vs SPY, percentile-ranked.
  • Trend template — 13%: Minervini 8-point Stage-2 uptrend checklist (above 50/150/200-day MAs, 200-day rising, etc.).
  • Options flow — 12%: call-vs-put premium tilt + unusual activity (volume > open interest) from the live options chain.
  • ADX trend strength — 6% & volatility quality — 5%: directional strength and a penalty for blow-off volatility.
Entry-timing tags (don't change rank, flag when): “Pullback” = RSI-2 oversold inside an uptrend (Connors); “Extended” = parabolic short-term spike (reversal risk). Dark pool = FINRA off-exchange volume proxy (~1-day delayed), not literal dark-pool prints.
End-of-day data. This ranks stocks by historical-edge characteristics — it is educational screening, not a prediction or trade recommendation.
Income ideas — TA-aligned
Covered-call & cash-secured-put opportunities re-ranked through the Edge engine — avoids selling puts into downtrends and calls that cap breakouts.

Enter a ticker and press Analyze.

Methodology: RSI, MACD, EMA/SMA, Bollinger Bands, ATR, OBV, Stochastic, Ichimoku, Fibonacci and relative volume are computed locally from price/volume bars; support/resistance is clustered from pivots, swing highs/lows, Fibonacci zones, moving-average clusters and volume-by-price. See the methodology and disclaimer.

Educational only. Not investment advice. See disclaimer · methodology.

if (syncing || !range) return; syncing = true; charts.forEach((dst) => { if (dst !== src) { try { dst.timeScale().setVisibleRange(range); } catch (e) {} } }); syncing = false; }); }); priceChart.timeScale().fitContent(); // ---- responsive ---- const resize = () => { const w = container.clientWidth; charts.forEach(c => c.applyOptions({ width: w })); }; resize(); if (window.ResizeObserver) new ResizeObserver(resize).observe(container); else window.addEventListener("resize", resize); return { destroy: () => charts.forEach(c => c.remove()) }; } return { render }; })(); window.TVChart = TVChart;