This project runs as a background market-scanner worker. It does not need an inbound HTTP port, so the Compose service intentionally publishes no host ports.
cp config/config.example.json config/config.json
cp .env.example .env
docker compose up -d --buildEdit .env with local secrets before starting the service. config/config.json
and .env are ignored by git and should not be committed.
For Alpaca paper trading credentials, keep the trading endpoint separate from the market-data endpoint:
ALPACA_TRADING_BASE_URL=https://paper-api.alpaca.markets/v2
ALPACA_USE_PAPER=true
ALPACA_DATA_FEED=iexWhen Discord or email is not configured, notification batches are still written as Markdown files under:
local_reports/YYYY-MM-DD/HHMMSS-notifications.md
The same run also keeps JSON state under analysis/.
The background worker only runs stock-alert scan cycles during its configured market-hours window (4:00 AM to 1:00 PM America/Los_Angeles). Outside that window, use the manual commands below to inspect the current screening state.
Once per weekday, the worker also writes a local combined screening report between 6:00 and 6:25 AM America/Los_Angeles (about 9:00-9:25 AM US/Eastern) so there is a pre-open report ready before the regular session starts:
local_reports/YYYY-MM-DD/HHMMSS-screening-all.md
Run one immediate local report without waiting for the market-hours loop:
docker compose exec breakoutanalysis python scripts/run_manual_report.py --sample-if-empty --limit 1--sample-if-empty is for validation only: if strict breakout filters find no
candidate, the report uses the top raw screener row and marks it as a manual
sample in the Markdown file.
The manual command also writes a full screener pipeline report:
local_reports/YYYY-MM-DD/HHMMSS-screening.md
local_reports/YYYY-MM-DD/HHMMSS-screening.json
To generate only the all-market screening report:
docker compose exec breakoutanalysis python scripts/run_screening_report.pyBefore 9:30 AM US/Eastern, auto uses the premarket gapper screener. To avoid
confusing a narrow premarket report with the broader market scan, use:
docker compose exec breakoutanalysis python scripts/run_screening_report.py --screener all
docker compose exec breakoutanalysis python scripts/run_screening_report.py --screener marketSet these in .env:
ANALYSIS_OUTPUT_LANGUAGE=zh-CN
LLM_CURRENT_MODEL=gemini-2.5-proOpenAI-compatible models are also supported:
OPENAI_BASE_URL=https://your-openai-compatible-endpoint.example/v1
LLM_CURRENT_MODEL=gpt-5.5docker compose ps
docker compose logs -f breakoutanalysis
docker compose restart breakoutanalysis
docker compose down