What the scanner is
A Python script (scanner/scan.py) that runs on a schedule, pulls daily price bars, computes standard technical indicators, and flags chart setups matching pre-written rules. It is a screening tool. A flagged setup is not a recommendation — it means "this chart matches the written pattern; a human should look at it." Cody picks every candidate. Nothing is entered without his review against the playbook rules.
Data
- Source: Yahoo Finance chart API — free, no key, daily OHLCV bars, 2 years of history per symbol.
- Why not Stooq: the original spec called for Stooq CSVs, but Stooq serves a JavaScript browser-verification challenge that blocks server-side fetches from our network (verified 2026-10-05). Yahoo provides equivalent daily bars from a single source.
- Fallbacks: CoinGecko (crypto) and Frankfurter/ECB (FX) if Yahoo fails for a symbol. Failed symbols are listed as skipped in the output — never silently dropped.
- Universe (18): SPY, QQQ, AAPL, MSFT, NVDA, TSLA, META, AMZN, AMD · BTC, ETH, SOL · EURUSD, GBPUSD, USDJPY, DXY · plus ES/NQ futures as market context (not scored).
- DXY is regime context only — an index, not tradeable spot, so it is never scored as a setup.
Indicators (standard definitions)
- RSI(14) — Wilder's smoothing. Pullback bands are asset-aware: 40–55 equities, 45–58 crypto, 38–58 FX.
- SMA 20 / 50 / 200 — simple moving averages for trend and range reads.
- MACD(12, 26, 9) — histogram > 0 is a required confirmation for pullback and breakout longs, not decoration.
- ATR(14) — Wilder's average true range; the ruler for every stop.
- ADX(14) — trend-strength gauge. Below 22 = ranging (mean-reversion allowed); above 25 = trending (mean-reversion blocked).
- Volume vs 20-day average — confirmation where volume exists (equities); range-expansion where it doesn't (FX/crypto).
Setup definitions (v1.1 — specialist-reviewed)
- trend-pullback (long): close > SMA50 (and SMA50 > SMA200 when available) · RSI dipped into its band for real — crossed under the band top within the last 3 bars, or fell ≥5 pts from its 5-bar high · close within 3% of the 20-day high (equities), 0.5× ATR (FX), 5% (crypto) · MACD histogram > 0. Volume confirms the turn, not the dip — no volume requirement on the pullback itself. RSI bands: 40–55 equities, 45–58 crypto, 38–58 FX.
- breakout (long): close above the highest high of the prior 20 sessions · volume > 1.5× average (equities) or range > 1.5× ATR plus a conviction close in the top third of the day's range (crypto/FX — wick filter) · MACD histogram > 0 · RSI ≤ 70.
- mean-reversion (long): RSI hook — dipped to ≤32 and turning back up · ADX(14) < 22 confirming an actual range (not a waterfall) · price within 8% of SMA50 · equities: SPY/QQQ only (single momentum names trend; ETFs revert).
- mean-reversion (short, FX only): mirror image — RSI hooked down from ≥68 in an ADX-confirmed range.
- Regime gate: equity longs need SPY above its SMA50 to earn full confidence — into a headwind they're capped at low.
- Dollar labeling: every FX idea prints its dollar view (USD+ / USD−) — a EURUSD long is short dollars; a USDJPY long is long dollars. Nobody should have to think about this.
How entry / stop / target are set
stop = entry ∓ ATR_MULT × ATR(14) · ATR_MULT = 1.5 (stocks/FX) · 2.0 (crypto) · 1.0 (mean-reversion)
target = entry ± 2 × (entry − stop) · always 2R minimum
Every idea carries an invalidation note — the concrete price or event that kills the thesis. If the invalidation triggers, the idea is dead; no second-guessing.
Position sizing
size = $50 ÷ |entry − stop| (shares / coins / FX units)
notional caps: 25% of sleeve (stocks) · 30% (crypto) · 100% (forex, no leverage)
if capped → size shrinks, actual risk shown honestly
Confidence — deliberately stingy
High requires the setup plus volume/range confirmation plus MACD histogram aligned plus RSI rising. Most scans will show zero highs. Medium = setup + confirmation. Low = pattern matched but confirmation is thin. A quiet scan is a valid scan — the scanner is not paid to find trades.
Fee assumptions (modeled on every paper fill)
- Stocks: $0 commission. SEC fee $0.000008 × sale proceeds on sells (min $0.01).
- Options: $0.65 per contract per side (Schwab/Fidelity standard; no ticket charge assumed).
- Crypto: 0.25% per side (major US spot exchange retail taker tier).
- Forex: spread cost, no commission — assumed EURUSD 1.2 / GBPUSD 1.8 / USDJPY 1.5 pips (retail standard-account averages, reviewed quarterly).
These are documented assumptions, not quotes. Net P&L — after these fees — is the only number that counts.
Market regime
Each scan prints a one-line regime read from ES/NQ futures vs their SMA50 (risk-on / risk-off / mixed). It is context, not a signal — the stocks sleeve stands down on new longs when regime reads risk-off.
Paper-vs-real gaps (disclosed, not hidden)
- Fills log at screen prices. Real trading has slippage, partial fills, and wider spreads.
- Options paper assumes clean exits; real exercise/assignment and wide markets are harsher.
- Paper triggers no emotions. The psychology gap is the biggest one and no spreadsheet fixes it.
- Scanner bars are daily and backward-looking; it cannot see news, order flow, or positioning.
Risk disclaimer
Research and screening only — not financial advice. This page documents exactly what the scanner computes so there are no black boxes — but transparency about a method is not an endorsement of its results. Nothing here is a recommendation to buy or sell anything. Never trade real money based on this site.