MVP em Python para paper trading de swing/position trade com scanner de setups, backtest sem lookahead, memória histórica por ativo e alertas Telegram.
SIMULAÇÃO — NÃO É CONTA REAL
Rentabilidade passada não garante resultado futuro. O sistema trabalha com probabilidade histórica estimada, nunca certeza.
- 200 ativos demo: 100 do Brasil, 50 dos EUA e 50 do Reino Unido.
- 35 setups implementados:
- IFR2
- Setup 123
- Inside Bar
- Supertrend
- Donchian
- Bollinger
- Trap na Média
- PFR
- EMA Cross
- EMA20 Pullback
- MACD Cross
- Engulfing
- Hammer/Star
- Volume Breakout
- RSI50 Retomada
- SMA20/50 Cross
- EMA9/21 Cross
- VWAP Reclaim
- VWAP Pullback
- NR7 Breakout
- Squeeze Breakout
- Keltner Breakout
- ADX Trend Pullback
- CCI Reversal
- Stochastic Cross
- Williams %R Reversal
- ROC Momentum
- OBV Breakout
- MFI Reversal
- Gap Continuation
- Gap Fade
- Three Bar Reversal
- Pin Bar Reversal
- Marubozu Continuation
- Double Top/Bottom Breakout
- Scanner de sinais de
COMPRAeVENDAsimulados; nenhuma ordem real é enviada. - Registro automático do desfecho dos sinais.
- Memória histórica por ativo/setup.
- Identidade única de sinais no banco para evitar duplicidade.
- Backtester com entrada no próximo candle.
- Alertas Telegram com outbox durável, reprocessamento e fan-out por destinatário.
- Filtro técnico de sinais em
VERDE/AMARELO/VERMELHO, com direçãoCOMPRA/VENDA, chance de acerto histórica estimada, amostra, tempo médio até alvo, PnL médio e risco/retorno. - Auditoria de fonte dos sinais: o robô grava provider, status, quantidade de fontes e motivo da confirmação de dados.
- Confirmação opcional por quorum de dados: em
strict, alertasVERDE/AMARELOde mercados configurados só são enviados se a fonte secundária confirmar o último candle/preço. - Modo multi-timeframe para swing trade: entrada em
H1/60 minutos com filtro de contexto emD1diário eW1semanal. - Scheduler para execução contínua, com ciclo inicial no boot, heartbeat operacional e trava exclusiva para evitar duas instâncias ao mesmo tempo.
- Envio Telegram imediato no ciclo do scanner/resolvedor, com lote alto próprio para não deixar sinais recém-criados esperando o job periódico; se o Telegram estiver indisponível, o alerta permanece na outbox para nova tentativa.
- Watchdog operacional para avisar no Telegram quando o scheduler parar, a fila travar, a memória ficar inconsistente ou o universo esperado (BR=100, US=50, UK=50) sair do esperado; sinais abertos velhos isolados entram como aviso interno e só viram alerta quando atingem
WATCHDOG_STALE_OPEN_SIGNALS_ALERT_MIN_COUNT. - Watchdog com janela de graça no startup para evitar falso alerta durante restart curto do scheduler.
- Backup consistente do SQLite antes de manutenção/deploy.
- Manutenção operacional com backup, retenção segura de notificações antigas e rotação de backups, sem apagar sinais nem memória histórica.
- Guardrails de recursos para alertar se o banco passar do limite ou se
data/,logs/oubackups/ficarem com pouco espaço livre. - Proteção por token nos endpoints operacionais mutáveis, para não depender só do loopback no VPS.
- Cache do
yfinanceredirecionado para dentro dedata/cache/, compatível com o hardeningProtectHome=trueno VPS. - Sinais que ficarem velhos sem nenhum candle posterior disponível no provider passam a expirar automaticamente com nota operacional, evitando ficar presos em
openindefinidamente. - FastAPI + Streamlit.
- Testes automatizados.
- Arquivos de deploy isolado para VPS.
- Relatório premium em HTML e PDF a partir de planilhas locais ou Google Sheets, com logo, rodapé em todas as páginas, fotos otimizadas e 10 gráficos automáticos.
super_trader_quant/
backend/app/
frontend/
deploy/
scripts/
tests/
python -m venv .venv
.venv\Scripts\activate
pip install -r requirements.txt
copy .env.example .env
python -m scripts.seed_demo
pytestpython -m scripts.seed_demo
python -m scripts.run_scanner --provider simulated
python -m scripts.run_backtest_batch --provider simulated
python -m scripts.build_catalog_report --source https://docs.google.com/spreadsheets/d/SEU_ID/edit#gid=0 --logo "C:\\caminho\\SELIM AZUL (1).png"
python -m scripts.check_deploy_readiness
python -m scripts.check_deploy_readiness --strict --runtime
python -m scripts.goal_acceptance_report --strict --runtime
python -m scripts.build_verification_manifest
python -m scripts.build_verification_bundle
python -m scripts.verify_verification_bundle
python -m scripts.verify_verification_round
python -m scripts.dispatch_notifications_now --max-batches 20 --require-empty
python -m scripts.suppress_pending_notifications --older-than-minutes 5 --output logs/suppress_pending_notifications_last.json
python -m scripts.production_preflight --strict --app-dir /opt/super_trader_quant --env-file /opt/super_trader_quant/.env
python -m scripts.verify_ops_http_protection --base-url http://127.0.0.1:8010
python -m scripts.verify_systemd_runtime
python -m scripts.verify_filesystem_isolation --app-dir /opt/super_trader_quant --app-user supertrader
python -m scripts.verify_process_runtime --app-user supertrader --app-dir /opt/super_trader_quant --api-port 8010
python -m scripts.validate_deploy_artifacts
python -m scripts.validate_demo_assets
python -m scripts.send_telegram_test
python -m scripts.send_telegram_canary
python -m scripts.rebuild_memory
python -m scripts.backup_db --label manual
python -m scripts.run_maintenance
python -m scripts.watchdog_once --strict
python -m scripts.scan_now --provider simulated --timeframe H1
python -m scripts.run_watchdog_loop
python -m scripts.run_scheduler
python -m scripts.run_api
streamlit run super_trader_quant/frontend/streamlit_app.py
pytestNo .env:
TELEGRAM_BOT_TOKEN=
TELEGRAM_CHAT_IDS=
TELEGRAM_BR_BOT_TOKEN=
TELEGRAM_BR_CHAT_IDS=
SCAN_MARKETS=BR,US,UK
SCAN_INTERVAL_MINUTES=60
SCAN_TIMEFRAME=H1
SCAN_INTRADAY_PERIOD=3mo
SCAN_DAILY_PERIOD=1y
SCAN_WEEKLY_PERIOD=2y
SIGNAL_ALERT_MIN_LEVEL=yellow
SIGNAL_ALERT_YELLOW_MIN_PROBABILITY=0.50
SIGNAL_ALERT_GREEN_MIN_PROBABILITY=0.58
OPS_ADMIN_TOKEN=
BRAPI_TOKEN=
SIGNAL_DATA_CONFIRMATION_MODE=auto
SIGNAL_DATA_CONFIRMATION_PROVIDER=brapi
SIGNAL_DATA_CONFIRMATION_MARKETS=BRDepois basta incluir outros IDs separados por vírgula:
TELEGRAM_CHAT_IDS=123456789,987654321Se quiser duas rotas ao mesmo tempo, use assim:
TELEGRAM_BOT_TOKEN=<bot-geral>
TELEGRAM_CHAT_IDS=123456789
TELEGRAM_BR_BOT_TOKEN=<bot-brasil>
TELEGRAM_BR_CHAT_IDS=123456789Com isso, BR vai para os dois bots e US/UK vao apenas para o bot principal.
Por padrão, só alertas VERDE e AMARELO são enviados. O scanner ainda salva sinais VERMELHO no banco para acompanhamento e aprendizado, mas não dispara Telegram para eles. A mensagem do Telegram informa se o sinal é COMPRA ou VENDA; VENDA significa posição vendida simulada/paper trading, não operação real. A chance de acerto exibida é uma estimativa histórica do ativo/setup/timeframe com suavização estatística; não é promessa de acerto.
Para exigir confirmação externa antes de enviar alerta importante no Brasil, configure uma chave grátis da Brapi no .env e ative o modo estrito:
BRAPI_TOKEN=<sua-chave-gratis>
SIGNAL_DATA_CONFIRMATION_MODE=strict
SIGNAL_DATA_CONFIRMATION_PROVIDER=brapi
SIGNAL_DATA_CONFIRMATION_MARKETS=BR
SIGNAL_DATA_CONFIRMATION_MAX_CLOSE_DIFF_PCT=0.5No modo auto, a divergência entre fontes bloqueia o alerta, mas falta de token da fonte secundária apenas fica registrada na auditoria para não silenciar todo o universo por configuração incompleta. No modo strict, falta de confirmação derruba VERDE/AMARELO para VERMELHO e impede Telegram.
No modo swing multi-timeframe, o scheduler pode rodar a cada 60 minutos com SCAN_TIMEFRAME=H1. Nesse modo, o gatilho do sinal vem do candle de 60 minutos, mas ele só passa se o contexto maior estiver aceitável:
W1semanal: tendência principal.D1diário: contexto/setup intermediário.H1/60 minutos: timing de entrada.
O filtro multi-timeframe é direcional: sinais de COMPRA favorecem contexto bullish/neutro em W1 e D1, enquanto sinais de VENDA favorecem contexto bearish/neutro. Assim, venda simulada em tendência maior de baixa não é rebaixada indevidamente apenas por estar contra a regra de compra.
Para um robô focado apenas em Brasil, use:
SCAN_MARKETS=BR
SCAN_INTERVAL_MINUTES=60
SCAN_TIMEFRAME=H1
OUTCOME_CHECK_INTERVAL_MINUTES=60Com isso, o scanner roda de hora em hora e só envia Telegram quando encontrar sinal novo qualificado no universo BR.
Os alertas explicam o timeframe junto com o tempo em candles. No padrão multi-timeframe (H1), 1 candle = 1 hora de negociação; então 3 candles H1 quer dizer aproximadamente 3 horas de pregão. Em D1, 1 candle = 1 pregão/dia útil; em W1, 1 candle = 1 semana.
Se quiser restringir o scanner inteiro aos mercados permitidos, ainda pode usar:
SCAN_MARKETS=BRNo VPS, depois de rodar o canário real, gere o comprovante final:
python -m scripts.goal_acceptance_report --strict --runtime --require-canary --require-preflight --require-ops-protection --require-systemd-runtime --require-filesystem-isolation --require-process-runtime --require-notification-drain --require-verification-manifest --output logs/goal_acceptance_last.jsonOs recibos exigidos pelo aceite final precisam ser recentes. O relatório agora rejeita recibos velhos mesmo que o arquivo exista.
Quando a validação roda pelo deploy/verify_vps.sh, os recibos também precisam pertencer à mesma rodada de verificação, identificada por um RUN_ID comum.
Além disso, os recibos obrigatórios precisam ser coerentes no mesmo host e em APP_ENV=production.
Os scripts de verificação agora gravam os recibos de forma atômica. Se algum recibo ficar corrompido, o aceite final bloqueia explicitamente em vez de aceitar silenciosamente.
O aceite final também verifica se os recibos obrigatórios refletem a configuração isolada esperada do VPS, como APP_DIR, APP_USER, .env e bind local da API.
Além disso, a rodada de validação agora gera um manifest hashado dos recibos obrigatórios, e o aceite final compara os hashes atuais com esse manifest.
Depois do aceite final, o VPS também pode gerar um bundle ZIP da rodada com os recibos e um resumo humano, por meio de python -m scripts.build_verification_bundle.
Para validar o caminho real dos alertas no VPS, use:
python -m scripts.send_telegram_canary
python -m scripts.send_telegram_canary --route brEsse comando não cria operação real: ele cria uma notificação canario na outbox, despacha pelo mesmo mecanismo usado pelos sinais e confirma se todos os destinatarios da rota escolhida ficaram com status sent.
Há duas opções preparadas:
systemdcom dois serviços separados:deploy/systemd/super-trader-quant-api.servicedeploy/systemd/super-trader-quant-scheduler.service
docker composecom o arquivo emdeploy/docker-compose.yml.
O serviço usa:
- banco próprio em
data/super_trader_quant.db; .envpróprio;- diretório próprio;
- logs próprios.
- trava própria em
data/scheduler.lock; - backups próprios em
data/backups/. - watchdog próprio em
super-trader-quant-watchdog.timer.
Assim ele pode rodar isolado dos demais sistemas do VPS.
Quando um ciclo 24/7 encontra novo sinal ou resolve um sinal aberto, o scheduler tenta enviar Telegram imediatamente no próprio ciclo. O job periódico de notificações continua existindo como rede de segurança para reprocessar alertas pendentes.
Se você acumulou backlog na outbox durante um período sem TELEGRAM_BOT_TOKEN, use python -m scripts.suppress_pending_notifications antes do primeiro go-live real. Esse comando não apaga o histórico: ele apenas marca pendências antigas como suppressed para evitar spam de alertas atrasados quando o bot entrar.
Para produção, use como base o arquivo .env.vps.example e siga o guia em deploy/README.md.
Há também scripts auxiliares:
deploy/install_vps.shdeploy/verify_vps.sh
Ao final do verify_vps.sh, os artefatos principais esperados em logs/ passam a incluir:
notification_drain_last.jsongoal_acceptance_last.jsonverification_manifest_last.jsonverification_bundle_last.jsonverification_bundle_last.zipverification_bundle_check_last.jsonverification_round_last.json
Endpoints operacionais:
GET /healthGET /ops/statuspara consultar heartbeat do scheduler, sinais abertos, envelhecimento dos sinais, fila de notificações e consistência da memória.GET /ops/watchdogpara ver a auditoria operacional pronta para alerta.POST /ops/auth-checkpara comprovar autenticação administrativa dos endpoints operacionais sem efeito colateral.POST /ops/scan-nowpara disparar scanner/resolução/Telegram imediatamente pelo mesmo pipeline seguro, usando trava para não colidir com o scheduler. Em produção, esse endpoint exigeX-Ops-Admin-Token(ouAuthorization: Bearer ...).
yfinanceé usado apenas como protótipo rápido e não é fonte oficial.brapiconsulta dados de ativos da B3 viaBRAPI_TOKENe pode ser usado como fonte principal ou confirmação secundária.bcb_sgsconsulta séries macro do Banco Central do Brasil por ID de série SGS; não é provider OHLC do scanner, mas serve para filtros/relatórios macro.- O provider
stooqestá preparado como alternativa complementar e exigeSTOOQ_API_KEY. - O provider
simulatedexiste para testes automatizados. - Nenhuma fonte externa garante acerto de trade. A confirmação de dados reduz erro de feed, mas não transforma probabilidade histórica em certeza.
Esta expansão priorizou setups clássicos de tendência, reversão, rompimento, volume e volatilidade, inspirados por:
- John J. Murphy,
Technical Analysis of the Financial Markets. - Jack D. Schwager, série
Market Wizards, com foco em processo, risco e disciplina. - Van K. Tharp,
Trade Your Way to Financial Freedom, com foco em sistema, expectativa e risco/retorno. - Mark Douglas,
Trading in the Zone, com foco em consistência e psicologia. - StockCharts ChartSchool e TradingView Education, como bases práticas de padrões, indicadores e estudo de gráficos.
- B3/Bora Investir, Giro de Mercado e Scanner da Bolsa, como referências nacionais de análise técnica e setups populares no Brasil.
Para montar o pacote visual a partir das planilhas na nuvem ou arquivos locais:
python -m scripts.build_catalog_report \
--source "https://docs.google.com/spreadsheets/d/SEU_ID/edit#gid=0" \
--source "C:\\dados\\catalogo_complementar.xlsx" \
--logo "C:\\imagens\\SELIM AZUL (1).png" \
--footer "feito por marx bruno" \
--title "SELIM AZUL | Dashboard Premium" \
--expected-records 780 \
--output-dir "data\\reports\\selim_azul"O gerador aceita CSV, TSV, XLSX, JSON e link de Google Sheets, baixa todas as fotos referenciadas nas colunas de imagem/foto/logo, reduz a qualidade para um HTML mais leve, gera uma galeria visual e cria:
catalog_dashboard.htmlcatalog_dashboard_offline.htmlcatalog_dashboard.pdfsummary.jsondataset_normalized.csvassets/charts/com 10 gráficos automáticos
Variáveis opcionais no .env:
REPORT_DATA_SOURCES=
REPORT_LOGO_PATH=
REPORT_OUTPUT_DIR=./data/reports
REPORT_EXPECTED_RECORDS=780- COTAHIST B3 completo.
- CVM fundamentos.
- Magic Formula real.
- Low Risk real.
- Full Factor real.
- MCP server.
- Alpaca paper broker.
- Walk-forward.
- Out-of-sample.
- Monte Carlo.
- Relatórios PDF.