config.py had no Schwab fields at all, so the keys listed in .env.example were being silently dropped by extra="ignore". They exist now, blank, and nothing reads them while live_source is yahoo. The token path moves under data/, which is the Coolify persistent volume. Left at the repository root it would vanish on every rebuild, and re-authenticating is an interactive browser flow, not something a deploy can do for itself. scripts/check_schwab.py answers empirically what the app is entitled to rather than inferring it from documentation: whether the credentials authenticate, whether /ES quotes return (futures market data is a separate entitlement from equities), and whether the streamer bootstrap responds. That last one is the decision. StreamClient.login() reads /trader/v1/userPreference for its socket URL and credentials, and that path belongs to the Accounts and Trading product — so an app registered for Market Data Production alone cannot stream, and CHART_FUTURES is unreachable until the app adds it. The script reports which of the two paths is open instead of leaving it to be discovered halfway through an implementation. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
38 lines
1.3 KiB
Text
38 lines
1.3 KiB
Text
# Data sources
|
|
LIVE_SOURCE=yahoo
|
|
SEED_SOURCE=yahoo
|
|
YAHOO_SYMBOL=ES=F
|
|
YAHOO_POLL_SECONDS=20
|
|
SEED_1H_RANGE=730d
|
|
SEED_1M_RANGE=8d
|
|
|
|
# Schwab. Only read once LIVE_SOURCE=schwab; blank is fine until then.
|
|
# The callback must match the app registration exactly — changing it there can
|
|
# re-trigger approval. The same URL works from local and production: the
|
|
# redirect lands in your browser, not on the machine running the code.
|
|
SCHWAB_API_KEY=
|
|
SCHWAB_APP_SECRET=
|
|
SCHWAB_CALLBACK_URL=https://chart.amow.com/api/qt
|
|
# Under data/ so it survives a deploy — that path is the Coolify volume.
|
|
SCHWAB_TOKEN_PATH=./data/.schwab_token.json
|
|
SCHWAB_SYMBOL=/ES
|
|
|
|
# Chart and analysis
|
|
TIMEFRAMES=1m,5m,15m,30m,1h,1d
|
|
BASE_TIMEFRAMES=1m,30m,1d
|
|
MAX_BARS_PER_TF=5000
|
|
MA_SETS__1D=sma10,sma20,sma50,sma100,sma200
|
|
DAILY_ANCHOR_ET=18:00
|
|
MANUAL_LINES_PATH=./data/manual_lines.json
|
|
CONFLUENCE_MIN_SCORE=28
|
|
# Four hours. Suppression is per price zone, so an unrelated zone still alerts;
|
|
# this governs only how often the same area repeats. See README.
|
|
ALERT_COOLDOWN_SECONDS=14400
|
|
|
|
# Notifications and access
|
|
NTFY_TOPIC=
|
|
NTFY_SERVER=https://ntfy.sh
|
|
# Blank = no auth (fine locally). In production this is set in Coolify, not
|
|
# here — see README. Sent as the X-Chart-Token header, or ?token= for /ws.
|
|
CHART_AUTH_TOKEN=
|
|
REPLAY_FILE=
|