Pontos de interrupção no verificador: É possível!
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>
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.
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
- 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