Expert Advisor — Design¶
ea/ML_Sensorial_Scanner.mq5 (v2.27, 1852 linhas)
Princípio: EA único multi-símbolo¶
Diferente do modelo "1 EA por gráfico", o nosso é um único EA em qualquer gráfico que escaneia todos os ativos via API.
Vantagens:
- Cliente abre 1 instância só
- Risk management global (não fragmentado por símbolo)
- Telemetria centralizada (heartbeat único por chave)
- Atualização do
.ex5aplicada imediatamente a todos
Trade-off: se o gráfico host travar, todos os símbolos param. Mitigado por watchdog interno (re-init se ticks param).
Loop principal¶
flowchart TB
Tick[OnTick] --> Cooldown{Cooldown<br/>ativo?}
Cooldown -->|sim| Skip[skip]
Cooldown -->|não| Fetch[Fetch /api/scan<br/>via WebRequest]
Fetch --> Filter[Filtra: confiança, RR,<br/>session_ok, plan_tier]
Filter --> ManageOpen[ManageAllPositions]
ManageOpen --> Trail[Trailing stop]
Trail --> BE[Breakeven check]
BE --> TS[Time-Stop check]
TS --> Clean[CleanClosedPositions]
Filter --> OpenNew{Slot livre?}
OpenNew -->|sim| Open[OpenPosition]
OpenNew -->|não| Done[next tick]
Open -->|POST /api/executions| Report[Report ao backend]
Clean -->|POST /api/executions| Report
Parâmetros input (v2.27)¶
// Conexão
InpApiUrl = "https://api.quantfx.com.br"
InpApiKey = "uuid-do-assinante"
// Filtros de sinal
InpMinConfidence = 0.52 // fallback (regime-dependent prevalece)
InpMinExpectedRR = 1.8
// Risk management
InpRiskPct = 1.0 // % do balance por operação
InpMaxDDPct = 2.0 // máx drawdown diário antes de pausar
InpMaxGlobalPositions = 5 // posições simultâneas no total
InpMaxPerSymbol = 1 // máx por símbolo
// Trailing
InpTrailingStartR = 0.7 // R-multiple para ativar trailing
InpTrailingDistAtr = 0.5 // dist trailing em ATRs
InpBreakevenR = 0.5 // breakeven a 0.5R
// Posicionamento
InpAtrMult = 1.0 // SL = 1.0 × ATR (alinhado com labels.atr_stop)
InpAtrTpMult = 1.5 // TP = 1.5 × ATR (alinhado com labels.atr_take)
// Cooldown
InpReentryCooldownMin = 30 // minutos pós-perda
// Time-Stop (v2.27)
InpTimeStop = true
InpMaxHoldBarsH4 = 6 // 1.5× horizon H4
InpMaxHoldBarsH1 = 12 // 1.5× horizon H1
InpMaxHoldBarsM15 = 12 // 1.5× horizon M15
InpMaxHoldBarsM5 = 18 // 1.5× horizon M5
Estruturas internas¶
g_positions[MAX_POS] — array de 100 slots¶
Cada slot guarda metadata da posição:
struct PositionInfo {
ulong ticket;
string symbol;
ENUM_TIMEFRAMES tf;
ENUM_ORDER_TYPE type;
double entry, stop, take;
double atr;
datetime opened_at;
bool trailingActive;
bool beActive;
bool tsclosed; // marcado pelo time-stop
}
Side arrays paralelos (v2.27)¶
Para evitar reentrância e perda de info ao fechar:
g_tsclosed[i]— flag se foi time-stop (vira "TIMEOUT" em reports)g_trailingStarted[i]— quando trailing começoug_pred_id[i]— pred_id retornado pela API ao abrir
Time-Stop (novidade v2.27)¶
void ManageTimeStopForTicket(int idx) {
int max_bars = GetMaxHoldBars(g_positions[idx].tf);
int bars_elapsed = iBarShift(g_positions[idx].symbol,
g_positions[idx].tf,
g_positions[idx].opened_at);
if (bars_elapsed >= max_bars) {
ClosePosition(idx);
g_tsclosed[idx] = true; // marca para reportar como TIMEOUT
}
}
Motivação: Modelos foram treinados com horizon X. Se a operação não resolveu em ~1.5×X, a tese provavelmente é decay. Fechar protege capital antes do mercado reverter (caso clássico antes de v2.27: SLs sistemáticos após horas de operação).
Sinais silenciosos detectados¶
EA v2.27 detecta 3 cenários onde estaria silenciosamente quebrado:
| Cenário | Detecção | Ação |
|---|---|---|
| AutoTrading desligado | MQLInfoInteger(MQL_TRADE_ALLOWED) == 0 |
Alerta no chart + log |
| WebRequest bloqueado | last_http_status == -1 |
Alerta com instrução exata |
| Candle stale (corretora) | last_tick > 10 min |
Pausa abertura, só gerencia |
Dashboard no chart¶
Canto superior direito:
QuantFX v2.27 🟢 Online · last: 12s
14 símbolos · 4 TF
3 posições · DD: 0.42%
EURUSD H1 BUY 67% (held 2.3h)
GBPUSD H4 SELL 58% (held 4.1h)
XAUUSD H1 BUY 72% (held 0.8h)
Reporting¶
Cada abertura/fechamento de posição → POST /api/executions:
{
"pred_id": 12345,
"ticket": 987654321,
"symbol": "EURUSD",
"timeframe": "H1",
"signal": "BUY",
"confidence": 0.67,
"opened_at": "2026-05-27T10:23:00Z",
"closed_at": "2026-05-27T12:45:00Z",
"entry_price": 1.0823,
"exit_price": 1.0851,
"pnl": 12.45,
"result": "TP" // TP | SL | TIMEOUT | MANUAL
}
Backend grava em executions com api_key_id automaticamente vindo da auth — feeds o /api/account/executions do assinante.
Versões — histórico¶
| Versão | Mudança principal |
|---|---|
| v2.25 | RR mínimo 1.8 + breakeven |
| v2.26 | Cooldown 60min, MinConfidence 0.60 |
| v2.27 | 8 parâmetros alinhados, time-stop, MinConfidence 0.52, cooldown 30min |