Batch Scanner
Runs every screening strategy in sequence and pushes results to Google Sheets (one tab per strategy). Cron-ready for scheduled scans.
Usage
python batch_scanner.py # run all → Sheets
python batch_scanner.py --dry-run # print, don't send
python batch_scanner.py --strategies "Momentum with Pullback,MEME Screen"
python batch_scanner.py --list # show valid strategy names
Available strategies
| Strategy | Surfaces |
|---|---|
| Momentum with Pullback | Multi-timeframe EMA stack + oscillator pullback |
| Volatility Squeeze | Coiled stocks ready to break out (ATR compression) |
| MEME Screen | Top 30 by IV from top 200 by volume |
| Small Cap Multibaggers | Quality small caps, growth + positive FCF |
| Gamma Scan | Stocks near high open-interest option strikes |
| EMA Cross Momentum | Bullish EMA crossover |
| Bearish EMA Cross (Down) | Bearish EMA crossover |
For the Squeeze / Momentum strategies' entry logic, see the
momentum-squeezeskill.
Setup
pip install pandas requests python-dotenv tradingview-screener yfinance scikit-learn- Create
.envwithGOOGLE_SHEETS_WEBHOOK=https://script.google.com/macros/s/<id>/exec - Deploy
google_sheets_script_v2.jsas an Apps Script Web App (Execute as Me, access Anyone); copy the URL into.env.
Cron (weekdays 4 PM)
0 16 * * 1-5 cd /path/to/project && .venv/bin/python batch_scanner.py >> logs/batch.log 2>&1
Output columns
ScanTime · Symbol · Company · WeekEnding · <strategy-specific> · CurrentPrice
(live via GOOGLEFINANCE).
Troubleshooting
| Issue | Fix |
|---|---|
| "GOOGLE_SHEETS_WEBHOOK not configured" | Create .env with the webhook URL |
| "Sheets error: 302" | Redeploy Apps Script with Anyone access |
| "Unknown strategy" | Run --list for valid names |
| Slow scans | MEME / Gamma fetch option data — expected |
Source
Full guide: BATCH_SCANNER_README.md.