Representación gráfica de las pruebas: Mejora de la funcionalidad

Andrey Khatimlianskii | 15 febrero, 2016


1. Descripción del problema

A partir de la versión build 196 MetaTrader 4, el terminal de cliente ofrece la función de representación gráfica. Permite controlar las pruebas de los Asesores Expertos a un nivel cualitativamente nuevo. Los traders pueden ver ahora cada acción de su Asesor Experto mediante la revisión de sus operaciones en el historial.

Puede leer acerca del uso del visualizador en el artículo Prueba de Asesores Expertos en el terminal de cliente MetaTrader 4: Un vistazo desde fuera. En este artículo vamos a describir cómo hacer que la prueba de estrategias sea muy parecida al terminal.

Entonces, ¿cuál es la característica principal de la prueba de estrategias? ¿Cuáles son las carencias de la representación gráfica? La carencia más importante es quizás la falta de la pestaña "Operaciones" (Trade).

¿Cuántas posiciones se habían abierto? ¿En cuánto tiempo se activará la orden pendiente? ¿Se ha movido el StopLoss de la posición? ¿Cuánto es el margen en este momento y cuándo llegará al nivel MarginCall? Todas las respuestas a estas y muchas otras preguntas están en la pestaña "Operaciones" del terminal. ¿Pero qué podemos hacer durante la prueba?

Este artículo se dedica a solucionar todo esto.

2. Aspectos técnicos

Como siempre, comenzaremos con la definición del problema. ¿Qué resultado queremos obtener?
- Como se mencionó antes, necesitamos crear algo similar a la pestaña "Operaciones", es decir, para visualizar la información de todas las posiciones abiertas y órdenes pendientes.
- La información tiene que estar siempre actualizada y fácil de leer.
- El uso del programa tiene que ser muy sencillo - no requerirá muchos esfuerzos para conectarse al Asesor Experto.

Ahora podemos discutir los aspectos técnicos. ¿Cómo será el programa: como un indicador o como una librería de funciones externas?

Está claro que un indicador en una ventana por separada podría ser la mejor opción. Es siempre visible, no se solapa con el gráfico de los precios y se actualiza a cada tick. Pero tendremos un nuevo problema al utilizar el indicador - toma todos los datos de las órdenes del terminal normal, no del terminal "virtual" (prueba), es decir, que durante la prueba, mostrará la información del estado actual de la cuenta sin ninguna interacción con la propia prueba.

Así que vamos a tener que buscar otra alternativa para resolver el problema.

Seguiremos con la creación de un indicador, pero sólo para "generar la subventana del gráfico". No mostrará nada, es decir, siempre tendremos una parte "reservada del gráfico". Esto es necesario para poder guardar la subventana creada bajo un único nombre en la plantilla tester.tpl o en la plantilla <expert_name>.tpl.

La representación de la información y su actualización se llevaran a cabo mediante una librería de funciones en forma de un archivo de inclusión.

3. Puesta en marcha

En primer lugar, hay que crear una plantilla del gráfico y que usará el visualizador. Luego simplemente hay que ajustar el aspecto del gráfico (color, cuadrícula, escala), añadir vTerminal.mq4 al gráfico y usar el comando del menú contextual "Save Template" (Guardar plantilla).




Ventana "Save as Template" (Guardar como plantilla)


Con el propósito de representar el gráfico, se utilizará la plantilla llamada tester.tpl o <expert_name>.tpl. Hay que utilizar el mismo nombre para guardar la plantilla.

4. Integración con el Asesor Experto

Se guardan las funciones que muestran la información de las posiciones en el archivo de inclusión llamado VisualTestingTools.mq4, que se encuentra en el directorio ...\MetaTrader 4\experts\include\ . En primer lugar hay que añadir el Asesor Experto - insertar la línea #include <VisualTestingTools.mq4> antes de la función start. Se verá así (ejemplo de CrossMACD_DeLuxe):

...
double _Commission = 0.0; string _Comment = ""; datetime _Expiration = -1;
 
#include <VisualTestingTools.mq4>
 
int start()
  {
    if ( FastEMAPeriod >= SlowEMAPeriod ) 
      { 
        return(-1); 
      }


    int _GetLastError = 0;
...


Ahora podemos utilizar las funciones en cualquier parte del programa. Se hará la llamada a vTerminalInit() en la función init() del Asesor Experto dado que se le debe llamar una vez sólo con el fin de crear los objetos para mostrar la información. Y se debe llamar a la otra, vTerminalRefresh(), con cada tick. Actualizará la información de las posiciones abiertas. Este será el código del Asesor Experto que usa las funciones:

...
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;
...

Puede descargar el Asesor Experto CrossMACD_DeLuxe_Visual.mq4 que ya lleva incluidas todas las modificaciones necesarias.

5. La prueba

Vamos a ver ahora lo que tenemos.
Primero, se han añadido nuevas variables externas en el Asesor Experto:




Las nuevas variables externas están disponibles después de añadir el archivo VisualTestingTools.mq4 al código del Asesor Experto


Su función es intuitiva, pero me gustaría describirlas con más detalle:
- Rows - la cantidad máxima de líneas que aparecen en la pantalla. Para la mayoría de las estrategias, 10 líneas son suficientes;
- BigText - poner true (verdadero) si quiere aumentar el tamaño de la fuente;
- SignalPoints - la distancia en puntos, desde que empiezan a resaltarse los campos Stop Loss, Take Profit y Open Price para las órdenes pendientes. Por ejemplo, si SignalPoints = 10, entonces el campo de Stop Loss cambiará su color cuando el precio está a 10 puntos del Stop Loss de la posición;
- MainColor - el color del encabezado del terminal y de la barra de información de la cuenta (Saldo, Patrimonio, ...).
- BuyColor - el color de la información de la posición Buy;
- BuyOPColor - el color del campo Open Price, que sustituirá al color principal cuando se acerca el precio actual al nivel Open de Buy Stop y Buy Limit ;
- BuySLColor - el color que sustituirá al color principal cuando se acerca el precio al nivel Stop Loss de las posiciones Buy;
- BuyTPColor - el color que sustituirá al color principal cuando se acerca el precio al nivel Take Profit de las posiciones Buy.
- SellOPColor, SellSLColor y SellTPColor - lo mismo que con las posiciones Sell..

Vamos a poner MainColor = Black y pulsar OK. El Asesor Experto ya está listo para su prueba. Antes de pulsar el botón "Iniciar", marque la casilla "Modo visual" y disfrute de los resultados:



Hasta que no hayan posiciones abiertas, nuestro "terminal" sólo mostrará la cabecera y la barra de estado de la cuenta. Vamos a esperar hasta que aparezca una señal y que el Asesor Experto abra una posición.




Se abre primero una posición Sell. Como puede ver, es una línea roja.

Por favor, preste atención a la barra de estado de la cuenta. Contiene todo lo que solemos ver en la pestaña "Operaciones" del terminal. Para que pueda ver cómo cambia el beneficio de la posición, se actualiza toda la información con cada tick:




Cuando se acerca el precio al nivel Stop Loss de la posición, el campo StopLoss cambia su color al color preestablecido por el usuario:



Para mí, es bastante bueno.

6. Posibles problemas

Cabe mencionar una función más del uso de tester.tpl con el indicador vTerminal: Durante la prueba, la función que tiene que buscar la ventana del indicador (WindowFind()) está desactivada. Por esto, hay que establecer el número de la subventana de forma explícita en el código:

    win = WindowFind( "vTerminal" );
    if ( IsTesting() ) { win = 1; }

Si la plantilla contiene otros indicadores que se muestran en una ventana separada, se mostrará toda la información de estos indicadores en la ventana superior. Es decir, tendrá que poner vTerminal en la parte superior o escribir win = subwindow number; en lugar de win = 1;.

No se encontraron más problemas al trabajar con el indicador.

7. Conclusión

Para presentar una conclusión bonita, me gustaría simplemente mostrar algunas capturas de pantalla.