Sobre o projeto

Watchy é um daemon auto-hospedado de monitoramento de ações baseado no framework multiagente de LLM TradingAgents. Ele monitora uma watchlist definida pelo usuário e envia orientações cientes da posição para o Telegram. É explicitamente um sistema de apoio à decisão: nunca envia ordens e não afirma prever retornos nem gerar alpha. Design de dois níveis. O Nível 1 é uma varredura técnica sem custo (padrão a cada 30 minutos, apenas no horário regular de negociação dos EUA, com correção de horário de verão via exchange_calendars) que busca OHLCV através do yfinance e calcula indicadores sem chamadas de LLM. Detecta 11 tipos de sinal, incluindo cruzamento dourado/morte com confirmação de escada de médias móveis, extremos de RSI, cruzamentos de MACD, rompimentos das Bandas de Bollinger, anomalias de volume e picos de ATR. O Nível 2 executa o pipeline completo do TradingAgents com quatro analistas (Mercado, Sentimento, Notícias, Fundamentos) com um debate Touro/Urso e gestão de risco, cuja profundidade escala para um debate de risco completo de três vias no primeiro dia de negociação de cada semana. O Watchy 2.0 (v2.0.0-rc.1) passa para um plano semanal mais monitoramento orientado a eventos. A execução completa semanal solicita ao advisor um bloco estrito WEEKLY PLAN (decisão, urgência, tese, zona de compra, teto de perseguição, nível/condição de invalidação, condição de redução, resistência, preço de take-profit, orientação e um "não fazer" concreto). Os planos são validados antes da ativação; saída inválida é armazenada para diagnóstico e nunca se torna acionável. Cada varredura classifica o preço em relação ao plano e notifica apenas em transições de estado, persistidas para que reinicializações não repitam alertas. Um roteador puro mapeia gatilhos para um de TAKE_PROFIT, TRIGGERED_RISK, FAST_RECHECK, NOTIFY_ONLY ou NO_ACTION, com rotas pagas rebaixadas para lembretes em modo shadow (o padrão distribuído), quando um ticker não está na lista de permissões, ou quando os orçamentos de sessão por ticker/global se esgotam. Rótulos de status determinísticos (ACT NOW, WAIT FOR LIMIT, DO NOT CHASE, RISK REVIEW, PLAN INVALID, STALE, INFORMATION ONLY) não podem ser sobrescritos pelo LLM. Definir tier2_schedule: daily restaura o comportamento da 1.x. Outros recursos documentados: um portão de proximidade de preço que pula análises caras para tickers apenas em observação distantes de seu alvo de entrada, enquanto sempre analisa posições mantidas; uma banda adaptativa opcional por ATR com script de calibração; um caminho de take-profit / anti-round-trip que injeta uma diretiva repleta de fatos para vencedores mantidos além de um piso de ganho e adapta propostas à quantidade de ações (tranches de ações inteiras, saída total, redução fracionária a mercado); uma fonte de posição em camadas (Schwab API ao vivo, snapshot em cache, YAML manual) com rotulagem de idade e alertas de expiração de token; e observabilidade via linhas de journal, uma tabela route_log e comandos scripts/watchy_ctl.py para status, inspeção de plano, roteamento/preview a seco, execuções semanais forçadas e uma reprodução de roteamento somente leitura. A implantação é via systemd com configuração dividida entre um config.yaml versionável e um secrets.yaml ignorado pelo git. Python 3.11+, licenciado sob MIT.