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.

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.

Formação do Teste Walk Forward

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.

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:

#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 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 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 optimizeStepOffset, int optimizeCustomW, int optimizeCustomS);
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_customWindowSizeDays, wfo_customStepSizePercent);
  
  return(r);
}

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

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 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.

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.

Configurações do testador

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.

Configurações do EA

Fig.3 Configurações do EA

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

Relatório walk-forward sem interrupção

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).

Relatório walk-forward clusterizado

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.

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

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:

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 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. 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, 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
https://www.mql5.com/pt/market/product/17683 https://www.mql5.com/pt/market/product/23068
WalkForwardReporter
Script
https://www.mql5.com/pt/market/product/17750 (não é necessário,
biblioteca MT5 WFO gera relatórios automaticamente)
WalkForwardDemo
Expert
(não) https://www.mql5.com/pt/market/product/23069

WFL: WalkForwardLight & WalkForwardBuilder

WalkForwardLight
Biblioteca
https://www.mql5.com/pt/market/product/23223 https://www.mql5.com/pt/market/product/23224
WalkForwardBuilder
Script
https://www.mql5.com/pt/market/product/23225 https://www.mql5.com/pt/market/product/23226
(opção)

O clique no ícone leva à página do produto correspondente.


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