07.Halts & catalyst radar
Nasdaq trade-halt RSS at 3 seconds, SEC EDGAR Atom every 6 seconds, four PR wires every 30 seconds, and a ticker-extraction NER pass over every headline. All live, all bounded, all WebSocket fan-out to every connected browser.
Halts — Nasdaq RSS at 3-second cadence
The poller in crates/traderview-web/src/live/halts.rs fetches nasdaqtrader.com/rss.aspx?feed=tradehalts every 3 seconds. New entries (by halt timestamp + symbol) push to the in-process VecDeque (cap 2 000) and broadcast on WS /ws/halts. The Halts tile shows the live list with reason-code badges and the row's age in seconds.
- Reason codes — looked up against a static table. T1 = news-pending, T2 = additional-info, T5 = single-stock-circuit-breaker, LUDP = limit-up-limit-down pause, MWC1/2/3 = market-wide level 1/2/3, H10 = SEC trading suspension, etc.
- Resumption — the same feed emits resumption rows. The tile shows resumed halts with a struck-through paused glyph; you can filter to only-currently-halted.
- TTS — the same voice-alert pipeline from the scanner reads new halts aloud ("Halt: S H W Z, code T-One"). Configurable per-account (enable / disable / filter by reason code).
- Symbol nav — every halt row exposes the standard 6-way symbol-nav context menu (Charts / Options / Research / Earnings / News / Copy).
Catalyst radar — EDGAR + 4 PR wires
The catalyst pipeline aggregates SEC filings and press releases into a single chronological feed with extracted tickers. Five sources, five separate pollers, all writing to the shared catalysts VecDeque (cap 10 000):
| Source | URL | Cadence |
|---|---|---|
| SEC EDGAR | sec.gov/cgi-bin/browse-edgar?action=getcurrent&type=4&output=atom | 6s |
| Business Wire | RSS | 30s |
| PR Newswire | RSS | 30s |
| GlobeNewswire | RSS | 30s |
| AccessWire | RSS | 30s |
EDGAR is the highest-signal source (Form 4 insider trades, 8-K material events, 13G/D stake disclosures) and runs at the tightest cadence the SEC's own throttling allows. The PR wires capture earnings, drug approvals, dividend declarations, M&A, and the long tail of company-issued news.
Ticker extraction (NER)
Catalysts are most useful when you can filter to your symbols. Each ingested headline + summary goes through a ticker-extraction pass:
$SYMcashtags — the easiest win. Match\$([A-Z]{1,5})\b.- Parenthetical
(SYM)— second-easiest. Match\(([A-Z]{1,5})\), then filter against a stop-word list (so(LLC),(USA),(NYSE)don't get flagged as tickers). - Exchange-prefixed forms —
NYSE:,NASDAQ:,AMEX:,OTC:,TSX:. Match(?:NYSE|NASDAQ|AMEX|OTC|TSX):([A-Z]{1,5}). - Validation — every extracted candidate is checked against the local
symbolstable (populated from your imports + the world-markets snapshot universe). Unknown tickers are dropped to keep noise low.
The extracted set lands on the catalyst row as tickers: string[] so the UI can render badges and the search box can filter to "show me only catalysts mentioning my watchlist".
The Catalysts view
frontend/js/views/catalysts.js. Chronological list (newest first) with:
- Source chip — color-coded per wire.
- Ticker badges — clickable, jump to per-symbol research dossier (step 08).
- Headline + 2-line summary — full body on hover or click-to-expand.
- Source link — opens the original filing / press release.
- Filter chips — by source, by my-watchlist-only, by has-ticker (drops generic market commentary), by time window.
- Search box — full-text over the catalyst body.
WS /ws/catalysts pushes new rows live; the page does not poll. New rows animate in at the top; resorting is preserved.
FINRA Reg-SHO short-sale data
Distinct from halts/catalysts but related. cdn.finra.org/equity/regsho/daily/ publishes daily short-sale volume. The Reg-SHO endpoint back-walks the publishing window on demand (not a poller — too much data, too low frequency). Used by the Short Interest view in step 08.
Resilience
- One feed failing doesn't kill the others. Each poller has its own task; one PR wire timing out for 60 seconds doesn't block the EDGAR poller.
- Backoff on consecutive failures. A poller that errors 3 times in a row doubles its interval (capped at 5 minutes) and recovers on first success.
- Empty-update suppression. Repeated polls that return zero new entries don't broadcast anything — the WebSocket only carries deltas.
- User-Agent. The HTTP client sets a descriptive UA so the SEC's automated abuse-monitor doesn't block us. If you self-host the web binary at scale, set
TRADERVIEW_USER_AGENTto something identifying.