v1.3.0
Stock Scanner v1.3.0
Stock Scanner v1.3.0 introduces the Relative Rotation Graph (RRG) — an interactive industry-group rotation view available across all twelve markets — brings the self-hosted live site to parity with the static Daily Snapshot demo behind a new global market selector with much faster page loads, and hardens the first-run bootstrap and data-refresh pipelines.
Highlights
Relative Rotation Graph (new)
- MarketSmith/Bloomberg-style quadrant plot of IBD industry groups (or GICS-sector roll-ups) by RS-Ratio vs RS-Momentum, with dated weekly tails and direction arrows tracing each series through Leading → Weakening → Lagging → Improving (#220)
- Interactive exploration: tails render as smooth Catmull-Rom splines with arrows riding the curve, drag-to-zoom (with reset) separates crowded clusters, and collision-avoiding group labels stay legible when toggled on (#239)
- Filtering: quadrant multi-select, group/sector name search, and a current-rank range slider (#220, #224)
- Multi-market scopes with market-aware scope handling and a JSON-backed RRG history cache that tolerates malformed entries (#234)
- One shared component serves both the live Group Rankings page and the static-site Groups page
Live-site parity & Daily Snapshot performance
- Global market selector in the header (persisted to
?market=and localStorage) replaces per-page market buttons, so Daily, Groups, Breadth, and Scan follow one coherent market (#238) - New
GET /v1/market-scan/daily-snapshotaggregates the whole Daily tab into one Redis-cached, ETag'd payload — replacing ~14 round-trips; the TradingView widget andlightweight-chartsnow lazy-load (#238) - Key-market cards (BTC, VIX, DXY, USDSGD) hydrate on self-hosted stacks via the daily refresh plan; the Leaders-in-Leading-Groups section, freshness header, and Top-10-Groups 1M column close the remaining static/live gaps (#238)
- Market-switch ghosting fixed at the root: the app-wide keep-previous-data placeholder is removed, bootstrap snapshots seed inside the query fn, and the Scan page reconciles its loaded scan on market switch (
GET /v1/scansgained amarketfilter) (#238) - Opt-in scheduled static-data export (
STATIC_EXPORT_ENABLED) writes GitHub-Pages-format bundles to a shared volume with atomic directory swaps (#238)
Price-chart RS strip
- The relative-strength line moved out of the price scale into its own strip below the candles, dynamically sized to the chart's free space so it never overlaps price (#215, #216)
- The Daily/Weekly/RS toggles moved beside the OHLC legend in the top-left, so they no longer cover the price scale (#239)
Leaders in Leading Groups
- New scan filtering for leaders (RS ≥ 80) within leading industry groups (rank ≤ 40), surfaced on the Daily Snapshot and resolved into static preset exports (#214, #217)
Bootstrap & data-refresh reliability
- Unified bootstrap price-readiness policy, with gate eligibility and coverage thresholds derived from a single policy model (#232)
- Group-rank cache coverage policy allowing policy-cleared partial warmups, with key-market price symbols centralized and aliases resolved (#233)
- Japan bootstrap hardening: invalid-symbol handling in Yahoo batches (no pacing or adaptive-failure penalties for known-invalid symbols, partial batch results preserved), reduced retry pressure, and warmup-barrier coverage waits moved into the runtime plan (#226, #228, #229)
Static-site CI scheduling
- The daily static-site run is split into Asian-close and US-close groups with explicit UTC crons, complete market coverage is enforced by tests, and the India daily run is hardened (#219, #225)
Community contributions
- Bash 3.2
mapfilecompatibility in helper scripts (#221) and backend README venv setup fix (#222) — thanks @kjpou1
Full changelog: v1.2.0...v1.3.0