- grafana/: docker-compose + provisioned Postgres datasource + 'Momentum — Live' dashboard (evaluation board with status colours, ready signals, risk events, bars + equity timeseries) reading the event store via JSONB extraction. Run: cd grafana && docker compose up -d -> http://localhost:3000. - RSS news-catalyst discovery wired: extract_tickers also matches $CASHTAGS; run_discovery pulls tickers from recent news into the universe when NEWS_FEEDS is set (no-op / safe otherwise). - docs: .env.example NEWS_FEEDS; GO_LIVE monitoring adds 'momentum watch' + Grafana. 67/67 tests green. Live board (momentum watch) verified rendering the evaluation board with real determinations. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
4.3 KiB
Go Live — market-open runbook
The system is verified end-to-end on real data (Postgres backend, sub-$20 discovery, live signals in the morning window). This is how to run and monitor it at the open.
0. Preconditions (already done)
- Postgres reachable at
127.0.0.1:5432(your LAN instance via the port proxy). .envhasDATABASE_URL=postgresql://admin:password@127.0.0.1:5432/momentumand validALPACA_API_KEY/ALPACA_SECRET_KEY.- Linux venv at
/home/philip/.venvs/momentum.
1. Start it (LIVE PAPER TRADING — enabled)
cd /mnt/c/code/momentum
PYTHONPATH=. /home/philip/.venvs/momentum/bin/python run_live_paper.py --no-dashboard
Each loop: discover sub-$20 most-actives, ETF-filtered (every 5 min) → ingest 1-min bars (every 60s) → watch/evaluate (every 30s) → on a ready signal, auto-arm a bracket order to your Alpaca paper account → sync account/positions → guard unfilled entries. Stop with Ctrl-C (graceful).
Guardrails (.env): 1% risk/trade, max 3 concurrent, 2R targets, and a
-3% daily-loss circuit breaker that halts new entries. Trading window
9:30–10:35 ET.
Start it a few minutes before 9:30 ET so the premarket screen + daily backfill are warm at the open.
2. The trading window
Signals fire 9:30–10:35 ET. The entry cutoff is 10:30 ET (+5 min grace, Ross-Cameron style) — after that, qualifying setups are marked late, not ready. So watch the first hour.
3. Monitor (any terminal, or remotely)
M="PYTHONPATH=. /home/philip/.venvs/momentum/bin/python momentum_cli.py"
$M watch # LIVE auto-refreshing board — the real-time view
$M doctor # PASS/WARN/FAIL across every stage
$M inspect signals # ready board + per-symbol gap/rvol/status
$M inspect bars # per-symbol bar counts + freshness (are bars flowing?)
$M inspect criteria RGNT # full per-criterion reasons for one symbol
$M inspect discovery # current sub-$20 universe + ranked gappers
$M inspect events --limit 30
Or point pgAdmin at the momentum DB (events, daily_bars,
minute_bars, scanner_snapshots are all live). For a polished remote
dashboard: cd grafana && docker compose up -d → http://localhost:3000
(see grafana/README.md).
4. Trading is ENABLED — how to dial it back
.env already has live paper trading on, with guardrails:
TRADING_EXECUTION_ENABLED=1
ALPACA_PAPER_SYNC_ENABLED=1
TRADING_AUTO_APPROVE=1 # auto-arm bracket orders (hands-off)
TRADING_MAX_DAILY_LOSS_PCT=0.03 # -3% daily-loss circuit breaker (implemented + verified)
TRADING_RISK_PER_TRADE_PCT=0.01 # 1% of equity per trade
TRADING_MAX_CONCURRENT_POSITIONS=3
- Manual approval instead of auto:
TRADING_AUTO_APPROVE=0, drop--no-dashboard, approve each signal athttp://127.0.0.1:8765. - Observe only (no orders):
TRADING_EXECUTION_ENABLED=0. - The breaker at -3% halts new entries and flattens the book — cancels
unfilled entries + market-closes open positions. Set
TRADING_FLATTEN_ON_BREACH=0for halt-only (leave positions open).
5. Tuning (env vars)
| var | default | meaning |
|---|---|---|
WATCHER_PRICE_MIN / MAX |
1 / 20 | discovery + watcher price band |
DISCOVER_TOP |
20 | screener universe size |
DISCOVER_INTERVAL_SECONDS |
300 | how often to re-screen |
WATCHER_INTERVAL_SECONDS |
30 | evaluation cadence |
LIVE_BARS_INTERVAL_SECONDS |
60 | minute-bar ingest cadence |
WATCHER_MIN_BARS |
10 | min bars before evaluating |
6. Reset to a clean slate (optional)
# clears event stream + scans; KEEPS the daily-bar gap baseline
/home/philip/.venvs/momentum/bin/python - <<'PY'
import psycopg2
c=psycopg2.connect("postgresql://admin:password@127.0.0.1:5432/momentum"); c.autocommit=True
c.cursor().execute("TRUNCATE events, scanner_snapshots")
PY
Known limitations (honest)
quality_scoreis a constant 1.0,float_rotationis 0.0,spread_pctis null — these fields are not real metrics yet.- News-catalyst discovery (RSS) exists but isn't wired into the watchlist.
- Free Alpaca IEX data is thinner than SIP, especially premarket — some sub-$20 names show few/no bars until volume builds.
- The screener can briefly rate-limit; discovery retries and falls back to a liquid sub-$20 list, so the watchlist stays tradeable.