Teste de Visualização: Melhoria de funcionalidade
1. Motivação
A partir da versão 196, o terminal do cliente MetaTrader 4 oferece a função de visualização de testes. Ela permite levar o controle dos testes do expert advisor a um novo nível. Agora, o programador de negociações pode examinar cada ação do seu expert advisor através da verificação da operação deste no histórico!
Você pode ler sobre como usar o visualizador no artigo chamado Teste de expert advisors no terminal do cliente MetaTrader 4: Um olhar para fora. Nosso artigo descreve como tornar o provador de estratégias altamente semelhante ao terminal.
Então, qual é a particularidade principal do provador? O que está ausente na visualização? A ausência mais importante é, talvez, a da aba "transação".
Quantas posições foram abertas? Quando o pedido pendente será ativado? O StopLoss da posição se moveu? Qual é o valor da margem no momento e qual é a distância até o nível de MarginCall? Nós encontraremos respostas a estas e muitas outras perguntas na aba "transação" do terminal. Mas o que podemos fazer ao realizar testes?
O presente artigo trata da solução a este problema.
2. Aspectos técnicos
Começaremos a criação do código com a definição do problema, como sempre. Que resultado queremos obter?
- Como foi dito anteriormente, nós precisamos realizar algo análogo à aba "negociação", ou seja, visualizar informações sobre todas as posições abertas e pedidos pendentes.
- As informações devem estar sempre atualizadas e serem facilmente legíveis.
- O programa deve ser bastante fácil de usar: a sua conexão ao expert advisor não deve exigir muito esforço.
Agora vamos discutir aspectos técnicos. Como o programa será formado: como um indicador ou como uma biblioteca de função externa?
É óbvio que formar um indicador em uma janela separada poderia ser a melhor solução. Ele estaria sempre visível, não bloquearia o gráfico de preços e seria atualizado em cada tick. Mas nós nos deparamos com um novo problema ao usar um indicador: ele obtém todos os seus dados sobre pedidos do terminal normal, e não do terminal 'virtual' (de teste), ou seja, durante testes, ele exibiria informações sobre o estado atual da conta, sem reagir ao teste em si.
Então nós precisamos encontrar uma alternativa, um tipo de porta de entrada, para resolver o nosso problema.
Nós ainda vamos criar um indicador, mas ele irá cumprir apenas a função de um "criador de sub-janelas de gráfico". Ele não exibirá nada, ou seja, nós sempre teremos uma parte 'reservada' do gráfico. Isso é necessário para que a sub-janela criada possa ser salva sob um nome único no modelo tester.tpl ou no modelo <nome_do_expert>.tpl.
A exibição e a atualização de informações será atribuída a uma biblioteca de funções formada no arquivo incluso.
3. Colocação em uso
Primeiramente, um modelo de gráfico deve ser criado, e ele usará o visualizador. Simplesmente ajuste o gráfico (cores, grade, escala), anexe o arquivo vTerminal.mq4 ao gráfico e use o comando "salvar modelo":
Para fins de visualização, o modelo chamado tester.tpl ou <nome_do_expert>.tpl será usado. É o nome que deve ser usado ao salvar o modelo.
4. Integração com o expert advisor
Funções que exibem informações sobre posições são salvas no arquivo incluso chamado VisualTestingTools.mq4, localizado no diretório ...\MetaTrader 4\experts\include\. Primeiramente, ele precisa estar anexo ao expert advisor: insira a linha #include <VisualTestingTools.mq4> antes da função "start" (iniciar). Ele então terá a seguinte aparência (exemplo do CrossMACD_DeLuxe):
... double _Commission = 0.0; string _Comment = ""; datetime _Expiration = -1; #include <VisualTestingTools.mq4> int start() { if ( FastEMAPeriod >= SlowEMAPeriod ) { return(-1); } int _GetLastError = 0; ...
Agora nós podemos usar as funções em qualquer parte do programa. Chame uma delas - vTerminalInit() - será colocada na função init() do expert advisor, pois ela só precisa ser chamada uma vez, dado que a sua função é criar objetos para exibir informações. Uma outra - vTerminalRefresh() - deve ser chamada a cada tick. Ela atualizará informações sobre posições abertas. O código do EA que usa as funções terá a seguinte aparência:
... double _Commission = 0.0; string _Comment = ""; datetime _Expiration = -1; #include <VisualTestingTools.mq4> int init() { if ( FastEMAPeriod >= SlowEMAPeriod ) { return(-1); } vTerminalInit(); return(0); } int start() { if ( FastEMAPeriod >= SlowEMAPeriod ) { return(-1); } vTerminalRefresh(); int _GetLastError = 0; ...
Você pode baixar o arquivo CrossMACD_DeLuxe_Visual.mq4 do expert advisor, ao qual todas as alterações necessárias já foram feitas.
5. Testando
Agora, vamos ver o que temos.
Primeiro, novas variáveis externas foram adicionadas ao expert advisor:
O seu destino é intuitivo, mas eu gostaria de oferecer mais detalhes em relação a elas:
- Fileiras - a quantidade máxima de linhas mostradas na exibição. Para a maior parte das estratégias, 10 linhas bastarão;
- BigText (texto grande) - utilize caso queira aumentar as fontes;
- SignalPoints (pontos de sinal) - distância em pontos, começando a partir dos campos nos quais Stop Loss, Take Profit e Open Price de pedidos pendentes estarão destacados. Por exemplo, se SignalPoints = 10, então a cor do campo Stop Loss mudará quando o preço estiver a 10 pontos do Stop Loss da posição;
- MainColor (cor principal) - cor da rubrica do terminal e da barra informando sobre a conta (balanço, equidade, ...).
- BuyColor (cor de compra) - cor das informações da posição de compra;
- BuyOPColor - cor do campo Open Price, que irá substituir a cor principal quando o preço atual se aproximar do nível de Open de Buy Stop e Buy Limit;
- BuySLColor - cor que irá substituir a cor principal quando o preço se aproximar do nível de Stop Loss de posições de compra;
- BuyTPColor - cor que irá substituir a cor principal quando o preço se aproximar do nível de Take Profit de posições de compra.
- SellOPColor, SellSLColor e SellTPColor - o mesmo em relação a posições de venda.
Vamos configurar MainColor como "preto" e pressionar OK. O expert está pronto para testes agora. Antes de pressionar o botão "iniciar", verifique a "visualização" e veja os resultados:
Até não haver posições abertas, o nosso "terminal" exibe apenas a rubrica e a barra de status da conta. Vamos esperar até que um sinal apareça e o expert abra uma posição.
Uma posição de venda é aberta como sendo a primeira. Como você pode ver, a linha está vermelha.
Por favor, dirija a sua atenção à barra de status da conta. Ela contém tudo o que costumávamos ver na aba "transação" do terminal. Todas as informações são atualizadas a cada tick, então você pode ver as mudanças no lucro da posição.
Quando o preço se aproxima do nível de Stop Loss da posição, a cor do campo StopLoss muda para aquela predefinida pelo usuário:
Na minha opinião, é muito bom.
6. Problemas possíveis
Um outro recurso do uso do tester.tpl com o indicador vTerminal deve ser mencionado: Durante os testes, a função que deve encontrar a janela do indicador (WindowFind()) é desativada. É por isso que o número da sub-janela é configurado explicitamente no código:
win = WindowFind( "vTerminal" ); if ( IsTesting() ) { win = 1; }
Caso o modelo contenha outros indicadores a serem desenhados em uma janela separada, todas as informações sobre eles serão exibidas na janela superior. ou seja, você precisa colocar o vTerminal por cima, ou escrever win = número da sub-janela; ao invés de win = 1; .
Nenhum outro problema foi encontrado no trabalho com o indicador.
7. Conclusão
Para chegar a uma bela conclusão, eu gostaria de mostrar algumas capturas de tela.
Traduzido do russo pela MetaQuotes Ltd.
Artigo original: https://www.mql5.com/ru/articles/1420
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso