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
| Campo | Valor recomendado | Motivo |
|---|---|---|
| Modelagem | Every tick (real ticks) | Maior precisão de execução |
| Depósito | Valor real pretendido | Cálculos de margem corretos |
| Alavancagem | Igual à conta real | Reflete restrições reais |
| Otimização | Algoritmo genético | Eficiente para muitos parâmetros |
| Período | Mínimo 3-5 anos de dados | Cobre 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 precisoAtençã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
- Abra o Strategy Tester (Ctrl+R)
- Selecione seu EA e o símbolo
- Ative Optimization → escolha os parâmetros a otimizar
- Ative Forward (botão ao lado de "Optimization")
- Configure a proporção (ex: 70% in-sample / 30% out-of-sample)
- Execute e compare os resultados in-sample vs forward
Interpretação
| Resultado | Significado |
|---|---|
| Resultados similares nos dois períodos | Estratégia robusta, baixo overfitting |
| In-sample excelente, forward fraco | Overfitting confirmado |
| Forward melhor que in-sample | Inconsistê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óricoAná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 → robustezComo analisar no Strategy Tester
- Execute a otimização com range de parâmetros (ex: FastMA de 5 a 20)
- Vá em Optimization Results
- Clique em 2D Surface para visualizar o mapa de calor
- 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:
- Após rodar o backtest, vá em Settings no resultado
- Ative Monte Carlo e defina o número de simulações (ex: 1000)
- 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
| Etapa | Duração mínima | O que avaliar |
|---|---|---|
| Backtest com ticks reais | — | Profit Factor, Drawdown, Win Rate |
| Walk Forward | — | Eficiência WFT > 0.5 |
| Demo com parâmetros idênticos | 1-3 meses | Comparar vs backtest (slippage real, spread) |
| Real com lote mínimo | 1-3 meses | Comportamento emocional e execução |
| Escala gradual | — | Aumentar lote após 3 meses consecutivos positivos |
Referências
- Backtesting Avançado: CSCV, PBO e DSR
- MQL5 — Fundamentos
- MQL5 — Gestão de Risco
- MQL5 — Integração Externa
- Sharpe Ratio — conceito
- Drawdown — conceito
Referências externas
- MQL5: Strategy Tester — documentação oficial
- Artigo: Walk Forward Analysis in MetaTrader 5
- Artigo: Avoiding Overfitting in Trading Systems
- Artigo: Monte Carlo Simulation for EAs
- Artigo: Statistical Analysis of EA Performance
- Bailey et al. — The Deflated Sharpe Ratio (paper)
- Pardo, R. — The Evaluation and Optimization of Trading Strategies (livro)
MQL5 — Análise Multi-Timeframe (MTF)
Como ler e combinar dados de múltiplos timeframes em MQL5: CopyRates, CopyBuffer com timeframe externo, sincronização de barras e padrões MTF em Expert Advisors.
MQL5 — Integração Externa e Recursos Avançados
WebRequest, integração com Python via sockets, ONNX (machine learning), banco de dados SQLite, OnTimer e serviços em MQL5.