About this project
Watchy is a self-hosted stock-monitoring daemon built on the TradingAgents multi-agent LLM trading framework. It watches a user-defined watchlist and pushes position-aware guidance to Telegram. It is explicitly a decision-support system: it never places orders and does not claim to predict returns or generate alpha.
Two-tier design. Tier 1 is a zero-cost technical scan (default every 30 minutes, US regular trading hours only, DST-correct via exchange_calendars) that fetches OHLCV through yfinance and computes indicators with no LLM calls. It detects 11 signal types including golden/death cross with moving-average staircase confirmation, RSI extremes, MACD crossovers, Bollinger band breaches, volume anomalies and ATR spikes. Tier 2 runs the full four-analyst TradingAgents pipeline (Market, Sentiment, News, Fundamentals) with a Bull/Bear debate and risk management, whose depth escalates to a full three-way risk debate on the first trading day of each week.
Watchy 2.0 (v2.0.0-rc.1) shifts to a weekly plan plus event-driven monitoring. The weekly full run asks the advisor for a strict WEEKLY PLAN block (decision, urgency, thesis, buy zone, chase ceiling, invalidation level/condition, trim condition, resistance, take-profit price, guidance, and a concrete "do not"). Plans are validated before activation; invalid output is stored for diagnosis and never becomes actionable. Each scan classifies price against the plan and notifies only on state transitions, persisted so restarts do not repeat alerts. A pure router maps triggers to one of TAKE_PROFIT, TRIGGERED_RISK, FAST_RECHECK, NOTIFY_ONLY or NO_ACTION, with paid routes downgraded to reminders in shadow mode (the shipped default), when a ticker is not allow-listed, or when per-ticker/global session budgets are spent. Deterministic status labels (ACT NOW, WAIT FOR LIMIT, DO NOT CHASE, RISK REVIEW, PLAN INVALID, STALE, INFORMATION ONLY) cannot be overridden by the LLM. Setting tier2_schedule: daily restores 1.x behaviour.
Other documented features: a price-proximity gate that skips expensive analysis for watch-only tickers far from their entry target while always analysing held positions; an optional ATR-adaptive band with a calibration script; a take-profit / anti-round-trip path that injects a fact-filled directive for held winners past a gain floor and adapts proposals to share count (whole-share tranches, full exit, fractional market trim); a layered position source (Schwab API live, cached snapshot, manual YAML) with age labelling and token-expiry alerts; and observability via journal lines, a route_log table, and scripts/watchy_ctl.py commands for status, plan inspection, dry routing/preview, forced weekly runs and a read-only routing replay.
Deployment is via systemd with config split between a committable config.yaml and a git-ignored secrets.yaml. Python 3.11+, MIT licensed.
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.