Screen every US common stock every hour during market hours via TradingView. Find quality stocks (≥$2B market cap, ≥500K avg volume) that drop ≥8% intraday and land on a major EMA/SMA support level. Enter for a mean-reversion bounce.
A quality stock drops ≥8% in a single session — earnings miss, sector rotation, macro news. If the drop lands the price on a major EMA level, institutional buyers are likely to step in. We trade the bounce.
Exponential moving averages are self-fulfilling at scale — fund managers and algos watch the same levels. A stock holding at D EMA50 or W EMA20 on a big dip day has strong buyers defending that price.
Price within ±3% of any level counts as "at support." Monthly and Weekly levels carry more weight — they represent institutional positioning, not short-term trader memory. 5 years of daily + 30 days of hourly history is downloaded per candidate to compute all levels. H SMA200 requires 200 hours (~8 weeks of market hours) — only fires on liquid stocks with full history.
A M EMA20 or W SMA200 hit alone outweighs two daily-only hits — timeframe rank matters more than raw count. H Breakout (1HR price closing above hourly EMA20 after the dip) confirms buyers have stepped in.
Step 1: TradingView screener API filters all US common stocks server-side — returns only stocks down ≥8%, mkt cap ≥$2B, avg volume ≥500K — in ~3 seconds.
Step 2: only the 10–30 qualifying candidates get 5yr daily + 30d hourly data downloaded.
Step 3: 11-level EMA/SMA check across 5 timeframes (M/W/D/H). Results written to
signals_history.json — one entry per day, latest scan overwrites —
powering the Live Signals page and the full Past Signals archive.
New signals vs the prior run trigger an email alert automatically.
signals_history.json as today's permanent entry. Use this to plan next-day entries — stocks that closed at support after a 10%+ drop are prime watchlist candidates for the open.Every trade on the master Robinhood account is automatically mirrored to all active customer accounts, proportionally sized to their capital. Customers can use Robinhood or Alpaca (or both).
qty = floor(capital ÷ max_trades ÷ price)data/customers.json.
extended_hours=true. Market orders are rejected by both Robinhood and Alpaca outside regular hours — the copy engine handles this automatically.
Direct RH trades (not placed via the platform) are detected by copy_rh_orders.py, which runs at the end of every hourly sync. Order state is tracked in data/rh_copy_seen.json — an order is marked done (never copied again) once it copies with no per-customer errors, or after 5 failed attempts; a transient failure (e.g. a bad broker API key) is retried automatically on the next hourly run instead of being silently dropped. Broker routing: customers with alpaca_key get Alpaca orders; customers with rh_token get Robinhood orders; customers with both get both simultaneously.