Algoritomo de generación de ticks en el téster de estrategias del terminal MetaTrader 5

MetaQuotes | 13 enero, 2014


Creación de expertos de sistemas de comercio automático en MQL5

Dentro de los componentes del terminal MetaTrader 5 se encuentra integrado un entorno de programación para el desarrollo estrategias completamente automatizadas (robots comerciales), que puedan comerciar sin la intervención de persona alguna. Otro nombre para los robots comerciales es el de "expertos".  Los expertos e indicadores comerciales para el termianal MetaTrader 5 están programados con el lenguaje MQL5, en el que se concretan todas las ventajas de los lenguajes de programación más modernos:

La posibilidad de depuración de programas en MQL5 permite escribir el código más seguro posible desde el punto de vista de la programación. Esto es una condición indispensable, pero no suficiente por sí misma, a la hora de desarrollar un sistema de comercio estable y rentable. Los sistemas comerciales capaces de demostrar buenos resultados durante un periodo prolongado de tiempo, suelen ser conocidos como "robustos" de la palabra inglesa robust según los datos del historial. Asímismo se muestran muy resistentes a fallos y errores.


Testado de estrategias comerciales

Antes de confiarle su capital comercial a un experto, es necesario cerciorarse de que las normas de apertura y cierre de posición incluidas en el mismo, así como las normas de gestión de capital, permitirán confiar en la obtención de beneficios. El modo más simple de realizar tales comprobaciones es la modelación del funcionamiento de un experto con los datos accesibles del historial.

En los terminales de cliente de MetaTrader 5 está instaldo un componente especial: un téster de estrategias para la obtención de resultados del funcionamiento del experto en base a los datos del historial. El proceso de la puesta en marcha del experto en un intervalo de fechas concreto se conoce como puesta a prueba (testado) del experto. Al finalizar el testado individual se obtiene multitud de información útil, la cual resulta imprescindible para llegar a conclusiones concretas sobre robustez del experto.

Pero para que la información sea fiable, el proceso mismo de testado debe modelar con la mayor exactitud posible el entorno actual en el que se desenvuelve el experto. En el tester de MetaTrader 5 se usa la modelación por ticks de los precios, utilizando los valores históricos del spread para cada instrumento en el que se realizan las operaciones comerciales.


Un poco de historia sobre el téster de estrategias


MetaTrader 3

El primer téster de estrategias ya estaba presente en el terminal de cliente de MetaTrader 3. Este era un téster relativamente simple según la idea actual, ya que en él, el proceso de testado se llevaba a cabo conforme a tres modelos de precio en la barra:

La modelación de precios siempre se había basado en las barras del time frame testado, y la información de los time frames menores no se utilizaba. El téster del terminal  MetaTrader 3 acusaba multitud de defectos, entre los cuales se encontraban la reducida velocidad de testado,  su baja precisión y la ausencia de la optimización de expertos en cuanto a sus parámetros de entrada.

MetaTrader 4

MetaTrader 4 vino a sustituir el tercer terminal, con un nuevo lenguaje compilado MQL4 (el anterior MQL-II era interpretado) y una aproximación al testado totalmente novedosa. Entonces el testado se podía ya llevar a cabo en los tres regímenes:

Además, una diferencia sustancial con repsecto al téster del terminal 3 era que en el téster de estrategia de MetaTrader 4, para la modelación se usaban los datos de los precios del time frame más reciente. Por ello, si está disponible el historial al minuto de todo el intervalo testado, los resultados del test estarán muy cerca de aquellos obtenidos en el régimen on-line. De no disponerse de los time frames de la parte inferior, la modelación del desarrollo de los precios dentro de la barra se ejecuta igual que en el téster del terminal MetaTrader 3.

Además, apareció la posibilidad de efectuar optimizaciones, tanto con la selección directa de los parámetros de entrada, como con la ayuda de un algoritmo genético. Esto dio la posibilidad de acelerar sustancialmente el proceso de optimización, en especial para las estrategias con una gran cantidad de parámetros de entrada. La optimización se puede efectuar ahora también en régimen visual, lo cual ha supuesto un gran paso adelante, realmente apreciado por los traders.

El nuevo terminal de cliente MetaTrader de 5ª generación está basado en la experiencia obtenida con los anteriores terminales, y esto se refiere, sobre todo, al téster de estrategias. Asímismo, ahora se tiene la posibilidad de testar estrategias multidivisa, es decir, estrategias que comercian simultáneamente en varios instrumentos.

La optimización de estrategias se puede efectuar ahora no sólo en todos los núcleos disponibles del procesador, si no también en agentes más alejados, ubicados en otras computadoras; del mismo modo se pueden efectuar tanto en una red local, como en la red global de Internet. Esto permite aumentar increíblemente la potencia del téster y realizar cálculos antes inaccesibles directamente en el lenguaje MQL5.

Sin embargo, para entender de manera elemental el proceso de testado en el terminal MetaTrader 5, es necesario hacerse una idea como se produce la modelación de precios en el téster de estrategias.


Algoritmo de generación de ticks

El téster de estrategias del terminal  MetaTrader 5 utiliza sólo un régimen de modelación de precios durante el testado, la generación de ticks en base al historial de datos preexistente en los time frame por minutos según los símbolos usados. Los otros métodos de modelación presentes en MetaTrader 4 fueron eliminados, ya que, a pesar de su gran velocidad, no proporcionaban la máxima precisión en el testado.

El uso en el téster del time frame M1 permite modelar con gran precisión el movimiento de los precios con un margen de error mínimo, a diferencia de la modelación de ticks en base a los antiguos time frames. Como consecuencia de ello, el margen de error máximo al llevar a cabo la modelación del precio en el téster de estrategias de MetaTrader 5 es minúsculo, y las divergencias entre el precio modelado y el precio real sólo pueden producirse a escala interna, dentro de la barra por minutos.

La posibilidad de efectuar la optimización, tanto en agentes locales como deslocalizados, permite compensar el incremento del gasto de tiempo de testado con tal enfoque. La generación de ticks se lleva a cabo en base a la grabación por minutos de la memoria caché, en formato numérico. Por eso la generación de ticks se produce muy rápido.

Las barras de todos los time frames necesarios se forman en la base histórica del téster de forma común (como el terminal del cliente) conforme van llegando los ticks generados. La barra por minutos con un volumen de ticks de 1 no es susceptible de generación alguna, el ticks se graba con el valorClose.


La barra con 2 ticks tampoco se genera, al principio se graba su tick con el valor Open, y después se graba con el valor Close.

          



La barra de 3 ticks se genera según el esquema, para este tipo de barras existen sólo cuatro patrones de desarrollo de la barra:
  1. Se mueven en una dirección y vuelven al nivel Open




  2. Se mueven en una dirección, se desplazan y sobrepasan el nivel Open




  3. Se mueven en una dirección, se desplazan, pero no llegan al nivel Open




  4. Varios puntos en una dirección




Puntos de apoyo

Si la barra tiene más de 3 ticks, entonces primero se generan los puntos de apoyo. La cantidad de puntos de apoyo no puede ser superior al volumen de ticks. El precio de apertura Open no entra en el cálculo de la cantidad de puntos de apoyo, dado que el movimiento comienza partiendo de él. El número máximo de puntos de apoyo es de 11.

Los puntos de apoyo se distribuyen entre el umbral de apertura, la amplitud de la vela y el umbral de cierre. 


Dependiendo de la cantidad de ticks, la distribución de los puntos es la siguiente (umbral de apertura - amplitud de la vela - umbral de cierre):

3 - 5 - 3
2 - 6 - 2
2 - 5 - 2
2 - 4 - 2
2 - 3 - 2
1 - 4 - 1
1 - 3 - 1
1 - 2 - 1
1 - 1 - 1
Si el gráfico de velas no dispone de alguno de los dos umbrales, entonces los puntos de apoyo del umbral correspondiente se transmiten a la amplitud de la vela.



La amplitud de la vela se genera en función de la cantidad impar de puntos de apoyo. Si la amplitud tiene un número par de puntos de apoyo, entonces el punto "sobrante" se transmite a uno de los umbrales, con la condición de que el umbral tenga ya 2 puntos. En caso contrario, el punto "sobrante" simplemente desaparece.

El valor de los puntos de apoyo constituye la diferencia  en puntos entre el precio del punto de apoyo y el precio de la apertura de la vela. La distribución ideal (3-5-3) de los puntos de apoyo para la vela del toro (en blanco) es la siguiente:





Para la vela del oso (en negro) la generación de puntos de apoyo según el esquema 3-5-3 se hace de manera analógica:




Se la vela es líder Сlose==Open, entonces se analiza la vela precedente, si la anterior fue ascendente, entonces esta líder se considera vela descendente.



Si el umbral se genera con ayuda de 3 puntos de apoyo y los valores enteros de 3/4 del tamaño de la vela y 1/2 del tamaño de la vela son equivalentes (esto sucede cuando la diferencia entre Open y Low o Open y High no supera los 2 puntos), entonces la generación del umbral cambia de la siguiente forma:

 

Si el umbral se genera con ayuda de 2 puntos de apoyo, entonces los puntos de apoyo se distribuyen de esta forma:





De un modo análogo se generan y se cierran los umbrales.


Formación de puntos de apoyo desde Low hasta High

La amplitud de la vela se genera con ondas-impulso, la cantidad de ondas se calcula como:

cantidad de ondas=(cantidad de puntos de apoyo en la amplitud + 1)/2.

Por ejemplo, si la cantidad de puntos de apoyo en la amplitud de la vela es igual a 5 (con un esquema 3-5-3), entonces se generarán 3 ondas = (5+1)/2.

Cada onda-impulso tiene una longitud step en puntos, que se calcula según la fórmula:

step=(High-Low-1)/(cantidad de ondas)+1

Por ejemplo, la amplitud de la vela (High - Low) = (1.3113 - 1.3100) = 0.0013 comprende 13 puntos, entonces la longitud de la onda step= (13-1)/3+1=5 puntos.

Después del impulso en puntos step sigue un desplazamiento de 1 punto. A continuación en el ciclo se calcula la posición de los puntos de apoyo (para la vela del toro):


prev=low
ciclo
n1=prev+step
n2=prev+step-1
prev=n2

donde:

Utilizamos este algoritmo para la vela del toro según el esquema 3-5-3, donde la cantidad de ondas es igual a 3 y step=5 puntos, punto=0.0001:

  1. Primer paso. Variable prev=Low=1.3100, entramos en ciclo.
  2. Calculamos los datos para la primera onda
    • Calculamos la posición del punto n1=prev+step=1.3100 + 5*0.0001 = 1.3105.
    • Calculamos la posición del punto n2=prev+step-1=1.3100 + 5*0.0001-1*0.0001 = 1.3104;
    • A la variable prev adjudicamos el valor n2: prev=1.3104;
  3. Calculamos los datos para la segunda onda
    • Calculamos la posición del punto n1=prev+step=1.3104 + 5*0.0001 = 1.3109.
    • Calculamos la posición del punto n2=prev+step-1=1.3104 + 5*0.0001-1*0.0001 = 1.3108;
    • A la variable prev adjudicamos el valor n2: prev=1.3108;
  4. Calculamos los datos para la tercera onda
    • Calculamos la posición del punto n1=prev+step=1.3108 + 5*0.0001 = 1.3113.
    • Salida del ciclo, prev = n2 = 1.3112

Todo lo anteriormente expuesto se muestra para mayor claridad en el dibujo:


Para la vela del oso el cálculo de los puntos de apoyo es análoga:


prev=high
ciclo
n1=prev-step
n2=prev-step+1
prev=n2


La generación de ticks se lleva a cabo según los puntos de apoyo

Los ticks intermedios entre puntos de apoyo se generan según las siguientes reglas:


Comprobación de la secuencia de ticks

Como conclusión, comparamos el historial de ticks grabado en el servidor MetaQuotes-Demo del 13 mayo 2010 desde las 13:00 a las 13:30 con una secuanciación de ticks generada por el téster en el terminal de cliente de MetaTrader 5. Para la grabación de los ticks en el registro del agente de testado se utilizaba un experto sencillo:

//+------------------------------------------------------------------+
//|                                                  Write_Ticks.mq5 |
//|              Copyright Copyright 2010, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+

input datetime start=D'2010.05.13 13:00:00';
input datetime end=D'2010.05.13 14:00:00';

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   MqlTick tick;
   datetime time=TimeCurrent();
//---
   SymbolInfoTick(Symbol(),tick);
   Print(time,tick.bid);
//---
   if(time>end) ExpertRemove();
//---
  }

El historial de ticks on-line era reunido con ayuda del indicador, descrito en el siguiente artículo Creación de indicadores de ticks.

Ambas secuencias de ticks (las del téster y las grabadas en el archivo) se pueden ver representadas en el gráfico. En color verde están representados los ticks obtenidos en el téster, y en color azul, los obtenidos en el servidor comercial de MetaQuotes-Demo y grabados en el archivo con un indicador.


Usted puede poner el cursor del ratón sobre cualquier lugar del gráfico y comprobar en el mensaje surgido las indicaciones sobre cada tick:

En el gráfico se puede ver perfectamente que la calidad del modelado de los ticks en el téster del terminal de MetaTrader 5 permite llevar a cabo un testado adecuado de los expertos en base a los datos del historial.