Pular para conteúdo

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 .ex5 aplicada 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çou
  • g_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