English Русский 中文 Deutsch 日本語 Português 한국어 Français Italiano Türkçe
3 Métodos de Aceleración de Indicadores según el Ejemplo de Regresión Lineal

3 Métodos de Aceleración de Indicadores según el Ejemplo de Regresión Lineal

MetaTrader 5Indicadores | 26 marzo 2014, 09:06
3 961 0
ds2
ds2


Velocidad de Cálculo

El cálculo rápido de los indicadores es una tarea de vital importancia. Los cálculos se pueden acelerar mediante diversos métodos. Hay muchos artículos dedicados a este tema.

Ahora vamos a describir 3 métodos más para acelerar los cálculos, y en ocasiones incluso para simplificar el mismo código. Todos los métodos descritos con algorítmicos, es decir, no reduciremos la profundidad del historial ni activaremos núcleos adicionales de la unidad del procesador. Vamos a optimizar algoritmos computacionales directamente.


Indicador Básico

El indicador que se usará para mostrar los 3 métodos es un indicador de regresión lineal. Crea una función de regresión en cada barra (de acuerdo con el número definido de las últimas barras) y muestra qué valor debería tener en esa barra. Como resultado, obtendremos una línea sólida:

Así se muestra el indicador en el terminal

 

La ecuación de regresión lineal es así:


En nuestro caso, x es un número de barras, e y son precios.

Las proporciones de la ecuación mencionada se calculan de la siguiente manera:


donde N es el número de barras que se usa para formar la línea de regresión.

Así se muestran estas ecuaciones en MQL5 (dentro del ciclo de todas las barras de historia):

            // Finding intermediate values-sums
            Sx  = 0;
            Sy  = 0;
            Sxx = 0;
            Sxy = 0;
            for (int x = 1; x <= LRPeriod; x++)
              {
               double y = price[bar-LRPeriod+x];
               Sx  += x;
               Sy  += y;
               Sxx += x*x;
               Sxy += x*y;
              }

            // Regression ratios
            double a = (LRPeriod * Sxy - Sx * Sy) / (LRPeriod * Sxx - Sx * Sx);
            double b = (Sy - a * Sx) / LRPeriod;

            lrvalue = a*LRPeriod + b;

El código completo del indicador se puede encontrar en el artículo como archivo adjunto. También contiene todos los métodos descritos en el artículo presente. Por tanto, el método de cálculo "estándar" se debe seleccionar en la configuración del indicador:

Eng_G0-Standard

Ventana de configuración de los parámetros de entrada del indicador cuando se configura en el gráfico 


Primer Método de Optimización Totales Móviles

Hay una gran cantidad de indicadores en los que la figura total de los valores de una secuencia de barras se calcula en cada una de ellas. Y esta secuencia cambia constantemente en cada barra. El ejemplo más conocido es la Media Móvil (Moving Average, o MA). Calcula la suma de las últimas barras N y después divide este valor por su número.

Creo que pocas personas saben que hay una forma elegante de acelerar considerablemente el cálculo de estos totales móviles. Yo he estado usando este método en mis indicadores desde hace ya mucho tiempo, cuando descubrí que también se usaba en MetaTrader 4 y en indicadores MA 5 regulares. (No se trata de la primera vez que veo que los indicadores de MetaTrader han sido optimizados correctamente por los desarrolladores. Hace tiempo, estaba buscando indicadores rápidos ZigZag, y un indicador regular resultó ser más efectivo que la mayoría de los indicadores externos. Por cierto, el mensaje del foro que ya mencioné también contiene métodos de optimización para ZigZag en caso de que alguien los necesite).

Y ahora volvamos a los totales móviles. Comparemos los totales calculados para dos barras adyacentes. La figura de abajo demuestra que estos totales tienen una parte considerable en común (en verde). El total calculado para la barra 0 difiere del total por la barra 1 solo por el hecho de que el total no incluye una barra obsoleta (la roja a la izquierda), pero sí incluye una barra nueva (la azul a la derecha):

Eng_m1

Los valores excluidos e incluidos en el total durante un cambio de barra

 

Por tanto, no hay necesidad de sumar todas las barras necesarias de nuevo al calcular un total para la barra 0. Simplemente podemos tomar una suma de la barra 1, deducir un valor y añadir uno nuevo a ello. Se requieren dos operaciones aritméticas. Usando tal método podemos acelerar los cálculos del indicador de forma considerable.

En la Media Móvil estos métodos se usan habitualmente, puesto que el indicador mantiene todos los valores de la media en su único buffer. Y esto no es otra cosa que los totales divididos entre N, es decir, el número de barras incluidas en el total. Al multiplicar un valor del buffer por N, obtenemos un total para cada barra de forma fácil, y aplicamos el método descrito arriba.

Ahora les mostraré cómo aplicar este método en un indicador más complicado: el de regresión lineal. Ya han visto que las ecuaciones para las proporciones de funciones de regresión contienen cuatro totales: x, y, x*x, x*y. Los cálculos de esos totales se deben guardar en el buffer. Los buffers para cada total en el indicador se deben asignar para conseguir esto:

double ExtBufSx[], ExtBufSy[], ExtBufSxx[], ExtBufSxy[];

Puede que el buffer no se vea en un gráfico. MetaTrader 5 tiene un tipo de buffer especial para cálculos inmediatos. Lo usaremos para asignar números de buffer en OnInit:

   SetIndexBuffer(1, ExtBufSx,  INDICATOR_CALCULATIONS);
   SetIndexBuffer(2, ExtBufSy,  INDICATOR_CALCULATIONS);
   SetIndexBuffer(3, ExtBufSxx, INDICATOR_CALCULATIONS);
   SetIndexBuffer(4, ExtBufSxy, INDICATOR_CALCULATIONS);

El código de cálculo de regresión lineal estándar cambiará a lo siguiente:

            // (The very first bar was calculated using the standard method)        
        
            // Previous bar
            int prevbar = bar-1;
            
            //--- Calculating new values of intermediate totals 
            //    from the previous bar values
            
            Sx  = ExtBufSx [prevbar]; 
            
            // An old price comes out, a new one comes in
            Sy  = ExtBufSy [prevbar] - price[bar-LRPeriod] + price[bar]; 
            
            Sxx = ExtBufSxx[prevbar];
            
            // All the old prices come out once, a new one comes in with an appropriate weight
            Sxy = ExtBufSxy[prevbar] - ExtBufSy[prevbar] + price[bar]*LRPeriod;
            
            //---

            // Regression ratios (calculated the same way as in the standard method)
            double a = (LRPeriod * Sxy - Sx * Sy) / (LRPeriod * Sxx - Sx * Sx);
            double b = (Sy - a * Sx) / LRPeriod;

            lrvalue = a*LRPeriod + b;

El código completo del indicador se puede encontrar en el artículo como archivo adjunto. El método de cálculo de "Totales Móviles" se debe seleccionar en la configuración del indicador.


El Segundo Método. Simplificación

Este método gustará a los fans de las matemáticas. En ecuaciones complicadas, a menudo se descubre que los fragmentos son las partes derechas de otras ecuaciones conocidas. Esto nos da la posibilidad de sustituir esos fragmentos con sus partes izquierdas (que habitualmente constan solo de una variable). En otras palabras, podemos simplificar una ecuación complicada. Y puede parecer que algunos elementos de esta ecuación simplificada ya se han establecido como indicadores. En este caso, el código del indicador que contiene esa ecuación se puede considerar a su vez simplificado.

Como resultado, tenemos al menos un código más sencillo y efectivo en términos de espacio. Y en algunos casos también puede ser más rápido, en caso de que los indicadores implementados en el código estén bien optimizados en lo que a velocidad se refiere.

Parece ser que la ecuación de regresión lineal también se puede simplificar, y su cálculo se puede sustituir con la inicialización de varios indicadores MetaTrader 5 estándar. Muchos de sus elementos se calculan con el indicador de Media Móvil en sus diferentes modos de cálculo:

  • la suma y está presente en la Media Móvil Simple (SMA por sus siglas en inglés):

  • la suma x*y está presente en la Media Móvil Ponderada Lineal (LWMA por sus siglas en inglés):

Tenga en cuenta que la ecuación para la LWMA solo será correcta en caso de que enumeremos las barras que participan en la regresión desde 1 a N de forma ascendente, del pasado al futuro:

Eng_m2

La manera convencional de enumerar las barras para regresión usando el indicador LWMA 

 

Por tanto, la misma enumeración se debe usar en todas las demás ecuaciones.

Procedamos con el método:

  • el total x no es más que un total de series de números (1 + 2 + ... + N) que podrían reemplazarse con la siguiente ecuación:

  • el total simplificado x*x de acuerdo con otra ecuación:

  • para construir un gráfico de indicador debemos calcular el significado de la función de regresión solo por su última barra en la que x es igual a N, es decir, la ecuación de la función de regresión se puede sustituir con su caso particular:


Por tanto, las últimas cinco ecuaciones nos permiten obtener reemplazos para todas las variables en proporciones de ecuaciones de cálculo de valores a y b y en la ecuación de regresión misma. Tras completar todos esos reemplazos, obtendremos una nueva ecuación para el cálculo del valor de regresión. Constará solo de valores de indicadores de Media Móvil y de la figura N. Tras todas las reducciones de sus elementos, obtendremos una ecuación muy elegante:

Esta ecuación sustituye todos los cálculos ejecutados en el indicador básico de regresión lineal. Es bastante evidente que el código del indicador con esta ecuación será mucho más efectiva en términos de espacio. En el capítulo "Comparación de Velocidad" también veremos si el código funciona más rápidamente.

La parte especificada del indicador:

            double SMA [1];
            double LWMA[1];
            CopyBuffer(h_SMA,  0, rates_total-bar, 1, SMA);            
            CopyBuffer(h_LWMA, 0, rates_total-bar, 1, LWMA);

            lrvalue = 3*LWMA[0] - 2*SMA[0];

Los indicadores LWMA y SMA se crean de forma preliminar en OnInit:

      h_SMA  = iMA(NULL, 0, LRPeriod, 0, MODE_SMA,  PRICE_CLOSE);
      h_LWMA = iMA(NULL, 0, LRPeriod, 0, MODE_LWMA, PRICE_CLOSE);

El código completo se encuentra adjunto a este artículo. El método de cálculo de "Simplificación" se debe seleccionar en la configuración del indicador.

Tenga en cuenta que en este método usamos los indicadores que han sido creados en el terminal, es decir, se usó la función iMA con la selección de los métodos de suavizado adecuados en lugar de iCustom. Es importante porque, en teoría, los indicadores ya creados deberían funcionar muy rápido. Otros indicadores estándar se crean en el terminal (se crean con funciones que tienen el prefijo "i", como iMA). Al usar el método de simplificación, es mucho mejor para simplificar ecuaciones que indicadores.


El Tercer Método. Aproximación

La idea de este método es que los indicadores "pesados" que se usan en un Asesor Experto (EA, por sus siglas en inglés), se pueden sustituir con otros más rápidos que calculan los valores necesarios de forma aproximada. Usando este método, puede simular su estrategia más rápidamente. Después de todo, la precisión de la predicción no es tan importante en la frase de depuración.

Asimismo, este método se puede usar con una estrategia funcional para optimizar los parámetros de forma genérica. Esto nos permite encontrar áreas de valores efectivas de los parámetros rápidamente. Y pueden ser procesadas por indicadores "pesados" para un mayor ajuste.

Además, parece ser que ese cálculo aproximado será suficiente para permitir que una estrategia funcione bien. En ese caso, un indicador "iluminado" se puede usar también para trading real.

Una ecuación rápida se puede desarrollar para la regresión lineal que tiene un efecto similar a la regresión. Por ejemplo, podemos dividir las barras de regresión en dos grupos, calcular el valor medio para cada una de ellas, dibujar una línea a través de esos dos puntos de media y definir el valor de la línea en la última barra:

Eng_Points

Los puntos se dividieron en dos grupos - los izquierdos y los derechos-, y se realizaron los cálculos.

 

Este cálculo contiene menos operaciones aritméticas que el caso de la regresión. Esa es la forma de acelerar cálculos.

           // The interval midpoint
           int HalfPeriod = (int) MathRound(LRPeriod/2);
           
           // Average price of the first half
           double s1 = 0;
           for (int i = 0; i < HalfPeriod; i++)
              s1 += price[bar-i];
           s1 /= HalfPeriod;
              
           // Average price of the second half
           double s2 = 0;
           for (int i = HalfPeriod; i < LRPeriod; i++)
              s2 += price[bar-i];
           s2 /= (LRPeriod-HalfPeriod);
           
           // Price excess by one bar
           double k = (s1-s2)/(LRPeriod/2);
           
           // Extrapolated price at the last bar
           lrvalue = s1 + k * (HalfPeriod-1)/2;

El código completo del indicador se puede encontrar en el artículo como archivo adjunto. El método de cálculo de "Aproximación" se debe seleccionar en la configuración del indicador.

Ahora, analicemos cuánto se acerca la aproximación al resultado original. Para ello, debemos configurar indicadores con métodos de cálculo estándar y de aproximación en un gráfico. También debemos añadir cualquier otro indicador que sepamos que sea débilmente similar a la regresión. En cualquier caso, debería calcular también algunas tendencias usando barras anteriores. La Media Móvil servirá para ello (yo usé LWMA, no SMA, porque es mucho más parecida al gráfico de regresión). Con ello podemos evaluar si tenemos una buena aproximación o no. Yo creo que es buena:

Eng_G3

 La línea roja está más próxima a la azul que a la verde. Esto significa que el algoritmo de aproximación es bueno.


Comparación de Velocidad

La vista del registro se puede activar en los parámetros del indicador:

Eng_True

Configurar el indicador para la evaluación de la velocidad de ejecución

 

En este caso, el indicador mostrará todos los datos necesarios para la evaluación de la velocidad en el registro de mensajes del Asesor Experto: el momento del inicio del procesamiento del evento OnInit() y el final de OnCalculate(). Le explicaré por qué la velocidad se debe evaluar según estos dos valores: el agente OnInit() se ejecuta casi instantáneamente con casi cualquier método, y OnCalculate() se inicia justo después de OnInit() con casi cualquier método. La única excepción es un método de simplificación en el que los indicadores SMA y LWMA se crean en OnInit(). Hay un retraso entre la finalización de OnInit() y el inicio de OnCalculate() en el caso del método mencionado (¡solo en este caso!):

Eng_log

Vista del registro de ejecución en el indicador en el diario del Asesor Experto del terminal 

 

Esto significa que este retraso se causa por los SMA y LWMA recientemente creados, que estaban ejecutando algunos cálculos en ese momento. La duración de estos cálculos se debe tener en cuenta. Por tanto, evaluaremos todo el tiempo "ininterrumpidamente", desde la inicialización del indicador de regresión hasta el final de sus cálculos.

Para ver la diferencia entre las velocidades de los diferentes métodos de forma más precisa, todas las evaluaciones se llevan a cabo usando un enorme array de datos: un marco temporal M1 con profundidad de historial de máxima accesibilidad. Esto son más de 4 millones de barras. Cada método se evaluará dos veces: con 20 y 2.000 barras en regresión.

Los resultados son:

Eng_Duration 1

Eng_Duration 2
 

Como puede ver, los tres métodos de optimización mostraron al menos dos duplicaciones de velocidad en comparación con el método de cálculo de regresión estándar. Tras aumentar el número de barras en la regresión, los métodos de totales móviles y simplificación resultaron en una velocidad fantástica. ¡Funcionaron cientos de veces más rápido que un método estándar!

Debería señalar que el tiempo necesario para el cálculo con estos dos métodos se mantiene básicamente inalterable. Esto se puede explicar fácilmente: independientemente de cuántas barras se usaran para crear una regresión, solo se ejecutaron dos acciones en el método de totales móviles: una barra antigua sale, y una nueva entra. No hay ciclos que dependan de la longitud de la regresión. Por tanto, aún si la regresión contiene 20.000 o 200.000, el momento del método de ejecución aumentará significativamente en comparación con las 20 barras.

El método de simplificación usa la Media Móvil en diferentes modos en su ecuación. Como ya apunté antes, este indicador se puede optimizar fácilmente con el método de totales móviles, y se usa por desarrolladores de terminal. No es de extrañar que la duración del método de ejecución de simplificación tampoco cambie cuando la longitud de la regresión aumenta.

El método de cálculo de los totales móviles ha resultado ser el más rápido de nuestro experimento.

 

Conclusión

Algunos traders se pasan el tiempo sentados y esperando al final de otro proceso de optimización de parámetros de sus sistemas de trading en sus simuladores. Pero hay quienes ya en esos momentos están ganando dinero. La velocidad de cálculo obtenida con los métodos aquí descritos explica claramente por qué hay tal diferencia entre grupos de traders. Y también por qué es tan importante prestar atención a la calidad de los algoritmos de trading.

No importa si escribe programas para el terminal para usted o los pide de programadores externos (por ejemplo, con la ayuda de la sección "Jobs" ("trabajos")). En cualquier caso, usted puede obtener indicadores y estrategias no solo funcionales, sino también rápidos, si está dispuesto a poner un poco de esfuerzo o gastar algo de dinero.

Si usa cualquier método de aceleración de algoritmo, obtendrá una ventaja en velocidad hasta cientos de veces superior en comparación con los algoritmos estándar. Esto signfica, por ejemplo, que puede optimizar sus parámetros de estrategias de trading en un simulador cien veces más rápido. Y también lo puede hacer más detallada y frecuentemente. Naturalmente, esto resultará en un aumento de sus beneficios en trading.


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

Archivos adjuntos |
Cómo ser suministrador de señales para MetaTrader 4 y MetaTrader 5 Cómo ser suministrador de señales para MetaTrader 4 y MetaTrader 5
¿Quiere ofrecer sus señales comerciales y que le paguen por ello? Regístrese en el sitio web MQL5.com como vendedor, indique su cuenta comercial y ofrezca a los tráders una suscripción para copiar sus transacciones.
Filtrar Señales Basadas en Datos Estadísticos de Correlación de Precios Filtrar Señales Basadas en Datos Estadísticos de Correlación de Precios
¿Hay alguna correlación entre el comportamiento de precios del pasado y sus tendencias futuras? ¿Por qué el precio repite hoy el carácter de su movimiento del día anterior? ¿Se pueden usar estadísticas para predecir la dinámica de los precios? Hay una respuesta, y es afirmativa. Si tiene alguna duda de ello, este artículo es para usted. Le explicaré cómo crear un filtro funcional para un sistema de trading en MQL5, revelando un patrón interesante en cambios de precio.
Principios de funcionamiento y ventajas de las señales comerciales MetaTrader 4 y MetaTrader 5 Principios de funcionamiento y ventajas de las señales comerciales MetaTrader 4 y MetaTrader 5
Las señales comerciales MetaTrader 4 / MetaTrader 5 - son un servicio que permite a los traders copiar las operaciones comerciales de un suministrador de señales. Nuestro objetivo ha sido crear un nuevo servicio masivo, que proteja a los suscriptores y les evite gastos innecesarios.
El Papel de las Distribuciones Estadísticas en el Trabajo del Trader El Papel de las Distribuciones Estadísticas en el Trabajo del Trader
Este artículo es una continuación lógica de mi artículo "Statistical Probability Distributions in MQL5" ("Distribuciones de Probabilidad Estadísticas en MQL5"), que presentó las clases para trabajar con algunas distribuciones estadísticas teóricas. Ahora que ya tenemos una base teórica, sugiero proceder directamente a conjuntos de datos reales para darle un uso a esta base.