Visão Geral¶
Fluxo end-to-end¶
flowchart TB
subgraph Coleta["📥 Coleta de dados"]
MT5[MetaTrader 5<br/>terminal da corretora]
TD[Twelve Data<br/>fallback histórico]
MT5 -->|tick + OHLCV| Collector
TD -->|bootstrap| Collector
Collector[Collector Worker<br/>scripts/run_collector.py]
end
Collector -->|UPSERT candles| DB[(PostgreSQL 16<br/>partições mensais)]
subgraph ML["🤖 Pipeline ML"]
Features[Feature Engineering<br/>FDA + ATR + EMA derived]
Train[Treino<br/>LGBM + XGB + CatBoost]
Predict[Predição<br/>+ Conformal + Meta-label]
Features --> Train --> Predict
end
DB --> Features
Predict -->|INSERT predictions| DB
subgraph API["🌐 API FastAPI"]
Auth[Auth multi-tenant<br/>X-API-Key + rate limit]
Scan[/api/scan/]
Account[/api/account/*/]
Webhooks[/webhooks/eduzz/]
Admin[/admin/*/]
Auth --> Scan & Account
end
DB --> API
API -->|sinais| EA[EA v2.27<br/>MT5 multi-símbolo]
EA -->|executions| API
subgraph Notif["📲 Notificações"]
Telegram[Bot + Canal]
Discord[Webhook]
Email[SMTP HTML]
end
API --> Notif
Eduzz[Eduzz<br/>checkout PIX/Cartão] -.->|HMAC webhook| Webhooks
Webhooks --> Email
subgraph Frontend["🖥️ Frontend"]
Index[/Landing/]
Conta[/Minha Conta<br/>tabs + KPIs/]
Dash[/Dashboard/]
Ops[/Ops admin/]
end
API --> Frontend
subgraph DR["💾 Backup & DR"]
B2[Backblaze B2<br/>us-east-005]
DB -.->|pg_dump diário| B2
Train -.->|sticky pickles| B2
end
Componentes principais¶
Worker (scripts/run_worker.py)¶
Loop principal que orquestra:
- Coleta — fetch de candles via MT5 (websocket) ou Twelve Data (REST)
- Features — calcula indicadores (ATR, EMAs derivadas, FDA, sessões, vol expansion)
- Predição — carrega modelos do
models/e gera sinais a cada nova barra - Persist — INSERT em
predictions(partição do mês) - Broadcast — confluência (H1+H4 mesma direção) → Telegram canal + Discord
- Drift check — diário, calcula PSI/CUSUM e marca modelos degradados
API (app/api/main.py)¶
FastAPI assíncrono com 11 routers:
| Router | Endpoints | Auth |
|---|---|---|
scan |
/api/scan |
X-API-Key |
signals |
/api/signals/{symbol}/{tf} |
X-API-Key |
history |
/api/history/* |
X-API-Key |
executions |
POST /api/executions (EA reporta) |
X-API-Key |
ea_status |
/api/ea-status |
X-API-Key |
account |
/api/account/me|signals|executions|regenerate-key |
X-API-Key |
performance |
/api/performance |
X-API-Key |
calibration |
/api/calibration |
X-API-Key |
models |
/api/models |
X-API-Key |
status |
/api/status, /api/health |
X-API-Key/público |
public |
/api/public/stats |
público |
admin |
/admin/keys, /admin/monitoring-data |
X-Admin-Secret |
webhooks |
/webhooks/eduzz |
HMAC-SHA256 |
EA (ea/ML_Sensorial_Scanner.mq5)¶
Single-file MQL5, 1852 linhas. Funciona como scanner único multi-símbolo:
- Roda em um gráfico qualquer
- Itera 14 pares × 4 TFs no loop
- Consulta
/api/scana cada minuto - Abre posições respeitando
MaxGlobalPositions,MaxPerSymbol - Gerencia: trailing, breakeven, time-stop, cooldown
- Reporta ao backend via
POST /api/executions
Frontend¶
Vanilla JS + Chart.js. Sem build step.
| Página | Stack |
|---|---|
/ (landing) |
HTML + CSS animado |
/resultados |
API public/stats + tabela |
/dashboard |
Chart.js + WebSocket-free polling |
/minha-conta |
4 tabs + KPIs + equity curve + modal regen |
/ops |
Admin dashboard (X-Admin-Secret) |
Latências típicas (produção)¶
| Operação | p50 | p95 |
|---|---|---|
/api/scan |
45ms | 120ms |
/api/account/me |
12ms | 30ms |
/api/account/signals?limit=50 |
28ms | 75ms |
/api/account/executions?days=30 |
35ms | 95ms |
| Worker: predição completa (1 slot) | 180ms | 450ms |
Throughput¶
- Candles ingeridos: ~40 ativos × 4 TFs × ≈1/min = ~160 inserts/min
- Predições geradas: 14 ativos × 4 TFs × 1/bar = 14-100/min (depende do TF)
- API: ~50-200 requests/min (EA polling + frontend)
- EA por assinante: 1 polling/min = 1440 requests/dia/assinante