English Русский 中文 Deutsch 日本語 Português 한국어 Français Italiano Türkçe
preview
Aprendiendo a diseñar un sistema de trading con VIDYA

Aprendiendo a diseñar un sistema de trading con VIDYA

MetaTrader 5Trading | 1 diciembre 2022, 09:21
880 0
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

Introducción

Bienvenidos a un nuevo artículo de la serie dedicada a la creación de sistemas comerciales basados en indicadores técnicos populares y estrategias simples. Hoy hablaremos del indicador de Media Móvil con Periodo de Promediación Dinámico (Variable Index Dynamic Average, VIDYA). Es un indicador de tendencia, lo cual significa que sus lecturas seguirán la tendencia. Por consiguiente, el indicador es rezagado, es decir, se mueve después de que el propio precio lo haya hecho. Una vez más, el trabajo sobre el indicador se dividirá en varios temas:

  1. Definición del indicador VIDYA
  2. Estrategias basadas en el indicador VIDYA
  3. Esquema de las estrategias según VIDYA
  4. Sistemas comerciales según VIDYA
  5. Conclusión


Para desarrollar y mejorar sus habilidades de programación, necesitará poner en práctica lo aprendido: esto le ayudará a comprender mejor lo que estamos analizando. En general, la práctica es un factor esencial en cualquier proceso de aprendizaje. En nuestros artículos, utilizaremos el lenguaje de programación MQL5 (MetaQuotes Language 5) integrado en el terminal MetaTrader 5 y el MetaEditor para escribir el código. Si no sabe cómo instalar MetaTrader 5 o utilizar el MetaEditor, le recomiendo que lea "Escribiendo el código MQL5 en el MetaEditor" en mi artículo anterior.

¡Atención! Toda la información del presente artículo se ofrece «tal cual», únicamente con fines ilustrativos, y no supone ningún tipo de recomendación. El artículo no garantiza ningún resultado en absoluto. Todo lo que ponga en práctica usando este artículo como base, lo hará bajo su propia cuenta y riesgo; el autor no garantiza resultado alguno.


Definición del indicador VIDYA

VIDYA es un indicador de tendencia desarrollado por Tushar Chande. Es similar a una media móvil exponencial, salvo que el indicador se ajustará dinámicamente según la volatilidad relativa de los precios. Para medir la volatilidad, el indicador utiliza el Chande Momentum Oscillator (CMO), que mide la relación entre la suma de movimientos positivos y negativos. Esto resultará más fácil de entender cuando intentemos calcular el indicador manualmente. El CMO se utiliza para suavizar la media móvil exponencial, por lo tanto, tendremos los siguientes parámetros para el indicador: el periodo del oscilador CMO y el periodo de promedio de la EMA. El indicador puede usarse como cualquier media móvil para determinar si la tendencia es alcista o bajista. En artículos anteriores, hemos hablado muchas veces de las tendencias. Por ejemplo, podrá leer una descripción detallada de la tendencia en el artículo del enlace. El indicador también puede usarse para generar señales de compra o venta. En otra sección, veremos diferentes variantes de estrategias comerciales sencillas con el indicador VIDYA.

Ahora veremos cómo calcular el indicador VIDYA manualmente: esto nos permitirá entender el concepto del indicador o usarlo de forma más eficaz. Para calcular el indicador, deberemos calcular sus componentes.

  • Calculamos la EMA:

EMA(i) = Price(i) * F + EMA(i-1)*(1-F)

donde:

EMA(i) = media exponencial actual

Price(i) = precio actual

F (factor de suavizado) = 2/(EMA del periodo+1)

EMA(i-1) = valor anterior de la EMA

  • Encontramos el valor del indicador VIDYA:

VIDYA(i) = Price(i) * F * ABS(CMO(i)) + VIDYA(i-1) * (1 - F* ABS(CMO(i)))

donde:

VIDYA(i) = valor actual del indicador VIDYA

ABS(CMO(i)) = valor actual absoluto del oscilador Chande Momentum Oscillator

VIDYA(i-1) = valor anterior del indicador VIDYA

  • Encontramos el oscilador de impulso Chande CMO:

CMO(i) = (UpSum(i) - DnSum(i))/(UpSum(i) + DnSum(i))

donde:

UpSum(i) = valor actual de la suma de los movimientos positivos del periodo

DnSum(i) = valor actual de la suma de los movimientos negativos del periodo

A continuación, obtendremos las lecturas del indicador VIDYA. Por fortuna, no necesitaremos calcular el indicador manualmente, pues existe uno listo para usar que ya viene incorporado en la plataforma MetaTrader 5. Podrá seleccionarlo de la lista de indicadores disponibles y ejecutarlo inmediatamente en el gráfico.

Insertar --> Indicadores --> Tendencias --> Variable Index Dynamic Average

Inserción de VIDYA

Se abrirá una ventana con los parámetros del indicador:

Parámetros del indicador VIDYA

1 - Periodo del oscilador de impulso de Chande CMO

2 - Periodo de la media móvil exponencial EMA

3 - tipo de precio

4 - color de la línea del indicador VIDYA

5 - estilo de la línea del indicador VIDYA

6 - grosor de la línea del indicador VIDYA

Seleccionamos los parámetros necesarios del indicador, presionamos el botón OK y el indicador se iniciará en el gráfico como mostramos a continuación:

 Indicador VIDYA en el gráfico

Como podemos ver en el ejemplo, el indicador se ejecuta directamente en la ventana del gráfico y se muestra como una línea por encima o por debajo del precio. Cuando la línea VIDYA se encuentra por encima del precio, indica el dominio de la fuerza bajista, y viceversa, cuando la línea VIDYA se encuentra por debajo del precio, indica el dominio de la fuerza alcista en el mercado.


Estrategias basadas en el indicador VIDYA

En esta parte, aprenderemos a usar el indicador VIDYA según su concepto, utilizando para ello estrategias sencillas como ejemplo. Para generar señales más fiables y eficaces, lo mejor es combinar el indicador con otras herramientas técnicas o indicadores. De este modo, obtendremos más información y evaluaremos la situación desde distintos ángulos. Esta es una de las mejores particularidades del análisis técnico.

    Estrategia uno: identificador de tendencia según VIDYA

      La estrategia informará del tipo de tendencia -alcista o bajista- comparando el cierre actual y el valor actual VIDYA con la configuración predeterminada (9,12). Así, se generará una señal de tendencia alcista si el cierre actual está por encima del valor VIDYA. Por el contrario, si el cierre actual está por debajo del valor VIDYA, se generará una señal de tendencia bajista.

      Cierre actual > VIDYA --> tendencia alcista

      Cierre actual < VIDYA --> tendencia bajista

        Segunda estrategia: cruce de VIDYA

          Según esta estrategia, recibiremos señales de compra o venta basadas en el análisis del indicador, como en la estrategia anterior. De esta manera, se generará una señal de compra si el cierre actual está por encima del valor VIDYA. Por el contrario, si el precio de cierre está por debajo del valor VIDYA, se generará una señal de venta.

          Cierre actual > VIDYA --> señal de compra

          Cierre actual < VIDYA --> señal de venta

            Estrategia tres: cruce de dos VIDYA

              Las señales de compra o venta se generarán a partir del análisis de dos indicadores VIDYA: con los ajustes (9, 12) y con los ajustes (20, 50). Recibiremos una señal de compra cuando VIDYA (9, 12) ascienda por encima de VIDYA (20, 50). Por el contrario, cuando el valor del indicador VIDYA con los parámetros (9, 12) descienda por debajo del indicador con los parámetros (20, 50), será una señal de venta.

              VIDYA (9, 12) > VIDYA (20, 50) --> señal de compra

              VIDYA (9, 12) < VIDYA (20, 50) --> señal de venta

              Estas tres sencillas estrategias nos muestran las opciones de uso del indicador VIDYA.


              Esquema de las estrategias según VIDYA

              En esta sección, desarrollaremos paso a paso un plan para crear un sistema comercial basado en cada una de las estrategias que hemos analizado.

                Estrategia uno: identificador de tendencia según VIDYA

                  El sistema basado en esta estrategia deberá generar y emitir señales con el tipo de tendencia actual. Para ello, deberemos comprobar dos valores: el cierre de la vela actual y el valor actual del indicador VIDYA, y basándonos en ello, determinar la tendencia. Si el cierre actual está por encima del valor VIDYA, será una señal de tendencia alcista.

                  En este caso, el sistema mostrará un comentario en el gráfico con los siguientes valores:

                  • Tendencia alcista
                  • Valor actual del precio de cierre
                  • Valor actual de VIDYA

                  De lo contrario, si el cierre actual está por debajo del valor VIDYA, será una señal de tendencia bajista.

                  En este caso, el sistema mostrará un comentario en el gráfico con los siguientes valores:

                  • Tendencia bajista
                  • Valor actual del precio de cierre
                  • Valor actual de VIDYA

                  La siguiente figura muestra el esquema de esta estrategia:

                  Esquema de la estrategia para identificar una tendencia según VIDYA

                    Segunda estrategia: cruce de VIDYA

                      El sistema basado en esta estrategia generará y mostrará señales de compra o venta. Se analizarán los mismos valores que en la detección de tendencias, solo que esta vez las señales serán diferentes. Para ello, comprobaremos nuevamente los mismos dos valores: el cierre de la vela actual y el valor actual del indicador VIDYA. Si el cierre actual está por encima del valor VIDYA, será una señal de compra.

                      En este caso, el sistema mostrará en el gráfico un comentario así:

                      • Señal de compra
                      • Valor actual del precio de cierre
                      • Valor actual de VIDYA

                      Si el cierre actual está por debajo de VIDYA, será una señal de venta.

                      En este caso, el sistema mostrará un comentario en el gráfico con los siguientes valores:

                      • Señal de venta
                      • Valor actual del precio de cierre
                      • Valor actual de VIDYA
                      La siguiente figura muestra el esquema de esta estrategia:

                      Esquema de la estrategia de cruce de VIDYA

                        Estrategia tres: cruce de dos VIDYA

                          El sistema comercial basado en esta estrategia generará y mostrará señales de compra y venta en el gráfico. Esto requerirá un análisis constante de dos valores de VIDYA con diferentes parámetros: VIDYA (9, 12) y VIDYA (20, 50). Si el valor actual de VIDYA con los parámetros (9, 12) es mayor que el valor actual del indicador con los parámetros (20, 50), esto supondrá una señal de compra.

                          En este caso, el sistema mostrará en el gráfico un comentario así:

                          • Señal de compra
                          • Valor actual del precio de cierre
                          • Valor actual de VIDYA (9, 12)
                          • Valor actual de VIDYA (20, 50)

                          Si, por el contrario, el valor de VIDYA con los parámetros (9, 12) es inferior al valor de VIDYA (20, 50), esto supondrá una señal de venta.

                          En este caso, el sistema mostrará en el gráfico un comentario así:

                          • Señal de venta
                          • Valor actual del precio de cierre
                          • Valor actual de VIDYA (9, 12)
                          • Valor actual de VIDYA (20, 50)

                          La siguiente figura muestra el esquema de esta estrategia:


                          Esquema de la estrategia de cruce de dos VIDYAs

                          Por lo tanto, hemos elaborado gráficos de desarrollo paso a paso para cada estrategia con el fin de ayudar a desarrollar los sistemas comerciales correspondientes. Ahora podemos pasar a la parte más interesante: el propio desarrollo. 


                          Sistemas comerciales según VIDYA

                          Según esta estrategia, el sistema simplemente mostrará el valor VIDYA actual como un comentario en el gráfico.

                          A continuación, mostraremos los pasos necesarios para crear este sistema comercial.

                          Para ello, crearemos el array vidyaArray usando una función double. El tipo double es un tipo real, un número de punto flotante, es decir, un valor con una parte fraccionaria.

                          double vidyaArray[];

                          Luego clasificaremos el array creado con la ayuda de la función ArraySetAsSeries, que retornará un valor booleano.

                          ArraySetAsSeries(vidyaArray,true);

                          Después crearemos la variable de tipo entero vidyaDef, que recibirá los valores del indicador VIDYA. A continuación, usaremos la función iVIDyA, que retorna el manejador del indicador.

                          Parámetros:

                          • symbol — nombre del símbolo; nosotros tenemos "_Symbol", es decir, calcularemos el indicador según el símbolo del gráfico actual
                          • period — marco temporal para el cálculo; el valor _Period mostrará que el indicador se calcula en el marco temporal actual.
                          • cmo_period — periodo de cálculo del indicador Chande Momentum, nosotros tenemos 9
                          • ema_period — periodo de suavizado de la media móvil exponencial, nosotros tenemos 12
                          • ma_shift — en caso necesario, podemos configurar el desplazamiento horizontal; lo establecemos en 0
                          • applied_price — define el tipo de precio utilizado para el cálculo; utilizaremos el precio de cierre
                          int vidyaDef = iVIDyA(_Symbol,_Period,9,12,0,PRICE_CLOSE);

                          A continuación, rellenaremos el array creado utilizando la función CopyBuffer para obtener los datos del indicador VIDYA.

                          Los parámetros de esta función serán:

                          • indicator_handle — manejador del indicador, vidyaDef
                          • buffer_num — número del búfer de indicador, lo estableceremos en 0
                          • start_pos — indica la posición del comienzo del cálculo; estableceremos 0
                          • count — cantidad de datos a copiar; indicaremos 3.
                          • buffer[] — establece el array de precios a copiar; para nosotros será StdDevArray.
                          CopyBuffer(vidyaDef,0,0,3,vidyaArray);

                           Después obtendremos vidyaVal, para el que crearemos una variable utilizando la función NormalizeDouble, que retornará un valor de tipo double.

                          Los parámetros de esta función serán:

                          • value — utilizamos el valor normalizado de vidyaArray[0]
                          • digits — número de dígitos decimales tras la coma, 6.
                          double vidyaVal = NormalizeDouble(vidyaArray[0],6);

                          Utilizaremos la función Comment para crear un comentario en el gráfico con el valor actual del indicador VIDYA:

                          Comment("VIDYA Value is ",vidyaVal);

                          El código completo del programa obtenido tendrá el aspecto siguiente:

                          //+------------------------------------------------------------------+
                          //|                                                 Simple VIDYA.mq5 |
                          //|                                  Copyright 2022, MetaQuotes Ltd. |
                          //|                                             https://www.mql5.com |
                          //+------------------------------------------------------------------+
                          #property copyright "Copyright 2022, MetaQuotes Ltd."
                          #property link      "https://www.mql5.com"
                          #property version   "1.00"
                          //+------------------------------------------------------------------+
                          void OnTick()
                            {
                             double vidyaArray[];
                          
                             ArraySetAsSeries(vidyaArray,true);
                          
                             int vidyaDef = iVIDyA(_Symbol,_Period,9,12,0,PRICE_CLOSE);
                          
                             CopyBuffer(vidyaDef,0,0,3,vidyaArray);
                          
                             double vidyaVal = NormalizeDouble(vidyaArray[0],6);
                          
                             Comment("VIDYA Value is ",vidyaVal);
                          
                            }
                          //+------------------------------------------------------------------+
                          

                          Después de realizar la compilación, el asesor aparecerá en la ventana del Navegador en MetaTrader 5:

                           VIDYA en el Navegador

                          Clicamos dos veces en el archivo o lo arrastramos y soltamos en el gráfico. Después de eso, la ventana del asesor aparecerá nuevamente:

                           Ventana del sistema VIDYA simple

                          Pulsamos OK y el programa (asesor) se iniciará en el gráfico como se muestra en la figura siguiente:

                          Sistema VIDYA simple en el gráfico

                          La indicación en la esquina superior derecha del gráfico muestra que el asesor se ha iniciado y está funcionando en el gráfico. A continuación, mostraremos el comentario generado por nuestro sistema comercial:

                           Señal del sistema VIDYA simple

                          Nuevamente, podemos ver que en la esquina superior izquierda del gráfico se muestra un comentario con el valor actual de VIDYA. Si queremos asegurarnos de que el asesor generará exactamente el mismo valor que el indicador VIDYA estándar suministrado con MetaTrader 5, podemos ejecutar el indicador y el asesor simultáneamente con la misma configuración.

                           Señales del indicador y la estrategia VIDYA

                          El asesor se está ejecutando en el gráfico, como lo muestra la indicación en la esquina superior derecha. El gráfico también muestra el valor actual de este asesor en la esquina superior izquierda. Además, el indicador VIDYA integrado se adjunta al gráfico y su valor se muestra en la parte derecha de la ventana de datos. Los valores son idénticos.

                            Estrategia uno: identificador de tendencia según VIDYA

                              A continuación, escribiremos el código de un sistema comercial que emitirá un comentario con el valor de la tendencia actual. Más abajo, mostraremos el código completo para crear esta estrategia:

                              //+------------------------------------------------------------------+
                              //|                                       VIDYA trend identifier.mq5 |
                              //|                                  Copyright 2022, MetaQuotes Ltd. |
                              //|                                             https://www.mql5.com |
                              //+------------------------------------------------------------------+
                              #property copyright "Copyright 2022, MetaQuotes Ltd."
                              #property link      "https://www.mql5.com"
                              #property version   "1.00"
                              //+------------------------------------------------------------------+
                              void OnTick()
                                {
                                 MqlRates priceArray[];
                                 double vidyaArray[];
                              
                                 int Data=CopyRates(_Symbol,_Period,0,3,priceArray);
                                 ArraySetAsSeries(vidyaArray,true);
                              
                                 int vidyaDef = iVIDyA(_Symbol,_Period,9,12,0,PRICE_CLOSE);
                              
                                 CopyBuffer(vidyaDef,0,0,3,vidyaArray);
                              
                                 double currentClose=NormalizeDouble(priceArray[2].close,6);
                                 double vidyaVal = NormalizeDouble(vidyaArray[0],6);
                              
                                 if(currentClose>vidyaVal)
                                   {
                                    Comment("Uptrend","\n",
                                            "Current Close Value is ",currentClose,"\n",
                                            "Current VIDYA Value is ",vidyaVal);
                                   }
                              
                                 if(currentClose<vidyaVal)
                                   {
                                    Comment("Downtrend","\n",
                                            "Current Close Value is ",currentClose,"\n",
                                            "Current VIDYA Value is ",vidyaVal);
                                   }
                              
                              
                                }
                              //+------------------------------------------------------------------+
                              

                              Diferencias en este código:

                              Crearemos dos matrices: una para los precios usando la función MqlRates y otra para VIDYA usando una función double, como ya hemos comentado.

                                 MqlRates priceArray[];
                                 double vidyaArray[];
                              

                              Clasificamos los arrays. Para el array de precios priceArray, usaremos la función CopyRates para obtener los datos históricos de MqlRates. Los parámetros serán los siguientes:

                              • symbol name (nombre del símbolo) —_Symbol.
                              • timeframe (marco temporal) — _Period.
                              • start time (hora de inicio) — 0.
                              • stop time (hora de finalización) — 3.
                              • rates array — priceArray

                              Para vidyaArray usaremos la función ArraySetAsSeries.

                                 int Data=CopyRates(_Symbol,_Period,0,3,priceArray);
                                 ArraySetAsSeries(vidyaArray,true);
                              

                              Luego determinaremos el precio de cierre actual y los valores VIDYA actuales.

                                 double currentClose=NormalizeDouble(priceArray[2].close,6);
                                 double vidyaVal = NormalizeDouble(vidyaArray[0],6);
                              

                              Condiciones de esta estrategia:

                              1. En el caso de una tendencia alcista

                                 if(currentClose>vidyaVal)
                                   {
                                    Comment("Uptrend","\n",
                                            "Current Close Value is ",currentClose,"\n",
                                            "Current VIDYA Value is ",vidyaVal);
                                   }
                              

                              2. En el caso de una tendencia bajista

                                 if(currentClose<vidyaVal)
                                   {
                                    Comment("Downtrend","\n",
                                            "Current Close Value is ",currentClose,"\n",
                                            "Current VIDYA Value is ",vidyaVal);
                                   }
                              

                              Después compilaremos el código y ejecutaremos el programa en el gráfico. Veremos algo aproximadamente así:

                              Identificador de tendencia VIDYA en el gráfico

                              Como podemos ver, el identificador de tendencia VIDYA se ha iniciado en el gráfico, pues hay un icono en la esquina superior derecha. El asesor funciona y genera señales. A continuación, mostraremos ejemplos de estas señales obtenidas durante las pruebas.

                              1. En el caso de una tendencia alcista

                               Identificador de tendencia VIDYA - señal de tendencia alcista

                              En la esquina superior izquierda del gráfico aparece un comentario con los valores siguientes:

                              • Tendencia alcista
                              • Valor actual del precio de cierre
                              • Valor actual de VIDYA

                              2. En el caso de una tendencia bajista

                               Identificador de tendencia VIDYA - señal de tendencia bajista

                              En el gráfico aparece el comentario correspondiente:

                              • Tendencia bajista
                              • Valor actual del precio de cierre
                              • Valor actual de VIDYA
                                Segunda estrategia: cruce de VIDYA

                                  Veamos el código completo para crear esta estrategia:

                                  //+------------------------------------------------------------------+
                                  //|                                          VIDYA one crossover.mq5 |
                                  //|                                  Copyright 2022, MetaQuotes Ltd. |
                                  //|                                             https://www.mql5.com |
                                  //+------------------------------------------------------------------+
                                  #property copyright "Copyright 2022, MetaQuotes Ltd."
                                  #property link      "https://www.mql5.com"
                                  #property version   "1.00"
                                  //+------------------------------------------------------------------+
                                  void OnTick()
                                    {
                                     MqlRates priceArray[];
                                     double vidyaArray[];
                                  
                                     int Data=CopyRates(_Symbol,_Period,0,3,priceArray);
                                     ArraySetAsSeries(vidyaArray,true);
                                  
                                     int vidyaDef = iVIDyA(_Symbol,_Period,9,12,0,PRICE_CLOSE);
                                  
                                     CopyBuffer(vidyaDef,0,0,3,vidyaArray);
                                  
                                     double currentClose=NormalizeDouble(priceArray[2].close,6);
                                     double vidyaVal = NormalizeDouble(vidyaArray[0],6);
                                  
                                     if(currentClose>vidyaVal)
                                       {
                                        Comment("Buy signal","\n",
                                                "Current Close Value is ",currentClose,"\n",
                                                "Current VIDYA Value is ",vidyaVal);
                                       }
                                  
                                     if(currentClose<vidyaVal)
                                       {
                                        Comment("Sell signal","\n",
                                                "Current Close Value is ",currentClose,"\n",
                                                "Current VIDYA Value is ",vidyaVal);
                                       }
                                  
                                  
                                    }
                                  //+------------------------------------------------------------------+
                                  

                                  Diferencias en este código:

                                  Comentario basado en esta estrategia.

                                  1. Con una señal de compra

                                     if(currentClose>vidyaVal)
                                       {
                                        Comment("Buy signal","\n",
                                                "Current Close Value is ",currentClose,"\n",
                                                "Current VIDYA Value is ",vidyaVal);
                                       }
                                  

                                  2. Con una señal de venta

                                     if(currentClose<vidyaVal)
                                       {
                                        Comment("Sell signal","\n",
                                                "Current Close Value is ",currentClose,"\n",
                                                "Current VIDYA Value is ",vidyaVal);
                                       }
                                  

                                  Compilamos el código y ejecutamos el programa en el gráfico:

                                  Cruce con VIDYA en el gráfico

                                  Como podemos ver en la captura de pantalla, en la esquina superior derecha del gráfico se muestra una indicación de que el asesor está funcionando. El asesor funciona y genera señales de compra y venta para esta estrategia. A continuación, mostraremos ejemplos de pruebas del sistema.

                                  1. Con una señal de compra

                                  VIDYA one crossover - señal de compra

                                  El sistema genera señales y muestra en el gráfico un comentario que aparece en la esquina superior izquierda. En este se representan los siguientes valores:

                                  • Señal de compra
                                  • Valor actual del precio de cierre
                                  • Valor actual de VIDYA

                                  2. Con una señal de venta

                                   VIDYA one crossover - señal de venta

                                  En la esquina superior izquierda del gráfico aparece un comentario con los valores siguientes:

                                  • Señal de venta
                                  • Valor actual del precio de cierre
                                  • Valor actual de VIDYA
                                    Estrategia tres: cruce de dos VIDYA

                                      Aquí tenemos el código completo de la estrategia de cruce de los dos indicadores VIDYA:

                                      //+------------------------------------------------------------------+
                                      //|                                          VIDYA two crossover.mq5 |
                                      //|                                  Copyright 2022, MetaQuotes Ltd. |
                                      //|                                             https://www.mql5.com |
                                      //+------------------------------------------------------------------+
                                      #property copyright "Copyright 2022, MetaQuotes Ltd."
                                      #property link      "https://www.mql5.com"
                                      #property version   "1.00"
                                      //+------------------------------------------------------------------+
                                      void OnTick()
                                        {
                                         MqlRates priceArray[];
                                         double vidyaArray[];
                                         double vidyaArray1[];
                                      
                                         int Data=CopyRates(_Symbol,_Period,0,3,priceArray);
                                         ArraySetAsSeries(vidyaArray,true);
                                         ArraySetAsSeries(vidyaArray1,true);
                                      
                                         int vidyaDef = iVIDyA(_Symbol,_Period,9,12,0,PRICE_CLOSE);
                                         int vidyaDef1 = iVIDyA(_Symbol,_Period,20,50,0,PRICE_CLOSE);
                                      
                                         CopyBuffer(vidyaDef,0,0,3,vidyaArray);
                                         CopyBuffer(vidyaDef1,0,0,3,vidyaArray1);
                                      
                                         double currentClose=NormalizeDouble(priceArray[2].close,6);
                                         double vidyaVal = NormalizeDouble(vidyaArray[0],6);
                                         double vidyaVal1 = NormalizeDouble(vidyaArray1[0],6);
                                      
                                         if(vidyaVal>vidyaVal1)
                                           {
                                            Comment("Buy signal","\n",
                                                    "Current Close Value is ",currentClose,"\n",
                                                    "Current VIDYA (9,12) Value is ",vidyaVal,"\n",
                                                    "Current VIDYA (20,50) Value is ",vidyaVal1);
                                           }
                                      
                                         if(vidyaVal<vidyaVal1)
                                           {
                                            Comment("Sell signal","\n",
                                                    "Current Close Value is ",currentClose,"\n",
                                                    "Current VIDYA (9,12) Value is ",vidyaVal,"\n",
                                                    "Current VIDYA (20,50) Value is ",vidyaVal1);
                                           }
                                      
                                      
                                        }
                                      //+------------------------------------------------------------------+
                                      

                                      Diferencias en este código:

                                      Esta vez utilizaremos tres arrays: precios, vidyaArray, vidyaArray1

                                         MqlRates priceArray[];
                                         double vidyaArray[];
                                         double vidyaArray1[];
                                      

                                      Clasificamos los arrays:

                                         int Data=CopyRates(_Symbol,_Period,0,3,priceArray);
                                         ArraySetAsSeries(vidyaArray,true);
                                         ArraySetAsSeries(vidyaArray1,true);
                                      

                                      Definimos vidyaDef y vidyaDef1

                                         int vidyaDef = iVIDyA(_Symbol,_Period,9,12,0,PRICE_CLOSE);
                                         int vidyaDef1 = iVIDyA(_Symbol,_Period,20,50,0,PRICE_CLOSE);
                                      

                                      Llenamos los arrays vidyaArray y vidyaArray1

                                         CopyBuffer(vidyaDef,0,0,3,vidyaArray);
                                         CopyBuffer(vidyaDef1,0,0,3,vidyaArray1);
                                      

                                      Luego definimos currentClose, vidyaVal y vidyaVal1

                                         double currentClose=NormalizeDouble(priceArray[2].close,6);
                                         double vidyaVal = NormalizeDouble(vidyaArray[0],6);
                                         double vidyaVal1 = NormalizeDouble(vidyaArray1[0],6);
                                      

                                      Condiciones de la señal según esta estrategia:

                                      1. Con una señal de compra

                                         if(vidyaVal>vidyaVal1)
                                           {
                                            Comment("Buy signal","\n",
                                                    "Current Close Value is ",currentClose,"\n",
                                                    "Current VIDYA (9,12) Value is ",vidyaVal,"\n",
                                                    "Current VIDYA (20,50) Value is ",vidyaVal1);
                                           }
                                      

                                      2. Con una señal de venta

                                         if(vidyaVal<vidyaVal1)
                                           {
                                            Comment("Sell signal","\n",
                                                    "Current Close Value is ",currentClose,"\n",
                                                    "Current VIDYA (9,12) Value is ",vidyaVal,"\n",
                                                    "Current VIDYA (20,50) Value is ",vidyaVal1);
                                           }
                                      

                                      Después compilaremos el código y ejecutaremos el programa en el gráfico. Veremos algo aproximadamente así:

                                       Cruce de dos VIDYA en el gráfico

                                      En la esquina superior derecha del gráfico se representará una indicación que mostrará que el asesor está funcionando. El asesor generará señales de compra y venta para esta estrategia. A continuación, mostraremos algunos ejemplos de pruebas del sistema.

                                      Señal de compra:

                                      VIDYA two crossover - señal de compra

                                      En la esquina superior izquierda del gráfico aparecerá un comentario con la señal y los valores adicionales:

                                      • Señal de compra
                                      • Valor actual del precio de cierre
                                      • Valor actual de VIDYA (9,12)
                                      • Valor actual de VIDYA (20,50)

                                      Señal de venta

                                       VIDYA two crossover - señal de venta

                                      El comentario del gráfico contendrá estos valores:

                                      • Señal de venta
                                      • Valor actual del precio de cierre
                                      • Valor actual de VIDYA (9,12)
                                      • Valor actual de VIDYA (20,50)


                                      Conclusión

                                      Bien, ya hemos analizado el indicador de Media Móvil con Periodo de Promediación Dinámico (Variable Index Dynamic Average, VIDYA). Como todos los artículos, hemos dividido el análisis en varias subsecciones. Hemos aprendido la definición del cálculo, qué mide y cómo calcularlo manualmente. Las fórmulas que componen el cálculo nos permiten comprender mejor el propio indicador. También hemos visto cómo usar el indicador estándar suministrado con la plataforma. Después hemos analizado cómo utilizar el indicador; para ello, el artículo ha mostrado varias estrategias sencillas basadas en el concepto básico estudiado. También hemos estudiado las siguientes estrategias:

                                      • Identificador de tendencia según VIDYA: la estrategia informa del tipo de tendencia en el mercado (alcista o bajista).
                                      • Estrategia de cruce de VIDYA: las señales de compra y venta se generarán cuando el precio y la línea del indicador se crucen.
                                      • Estrategia de dos cruces de VIDYA: las señales de compra y venta se generarán al cruzarse dos indicadores VIDYA con los parámetros (9,12) y (20,50).

                                      Esperamos que el lector haya trabajado en cada código por su cuenta: así aprenderá a escribir los códigos de la estrategia comercial. Esto resulta especialmente importante para los programadores principiantes, porque así es como se desarrollarán sus habilidades. En general, la práctica es vital en cualquier proceso de aprendizaje, no solo en la programación. Una vez más, recuerde que deberá probar a fondo cualquier estrategia presentada en los artículos antes de aplicarla a una cuenta real para asegurarse de que se adapta a su estilo comercial y a su comprensión del trading. Al fin y al cabo, lo que funciona para otros no tiene por qué funcionar para usted. Además, no olvide que todas las estrategias se presentan aquí con fines ilustrativos, y deberán ser optimizadas.

                                      Esperamos que el artículo le resulte útil y le ayude a alcanzar sus objetivos comerciales. Si le ha gustado este artículo y está interesado en la creación de estrategias comerciales basadas en indicadores técnicos populares, le recomendamos que lea otros artículos de esta serie: ya hemos analizado anteriormente el desarrollo de sistemas utilizando RSI, MACD, estocástico, medias móviles, Bandas de Bollinger, Envolventes y muchas otras herramientas técnicas.

                                      Traducción del inglés realizada por MetaQuotes Ltd.
                                      Artículo original: https://www.mql5.com/en/articles/11341

                                      Redes neuronales: así de sencillo (Parte 28): Algoritmo de gradiente de políticas Redes neuronales: así de sencillo (Parte 28): Algoritmo de gradiente de políticas
                                      Continuamos analizando los métodos de aprendizaje por refuerzo. En el artículo anterior, nos familiarizamos con el método de aprendizaje Q profundo, en el que entrenamos un modelo para predecir la próxima recompensa dependiendo de la acción realizada en una situación particular. Luego realizamos una acción según nuestra política y la recompensa esperada, pero no siempre es posible aproximar la función Q, o su aproximación no ofrece el resultado deseado. En estos casos, los métodos de aproximación no se utilizan para funciones de utilidad, sino para una política (estrategia) de acciones directa. Precisamente a tales métodos pertenece el gradiente de políticas o policy gradient.
                                      Redes neuronales: así de sencillo (Parte 27): Aprendizaje Q profundo (DQN) Redes neuronales: así de sencillo (Parte 27): Aprendizaje Q profundo (DQN)
                                      Seguimos explorando el aprendizaje por refuerzo. En este artículo, hablaremos del método de aprendizaje Q profundo o deep Q-learning. El uso de este método permitió al equipo de DeepMind crear un modelo capaz de superar a los humanos jugando a los videojuegos de ordenador de Atari. Nos parece útil evaluar el potencial de esta tecnología para las tareas comerciales.
                                      Aprendiendo a diseñar un sistema de trading con DeMarker Aprendiendo a diseñar un sistema de trading con DeMarker
                                      Le presentamos un nuevo artículo de la presente serie sobre la creación de sistemas comerciales basados en los indicadores técnicos más populares. En este artículo, veremos cómo crear un sistema comercial basado en el indicador de DeMark (DeMarker).
                                      DoEasy. Elementos de control (Parte 16): Objeto WinForms TabControl - múltiples filas de encabezados de pestañas, modo de expansión de encabezados para ajustarse al tamaño del contenedor DoEasy. Elementos de control (Parte 16): Objeto WinForms TabControl - múltiples filas de encabezados de pestañas, modo de expansión de encabezados para ajustarse al tamaño del contenedor
                                      En este artículo, proseguiremos con el desarrollo del control TabControl, e implementaremos la disposición de los encabezados de las pestañas en los cuatro lados del control para todos los modos de establecimiento de tamaño del encabezado: "Normal", "Fixed" y "Fill To Right".