English Русский 中文 Deutsch 日本語 Português
Puntos de interrupción en la "Prueba de estrategia": ¡Es posible!

Puntos de interrupción en la "Prueba de estrategia": ¡Es posible!

MetaTrader 4Ejemplos | 15 marzo 2016, 07:44
876 0
Christo Tsvetanov
Christo Tsvetanov

Introducción

Lo único que hecho de menos en MQL4 es un depurador (debugger) normal para los Asesores Expertos. Somos humanos y cometemos errores. En una programación normal, establecemos los puntos de interrupción, ejecutamos el programa y cuando la ejecución llega a uno de estos puntos se detiene. Y así podemos ver los contenidos de las variables que nos interesan.

La visualización de los datos de la depuración ya es posible gracias a algunas funciones como Print, Comment, etc. Pero a veces nos apetece detener el programa en un punto concreto y en un momento determinado para analizar la situación. Hay otros aspectos a tener en cuenta. En general, se ejecuta el programa para operar en una cuenta de demostración o una cuenta real. Esto significa que sólo podemos ver los resultados de unos cuantos meses... Por lo tanto, el modo de depuración sólo es útil en el modo de Asesores Expertos (en la "Prueba de estrategia").

Cómo funciona

Con la llegada del "Modo visual" en la "Prueba de estrategia", ya es posible hacer el seguimiento de las respuestas de nuestros Asesores Expertos durante la ejecución rápida del programa en la "Prueba de estrategia". Podemos detener temporalmente la ejecución, pulsando "Pausa" en el teclado o haciendo clic sobre el botón de pausa presente en el panel de la "Prueba de estrategia". Los desarrolladores del terminal han proporcionado la librería WinUser32.mqh que contiene algunas funciones muy interesantes. Una de estas funciones es keybd_event. Nos permite pulsar cualquier tecla.

Aquí surgió la idea; podemos escribir una función que podría pulsar "pausa" mediante la programación y representar la información de depuración necesaria. Dado que nuestro Asesor Experto usará una DLL, tenemos primero darle el permiso para hacerlo. Pulsamos Ctrl+O y marcamos o desmarcamos las casillas:



A continuación tenemos que declarar el uso de WinUser32 en alguna parte al principio del código:
#include <WinUser32.mqh>
Le sigue la declaración de la propia función BreakPoint. Hay algunos matices aquí, pero la implementación más sencilla implica que no se envía ni se devuelve ningún parámetro.
void BreakPoint()

La función sólo debe activarse en el modo visual de la prueba, así que vamos a insertar una comprobación: Si la "Prueba de estrategia" no está en el "Modo visual", la dejamos:

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

Después hay que visualizar algunos datos. En mi opinión, la mejor manera de hacerlo es mediante Comment(). Supongamos que sólo necesitamos Bid y Ask.

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

El carácter "\n" significa que los siguientes datos aparecerán en la siguiente línea. Y por último, vamos a pulsar "Pausa".

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

La primera cadena pulsa la tecla y la última la suelta. Tiene que haber un tiempo (Sleep) entre pulsar y soltar, ya que puede no se procese la pausa si el tiempo entre pulsar y soltar es demasiado corto. El 19 es el código de la tecla virtual de la pausa, el 2 de la última cadena indica que hay que emular la liberación de la tecla.

Sólo nos queda sustituir el punto de interrupción en el código del Asesor Experto, por ejemplo, justo después de la apertura de una posición larga en el EA del artículo Ejemplo de un Asesor Experto.
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green);
BreakPoint();

A continuación se muestra el código completo:

//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);
}

¿Qué hay que hacer para ver las variables locales?

El problema está en la "invisibilidad" de estas variables fuera de sus declaraciones. En este caso, hay que enviar los datos. Supongamos que queremos ver la variable MacdCurrent del mismo artículo. Para ello, modificamos la función del siguiente modo:

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

Puntos de interrupción opcionales

A veces no queremos que el programa se detenga al alcanzar una cadena determinada, pero queremos que se detenga cuando se cumplan unas condiciones adicionales. En general, esto se suele hacer en los bucles. Por ejemplo, queremos detener la ejecución cuando el contador alcanza un valor determinado. Para ello, tenemos que enviar una condición 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);

La llamada se hace mediante el siguiente código:

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

Conclusión

Entonces, ¿por qué no creamos simplemente una librería para conectarla al programa y usarla después? Lo cierto es que hay muchas opciones, por ello sería mejor modificar la función BreakPoint. De hecho, todo lo anterior es simplemente una idea general. Se puede hacer la implementación de distintas maneras.

Por último, me gustaría dar las gracias a Klot quien fue el primero en pensar en la manera de pulsar "pausa" mediante la programación.

Traducción del ruso hecha por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/ru/articles/1427

Análisis técnico: ¡Hacer posible lo imposible! Análisis técnico: ¡Hacer posible lo imposible!
Esto artículo responde a la siguiente pregunta: ¿Por qué se puede hacer posible lo imposible cuando muchos sugieren lo contrario? Razonamiento del análisis técnico.
Creación de un sistema de trading automatizado Creación de un sistema de trading automatizado
Debe admitir que resulta tentador convertirse en el afortunado dueño de un programa que le permite desarrollar un sistema de trading automatizado (STA) rentable en pocos minutos. Sólo tiene que introducir las entradas adecuadas y pulsar "Enter". Y aquí lo tiene, su STA probado y con una previsión de beneficio positiva. Pero al ver a miles de personas dedicando miles de horas en el desarrollo de este singular STA, que será como "coser y cantar", mis afirmaciones le resultarían, por decirlo suavemente, poco convincentes. Por una parte, esto parece realmente inalcanzable... Pero en mi opinión, esto tiene solución.
Representación gráfica de las pruebas: Historial de las operaciones. Representación gráfica de las pruebas: Historial de las operaciones.
Este artículo describe la posibilidad de ver correctamente el historial de las operaciones durante la visualización de las pruebas.
Predicción del precio usando redes neuronales Predicción del precio usando redes neuronales
Muchos operadores hablan sobre las redes neuronales, pero lo que estas son y lo que realmente hacen solo lo saben unas pocas personas. Este artículo arroja algo de luz sobre el mundo de la inteligencia artificial. Describe cómo preparar correctamente los datos para la red. Aquí encontrará también un ejemplo de predicción usando los recursos del programa Matlab.