Você está na página 1de 20

MQL5 Site / Otimização Walk Forward em Meta... https://www.mql5.com/pt/articles/3279?

print=

Otimização Walk Forward em MetaTrader 5 feita com suas próprias


mãos
Stanislav Korotky | 19 setembro, 2017

A negociação algorítmica requer não apenas esforços na concepção e programação de robôs, mas
também, no teste e verificação da durabilidade das ideias e algoritmos. MetaTrader 5 fornece um
testador integrado para otimizar EAs em dados históricos. É impossível superestimar seu valor e
ajuda no trabalho. No entanto, o principal desafio consiste na busca de parâmetros que mantenham
sua rentabilidade no futuro, independentemente do período em que se realiza a otimização. Uma das
formas de lidar com este problema é usando o Teste Walk Forward. O testador fornece o modo
embutido apropriado. Será que basta otimizar um Expert Advisor uma vez e testá-lo com sucesso no
seguinte período para ter certeza de sua estabilidade?

O ciclo de operação do EA sugere que as fases de otimização e negociação são repetidas de tempos
em tempos com a frequência escolhida, e o trader aguarda resultados positivos (ou, pelo menos,
sem perdas) durante um longo tempo. Para garantir a eficiência do sistema, é necessário repetir as
etapas do ciclo muitas vezes no testador por meio do uso da otimização e teste passo Forward com
uma mudança constante do período atual, do passado para o futuro virtual.

Este procedimento é chamado de Otimização Walk Forward e é amplamente utilizado por muitos
traders. Infelizmente, o Testador embutido da MetaTrader não permite que ele seja executado com
um simples clique. Em vez disso, é necessário automatizar a inicialização do Testador, usando
ferramentas externas, e juntar os relatórios do Teste Walk Forward. Seria bom ter um recurso para
realizar uma Análise Walk Forward de uma forma mais simples, usando só funcionalidades
MetaTrader e MQL, sem operações de rotina.

Afinal, podemos criar para nós esse recurso sob a forma de uma biblioteca MQL, que, se necessário,
pode ser anexada a qualquer EA com facilidade. A única exigência é possuir algumas habilidades de
programação, uma

Desenho
Antes de descrever os princípios de funcionamento da biblioteca, proporcionaremos algumas noções.

O período durante o qual é realizada a optimização, geralmente é chamado de dados in-sample


(dados na amostra). O seguinte período de teste, dados out-of-sample (dados fora da amostra). Mas,
por uma questão de simplicidade, usaremos os termos janela de otimização (ou simplesmente
janela) e passo do teste (ou simplesmente passo, teste) respectivamente.

A ideia de implementar uma Otimização Walk Forward é simples. No Testador, é necessário


selecionar um período geral de otimização D, muito maior do que a janela de otimização habitual,
mudando a data inicial para o passado, ou seja, para o ponto B. Depois, é necessário permitir que o
EA negocie apenas dentro da janela atual W - de tamanho predefinido - e do passo de teste
subsequente S. Desse modo, vemos o esquema D > W >> S. Por exemplo, D deve incluir uma janela
W e uma dúzia de passos S.

Primeiro, a janela começará no ponto inicial B, em seguida, deverá se mover um passo para a direita,
logo, muitas vezes sucessivamente, até que a borda direita da janela repouse sobre data final do
intervalo geral D.

Os indicadores para a otimização devem ser calculados apenas com base na negociação dentro da
janela W. Consideraremos - e guardaremos para análise posterior - os resultados de negociação no
trecho S. Desse modo, será possível definir os parâmetros ideais para cada janela e, tendo o número
da passagem, obter a referência para os resultados de teste correspondentes.

1 of 20 17/09/2019 15:22
MQL5 Site / Otimização Walk Forward em Meta... https://www.mql5.com/pt/articles/3279?print=

Isto repete inteiramente o passo Forward canônico, com exceção de uma óbvia nuance, isto é, a
negociação em S não começa com o depósito inicial, mas sim com o valor que o EA consegue
ganhar durante o tempo W. Esta particularidade restringe a aplicabilidade da biblioteca apenas a
estratégias com lote fixo. No entanto, a maioria dos traders provavelmente concordaria que a
verificação com lote fixo é o primeiro ponto obrigatório do programa de análise de qualquer Expert
Advisor, mesmo quando se planeja ativar o controle de capital [money management] em fases
posteriores.

Nós podemos realizar a negociação "fragmentada" acima descrita adicionando ao EA parâmetros de


entrada especiais, que definam o tamanho da janela W, passo S e o número do passo que define o
deslocamento da janela dentro do período D, como um número de passos. Por exemplo, quando o
deslocamento é igual 0, a janela começa no ponto de partida B. Quando a janela é igual a 1, ela
começa no momento S e termina no momento S+W. Quando o deslocamento é igual a 2, a janela
começa no ponto 2*S e termina em 2*S+W, e assim por diante. Podemos confiar ao Testador a
procura exaustiva de diferentes deslocamentos através da optimização do respectivo parâmetro.
Assim, organizamos muitas execuções do testador nos trechos que incluem dados in-sample e out-
of-sample, movendo-os no eixo de tempo virtual.

Resta adaptar este mecanismo para funcionar como uma Otimização Walk Forward Sem
Interrupção. Para fazer isto, é necessário garantir que a otimização seja realizada apenas segundo
os resultados de negociação em cada janela W e ignore todos os períodos de teste S subsequentes.
Para isso, nas configurações do testador, é possível selecionar o critério de otimização
personalizado, logo, com base nas transações dentro da janela W atual, calculá-lo na biblioteca e,
em seguida, retorná-lo no testador usando o manipulador de eventos OnTester. Além disso, a
biblioteca deve calcular e armazenar em algum lugar os resultados de negociação para cada período
de teste S subsequente. Após a otimização, para cada janela W com deslocamento de i passos,
teremos muitos conjuntos de parâmetros, entre os quais já estará definido o melhor conjunto. De
acordo com o número desta execução, imediatamente poderemos obter os resultados de negociação
no seguinte trecho de teste S. Combinando-los obteremos um relatório completo sobre o Teste Walk
Forward durante vários ciclos em D.

2 of 20 17/09/2019 15:22
MQL5 Site / Otimização Walk Forward em Meta... https://www.mql5.com/pt/articles/3279?print=

Fig.1 Formação do Teste Walk Forward

Os tamanhos de W e S podem variar segundo o critério do trader. Por exemplo, pode-se selecionar
uma janela de otimização de 3 meses e um passo Forward de 1 mês. Se o período de verificação D
é 12 meses, no testador é necessário examinar exaustivamente os passos S com deslocamento de 0
a 9 (inclusive). 9 obtido por simples cálculo:

N = (D - W) / S = (12 - 3) / 1 = 9 (1)

Em todas as interações, exceto a última, à direita da janela W, estará localizado o passo Forward. No
entanto, quando o deslocamento é 9, a janela W se aproxima em cheio da data final e torna-se
impossível o Teste Walk Forward. Caso a Otimização Walk Forward seja bem-sucedida, os
parâmetros ideais deste último passo viram o conjunto recomendado para negociação online.

O sucesso da Otimização Walk Forward pode ser avaliado de acordo com vários critérios, discutidos
abaixo. Contudo, nós intuitivamente entendemos que os passos combinados do Teste Walk Forward
formam uma curva de saldo, que é caraterizada pelos habituais indicadores de fator de lucro, índice
de Sharpe, retorno esperado, etc.

Enquanto isso, debruçaremos sobre outra pergunta, isto é, qual tamanho deve ser selecionado para
a janela W e passo S . É lógico confiar ao mesmo Testador a busca de valores ideais. De fato, assim
como nós iteramos exaustivamente os passos do Teste Walk Forward com ajuda de um parâmetro
de entrada especial, fornecido pela biblioteca, podemos incluir na lista a ser otimizada os parâmetros
que definem o tamanho da janela e o tamanho do passo.

A execução da Otimização Walk Forward em conjunto com a seleção dos melhores tamanhos de
janela e passo é chamada de Análise Walk Forward Clusterizada.

3 of 20 17/09/2019 15:22
MQL5 Site / Otimização Walk Forward em Meta... https://www.mql5.com/pt/articles/3279?print=

Com a ajuda da biblioteca, e baseados nos resultados de otimização de todos os três parâmetros,
podemos construir um relatório contendo a tabela de rentabilidade do Teste Walk Forward para
diferentes combinações de tamanhos de janela e passo, bem como um relatório detalhado para cada
célula da tabela, em que são apresentados todos os passos sem interrupção dos Testes Walk
Forward, com os valores de W e S respectivos.

Além dos dois modos de utilização descritos, isto é, Análise Walk Forward Clusterizada e Otimização
Walk Forward Sem Interrupção, a biblioteca suporta mais um modo, isto é, o de Otimização Walk
Forward Ancorada. Ele difere do teste sem interrupção (ou sequencial) em que a data inicial da
janela W nunca muda, no entanto, em cada passo, o tamanho da janela aumenta, incluído o período
de teste da iteração anterior. Por exemplo, se continuamos com o exemplo em que o tamanho inicial
de janela é de 3 meses e assumimos que o período geral D começa em janeiro, veremos que, após o
primeiro passo cuja otimização é feita na faixa janeiro-março com teste em abril, o segundo passo
incluirá a otimização para janeiro-abril com teste em maio, o terceiro passo, a otimização na faixa
janeiro-maio com teste em junho, e assim por diante.

Resta só implementar a ideia. Programadores e desenvolvedores de EAs podem criar sozinhos tal
ferramenta. Embora seja grande, é uma tarefa clara. Para aqueles que preferem obter o produto
acabado, já existe uma biblioteca WalkForwardOptimizer (WFO) pronta, para MetaTrader 4 e
MetaTrader 5. Elas diferem em algumas nuances que tornam a versão para MetaTrader 5 mais
atraente. Em particular, nela:

há uma biblioteca concebida como um módulo único que reúne os dados de otimização e
constrói um relatório baseado neles. Na versão para MetaTrader 4, os arquivos são gerados
na pasta tester/Files, desde onde eles devem ser transferidos para a pasta MQL4/Files e, em
seguida, tem de se executar um script separado (todos os links estão anexados no final do
artigo) para construir um relatório sobre sua base;
a maioria das operações manuais rotineiras estão excluídas, como remover arquivos de
preparo antes de iniciar uma nova otimização;
determinam-se automaticamente o nome e valor dos parâmetros de trabalho do EA (no MT4,
estas informações devem ser redirecionadas especificamente através da chamada das
respectivas funções);
suporta-se a otimização em múltiplos fluxos, incluindo o uso de agentes de rede e computação
em nuvem MQL.

Em geral, a versão para MetaTrader 5 é mais eficiente e fácil de usar. Isso é devido à grande
variedade de ferramentas úteis fornecidas pelo MQL5 API do Testador.

Implementação
Pois bem, a interface programática da biblioteca deve fornecer parâmetros de entrada, com os quais
o Testador pode ser configurado em relação à Otimização Walk Forward Sem Interrupção. Eles
são descritos no arquivo de cabeçalho:

input WFO_TIME_PERIOD wfo_windowSize = year;


input int wfo_customWindowSizeDays = 0;
input WFO_TIME_PERIOD wfo_stepSize = quarter;
input int wfo_customStepSizePercent = 0;
input int wfo_stepOffset = 0;
input string wfo_outputFile = "";
input WFO_ESTIMATION_METHOD wfo_estimation = wfo_built_in_loose;
input string wfo_formula = "";

Parâmetros wfo_windowSize e wfo_stepSize permitem definir o tamanho da janela e o passo da


otimização. A enumeração WFO_TIME_PERIOD é usada para configurá-los em unidades padrão:

4 of 20 17/09/2019 15:22
MQL5 Site / Otimização Walk Forward em Meta... https://www.mql5.com/pt/articles/3279?print=

#define DAYS_PER_WEEK 7
#define DAYS_PER_MONTH 30
#define DAYS_PER_QUARTER (DAYS_PER_MONTH*3)
#define DAYS_PER_HALF (DAYS_PER_MONTH*6)
#define DAYS_PER_YEAR (DAYS_PER_MONTH*12)

#define SEC_PER_DAY (60*60*24)


#define SEC_PER_WEEK (SEC_PER_DAY*DAYS_PER_WEEK)
#define SEC_PER_MONTH (SEC_PER_DAY*DAYS_PER_MONTH)
#define SEC_PER_QUARTER (SEC_PER_MONTH*3)
#define SEC_PER_HALF (SEC_PER_MONTH*6)
#define SEC_PER_YEAR (SEC_PER_MONTH*12)

#define CUSTOM_DAYS -1

enum WFO_TIME_PERIOD
{
none = 0,
year = DAYS_PER_YEAR,
halfyear = DAYS_PER_HALF,
quarter = DAYS_PER_QUARTER,
month = DAYS_PER_MONTH,
week = DAYS_PER_WEEK,
day = 1,
custom = CUSTOM_DAYS
};

A unidade básica de medição é o dia. Não são suportados passos pequenos. Mesmo assim, o
próprio Testador permite definir as datas com precisão de um dia. Para aqueles que usam a
Otimização Walk Forward intradia, a seguir, será apresentada uma opção alternativa que funciona
com precisão de barras.

Note que os elementos da semana, mês, trimestre, ano são definidos como constantes (número fixo
de dias). Não ocorre o alinhamento dos períodos de acordo com as bordas de calendário. Isso
permite melhorar a eficiência dos cálculos e, de forma padronizada, transferir uma janela de tamanho
arbitrário sem âncora às bordas das semanas ou meses. Quando o período é "mês" [month], definido
como 30 dias, e a contagem é realizada a partir do início de qualquer mês, é obvio que cada mês
calendar pode vir depois do seguinte antes ou após o "passo mensal" (porque os meses variam em
número de dias). Quando o processo inicia a partir de meados do mês, o passo oincidirá com o meio
dos meses ulteriores, mas, também, como o deslocamento do dia ordinal do mês.

O valor custom, em wfo_windowSize ou wfo_stepSize, permite definir nos seguintes parâmetros -


wfo_customWindowSizeDays e wfo_customStepSizePercent, respectivamente - tamanhos arbitrários
para janela e passo. Como pode ser visto a partir dos nomes de parâmetro, a janela é definida em
dias, e o passo, como uma porcentagem da janela.

É através destes parâmetros que é organizada a busca exaustiva de tamanhos durante a otimização
clusterizada. Os tamanhos devem ser escolhidos de tal modo que a porcentagem mínima (inicial) e
suas alterações, com o incremento predefinido, após serem aplicados à janela mínima, deem número
inteiro de dias. Por exemplo, se a janela muda de 10 para 50 com passo 10, não faz sentido tornar a
passo inferior a 10%, porque isto seria apenas 1 dia da janela mínima. Além disso, para o passo
Forward, não vale a pena tomar um incremento inferior a 10%, porque, por exemplo, se ele fosse
igual a 5% e o tamanho de janela 30, a segunda iteração implicaria um teste num intervalo de 15%
(iniciais 10% mais um passo 5%) a partir de 30, o que daria 4.5. Certamente, tal configuração não
levaria a erros fatais, e a biblioteca continuaria a trabalhar normalmente, no entanto os passos do

5 of 20 17/09/2019 15:22
MQL5 Site / Otimização Walk Forward em Meta... https://www.mql5.com/pt/articles/3279?print=

Teste Walk Forward poderiam não estar precisamente encaixados, o que afetaria a precisão dos
cálculos.

Infelizmente, neste contexto, a biblioteca não pode oferecer ferramentas convenientes para facilitar a
configuração e verificar se é correta. O usuário (em nosso caso, sequer um pouquinho programador)
deve verificar os parâmetros sozinho. Uma organização diferente da biblioteca pode ser uma maneira
de abordar este problema, em particular, o trabalho com precisão de barras pode ser útil. Falaremos
sobre isso mais tarde.

Quando os tamanhos wfo_windowSize e wfo_stepSize são none, a biblioteca é desabilitada.

O parâmetro wfo_stepOffset, após ser incluído na lista a ser otimizada, permite examinar
exaustivamente os passos do Teste Walk Forward. Seu incremento sempre eve ser igual a 1. O valor
máximo é calculado pela fórmula (1), nela é inserido o tamanho máximo da janela W e o tamanho
mínimo da passo S.

O parâmetro Wfo_outputFile define o nome do arquivo .csv, em que será gravado o desempenho
financeiro após cada otimização. O arquivo é criado na pasta MQL5/Files (MT%) ou tester/Files
(MT4).

O parâmetro wfo_estimation define o indicador que será redirecionado para o Testador, a fim de
realizar a otimização. O valor pode ser um da enumeração WFO_ESTIMATION_METHOD:

enum WFO_ESTIMATION_METHOD
{
wfo_built_in_loose,
wfo_built_in_strict,
wfo_profit,
wfo_sharpe,
wfo_pf,
wfo_drawdown,
wfo_profit_by_drawdown,
wfo_profit_trades_by_drawdown,
wfo_average,
wfo_expression
};

wfo_built_in_loose (por padrão) e wfo_built_in_strict são indicadores complexos compostos


pelo índice de Sharpe, o fator de lucro, as margens de lucro e o número de transações;
wfo_profit — lucro;
wfo_sharpe — índice de Sharpe;
wfo_pf — fator de lucro;
wfo_drawdown — rebaixamento relativo invertido (100 - DD), calculado na curva do saldo;
wfo_profit_by_drawdown — lucro dividido pelo rebaixamento relativo;
wfo_profit_trades_by_drawdown — lucro multiplicado pelo número de transações e dividido
pelo rebaixamento relativo;
wfo_average — lucro médio de transação;
wfo_expression — fórmula personalizada do indicador.

Finalmente, o parâmetro wfo_formula é aquela fórmula personalizada para calcular o indicador, se


wfo_estimation é definido como igual a wfo_expression. Para mais detalhes sobre fórmulas
permitidas e outras configurações, acesse o guia do usuário da biblioteca.

Todos os parâmetros têm o prefixo wfo_, assim, eles podem ser facilmente distinguidos dos
parâmetros de trabalho do EA.

Repare que assim que você anexar os arquivos de cabeçalho ao seu EA, nele serão criados os

6 of 20 17/09/2019 15:22
MQL5 Site / Otimização Walk Forward em Meta... https://www.mql5.com/pt/articles/3279?print=

parâmetros de entrada descritos, quer dizer, os meta-parâmetros, uma vez que eles controlam o
processo de otimização.

Também deve-se notar que apenas o cabeçalho declara os tipos e meta-parâmetros necessários.
Para que as informações - definidas por eles - fiquem dentro da biblioteca, é preciso um conjunto de
funções abertas, isto é, a interface programática da biblioteca. Elas também são descritos no
cabeçalho do arquivo na forma de diretivas de importação (doravante é considerada a versão para
MetaTrader 5):

#import "WalkForwardOptimizer.ex5"
void wfo_setEstimationMethod(WFO_ESTIMATION_METHOD estimation, string formula);
void wfo_setPFmax(double max);
void wfo_setCloseTradesOnSeparationLine(bool b);
void wfo_OnTesterPass();
int wfo_OnInit(WFO_TIME_PERIOD optimizeWindow, WFO_TIME_PERIOD optimizeStep, int
int wfo_OnTick();
double wfo_OnTester();
void wfo_OnTesterInit(string optimizeLog);
void wfo_OnTesterDeinit();
#import

Funções com prefixo wfo_set são opcionais. Elas permitem definir o modo de operação, porém se
não forem chamadas, serão utilizados os valores padrão. Funções com prefixo wfo_On são
manipuladores de eventos correspondentes. Eles devem ser adicionados ao código-fonte do Expert
Advisor.

Aqui está um exemplo do código-fonte de um EA com biblioteca embutida. Todos os parâmetros das
funções são tomados diretamente a partir dos meta-parâmetros de entrada.

#include <WalkForwardOptimizer.mqh>

...

int OnInit(void)
{
// seu código de trabalho está aqui
...

// opcional, padrão wfo_built_in_loose


wfo_setEstimationMethod(wfo_estimation, wfo_formula);

// opcional, padrão DBL_MAX


wfo_setPFmax(100);

// opcional, padrão false


// wfo_setCloseTradesOnSeparationLine(true);

// obrigatoriamente, todos os parâmetros do arquivo de cabeçalho


int r = wfo_OnInit(wfo_windowSize, wfo_stepSize, wfo_stepOffset, wfo_customWindowSizeDa

return(r);
}

void OnTesterInit()
{
wfo_OnTesterInit(wfo_outputFile); // obrigatoriamente

7 of 20 17/09/2019 15:22
MQL5 Site / Otimização Walk Forward em Meta... https://www.mql5.com/pt/articles/3279?print=

void OnTesterDeinit()
{
wfo_OnTesterDeinit(); // obrigatoriamente
}

void OnTesterPass()
{
wfo_OnTesterPass(); // obrigatoriamente
}

double OnTester()
{
return wfo_OnTester(); // obrigatoriamente
}

void OnTick(void)
{
int wfo = wfo_OnTick();
if(wfo == -1)
{
// aguardamos quando começa a janela
// não negociamos
return;
}
else if(wfo == +1)
{
// aguardamos o final do teste após a janela e passo Forward
// não negociamos
return;
}

// seu código de trabalho está aqui


...
}

wfo_OnInit envia todos os dados necessários para a biblioteca: tamanho de janela, tamanho de
passo, número de passo, tamanho personalizado de janela em dias, tamanho personalizado de
passo em porcentagem da janela. Ela retorna 0, se for bem-sucedido, ou um código de erro (por
exemplo, INIT_PARAMETERS_INCORRECT), se forem definidos parâmetros inválidos.

wfo_OnTick controla a otimização do EA na janela de otimização e Teste Walk Forward. Ela retorna
0, se o tick atual (ou barra) fica dentro do quadro móvel onde o EA pode operar, bem como -1 ou +1,
se o tick está se encontrar fora da janela e a negociação deve ser desativada temporariamente (-1
indica que a janela ainda não começou, enquanto +1 significa que a janela já passou).

wfo_OnTester calcula e retorna ao testador o indicador de desempenho definido.

wfo_setCloseTradesOnSeparationLine define o modo de fechamento de todas as ordens de mercado


e remoção das ordens pendentes, ao se cruzarem as bordas da janela de otimização com as do
Teste Walk Forward.

Prática
Após compilado o EA com a biblioteca embutida, é possível proceder à configuração do Testador.

Selecionamos um intervalo de datas específico no grupo de campos Intervalo, ele é o mesmo

8 of 20 17/09/2019 15:22
MQL5 Site / Otimização Walk Forward em Meta... https://www.mql5.com/pt/articles/3279?print=

período geral D, descrito acima. Normalmente, a data final é o hoje real ou algo próximo a isso.

No campo Forward, deve ser selecionada a opção Não (não temos interesse nenhum no Teste Walk
Forward embutido).

No campo Execution (Modo de execução) é recomendado Comum, segundo as barras ou pontos


de verificação. Lembre-se que a nosso walk-forward funciona adicionando meta-parâmetros, que
estão incluídos na otimização (para além dos parâmetros operacionais do Expert Advisor) e
aumentam a carga computacional.

No campo Otimização é possível selecionar o modo lento (busca exaustiva) ou rápido (usando
genética), por outro lado, o Critério de otimização precisa ser personalizado.

O uso de algoritmo genético de otimização é permitido, mas é preciso ter em mente algumas
nuances. Algoritmo genético ignora muitas combinações de parâmetros de entrada, incluindo a
combinação de meta-parâmetros, que definem o tamanho da janela, o tamanho da passo Forward e
número da passo, o que pode levar à falta de alguns Testes Walk Forward. Este problema pode ser
perceptível quando a dimensão de busca é imensa (EA com muitos parâmetros de trabalho ou
incrementos), porém, em outros casos, pode ser negligenciado. No relatório gerado, as lacunas são
marcadas, e com base nessas informações, pode-se decidir se é necessário tentar reduzir o espaço
de otimização.

Esse problema geralmente ocorre quando a otimização é clusterizada. As Otimizações Walk Forward
Ancoradas ou Sem Interrupção são menos suscetíveis a ela.

O algoritmo genético pode "estabelecer prioridades" de maneira irregular entre as janelas de


otimização com diferentes deslocamentos, dependendo de sua rentabilidade. Por exemplo, se o
primeiro mês de negociação for mais difícil do que o segundo, o testador, muito provavelmente,
prestará mais atenção ao parâmetro wfo_stepOffset com valor 1, do que com valor 0. Em outras
palavras, a optimização genética - em muitas janelas - dentro do intervalo de datas D não dá
resultados tão bons, como uma optimização genética numa determinada janela W (com a biblioteca
desativada). A única solução para este problema consiste na utilização da busca exaustiva de todos
os parâmetros e meta-parâmetros.

Por outro lado, o passo Forward verifica a estabilidade do algoritmo sobre os dados out-of-sample,
bem como seleciona a melhor profundidade de histórico para a otimização e o passo de re-
otimização (como amiúde encontrar novas configurações). Estas funções são normalmente
realizadas sem encontrar os parâmetros ideais.

Configure os parâmetros operacionais do EA que requer otimização, como de costume. Configuração


de meta-parâmetros depende do modo de Otimização Walk Forward a ser ativado.

Otimização Walk Forward Sem Interrupção em períodos predefinidos

1. Selecione uma janela de otimização da lista usando wfo_WindowSize


2. Selecione o tamanho do passo Forward na lista em wfo_stepSize
3. Ative a otimização para wfo_stepOffset na faixa de 0 a qualquer número de passos que caiba
no histórico disponível, em incrementos de 1.

Otimização Walk Forward Sem Interrupção em períodos arbitrários

1. Selecione custom na lista de parâmetros wfo_WindowSize


2. Insira a quantidade de dias em wfo_customWindowSizeDays
3. Selecione tamanho custom para o parâmetro wfo_stepSize
4. Insira o tamanho em wfo_customStepSizePercent, como uma porcentagem do tamanho da
janela
5. Ative a otimização para wfo_stepOffset na faixa de 0 a qualquer número de passos que caiba
no histórico disponível, em incrementos de 1.

9 of 20 17/09/2019 15:22
MQL5 Site / Otimização Walk Forward em Meta... https://www.mql5.com/pt/articles/3279?print=

Otimização Walk Forward Clusterizada

1. Selecione o tamanho da janela de otimização em wfo_WindowSize como custom.


2. Ative a otimização para wfo_customWindowSizeDays para qualquer intervalo adequado e
incremento em dias.
3. Selecione o tamanho do passo Forward em wfo_stepSize como custom.
4. Ative a otimização para wfo_customStepSizePercent para qualquer intervalo adequado e
incremento em porcentagem do tamanho da janela. (intervalo de valores recomendado 5-30%,
passo 5-10%).
5. Ative a otimização para wfo_stepOffset na faixa de 0 a qualquer número de passos que caiba
no histórico disponível, em incrementos de 1.

Se você já tiver um tamanho preferencial para a janela de otimização, você poderá executar a
análise clusterizada apenas para o passo que está mudado, e se você já tiver selecionado o tamanho
do passo, apenas será possível alterar o tamanho da janela.

Otimização Walk Forward Ancorada

1. Selecione o tamanho da janela de otimização em wfo_WindowSize como custom.


2. Selecione a otimização para wfo_customWindowSizeDays no intervalo desejado. Como o
incremento, selecione uma quantidade de dias igual ao comprimento do período predefinido,
que será definido no seguinte passo (por exemplo, digite um incremento de 30 dias, se você
quiser utilizar a passo "mês").
3. Selecione o tamanho do passo na lista de constantes predefinidas wfo_stepSize, note que a
constante deve ser igual ao incremento, especificado acima para o tamanho da janela.
4. Desative a otimização para wfo_stepOffset e defina 0 como seu valor.

Quando tudo estiver configurado, executaremos a otimização e aguardaremos sua conclusão.


Quando se trabalha com a biblioteca, não se deve suspender e, depois, continuar a otimização,
como é permitido ao fazer a otimização normal. Isso é devido ao fato de a suspensão e continuação
do trabalho do testador não terem eventos de programação correspondentes em MQL5 API, e é por
isso que a cache de dados da biblioteca não se pode sincronizar com a cache do testador. Em outras
palavras, cada pressionamento do botão Start chama a inicialização completa da biblioteca,
independentemente do estado interno do Testador, a biblioteca começa a coletar os dados das
execuções de novo, do zero. Se isso se tratar da reinicialização da otimização que antes estava em
pausa, todos os dados coletados pela biblioteca antes da pausa, serão perdidos. Recomenda-se, em
qualquer caso, limpar a pasta tester/cache antes de iniciar a Otimização Walk Forward.

No processo de otimização, WFO cria variáveis globais especiais (elas são armazenadas no arquivo
com extensão GVF) e um arquivo CSV com dados na pasta MQL5/Files. Posteriormente, com base
nelas, gera-se automaticamente uma página html com a descriptografia dos resultados. Os nomes
dos arquivos GVF e HTML coincidem com o nome do arquivo CSV, definido na biblioteca através do
parâmetro wfo_outputFile.

Pegamos um Expert Advisor simples e, com base em seu modelo, examinamos quais relatórios
podem ser obtidos com ajuda da biblioteca, em diferentes modos. O EA foi gerado pelo assistente
MQL5 com base em dois estratégias de negociação, nomeadamente, Envelopes e WPR. Ele está
disponível no Mercado como um produto gratuito.

Atenção! O Expert Advisor não afirma trazer um superlucro. Ele é um tipo modelo habitual, cuja
tarefa é ser uma cobaia para a biblioteca.

Os experimentos serão realizados no gráfico EURUSD D1. Para começar, tentaremos obter um
relatório simples do walk-forward sem interrupção. Definimos o período geral de teste
2015.01.01-2017.06.01.

10 of 20 17/09/2019 15:22
MQL5 Site / Otimização Walk Forward em Meta... https://www.mql5.com/pt/articles/3279?print=

Fig.2 Configurações do testador

No EA é fornecido o parâmetro EnableWFO, que, por padrão, é false. Neste caso, a biblioteca é
desativada, e o Expert Advisor opera como de costume. Para habilitar a biblioteca, é preciso alterar o
valor do sinalizador para true.

Deixamos o valor padrão em wfo_windowSize, isto é, year, bem como o valor padrão quarter no
parâmetro wfo_stepSize. Isso estabelece que o deslocamento da janela de otimização deve ser de 1
ano com deslocamentos de 1 trimestre, trimestre esse que, por sua vez, envolve um único Teste
Walk Forward. O que dá (2.5 anos - 1 ano) / 3 meses = (30 - 12) / 3 = 6 passos do Teste Walk
Forward.

Definimos o nome do arquivo demo.csv em wfo_outputFile.

Entre os parâmetros operacionais do Expert Advisor, otimizaremos os níveis Stop Loss e Take Profit,
período e desvio do Envelopes, bem como o período do WPR. O conjunto de parâmetros (wfo-demo-
rolling.set) está anexado no final do artigo.

11 of 20 17/09/2019 15:22
MQL5 Site / Otimização Walk Forward em Meta... https://www.mql5.com/pt/articles/3279?print=

Fig.3 Configurações do EA

Após a otimização, obtemos o seguinte relatório demo.html.

12 of 20 17/09/2019 15:22
MQL5 Site / Otimização Walk Forward em Meta... https://www.mql5.com/pt/articles/3279?print=

Fig.4 Relatório walk-forward sem interrupção

Como pode ser visto a partir do relatório, o EA não se porta muito bem nos períodos forward [para
frente]. Mas, partindo da prática científica, é sabido que um resultado negativo é o mesmo resultado
útil.

Agora tentaremos obter o relatório clusterizado e escolher os tamanhos das janelas de otimização e
passo, em que o lucro será estável. Para este fim, nos parâmetros wfo_windowSize e wfo_stepSize
selecionamos a opção custom, em seguida, configuramos wfo_customWindowSizeDays para
otimização de 90 a 180 dias com incremento 30 e wfo_customStepSizePercent - de 10 a 30% com
incremento 10. Obtemos o número máximo de passos em wfo_stepOffset como o quociente entre
(2.5 anos - 90 dias) / (90 dias * 10%) = 810 / 9 = 90. O conjunto de parâmetros (wfo-demo-cluster.set)
está anexado no final do artigo.

Abaixo está um exemplo do relatório resultante ( na próxima seção - Análise - os indicadores são
examinados em mais detalhes).

13 of 20 17/09/2019 15:22
MQL5 Site / Otimização Walk Forward em Meta... https://www.mql5.com/pt/articles/3279?print=

FIg.5 Relatório walk-forward clusterizado

Muitas células da tabela mostram resultados satisfatórios. Indicamos com exatidão, por exemplo, que
está escondido sob uma configuração com uma janela de 120 dias, e em incrementos de 30%. Para
fazer isso, clicamos na célula correspondente e vemos o detalhamento do Teste Walk Forward.

14 of 20 17/09/2019 15:22
MQL5 Site / Otimização Walk Forward em Meta... https://www.mql5.com/pt/articles/3279?print=

Fig.6 Relatório walk-forward sem interrupção detalhado

Embora o resultado seja positivo, a curva do saldo é pouco convincente. Depois de analisar outras
opções, podemos concluir que o EA com os parâmetros selecionados, para otimização, neste
momento, não é suficientemente estável. É preciso ora o ajuste do conjunto de estratégias de
negociação, ora a otimização de outros parâmetros não usados.

De um modo geral, o processo para conduzir o EA a resultados aceitáveis sempre dura muito tempo,
e o uso da tecnologia do walk-forward facilita a tarefa, porque permite descartar rapidamente muitas
variantes de verificação, o que de um modo convencional exigiria muito mais esforço. Por enquanto,
mantem-se inalterada a busca de caminhos para melhorar as características do robô, além disso, em
grande parte permanece dependente da intuição. Aqui o Walk-forward não recomenda nenhuma
maneira de operar. O ideal é implementar o método quando já temos um Expert Advisor mais o
menos lucrativo e é necessário esclarecer se seu desempenho está ajustado e verificado com
suficiente cuidado.

Análise
O relatório gerado contém diferentes tipos de dados, dependendo do modo de trabalho selecionado
para a biblioteca. Durante a análise clusterizada, o relatório começa com várias tabelas contendo
resultados finais para muitas Otimizações Walk Forward Sem Interrupção. Em cada tabela, as
colunas correspondem às dimensões da janela W em dias, enquanto que as linhas, às dimensões do
passo S em porcentagem. Cada célula na tabela é um hiperlink, que, ao ser clicado, desencadeia a
transição para o relatório respectivo de Teste Walk Forward Sem Interrupção. Assim, é possível
especificar como buscar qualquer indicador final.

As seguintes medições são exibidas nas tabelas de análise clusterizado:

15 of 20 17/09/2019 15:22
MQL5 Site / Otimização Walk Forward em Meta... https://www.mql5.com/pt/articles/3279?print=

Lucro anual (annualized profit/loss) — lucro hipotético anual do EA ao recalcular o ganho em


proporção aos períodos de otimização e teste.
Eficiência (efficiency) — proporção do lucro anual, no período de teste e período de
otimização, para a mesma execução.
Estabilidade (consistency) — porcentagem de passagens entre todas as passagens de teste
para o forward "aglutinado".
Completude (completness) — número de passos Forward, feitos para combinações
específicas de tamanho de janela e passo Forward; ele pode ser inferior ao número solicitado
durante a otimização genética, devido à omissão de alguns dos valores dos parâmetros;
número de passos ignoradas é indicado em letras pequenas entre parêntesis.
Número de dias (days in step) — quantidade de dias no passo para cada combinação de
tamanhos de janela e passo, usa-se para conversão - de porcentagem para dias - do tamanho
do passo.

Lucro anual, eficiência e estabilidade são os principais critérios para avaliar o sucesso de um Teste
Walk Forward. Entende-se que quanto maiores eles, melhor. Recomenda-se a ter uma estabilidade
superior a 50%. As melhores variações são destacadas em verde, nas tabelas de análise
clusterizada.

Além disso, faz sentido prestar atenção ao rebaixamento, retorno esperado e desvio padrão do lucro.
Eles estão disponíveis nos relatórios padrão detalhados.

Os relatórios padrão dos testes sem interrupção são não apenas realizados como detalhados para as
variações da análise clusterizada, mas também como resultados da Otimização Walk Forward Sem
Interrupção simples.

Para o Teste Walk Forward Sem Interrupção (padrão) ou Ancorado, o relatório é uma tabela com
todas as execuções do teste, que geraram dado forward unificado. Em cada linha, são exibidos os
resultados de negociação - lucro, fator de lucro, número total de transações e transações lucrativas,
rebaixamento, índice de Sharpe - separadamente para períodos de otimização e teste. Os
indicadores de otimização são destacados em azul, e, no período de teste, em amarelo. Se o último
passo abrange o tempo "atual" (data final do teste), ela é mostrada a verde, indicando que se trata
dos últimos parâmetros conhecidos, e, portanto, apropriados para a negociação "atual". Claro, o
tempo "atual" é realmente atual, apenas se hoje é definido como a data final da otimização.

Nas três primeiras colunas do relatório forward, são exibidos o número de passagem do teste, a data
inicial da janela de otimização (in-sample), a data inicial do período de teste (out-of-sample) e a data
de seu término. Na última coluna do relatório, são mostrados os valores dos parâmetros encontrados
como resultado da otimização dentro da janela. Pode-se obter ajuda sobre os nomes dos parâmetros
movendo o mouse sobre o cabeçalho da coluna.

Ao usar o método de otimização genética, os números das passagens no relatório incorporado não
são mostrados como um número, mas sim como um "número de geração, número de instância", por
isso, estabelecer uma correspondência entre as linhas do relatório incorporado e as linhas da
biblioteca WFO só é possível de acordo com os parâmetros. Não acontece este problema ao usar o
método lento de otimização, e os números das passagens em ambos os relatórios coincidem. Esta é
uma característica da plataforma MetaTrader 5, e não da biblioteca.

Ao clicar duas vezes na linha correspondente do relatório incorporado do testador, o usuário pode
reproduzir a negociação do EA tanto numa determinada janela da Otimização Walk Forward quanto
no passo subsequente do Teste Walk Forward. Observe que qualquer negociação fora desta data
não será realizada. Para ver como negociaria o EA com este conjunto fora da janela, é preciso
desativar a biblioteca ou definir wfo_windowSize como none.

Depois da tabela, é mostrado o gráfico esquemático da curva de saldo.

Aqui está um resumo até agora. Fomos capazes de organizar de forma simplificada uma Otimização

16 of 20 17/09/2019 15:22
MQL5 Site / Otimização Walk Forward em Meta... https://www.mql5.com/pt/articles/3279?print=

Walk Forward diretamente no testador do MetaTrader. Ela funciona e dá resultados interessantes. No


entanto, a configuração dos parâmetros da biblioteca não pode ser considerada como uma questão
trivial. A seleção de meta-parâmetros válidos representa um problema para alguns usuários. Além
disso, há outro problema associado com o desempenho. Como o trabalho da biblioteca é baseado
nos meta-parâmetros adicionais que estão envolvidos na otimização, a dimensão de busca aumenta
significativamente, e, portanto, exige mais recursos computacionais. Será que é possível de alguma
forma facilitar as coisas? É possível, sim. Mas, para isso, teremos que reinventar a roda novamente,
em outras palavras, deveremos rever os princípios de trabalho por trás da biblioteca e implementar
uma biblioteca diferente.

Walk-forward para preguiçosos e ocupados


A nova biblioteca também será integrada no EA, mas não exibirá os parâmetros e não envolverá a
configuração. O EA será executado para optimização no período geral (aumentado) D. A única
diferença entre ele e a otimização convencional é caraterizada pelo período, uma vez que a
otimização normal é realizada pelo usuário na janela W desejada. Durante o processo de otimização
no período D, a nova biblioteca coleta informações sobre todas as transações executadas pelo
Expert Advisor (para diferentes conjuntos de parâmetros). Em outras palavras, para cada passagem
do teste, é gerado um arquivo, onde, em cada barra, são registrados o saldo atual, o lucro flutuante e
o número de posições abertas. Acontece que, após concluir a otimização, com base em seus dados,
é possível construir uma variedade de relatórios walk-forward, semelhantes aos discutidos acima. No
caso do MetaTrader 4, um script separado pode fazer isso, e no caso do MetaTrader 5, a própria
biblioteca.

Nesta biblioteca, também estão disponíveis versões tanto para MetaTrader 4 quanto MetaTrader 5,
mas, para variar, consideraremos aqui a implementação para MetaTrader 4. A documentação
completa juntamente com as nuances entre versões é publicada no blog.

Vamos explicar o princípio de funcionamento de uma biblioteca simplificada.

Quando ela é usada, o testador, de fato, não executa a otimização, como tal, mas examina
exaustivamente várias combinações de parâmetros de entrada. A escolha de conjuntos ideais para
cada janela é realizada durante a criação do relatório. O script identifica a janela in-sample
necessária de W, no período geral D, calcula nela os resultados de desempenho para todas as
passagens do teste (cada passagem é um conjunto de parâmetros separado) e encontra a melhor
opção. Além disso, a partir da mesma passagem, resta calcular os indicadores de desempenho da
negociação no passo subsequente out-of-sample S do teste.

Este algoritmo implementa o walk-forward de maneira incomum. Isto permite conseguir a facilidade
de uso, mas também tem efeitos colaterais. Em particular, quando se utiliza o método genético de
optimização, gera-se algum tipo de ideia preconcebida, devido ao fato de que os conjuntos de
parâmetros a serem verificados são ideais num sentido global (durante todo o período D, e não na
janela W atual). Isto pode ser visto como olhar para o futuro. No entanto, por outro lado, os melhores
parâmetros num sentido global, provavelmente, darão menos lucro do que os parâmetros que podem
ser encontrados numa otimização local na janela W.

Em qualquer caso, este problema não existe durante busca exaustiva lenta de parâmetros.

Também deve-se notar que o EA negocia durante todo o período D, e isso traz consigo duais
consequências.

Primeiro, o saldo pode ser arbitrário, para o início da uma janela W específica. Por analogia com o
WFO, isso significa que uma nova biblioteca só poderá ser aplicável para estratégias com lotes fixos.

Em segundo lugar, algumas posições podem - durante sua existência - ultrapassar a borda inicial ou
final da janela, quer dizer, no início da janela, a posição aberta pode já existir e ter um lucro flutuante,
ou a posição pode estar aberta dentro da janela e ser fechada já no passo de Teste Walk Forward.

17 of 20 17/09/2019 15:22
MQL5 Site / Otimização Walk Forward em Meta... https://www.mql5.com/pt/articles/3279?print=

Esta imprecisão é o custo da simplificação do processo. Com o aumento do número de transações, o


efeito negativo que isto traz é reduzido para um valor insignificante. Por exemplo, ao utilizar uma
conta com compensação, o máximo de uma posição pode distorcer os números no início da janela e
um máximo de uma posição pode fazer isso no final. Se, na janela W, entram 100 transações
duplicadas entrada/saída, o erro médio no cálculo não será superior a 2% do tamanho médio das
transações.

A interface da biblioteca no arquivo de cabeçalho wfL.mqh é muito simples.

#import "wfL.ex4"
int wfl_OnInit(const int cleanUpTimeout);
void wfl_OnTick();
#import

O procedimento de incorporação no código do Expert Advisor é também simplificado


significativamente.

#include <wfL.mqh>

int OnInit()
{
// ... código de trabalho
wfl_OnInit(60);
}

void OnTick()
{
// ... código de trabalho
wfl_OnTick();
}

Imediatamente optimização é realizada usando o mesmo procedimento que o descrito acima, para a
biblioteca do WFO.

O período de otimização deve conter pelo menos 200 barras, mas se recomenda 1 000 ou mais. Isto
é devido ao facto de a divisão do período total em janelas e passos de Teste Walk Forward é levada
a cabo de acordo com as barras, e os conjuntos tanto de valores de tamanho de janela - a serem
examinados - quanto de deslocamentos são predefinidos no código da biblioteca: o tamanho da
janela varia de 10% a 50% em incrementos de 10% (repare que aqui o tamanho da janela é definido
como a porcentagem da faixa total de teste D), enquanto o tamanho do passo S, de 5% a 30% em
incrementos de 5%.

Depois de completar a otimização, na pasta Tester/Files, cria-se uma catálogo assim:

<EA name>-<Symbol>-<Timeframe>-<Date>-<Time>

Nele, encontram-se os arquivos csv com metadados recolhidos pela biblioteca durante cada
passagem do testador. Cada registro no arquivo contém informações sobre uma barra, isto é, data e
hora, saldo, lucro flutuante e número de transações abertas. Com essas informações é possível
calcular o lucro ou perda em qualquer janela dentro do período. Informações sobre transações
individuais não são armazenadas e analisadas.

Tendo movido a pasta selecionada - com todos os arquivos - desde Tester/Files para MQL4/Files,

18 of 20 17/09/2019 15:22
MQL5 Site / Otimização Walk Forward em Meta... https://www.mql5.com/pt/articles/3279?print=

pode-se executar o script de construção do relatório - selecione o nome da pasta, no parâmetro de


entrada. É indicado critério de otimização pelo qual serão selecionados os melhores conjuntos de
parâmetros dentro de janelas específicas. Os critérios disponíveis são os mesmos que na versão
completa da biblioteca do WFO. Como resultado, é obtido um relatório clusterizado com Testes Walk
Forward Sem Interrupção (seu exemplo é mostrado acima).

Todas os pequenos defeitos, mencionados acima, são compensados com o desempenho e facilidade
de uso. Como, neste caso, não há meta-parâmetros, a Otimização Walk Forward não traz despesas
adicionais em comparação com a usual otimização segundo os parâmetros operacionais
selecionados do EA.

Fim do artigo
Bem, examinamos os possíveis princípios de design e implementação da tecnologia walk-forward no
âmbito das ferramentas atualmente disponíveis do Testador embutido nos terminais. As bibliotecas -
prontas para serem usadas - descritas permitem testar abordagens com o mínimo esforço. Por um
lado, a variante resultante do walk-forward difere do canônico em algumas simplificações e restrições
das bibliotecas, porém, por outro lado, elas proporcionam usabilidade e não requerem quaisquer
programas externos. Atualmente, o MetaTrader não tem um recurso embutido para realizar a
Otimização Walk Forward, e estas bibliotecas fornecem uma alternativa aceitável.
Tabela dinâmica de produtos

Produto MT4 MT5

WFO: WalkForwardOptimizer & WalkForwardReporter

WalkForwardOptimizer
Biblioteca

(não é necessário,
WalkForwardReporter
biblioteca MT5 WFO gera
Script
relatórios automaticamente)

WalkForwardDemo
(não)
Expert

WFL: WalkForwardLight & WalkForwardBuilder

WalkForwardLight
Biblioteca

WalkForwardBuilder
Script
(opção)
O clique no ícone leva à página do produto correspondente.

19 of 20 17/09/2019 15:22
MQL5 Site / Otimização Walk Forward em Meta... https://www.mql5.com/pt/articles/3279?print=

Parâmetros para Análise Walk Forward Sem Interrupção do EA de demonstração — wfo-demo-


rolling.set

20 of 20 17/09/2019 15:22

Você também pode gostar