Kaique Mitsuo Silva Yamamoto
Mercado financeiroAutomação de EstratégiasMetaTrader 5 / MQL5

MQL5 — Otimização e Robustez de Estratégias

Walk forward testing, análise de sensibilidade, evitar overfitting, métricas de qualidade e validação estatística de Expert Advisors no Strategy Tester do MetaTrader 5.

MQL5 — Otimização e Robustez de Estratégias

Otimizar um EA para o passado é fácil. O difícil é garantir que ele funcione no futuro. Esta página cobre os métodos profissionais de validação — desde a configuração correta do Strategy Tester até walk forward, análise de sensibilidade e critérios estatísticos mínimos.

Fundamentos: MQL5 — Fundamentos | Backtesting teórico: Backtesting Avançado


Strategy Tester — Configuração Correta

Configurações essenciais

CampoValor recomendadoMotivo
ModelagemEvery tick (real ticks)Maior precisão de execução
DepósitoValor real pretendidoCálculos de margem corretos
AlavancagemIgual à conta realReflete restrições reais
OtimizaçãoAlgoritmo genéticoEficiente para muitos parâmetros
PeríodoMínimo 3-5 anos de dadosCobre múltiplos regimes de mercado

Modos de modelagem comparados

Every tick (real ticks)   → Usa ticks reais da corretora — máxima precisão
Every tick (gerado)       → Ticks gerados a partir de OHLC M1 — precisão alta
1 minute OHLC             → Usa barras M1 — bom para estratégias D1/H4
Open prices only          → Usa apenas abertura das barras — rápido, menos preciso

Atenção: backtests com "Open prices only" podem mascarar spreads e slippage. Sempre confirme com "Every tick" antes de ir a real.


Walk Forward Testing (WFT)

O método mais confiável para validar robustez. Divide o histórico em janelas e repete o ciclo: otimizar → validar out-of-sample → avançar.

Como configurar no MetaTrader 5

  1. Abra o Strategy Tester (Ctrl+R)
  2. Selecione seu EA e o símbolo
  3. Ative Optimization → escolha os parâmetros a otimizar
  4. Ative Forward (botão ao lado de "Optimization")
  5. Configure a proporção (ex: 70% in-sample / 30% out-of-sample)
  6. Execute e compare os resultados in-sample vs forward

Interpretação

ResultadoSignificado
Resultados similares nos dois períodosEstratégia robusta, baixo overfitting
In-sample excelente, forward fracoOverfitting confirmado
Forward melhor que in-sampleInconsistência — revisar lógica

WFT manual (múltiplas janelas)

Período total: 2020–2025 (5 anos)

Janela 1: Otimizar 2020–2022 → Validar 2023
Janela 2: Otimizar 2021–2023 → Validar 2024
Janela 3: Otimizar 2022–2024 → Validar 2025

Eficiência WFT = média(forward) / média(in-sample)
Alvo: eficiência > 0.5 (forward ≥ 50% do in-sample)

Métricas de Qualidade

Métricas primárias

// Profit Factor = lucro bruto / perda bruta
// Alvo: > 1.5 (idealmente > 2.0)
// Abaixo de 1.3 = estratégia fraca

// Sharpe Ratio anualizado
// Alvo: > 1.0 (idealmente > 1.5)
// Calcula-se: retorno médio / desvio padrão dos retornos × √(252)

// Drawdown máximo
// Alvo: < 20% (prop firms geralmente limitam a 8-10%)
// Importante: medir tanto em % quanto em valor absoluto

// Recovery Factor = lucro líquido / drawdown máximo
// Alvo: > 3.0

// Expected Payoff = lucro líquido / total de trades
// Deve ser positivo após custos (spread + comissão)

Métricas secundárias

// Win Rate (taxa de acerto)
// Não é isoladamente relevante — 30% de acerto com RR 1:3 é bom
// Calcular sempre em conjunto com o payoff médio

// Consistência mensal
// Calcular % de meses positivos — alvo: > 70%

// Maior perda consecutiva
// Quantas perdas seguidas o sistema pode ter?
// Dimensionar capital para suportar 2x o pior cenário histórico

Análise de Sensibilidade de Parâmetros

Um EA robusto não depende de parâmetros precisos. Pequenas variações não devem colapsar o desempenho.

Teste de perturbação de parâmetros

Parâmetro otimizado: FastMA = 10, SlowMA = 20

Teste de sensibilidade:
FastMA = 8,9,10,11,12 × SlowMA = 18,19,20,21,22

Se apenas FastMA=10/SlowMA=20 funciona → overfitting
Se a "ilha" de bons resultados é ampla → robustez

Como analisar no Strategy Tester

  1. Execute a otimização com range de parâmetros (ex: FastMA de 5 a 20)
  2. Vá em Optimization Results
  3. Clique em 2D Surface para visualizar o mapa de calor
  4. Procure platôs (regiões amplas de bom desempenho), não picos isolados

Evitar Overfitting — Checklist

  • Mínimo de 200-300 trades no backtest (significância estatística)
  • Testar em múltiplos símbolos semelhantes (ex: EURUSD + GBPUSD)
  • Testar em diferentes timeframes próximos (M15 + M30)
  • Parâmetros "óbvios" (ex: MA 20, RSI 14) têm mais chance de generalizar
  • Walk forward com eficiência > 0.5
  • Resultados similares em conta demo vs backtest
  • Sem filtros de data (ex: "não operar em 2020") — isso é data snooping
  • Máximo de 5-7 parâmetros otimizados (mais que isso → overfitting provável)

Código: Coletar estatísticas de performance em tempo real

struct TradeStats
{
    int    totalTrades;
    int    wins;
    int    losses;
    double grossProfit;
    double grossLoss;
    double maxDrawdown;
    double peakEquity;

    double WinRate()     { return totalTrades > 0 ? (double)wins / totalTrades * 100 : 0; }
    double ProfitFactor(){ return grossLoss != 0  ? grossProfit / MathAbs(grossLoss) : 0; }

    void Update(double profit)
    {
        totalTrades++;
        if(profit > 0) { wins++; grossProfit += profit; }
        else           { losses++; grossLoss += profit; }

        double equity = AccountInfoDouble(ACCOUNT_EQUITY);
        if(equity > peakEquity) peakEquity = equity;

        double dd = (peakEquity - equity) / peakEquity * 100;
        if(dd > maxDrawdown) maxDrawdown = dd;
    }

    void Print()
    {
        ::Print("=== ESTATÍSTICAS ===");
        ::PrintFormat("Trades: %d | Win Rate: %.1f%%", totalTrades, WinRate());
        ::PrintFormat("Profit Factor: %.2f", ProfitFactor());
        ::PrintFormat("Max Drawdown: %.2f%%", maxDrawdown);
    }
};

TradeStats g_stats;

void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &req,
                        const MqlTradeResult &res)
{
    if(trans.type == TRADE_TRANSACTION_DEAL_ADD)
    {
        if(HistoryDealSelect(trans.deal))
        {
            ENUM_DEAL_ENTRY entry = (ENUM_DEAL_ENTRY)HistoryDealGetInteger(trans.deal, DEAL_ENTRY);
            if(entry == DEAL_ENTRY_OUT || entry == DEAL_ENTRY_INOUT)
            {
                double profit = HistoryDealGetDouble(trans.deal, DEAL_PROFIT);
                g_stats.Update(profit);
            }
        }
    }
}

Monte Carlo no Strategy Tester

O MT5 suporta simulação Monte Carlo nativa:

  1. Após rodar o backtest, vá em Settings no resultado
  2. Ative Monte Carlo e defina o número de simulações (ex: 1000)
  3. Analise os percentis de drawdown e retorno

O Monte Carlo embaralha a sequência de trades para estimar a distribuição de possíveis resultados. Se o percentil 95% de drawdown ainda está dentro do seu limite de risco → estratégia robusta.


Validação em conta Demo antes do real

EtapaDuração mínimaO que avaliar
Backtest com ticks reaisProfit Factor, Drawdown, Win Rate
Walk ForwardEficiência WFT > 0.5
Demo com parâmetros idênticos1-3 mesesComparar vs backtest (slippage real, spread)
Real com lote mínimo1-3 mesesComportamento emocional e execução
Escala gradualAumentar lote após 3 meses consecutivos positivos

Referências

Referências externas

On this page