From prototype to daily runner. Build a production-grade scanner pipeline with scheduling, data feeds, alerting, monitoring, retrospective analysis, and the continuous improvement loop that separates hobbyists from professionals.
You've built the scanner logic (filters, scoring, regime detection) and validated it with backtesting. Now it's time to wrap it in a production-grade pipeline that runs reliably every day without manual intervention. Here's the complete architecture.
Pull market data from your data provider(s). This includes end-of-day prices, volume, fundamentals, insider transactions, options flow, and sentiment data. The ingestion layer handles API rate limits, retries, and data validation.
Before running any scanner logic, determine the current market regime. This sets the parameters for everything that follows — which strategies to deploy, position sizing multipliers, and exposure limits.
Output: Regime label (Risk-On, Transition, Risk-Off, Crisis) + confidence level (High/Medium/Low).
Apply the DSL filters (Part 2) to define the candidate universe, then score all candidates (Part 3) using the composite scoring engine. Apply boosts and penalties. This is the core scanner logic.
Output: Ranked list of all scored candidates with grades.
Select the top N candidates based on grade threshold and diversification rules. Validate each pick: check spot price vs calculated entry (must be within 10%), verify volume is still sufficient, and cross-check for any breaking news that might invalidate the thesis.
Output: Final shortlist of 5-10 A+ picks with entry, stop, and target levels.
Generate the scan report (HTML or PDF), send alerts to configured channels (Discord, email, Telegram), and log all results for retrospective analysis. Archive the full scoring data for audit trail.
Output: Published scan report + notifications + historical log entry.
Production systems fail. APIs go down, data feeds have gaps, your server reboots. Design your pipeline with fail-safe defaults:
The golden rule: when in doubt, do nothing. No trade is always better than a bad trade based on faulty data.
Your scanner needs to run at the same time every day, reliably, without manual intervention. The timing matters — you want results ready for the next trading day's open.
| Time (ET) | Task | Duration | Notes |
|---|---|---|---|
| 20:00 | EOD data finalized | — | Most providers finalize by 8 PM ET |
| 22:00 | Data ingestion begins | 5-10 min | Pull all required data sources |
| 22:10 | Regime detection + scanning | 3-5 min | Full pipeline execution |
| 22:15 | Validation + report generation | 2-3 min | Spot price check, HTML report build |
| 22:20 | Alerts sent | 1 min | Discord/email/Telegram notifications |
| 06:30 | Pre-market review | 15 min | Manual review of scanner output + overnight news |
| 09:30 | Market open — execute | — | Place orders based on reviewed picks |
Running at night (after market close) has three advantages: (1) EOD data is complete and finalized — no partial candles or delayed feeds. (2) You have the entire overnight period to review results and prepare orders before market open. (3) Intraday scanning generates excessive noise — daily timeframe signals are more reliable for swing trading setups.
Some scanners also run a pre-market refresh at 7 AM ET to check for overnight news that might invalidate setups (earnings miss, geopolitical event, pre-market gap). This is a quick validation pass, not a full re-scan.
| Method | Complexity | Reliability | Cost | Best For |
|---|---|---|---|---|
| Cron job (Linux/Mac) | Low | High (local) | Free | Personal scanner on your machine |
| Task Scheduler (Windows) | Low | Medium | Free | Windows users |
| Cloud function (AWS Lambda) | Medium | Very high | $1-5/month | Reliable, serverless deployment |
| Docker + cron on VPS | Medium | High | $5-20/month | Full control, portable environment |
| Bot (Discord/Telegram) | High | Very high | $5-10/month | Team use, interactive commands |
| GitHub Actions | Low | High | Free (2000 min/mo) | Open-source scanners, CI/CD native |
For most individual traders, a cron job on a local machine or a cloud function is sufficient. If you need team access or want interactive queries ("run scanner with custom filters"), a Discord/Telegram bot adds significant value. This is the approach DailyTickers uses — a Discord bot that triggers the scanner via scheduled commands, with the flexibility to run ad-hoc scans on demand.
Your scanner is only as good as its data. A missing data point, a stale quote, or a bad fundamental value can produce a pick that looks great on paper but is based on fiction. The data pipeline is the foundation of production reliability.
| Data Type | Free Options | Paid Options | Update Frequency |
|---|---|---|---|
| EOD Prices | Yahoo Finance, Alpha Vantage | Polygon, IEX Cloud, Tiingo | Daily (after 8 PM ET) |
| Intraday Prices | Alpha Vantage (limited) | Polygon, Alpaca | 1-min to 15-min bars |
| Fundamentals | SEC EDGAR, Financial Modeling Prep | Sharadar, Bloomberg | Quarterly (within days of filing) |
| Insider Transactions | SEC EDGAR (Form 4) | OpenInsider, Quiver Quant | Within 2 business days of trade |
| Options Flow | Limited free options | Unusual Whales, FlowAlgo | Real-time during market hours |
| Sentiment | StockTwits API | Sentifi, MarketPsych | Real-time |
| Market Regime | FRED (VIX, yield curve) | Most providers include this | Daily |
Every data ingestion run should pass through quality checks before the scanner processes it. These are your data circuit breakers:
Always have a secondary data source configured. If your primary provider goes down (it happens more often than you'd expect), the pipeline should automatically fall back to the secondary source rather than skipping the scan entirely. Log the fallback event for investigation the next day. The key metrics to verify on fallback: price accuracy (<0.5% divergence from primary) and universe coverage (>95% of symbols available).
Your scanner produces results. Now they need to reach you — and possibly your team or subscribers — through the right channels at the right time. The key principle is tiered urgency: not every alert deserves to wake you up at midnight.
| Channel | Latency | Rich Content | Team Support | Setup Effort |
|---|---|---|---|---|
| Discord | < 1s | Embeds, charts, reactions | Excellent (channels, roles) | Medium (bot + webhook) |
| Telegram | < 1s | Good (Markdown, images) | Good (groups, channels) | Low (bot token + API) |
| 1-30s | Excellent (full HTML) | Limited | Low (SMTP or API) | |
| SMS | < 5s | None (text only) | None | Medium (Twilio) |
| Web Dashboard | Real-time | Full (interactive charts) | Excellent | High (web app) |
| Tier | Channels | Examples | Frequency |
|---|---|---|---|
| Critical | SMS + Discord | Scanner failure, data quality issue, regime → Crisis | ~2/month |
| High | Discord + Email | New scan results, A+ picks, regime change | Daily (scan nights) |
| Medium | Discord only | B+ picks, price approaching entry/stop levels | 2-3x/week |
| Low | Dashboard only | Watchlist updates, performance stats, market commentary | Continuous |
Discord is the most popular choice for trading communities and automated scanners because it supports rich embeds, file attachments (for scan reports), role-based access, and real-time interaction. Here's what a well-structured Discord scanner setup looks like:
| Channel | Purpose | Update Frequency |
|---|---|---|
| #scanner-daily | Daily scan results — top 10 picks with entry/stop/target | Once/day at 10:20 PM ET |
| #regime-alerts | Regime changes and confidence level updates | On regime change only |
| #trade-alerts | Entry/stop triggers for active picks during market hours | Real-time during market |
| #retrospective | Weekly performance review and scoring adjustments | Once/week (Friday) |
| #scanner-logs | System health, errors, debugging, data quality reports | Continuous |
A production scanner is a living system. It can degrade silently — data quality drops, a signal stops working, market structure changes. Without monitoring, you won't notice until your P&L tells you, and by then the damage is done.
| Metric | Normal Range | Warning | Critical |
|---|---|---|---|
| Data completeness | > 99% | 95-99% | < 95% (abort scan) |
| Execution time | < 10 min | 10-20 min | > 20 min (likely hanging) |
| Candidates scored | 2,000-3,000 | < 1,500 (data gap?) | < 500 (feed down) |
| A+ picks generated | 2-6 per scan | 0-1 or 10+ (calibration issue) | Always 0 or always 10+ |
| Rolling 30-day hit rate | 55-70% | 45-55% (strategy degrading) | < 45% (broken — kill switch) |
| Avg score drift | Stable (mean ~62) | Mean shifting 5+ points | Scores clustering at extremes |
Stop the scanner and investigate if any of these occur:
Pulling the kill switch is not failure — it's prudent risk management. Better to pause for a week of debugging than to bleed capital into a broken system.
| Symptom | Likely Cause | Diagnostic Step | Fix |
|---|---|---|---|
| All picks hitting stops | Regime mismatch | Check regime classifier accuracy | Recalibrate regime thresholds |
| Same 5 stocks every scan | Filters too narrow | Log candidate count at each filter | Widen filters or add signal types |
| Score inflation (many A+) | Correlated signals | Check signal independence matrix | Remove correlated signals |
| No picks found | Overly restrictive or data gap | Run each filter independently | Check data, relax weakest filter |
| Good picks, poor execution | Entry timing or slippage | Compare entry price vs signal price | Add limit orders or intraday logic |
| Decreasing hit rate over time | Market structure shift | Compare recent vs historical regime | Re-run walk-forward backtest |
The retrospective is the most important process in running a production scanner. It closes the feedback loop: the scanner generates picks, the market delivers outcomes, and you analyze the delta. Without retrospectives, your scanner is static — it will inevitably degrade as markets evolve.
| Section | Contents | Time |
|---|---|---|
| 1. Results Dashboard | Hit rate, avg P&L, best/worst picks, profit factor for the week | 5 min |
| 2. Pick-by-Pick Review | For each pick: entry, current price, TP1 hit?, stop hit?, still open | 15 min |
| 3. Strategy Analysis | Hit rate by strategy type (momentum, value, breakout, short) | 5 min |
| 4. Regime Accuracy | Was the regime classifier correct? Did strategy allocation match? | 5 min |
| 5. Lessons & Adjustments | What worked, what didn't, parameter changes for next week | 10 min |
| 6. Forward Look | Regime outlook, earnings calendar, macro events, adjusted strategy | 5 min |
Beyond weekly retros, track cumulative performance metrics that reveal the scanner's health over longer horizons:
A production scanner is never "done." Markets evolve, correlations shift, new data sources become available, and your own trading style matures. The improvement flywheel ensures your scanner keeps pace with these changes.
When you want to test a change (new signal, different weight, adjusted threshold), don't just apply it globally. Run two variants in parallel and compare results over 30+ trading days.
| Element | Variant A (Control) | Variant B (Test) |
|---|---|---|
| Description | Current production scanner | Production + new insider buying signal |
| Duration | 30 trading days minimum | 30 trading days minimum |
| Capital allocation | 80% of normal | 20% of normal (or paper trade) |
| Tracking | Hit rate, PF, Sharpe, MDD | Same metrics, tracked separately |
| Decision rule | Baseline performance | Promote if improvement > 10% |
Don't deploy a variant just because it's marginally better. Require a meaningful improvement (at least 10% better on key metrics) before promoting it to production. Small improvements may be noise — statistical fluctuations that don't represent genuine edge. Additionally, the variant must perform well across all walk-forward windows in a re-backtest, not just the recent 30-day test period.
Be especially cautious about adding complexity. A variant with 2 extra signals that improves hit rate by 3% but makes the scanner harder to maintain and debug is probably not worth deploying. Simplicity has compounding value in production systems — every additional dependency is a potential point of failure.
As your scanner matures and proves its edge, you may want to scale along several dimensions. The critical rule: scale one dimension at a time with a 30-day validation period between changes.
| Dimension | Starter | Intermediate | Advanced |
|---|---|---|---|
| Universe | US large-cap (500) | US all-cap + Europe (3,000) | Global + crypto (10,000+) |
| Strategies | 1 (momentum only) | 3 (momentum + value + breakout) | 5+ with regime-based rotation |
| Run frequency | Daily (EOD) | Daily + pre-market refresh | Intraday (every 4 hours) |
| Team | Solo trader | 2-3 person group | Full trading desk |
| Output | Email alert | Discord bot + dashboard | Full web app + API + published reports |
| Retrospective | Monthly (manual) | Weekly (semi-automated) | Daily (fully automated with exception alerts) |
If you scale multiple dimensions simultaneously and performance degrades, you won't know which change caused the problem. One dimension at a time, with validation between each step, gives you a clear audit trail and easy rollback path.
You now have the complete blueprint for a professional-grade stock scanner. The rest is execution. Start simple (Parts 1-2), add scoring (Part 3), integrate regime detection (Part 4), validate with backtesting (Part 5), and deploy to production (Part 6). Iterate weekly with retrospectives. Good trading.