English Русский 中文 Español Deutsch 日本語
Pontos de interrupção no verificador: É possível!

Pontos de interrupção no verificador: É possível!

MetaTrader 4Exemplos | 19 fevereiro 2016, 12:20
844 0
Christo Tsvetanov
Christo Tsvetanov

Introdução

A única coisa que eu sinto falta no MQL4 é um depurador normal para Expert Advisors. Todos os seres humanos têm sentimentos, sendo assim, cometemos erros. Na programação normal, definimos pontos de interrupção, o lançamento do programa e, em seguida, quando a execução atinge um ponto de interrupção, é interrompida. Assim, podemos ver o conteúdo das variáveis.

Agora, resultados de depuração de dados são possíveis devido a funções como impressão, comentário, etc. Mas, algumas vezes, quereremos parar o programa temporariamente em determinados locais, em determinado momento, a fim de avaliar a situação. Há alguns pontos delicados aqui. O programa geralmente é lançado para o comércio em uma conta demo ou em uma conta real. Isto significa que só será possível ver os resultados após vários meses ... Assim, o modo de depuração é razoável apenas no modo de teste do Expert Advisors (no verificador).


Como funciona

Uma vez que um "Modo de Teste Visual" aparece no verificador, torna-se possível controlar as respostas do EA durante a passagem rápida do programa no verificador. Se queremos parar a execução temporariamente, podemos pressionar "Pause" no teclado ou clicar com o botão do mouse sobre o botão de mesmo nome na barra de ferramentas do verificador. Os desenvolvedores do terminal fornecem uma biblioteca chamada WinUser32.mqh que contém algumas funções muito interessantes. Uma delas é keybd_event. Ela nos permite pressionar qualquer tecla que queremos.

A ideia foi lançada - podemos escrever uma função que vai pressionar pausa programaticamente e imprimir as informações de depuração necessárias. Já que o nosso Expert Advisor usará DLL, devemos primeiro habilitá-lo para EA. Pressione Ctrl + O e marque/desmarque caixas de seleção:


Devemos declarar a utilização de WinUser32 em algum lugar no início do código:
#include <WinUser32.mqh>

Essa ação é seguida pela declaração da função de ponto de interrupção. Há alguns pontos mais delicados aqui, mas a execução mais simples não aprova/reprova parâmetros:
void BreakPoint()

A função deve acionar somente no modo de teste visual, por isso vamos inserir uma verificação: Se o verificador não estiver no modo de teste visual, deixamos:

if (!IsVisualMode()) return(0);

Então, vamos visualizar alguns dados. Na minha opinião, o mais descritivo seria usar Comentário(). Suponha que precisamos apenas Pedir e Perguntar.

string Comm="";
Comm=Comm+"Bid="+Bid+"\n";
Comm=Comm+"Ask="+Ask+"\n";
   
Comment(Comm);

O "\ n" aqui significa que os dados seguintes depois serão mostrados na próxima string. Finalmente, vamos pressionar Pause.

keybd_event(19,0,0,0);
Sleep(10);
keybd_event(19,0,2,0);

A primeira string pressiona a tecla e a última solta. O botão de suspensão também é necessário, uma vez que um pressionar/soltar pode ser muito rápido e permanecer inalterado. 19 é um código virtual de pausa, 2 na última string mostra que a liberação deve ser emulada.

Tudo o que temos que fazer agora é substituir o ponto de interrupção no código do Expert Advisor, dizer imediatamente após a longa posição do exemplo do artigo Expert Advisor Sample estiver aberta.
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green);
BreakPoint();

Abaixo está o código inteiro para ser inserido:

//We will use a function, described in header file
#include 
 
//Breakpoint neither receive nor send back any parameters
void BreakPoint()
{
   //It is expecting, that this function should work
   //only in tester
   if (!IsVisualMode()) return(0);
   
   //Preparing a data for printing
   //Comment() function is used as 
   //it give quite clear visualisation
   string Comm="";
   Comm=Comm+"Bid="+Bid+"\n";
   Comm=Comm+"Ask="+Ask+"\n";
   
   Comment(Comm);
   
   //Press/release Pause button
   //19 is a Virtual Key code of "Pause" button
   //Sleep() is needed, because of the probability
   //to misprocess too quick pressing/releasing
   //of the button
   keybd_event(19,0,0,0);
   Sleep(10);
   keybd_event(19,0,2,0);
}


O que devemos fazer para assistir variáveis locais?

O problema está na "invisibilidade" de tais variáveis fora de suas declarações. Neste caso, os dados devem ser transmitidos. Suponha que queremos assistir a variável MacdCurrent do mesmo artigo. Para isso, vamos modificar a função da seguinte forma:

void BreakPoint(double MacdCurrent)
{
   if (!IsVisualMode()) return(0);
   
   Comment("MacdCurrent = ",MacdCurrent);


Pontos de interrupção opcionais

Algumas vezes, queremos que o programa não pare sempre que atingir uma sequência específica, mas apenas quando forem cumpridas algumas exigências adicionais. Isso geralmente acontece em ciclos. Por exemplo, queremos interromper a execução quando a contagem chegar a um certo valor predefinido. Para isso, temos que passar um requisito adicional:

void BreakPoint(double MacdCurrent, bool Condition)
{
   if (!IsVisualMode() || (!Condition)) return(0);
   //Or - which is the same:
   //if (!(IsVisualMode()&&Condition)) return(0);
   
   Comment("MacdCurrent = ",MacdCurrent);

Vamos chamá-lo da seguinte forma:

   for(cnt=0;cnt<total;cnt++)     
   {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      BreakPoint(MacdCurrent, cnt==1);


Conclusão

Então, por que nós não apenas criamos uma biblioteca para se conectar ao programa e, em seguida, usar? A questão é que existem muitas variações, para as quais seria melhor modificar a função do ponto de interrupção. Na verdade, tudo escrito acima é apenas uma ideia geral. Pode ser implementado de muitas maneiras diferentes.

Concluindo, eu gostaria de agradecer ao Klot que foi o primeiro a descobrir como realizar uma pausa pressionando de forma programática.

Traduzido do russo pela MetaQuotes Ltd.
Artigo original: https://www.mql5.com/ru/articles/1427

Análise técnica: Torne possível o impossível! Análise técnica: Torne possível o impossível!
O artigo responde a pergunta: por que o impossível tornou-se possível onde grande parte sugere o contrário? Raciocínio da análise técnica.
Criação de um sistema de comércio automatizado Criação de um sistema de comércio automatizado
Você deve admitir que isso soa fascinante - tornar-se um proprietário privilegiado de um programa que pode desenvolver um sistema de comércio automatizado e lucrativo (ATC) em poucos minutos. Tudo que você precisa fazer é inserir os dados necessários e pressionar Enter. E - aqui está, pegue seu ATC testado e obtenha o retorno desejado. Onde milhares de pessoas passam milhares de horas desenvolvendo aquele ATC super original que irá "fazer chover", essas demonstrações soam, no mínimo, muito vazias. Por um lado, isso parece realmente maior que sua vida... No entanto, na minha opinião, este problema pode ser resolvido.
Teste de Visualização: Histórico de negociações Teste de Visualização: Histórico de negociações
O artigo descreve as possibilidades de visualização convenientes do histórico de negociações ao visualizar testes.
O ABC das negociações no Forex O ABC das negociações no Forex
O trabalho em mercados financeiros representa, antes de tudo, operações de comércio. Todos nós, desde a infância, temos uma ideia intuitiva do que significa comprar e vender. Mas as negociações no Forex são algo especial. Este artigo trata das ideias necessárias à explicação de alguns termos. Nós também vamos abordar as funções do MQL4 que correspondem a esses termos.