O MetaTrader 5, através do seu Testador de Estratégias, permite que você obtenha parâmetros estatísticos de um sistema de trading após cada rodada de teste.
Esses parâmetros podem ser acessados utilizando a função TesterStatistics(), que é chamada dentro das funções OnTester() e OnDeinit().
Com a introdução de funções para trabalhar com resultados de otimização (FrameFirst(), FrameFilter(), FrameNext(), FrameInputs() e FrameAdd()), os traders agora conseguem realizar otimizações visuais. Os dados necessários podem ser processados e exibidos durante a otimização do Expert Advisor ou na resolução de problemas matemáticos.
Neste artigo, vamos explorar os detalhes de um exemplo de visualização dos resultados de testes de um Expert Advisor durante a otimização, conforme descrito no artigo "Visualizando uma Estratégia no Testador do MetaTrader 5".
1. Visualização da Dinâmica do Saldo Durante a Otimização
1.1. Baixando os Arquivos
O Expert Advisor Moving Averages_With_Frames.mq5 deve ser copiado para a pasta terminal_data_folder\MQL5\Experts.
Os seguintes arquivos são necessários para o funcionamento do Expert Advisor:
- FrameGenerator.mqh - Classe CFrameGenerator para exibir os resultados da otimização;
- SpecialChart.mqh - Classe CSpecialChart para desenhar vários gráficos de saldo;
- SimpleTable.mqh - Classe CSimpleTable, uma tabela simples com duas colunas;
- ColorProgressBar.mqh - Classe CColorProgressBar para uma barra de progresso com duas cores.
Esses arquivos devem ser copiados para a pasta terminal_data_folder\MQL5\Include.
Programas da Biblioteca de Códigos podem ser baixados automaticamente via o terminal MetaTrader 5 (aba CodeBase na janela "Toolbox"). Para isso, selecione "Baixar". Todos os códigos serão baixados e armazenados em suas respectivas pastas.

Fig. 1. Baixando programas da CodeBase via terminal MetaTrader 5
1.2. Testando o Expert Advisor
O Expert Advisor Moving Averages_With_Frames.mq5 deve ser iniciado no Testador de Estratégias.
Configurações do teste:

Fig. 2. Configurações de teste do Moving Averages_With_Frames.mq5
Opções de otimização:

Fig. 3. Parâmetros de otimização do Moving Averages_With_Frames.mq5
Durante a otimização, o Expert Advisor exibe a dinâmica do saldo e dados estatísticos da rodada de otimização:

Fig. 4. Moving Averages_With_Frames.mq5 otimização
Processo de otimização:
1.3. Princípio de Operação do Expert Advisor
O Expert Advisor Moving Averages_With_Frames.mq5 foi criado com base no Moving Averages.mq5 que está incluído no pacote padrão do terminal MetaTrader 5 (MQL5\Experts\Examples\Moving Average).
O seguinte código foi adicionado para a visualização dos resultados:
//--- conectando o código para trabalhar com resultados de otimização #include <FrameGenerator.mqh> //--- gerador de frames CFrameGenerator fg; //+------------------------------------------------------------------+ //| Função Tester | //+------------------------------------------------------------------+ double OnTester() { //--- insira sua função de cálculo do critério de otimização aqui double TesterCritetia=MathAbs(TesterStatistics(STAT_SHARPE_RATIO)*TesterStatistics(STAT_PROFIT)); TesterCritetia=TesterStatistics(STAT_PROFIT)>0?TesterCritetia:(-TesterCritetia); //--- invocando após cada teste e submetendo o critério de otimização como um parâmetro fg.OnTester(TesterCritetia); //--- return(TesterCritetia); } //+------------------------------------------------------------------+ //| Função TesterInit | //+------------------------------------------------------------------+ void OnTesterInit() { //--- preparando o gráfico para exibir várias linhas de saldo fg.OnTesterInit(3); // parâmetro define o número de linhas de saldo no gráfico } //+------------------------------------------------------------------+ //| Função TesterPass | //+------------------------------------------------------------------+ void OnTesterPass() { //--- manipulando os resultados do teste obtidos e exibindo gráficos fg.OnTesterPass(); } //+------------------------------------------------------------------+ //| Função TesterDeinit | //+------------------------------------------------------------------+ void OnTesterDeinit() { //--- fim da otimização fg.OnTesterDeinit(); } //+------------------------------------------------------------------+ //| Manipulação de eventos do gráfico | //+------------------------------------------------------------------+ void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam) { //--- inicia a exibição de frames após o fim da otimização ao clicar no cabeçalho fg.OnChartEvent(id,lparam,dparam,sparam,100); // 100 é uma pausa em ms entre as capturas } //+------------------------------------------------------------------+
Esse código pode ser usado da mesma forma em qualquer Expert Advisor.
A classe CFrameGenerator é utilizada para trabalhar com resultados de otimização. Ela contém métodos para gerenciar os eventos do Testador de Estratégias (OnTester(), OnTesterInit(), OnTesterPass(), OnTesterDeinit()) e o método para eventos do gráfico (OnChartEvent()). Os objetos gráficos utilizados são preparados no método OnTesterInit() da classe CFrameGenerator.
O método OnTester() da classe CFrameGenerator é invocado em um agente de teste após cada rodada de teste. Esse método fornece o cálculo da dinâmica da curva de saldo com base nos resultados de trading. O gráfico da curva de saldo é um array unidimensional, cuja extensão depende do número de operações realizadas.
Em seguida, a função TesterStatistics() é utilizada para solicitar dados estatísticos (lucro líquido, fator de lucro, fator de recuperação, número de trades, número de operações, porcentagem máxima de drawdown, valor do critério de otimização personalizado) e um frame (array de dados da rodada de teste, neste caso) é gerado e enviado ao terminal (do agente de teste) utilizando a função FrameAdd().
Os frames são recebidos e gerenciados no método OnTesterPass() da classe CFrameGenerator. A operação de leitura dos frames é realizada pela função FrameNext(). A solicitação dos parâmetros de entrada do Expert Advisor, para os quais o frame foi gerado, é realizada utilizando a função FrameInputs().
Após obter os dados, eles são exibidos e atualizados utilizando os métodos das classes CSimpleTable, CColorProgressBar e CSpecialChart.
É importante notar que a execução das funções de manipulação do OnTester() é feita no agente de teste após o término de outra rodada de otimização atual. Isso permite o uso das capacidades da Rede Cloud MQL5 para realizar cálculos matemáticos complexos. Para isso, coloque a parte de cálculo no manipulador de eventos OnTester.
O exemplo de uso da otimização para acelerar cálculos matemáticos (transformação wavelet contínua da função de Weierstrass) é mostrado no tópico "Gerenciando processos de otimização em tempo real e transferindo grandes dados dos agentes para o MetaTrader 5".
2. Exemplos de Trabalho com as Classes CSimpleTable, CColorProgressBar e CSpecialChart
Os scripts Test_SimpleTable.mq5 e Test_CSpecialChart.mq5 anexados contêm exemplos de trabalho com as classes CSimpleTable, CColorProgressBar e CSpecialChart. Eles devem ser copiados para a pasta terminal_data_folder\MQL5\Scripts.

Fig. 5. Resultado da execução do script Test_SimpleTable.mq5

Fig. 6. Resultado da execução do script Test_CSpecialChart.mq5
Publicações relacionadas
- MACD Sample: Um Guia Prático para o Expert Advisor no MetaTrader 5
- Como Criar Sinais de Negociação com MQL5 Wizard Usando Estrelas da Manhã e da Noite + Estocástico
- MQL5 Wizard: Sinais de Negociação com Padrões Candlestick e RSI no MetaTrader 5
- MQL5 Wizard: Sinais de Negociação com Estrelas da Manhã/Noite + RSI para MetaTrader 5
- Como Criar um Expert Advisor com MQL5: Sinais de Negociação Baseados em Harami e RSI