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

Aprendiendo a diseñar un sistema de trading con Awesome Oscillator

MetaTrader 5Trading | 21 diciembre 2022, 16:33
1 068 0
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

Introducción

Bienvenidos a un nuevo artículo de la serie dedicada al análisis de indicadores técnicos populares y la creación de sistemas comerciales basados en ellos. En este artículo, trabajaremos con el indicador Awesome Oscillator: estudiaremos con detalle qué es y qué mide, y también veremos cómo utilizarlo, usando estrategias simples como ejemplos. También crearemos nuestros propios sistemas comerciales basados en las estrategias discutidas.

Para estudiar el indicador con detalle, como siempre, dividiremos el trabajo en varias subsecciones:

  1. Definición del indicador Awesome Oscillator
  2. Estrategias según el indicador Awesome Oscillator
  3. Esquemas de estrategias según Awesome Oscillator
  4. Sistemas comerciales basados en Awesome Oscillator
  5. Conclusión

Los códigos de este artículo se escribirán en MQL5 (MetaQuotes Language 5), y las aplicaciones resultantes se ejecutarán en el terminal comercial MetaTrader 5. El lenguaje MQL5 está integrado en la plataforma MetaTrader 5. Si quiere saber más sobre cómo instalarlos y utilizarlos, le recomiendo que lea "Escribiendo el código MQL5 en el MetaEditor" en uno de los artículos anteriores. Recomendamos a todos los lectores a que descarguen y apliquen por su cuenta todo lo discutido aquí: precisamente con la práctica logrará desarrollar sus habilidades.

¡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 Awesome Oscillator

En esta sección, aprenderemos con detalle qué es el indicador Awesome Oscillator (AO). El indicador AO fue desarrollado por Bill Williams para medir el impulso, y se puede utilizar para concretar qué fuerza domina el mercado: el lado de los compradores o el de los vendedores. El indicador mide el impulso comparando el impulso de las últimas cinco barras/velas con el impulso de las últimas 34 barras/velas en un marco temporal mayor, en otras palabras, compara el impulso reciente con el impulso de un marco temporal mayor. En cuanto al análisis técnico, resulta más útil obtener la confirmación de una señal AO de otro indicador o instrumento. Las señales son más precisas cuando se usan varios instrumentos juntos. Para entender mejor lo que mide este indicador, echaremos un vistazo a los componentes que integran el cálculo. Para ello, calcularemos manualmente el valor del indicador.

El indicador AO supone la diferencia entre una media móvil simple de 5 periodos y una media móvil simple de 34 periodos. Para calcular el AO, utilizaremos el precio mediano.

MEDIAN PRICE = (HIGH + LOW) / 2 

AO = SMA (MEDIAN PRICE, 5) - SMA (MEDIAN PRICE, 34)

donde:

MEDIAN PRICE — precio mediano del instrumento

HIGH — precio máximo

LOW — precio mínimo

AO — valor de Awesome Oscillator

SMA = media móvil simple

Pero no hay necesidad de calcular el indicador manualmente, ya que tenemos un Awesome Oscillator listo para usar en el terminal comercial MetaTrader 5: todo lo que tenemos que hacer es seleccionarlo de la lista de indicadores.

Veamos cómo se ejecuta el indicador en el gráfico. Abrimos MetaTrader 5, clicamos en "Insertar" --> Indicadores --> Bill Williams --> Awesome Oscillator

Iniciando AO en el gráfico

Después de ello, se abrirá una ventana con los parámetros del indicador.

Parámetros del indicador AO

donde:

1 — color para las lecturas ascendentes

2 — grosor del histograma del indicador

3 — color para las lecturas descendentes

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 AO en el gráfico del símbolo

Como podemos ver en el gráfico anterior, ha aparecido una ventana de indicador adicional en la parte inferior, con las columnas del histograma fluctuando alrededor de cero.


Estrategias según el indicador Awesome Oscillator

En esta parte, veremos sencillas estrategias ilustrativas y utilizaremos el indicador AO como ejemplo. En general, antes de usar cualquiera de los desarrollos en una cuenta real, siempre deberá ponerlo a prueba para asegurarse de que resulte adecuado para usted. Para las estrategias analizadas, podría ser necesario realizar una optimización. Al fin y al cabo, el objetivo principal de su desarrollo es el aprendizaje, mostrar cómo podemos utilizar el indicador en la práctica. También resultará útil usar este indicador junto con otras herramientas técnicas para obtener más información y ver el panorama general. Esta es una de las mejores características del análisis técnico, ya que nos permite usar una combinación de diferentes conceptos y obtener más información sobre un instrumento desde diferentes perspectivas. En este artículo, probaremos el indicador junto con una media móvil: esta combinación debería generar señales de compra y venta más fiables.

    Estrategia uno: cruce del cero por parte de AO

      Esta estrategia producirá una señal alcista o bajista basada en el cruce entre el valor actual de AO y el nivel cero. Si el valor actual de AO es superior a cero, tendremos una señal alcista. Si el valor actual de AO es inferior a cero, tendremos una señal bajista.

      Esquemáticamente:

      Valor actual AO > 0 --> Alcista

      Valor actual de AO < 0 --> Bajista

        Estrategia dos: Fuerza de AO

          Según esta estrategia obtendremos una señal de la fuerza del movimiento de AO basada en la posición del AO actual y el valor medio de las últimas lecturas durante 5 periodos. Si el valor actual de AO es superior a la media, esto será una señal de la fuerza del movimiento de AO. Si el valor actual de AO es inferior a la media, esto será una señal de un movimiento débil de AO.

          Esquemáticamente:

          Valor actual de AO > AVG en 5 periodos AO --> AO fuerte

          Valor actual de AO < AVG en 5 periodos AO --> AO débil

            Estrategia tres: AO y MA

              Según esta estrategia, recibiremos señales de compra o venta basadas en el cruce del indicador AO actual y el nivel cero, y también analizaremos la posición del precio de cierre con respecto a una media móvil exponencial de 50 periodos. Si el AO actual está por encima del nivel cero y el precio de cierre se encuentra por encima de la EMA de 50 periodos, tendremos una señal de compra. Si el AO actual está por debajo del nivel cero y el precio de cierre se encuentra por debajo de la EMA de 50 periodos, tendremos una señal de venta.

              Esquemáticamente:

              AO actual > nivel cero Y precio de cierre > EMA de 50 periodos --> señal de compra

              AO actual < nivel cero Y precio de cierre < EMA de 50 periodos --> señal de venta

              Esquemas de estrategias según Awesome Oscillator

              A continuación, desarrollaremos esquemas paso a paso para cada una de las estrategias analizadas; esto nos ayudará a desarrollar sistemas comerciales basados en ellas.

                Estrategia uno: cruce del cero por parte de AO

                  Como parte de esta estrategia, crearemos un sistema comercial que genere señales alcistas o bajistas comparando constantemente dos valores: el AO actual y el nivel cero del indicador. Partiendo de las posiciones de estos valores en relación con los demás, se sacará una conclusión sobre la situación del mercado. Si el valor de AO es superior a cero, el sistema comercial deberá mostrar un comentario en el gráfico con los siguientes valores:

                  • Alcista
                  • Valor AO: n

                  En el escenario opuesto, si el valor de AO está por debajo de cero, el sistema comercial debería mostrar un comentario en el gráfico con los siguientes valores:

                  • Bajista
                  • Valor AO: n

                  Este esquema paso a paso le ayudará a desarrollar un sistema comercial para esta estrategia:

                  Esquema de desarrollo de la estrategia 1

                    Estrategia dos: Fuerza de AO

                      Como parte de esta estrategia, crearemos un sistema comercial que generare señales sobre la fuerza de AO comparando continuamente dos valores: el AO actual y la media del rendimiento del indicador en los cinco periodos anteriores. Compararemos los dos valores y determinaremos su posición en relación con el otro. Si el valor actual es superior a la media, el sistema comercial mostrará un comentario en el gráfico con los siguientes valores (se trata de la propia señal y de los valores a partir de los cuales se ha generado la señal):

                      • El movimiento de AO es fuerte
                      • AO CurrVal : n
                      • AO FirstVal : n
                      • AO SecondVal : n
                      • AO ThirdVal : n
                      • AO FourthVal : n
                      • AO FifthVal : n
                      • AO AvgVal : n

                      Si el valor de AO actual es inferior a la media, el sistema comercial mostrará un comentario diferente en el gráfico:

                      • El movimiento de AO es débil
                      • AO CurrVal : n
                      • AO FirstVal : n
                      • AO SecondVal : n
                      • AO ThirdVal : n
                      • AO FourthVal : n
                      • AO FifthVal : n
                      • AO AvgVal : n

                      Este esquema paso a paso le ayudará a desarrollar un sistema comercial para esta estrategia:

                       Esquema de desarrollo de la estrategia 2

                        Estrategia tres: AO y MA

                          Según la descripción de la estrategia en la sección anterior, crearemos un sistema comercial que se pueda utilizar para generar un comentario con señales de compra y venta. Esto requerirá un análisis continuo de cuatro valores, a saber:

                          • El valor actual de AO
                          • El nivel cero del indicador AO
                          • El precio de cierre
                          • Una media móvil de 50 periodos

                          Si el valor actual de AO es superior a cero y el precio de cierre está por encima de la media de 50 periodos, el sistema comercial mostrará un comentario en el gráfico con los siguientes valores:

                          • Compra
                          • Precio de cierre: n
                          • Valor AO: n
                          • Valor MA: n

                          En el escenario opuesto, si el valor AO es inferior a cero y el precio de cierre está por debajo de la media de 50 periodos, el sistema comercial deberá mostrar un comentario en el gráfico con los siguientes valores:

                          • Venta
                          • Precio de cierre: n
                          • Valor AO: n
                          • Valor MA: n

                          Este esquema paso a paso le ayudará a desarrollar un sistema comercial para esta estrategia:

                          Esquema de desarrollo de la estrategia 3

                          Sistemas comerciales basados en Awesome Oscillator

                          Así que ya hemos llegado a la parte más interesante del artículo: la creación de sistemas comerciales para las estrategias comentadas anteriormente. En primer lugar, escribiremos un programa sencillo que mostrará un comentario en el gráfico con el valor actual del indicador AO. Esto servirá como base para todos los demás sistemas.

                          Vamos a ver paso a paso la creación de un sistema comercial de este tipo.

                          Para ello, crearemos el array aoArray usando la función "double":

                          double aoArray[];

                          Luego estableceremos la bandera de clasificación como en la serie temporal AS_SERIES usando la función ArraySetAsSeries, que retornará true o false: Parámetros de la función:

                          • array[] — es un array; en nuestro caso, aoArray.
                          • flag — establece la bandera "true" para indicar la dirección de indexación en el array.
                          ArraySetAsSeries(aoArray,true);

                          A continuación, definiremos el indicador AO usando la función iAO, que retornará el manejador del indicador. Parámetros de la función:

                          • symbol — símbolo sobre el que se calcula el indicador; utilizaremos el actual (_Symbol).
                          • period — periodo del cálculo del indicador; utilizaremos el periodo actual (_period).
                          int aoDef = iAO(_Symbol,_Period);

                          Luego recuperaremos los datos del búfer del indicador AO usando la función CopyBuffer. Parámetros de la función: 

                          • indicator_handle — manejador estándar del indicador aoDef
                          • buffer_num — número del búfer de indicador; lo estableceremos en 0.
                          • start_pos — indica la posición del inicio del cálculo; estableceremos 0
                          • count — cantidad de datos a copiar; indicaremos 3.
                          • buffer[] — define el array de precios a copiar, en nuestro caso, será aoArray
                          CopyBuffer(aoDef,0,0,3,aoArray);

                          Después definiremos el valor de AO; para ello, crearemos la variable double aoVal para él y normalizaremos utilizando la función NormalizeDouble. Parámetros de la función Normalizedouble:

                          • value — número normalizado; en nuestro caso, aoArray[0].
                          • digits — número de dígitos después del punto decimal. Utilizaremos (7).
                          double aoVal = NormalizeDouble(aoArray[0],7);

                          Luego generaremos un comentario en el gráfico con el valor actual de AO utilizando la función Comment:

                          Comment("AO Value is ",aoVal);

                          A continuación, le mostramos el código completo para crear la estrategia mencionada:

                          //+------------------------------------------------------------------+
                          //|                                                    Simple AO.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"
                          //+------------------------------------------------------------------+
                          //| Expert initialization function                                   |
                          //+------------------------------------------------------------------+
                            void OnTick()
                            {
                             double aoArray[];
                             ArraySetAsSeries(aoArray,true);
                             int aoDef = iAO(_Symbol,_Period);
                             CopyBuffer(aoDef,0,0,3,aoArray);
                             double aoVal = NormalizeDouble(aoArray[0],7);
                             Comment("AO Value is ",aoVal);
                            }
                          //+------------------------------------------------------------------+
                          
                          

                          Después de ello, compilaremos el código del asesor. Si todo es correcto y el programa se ha compilado correctamente, el archivo del asesor aparecerá en la ventana del Navegador en el terminal:

                          Sistema AO simple en el Navegador

                          Clicamos dos veces en el archivo o lo arrastramos y soltamos en el gráfico. Esto hará que aparezca la ventana del asesor así:

                          Ventana del asesor Simple AO

                          Permitimos el comercio automático "Allow Algo Trading", pulsamos OK y el programa se iniciará en el gráfico:

                          Asesor Simple AO en el gráfico

                          En la esquina superior derecha del gráfico veremos una indicación de que el asesor está funcionando. Ahora estamos listos para recibir las señales generadas por el asesor. A continuación, le mostraremos un ejemplo de dicha señal:

                          Señal del asesor Simple AO

                          En el gráfico anterior, la señal con el valor AO actual generado por el asesor se muestra como un comentario en la esquina superior izquierda.

                            Estrategia uno: cruce del cero por parte de AO

                              Vamos a crear un sistema comercial basado en esta estrategia de cruce del valor AO y el nivel cero. A continuación, le mostraremos el código completo de este sistema:

                              //+------------------------------------------------------------------+
                              //|                                            AO Zero 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()
                                {
                                 double aoArray[];
                                 ArraySetAsSeries(aoArray,true);
                                 int aoDef = iAO(_Symbol,_Period);
                                 CopyBuffer(aoDef,0,0,3,aoArray);
                                 double aoVal = NormalizeDouble(aoArray[0],7);
                                 if(aoVal > 0)
                                   {
                                    Comment("Bullish","\n"
                                            "AO Value is ",aoVal);
                                   }
                              
                                 if(aoVal < 0)
                                   {
                                    Comment("Bearish","\n"
                                            "AO Value is ",aoVal);
                                   }
                                }
                              //+------------------------------------------------------------------+
                              
                              

                              Diferencias en este código.

                              Condiciones de esta estrategia.

                              En el caso de una señal alcista:

                                 if(aoVal > 0)
                                   {
                                    Comment("Bullish","\n"
                                            "AO Value is ",aoVal);
                                   }
                              
                              

                              En caso de una señal bajista:

                                 if(aoVal < 0)
                                   {
                                    Comment("Bearish","\n"
                                            "AO Value is ",aoVal);
                                   }
                              
                              

                              Después de ello, compilaremos el código del asesor. Si todo es correcto y el programa se compila correctamente, el archivo del asesor aparecerá en la ventana del Navegador en el terminal, lo ejecutaremos como el programa anterior. En el gráfico, tendrá el aspecto siguiente:

                              Asesor AO Zero Crossover en el gráfico

                              La indicación en la esquina superior derecha del gráfico mostrará que el asesor ha sido iniciado y se está ejecutando en el gráfico. El asesor funciona y genera señales.

                              Un ejemplo de señal alcista:

                              Asesor AO Zero Crossover - señal alcista

                              En el gráfico anterior, se muestra un comentario con los siguientes valores en la esquina superior izquierda del gráfico:

                              • Alcista
                              • El valor actual de AO

                              Ejemplo de señal bajista:

                              AO Zero Crossover - señal bajista

                              El comentario del gráfico muestra los siguientes valores:

                              • Bajista
                              • El valor actual de AO

                              Por lo tanto, la estrategia funciona y genera las señales alcistas y bajistas correspondientes.

                                Estrategia dos: Fuerza de AO

                                  A continuación, le mostramos el código completo para crear la estrategia mencionada:

                                  //+------------------------------------------------------------------+
                                  //|                                                  AO Strength.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 aoArray[];
                                     ArraySetAsSeries(aoArray,true);
                                     int aoDef = iAO(_Symbol,_Period);
                                     CopyBuffer(aoDef,0,0,6,aoArray);
                                  
                                  
                                     double aoCurrVal = NormalizeDouble(aoArray[0],6);
                                     double aoFifthVal = NormalizeDouble(aoArray[1],6);
                                     double aoFourthVal = NormalizeDouble(aoArray[2],6);
                                     double aoThirdVal = NormalizeDouble(aoArray[3],6);
                                     double aoSecondVal = NormalizeDouble(aoArray[4],6);
                                     double aoFirstVal = NormalizeDouble(aoArray[5],6);
                                  
                                     double aoAvgVal = NormalizeDouble((aoFifthVal+aoFourthVal+aoThirdVal+aoSecondVal+aoFirstVal)/5,6);
                                  
                                     if(aoCurrVal > aoAvgVal)
                                       {
                                        Comment("AO Movement is strong","\n",
                                                "AO CurrVal : ",aoCurrVal,"\n",
                                                "AO FirstVal : ",aoFifthVal,"\n",
                                                "AO SecondVal : ",aoFourthVal,"\n",
                                                "AO ThirdVal : ",aoThirdVal,"\n",
                                                "AO FourthVal : ",aoSecondVal,"\n",
                                                "AO FifthVal : ",aoFirstVal,"\n",
                                                "AO AvgVal : ",aoAvgVal
                                               );
                                       }
                                  
                                     if(aoCurrVal < aoAvgVal)
                                       {
                                        Comment("AO Movement is Weak","\n",
                                                "AO CurrVal : ",aoCurrVal,"\n",
                                                "AO FirstVal : ",aoFifthVal,"\n",
                                                "AO SecondVal : ",aoFourthVal,"\n",
                                                "AO ThirdVal : ",aoThirdVal,"\n",
                                                "AO FourthVal : ",aoSecondVal,"\n",
                                                "AO FifthVal : ",aoFirstVal,"\n",
                                                "AO AvgVal : ",aoAvgVal
                                               );
                                       }
                                  
                                    }
                                  //+------------------------------------------------------------------+
                                  
                                  

                                  Diferencias en este código:

                                  Usando la función NormalizeDouble, determinaremos los valores del valor actual de AO y los cinco valores anteriores:

                                     double aoCurrVal = NormalizeDouble(aoArray[0],6);
                                     double aoFifthVal = NormalizeDouble(aoArray[1],6);
                                     double aoFourthVal = NormalizeDouble(aoArray[2],6);
                                     double aoThirdVal = NormalizeDouble(aoArray[3],6);
                                     double aoSecondVal = NormalizeDouble(aoArray[4],6);
                                     double aoFirstVal = NormalizeDouble(aoArray[5],6);
                                  
                                  

                                  Luego encontraremos el valor medio de AO en cinco periodos:

                                  double aoAvgVal = NormalizeDouble((aoFifthVal+aoFourthVal+aoThirdVal+aoSecondVal+aoFirstVal)/5,6);

                                  Las condiciones de esta estrategia.

                                  Ejemplo de movimiento de AO fuerte:

                                     if(aoCurrVal > aoAvgVal)
                                       {
                                        Comment("AO Movement is strong","\n",
                                                "AO CurrVal : ",aoCurrVal,"\n",
                                                "AO FirstVal : ",aoFifthVal,"\n",
                                                "AO SecondVal : ",aoFourthVal,"\n",
                                                "AO ThirdVal : ",aoThirdVal,"\n",
                                                "AO FourthVal : ",aoSecondVal,"\n",
                                                "AO FifthVal : ",aoFirstVal,"\n",
                                                "AO AvgVal : ",aoAvgVal
                                               );
                                       }
                                  
                                  

                                  Ejemplo de movimiento de AO débil:

                                     if(aoCurrVal < aoAvgVal)
                                       {
                                        Comment("AO Movement is Weak","\n",
                                                "AO CurrVal : ",aoCurrVal,"\n",
                                                "AO FirstVal : ",aoFifthVal,"\n",
                                                "AO SecondVal : ",aoFourthVal,"\n",
                                                "AO ThirdVal : ",aoThirdVal,"\n",
                                                "AO FourthVal : ",aoSecondVal,"\n",
                                                "AO FifthVal : ",aoFirstVal,"\n",
                                                "AO AvgVal : ",aoAvgVal
                                               );
                                       }
                                  
                                  

                                  Después de ello, compilaremos el código del asesor. Si el programa se ha compilado sin errores, localizaremos el archivo del asesor en la ventana del Navegador y lo ejecutaremos en el gráfico. Veremos lo siguiente:

                                  Asesor AO Strength 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.

                                  Ejemplo de una señal de AO fuerte:

                                  Asesor AO Strength - señal fuerte

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

                                  • El movimiento de AO es fuerte
                                  • AO CurrVal : n
                                  • AO FirstVal : n
                                  • AO SecondVal : n
                                  • AO ThirdVal : n
                                  • AO FourthVal : n
                                  • AO FifthVal : n
                                  • AO AvgVal : n

                                  Ejemplo de una señal de AO débil:

                                  Asesor AO Strength - señal débil

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

                                  • El movimiento de AO es débil
                                  • AO CurrVal : n
                                  • AO FirstVal : n
                                  • AO SecondVal : n
                                  • AO ThirdVal : n
                                  • AO FourthVal : n
                                  • AO FifthVal : n
                                  • AO AvgVal : n

                                  Por lo tanto, el asesor para esta estrategia funciona y genera las señales correspondientes.

                                    Estrategia tres: AO y MA

                                      Para este sistema comercial, el código será el siguiente:

                                      //+------------------------------------------------------------------+
                                      //|                                             AO & MA Strategy.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 pArray[];
                                         double aoArray[];
                                         double maArray[];
                                      
                                         int Data=CopyRates(_Symbol,_Period,0,1,pArray);
                                         ArraySetAsSeries(aoArray,true);
                                         ArraySetAsSeries(maArray,true);
                                         
                                         int aoDef = iAO(_Symbol,_Period);
                                         int maDef = iMA(_Symbol,_Period,50,0,MODE_EMA,PRICE_CLOSE);
                                      
                                         CopyBuffer(aoDef,0,0,3,aoArray);
                                         CopyBuffer(maDef,0,0,3,maArray);
                                      
                                         double closingPrice = pArray[0].close;
                                         double aoVal = NormalizeDouble(aoArray[0],7);
                                         double maVal = NormalizeDouble(maArray[0],7);
                                      
                                         if(aoVal > 0 && closingPrice > maVal)
                                           {
                                            Comment("Buy","\n"
                                                    "Closing Price is ",closingPrice,"\n",
                                                    "AO Value is ",aoVal,"\n",
                                                    "MA Value is ",maVal);
                                           }
                                      
                                         if(aoVal < 0 && closingPrice < maVal)
                                           {
                                            Comment("Sell","\n"
                                                    "Closing Price is ",closingPrice,"\n",
                                                    "AO Value is ",aoVal,"\n",
                                                    "MA Value is ",maVal);
                                           }
                                      
                                        }
                                      //+------------------------------------------------------------------+
                                      
                                      

                                      Diferencias en este código.

                                      Crea tres arrays: pArray, aoArray y maArray. Usaremos la función double para aoArray y maArray, y para pArray utilizaremos la función MqlRates para almacenar la información sobre el precio, el volumen y el spread.

                                         MqlRates pArray[];
                                         double aoArray[];
                                         double maArray[];
                                      
                                      

                                      Luego estableceremos la bandera AS_SERIES para los arrays aoArray y maArray. Después utilizaremos la función CopyRates para rellenar el array y obtener los datos históricos de MqlRates. Parámetros de la función:

                                      • symbol_name — nombre del símbolo; indicaremos _Symbol para usar el actual
                                      • period — periodo de cálculo del indicador; usaremos el periodo actual (_period)
                                      • start_pos — indica la posición del inicio del cálculo; estableceremos 0 
                                      • count — cantidad de datos para copiar; indicaremos 1
                                      • rates_array[] — array en la que se copian los datos
                                         int Data=CopyRates(_Symbol,_Period,0,1,pArray);
                                         ArraySetAsSeries(aoArray,true);
                                         ArraySetAsSeries(maArray,true);
                                      
                                      

                                      A continuación, definiremos AO y MA:

                                      Para el indicador AO, usaremos la función iOA.

                                      Para la media móvil MA, utilizaremos la función iMA con estos parámetros:

                                      • symbol — nombre del símbolo; en nuestro caso, _Symbol 
                                      • period — periodo; en nuestro caso, _period
                                      • ma_period — periodo para calcular la media; para nosotros será 50 
                                      • ma_shift — desplazamiento horizontal; lo estableceremos en 0 
                                      • ma_method — tipo de suavización de la media móvil; utilizaremos la exponencial. 
                                      • applied_price — define el tipo de precio utilizado para el cálculo; nosotros utilizaremos el precio de cierre
                                         int aoDef = iAO(_Symbol,_Period);
                                         int maDef = iMA(_Symbol,_Period,50,0,MODE_EMA,PRICE_CLOSE);
                                      
                                      

                                      Vamos a recuperar los datos del búfer de los indicadores AO y MA usando la función "CopyBuffer".

                                         CopyBuffer(aoDef,0,0,3,aoArray);
                                         CopyBuffer(maDef,0,0,3,maArray);
                                      
                                      

                                      A continuación, definiremos el precio de cierre, aoArray y maArray.

                                         double closingPrice = pArray[0].close;
                                         double aoVal = NormalizeDouble(aoArray[0],7);
                                         double maVal = NormalizeDouble(maArray[0],7);
                                      
                                      

                                      Las condiciones de la estrategia.

                                      Con una señal de compra

                                         if(aoVal > 0 && closingPrice > maVal)
                                           {
                                            Comment("Buy","\n"
                                                    "Closing Price is ",closingPrice,"\n",
                                                    "AO Value is ",aoVal,"\n",
                                                    "MA Value is ",maVal);
                                           }
                                      
                                      

                                      Señal de venta

                                         if(aoVal < 0 && closingPrice < maVal)
                                           {
                                            Comment("Sell","\n"
                                                    "Closing Price is ",closingPrice,"\n",
                                                    "AO Value is ",aoVal,"\n",
                                                    "MA Value is ",maVal);
                                           }
                                      
                                      

                                      Luego compilaremos el código del asesor y este aparecerá en la ventana del Navegador en el terminal, desde donde lo ejecutaremos en el gráfico:

                                       Asesor AO & MA en el gráfico

                                      Podemos ver que el asesor experto está adjunto al gráfico, así como el icono correspondiente en la esquina superior derecha. El asesor está listo para generar señales.

                                      Señal de compra:

                                       Asesor AO & MA - señales de compra

                                      En el gráfico anterior, se muestra un comentario con los siguientes valores en la esquina superior izquierda del gráfico:

                                      • Compra
                                      • Precio de cierre: n
                                      • Valor AO: n
                                      • Valor MA: n

                                      Ejemplo de señal de venta:

                                       Asesor AO & MA - señal de venta

                                      En el gráfico aparecerá un comentario con los valores de la señal y de los indicadores:

                                      • Venta
                                      • Precio de cierre: n
                                      • Valor AO: n
                                      • Valor MA: n


                                      Conclusión

                                      En el artículo de hoy, hemos analizado el indicador Awesome Oscillator y todos sus detalles: qué es, qué mide y cómo se puede calcular manualmente. Asimismo, hemos visto cómo encontrar y ejecutar en el gráfico el indicador incorporado en MetaTrader 5. Asimismo, hemos visto cómo usarlo con estrategias sencillas basadas en su concepto básico. Hemos analizado las tres estrategias siguientes:

                                      • La primera estrategia es "Cruce de AO y el Nivel Cero", que sirve para obtener señales alcistas y bajistas basadas en el cruce del nivel cero.
                                      • La segunda estrategia es "Fuerza de AO", que señala la fuerza del movimiento de AO basándose en la posición del valor de AO y el valor medio de las cinco lecturas anteriores. 
                                      • La tercera estrategia es "Señales según AO y MA", que genera señales de compra y venta basadas en la posición de AO actual respecto al nivel cero, y del precio de cierre respecto a la EMA de 50 periodos.

                                      Después de eso, hemos creado planes paso a paso para desarrollar cada una de las estrategias discutidas. Dichos planes ayudan a desarrollar organizadamente ideas en forma de esquemas comprensibles. Por último, hemos creado sistemas automáticos basados en cada una de las estrategias comentadas. Estos han sido diseñados para funcionar en el terminal comercial MetaTrader 5.

                                      Esperamos que escriba su propio código repitiendo todo lo que hemos hablado en este artículo. En primer lugar, le ayudará a entender mejor las ideas analizadas, y en segundo lugar, podrá encontrar nuevas ideas mientras trabaja en las estrategias. Una vez más, resultará esencial que ponga a prueba cuidadosamente cualquier nuevo conocimiento antes de aplicarlo a su cuenta real: así se asegurará de que se adapte a su estilo y comprensión del comercio. Al fin y al cabo, lo que funciona para otros no tiene por qué funcionar para usted.

                                      Si le ha gustado este artículo y lo ha encontrado útil, lea los artículos anteriores de la misma serie para aprender a desarrollar un sistema comercial basado en los indicadores técnicos más populares.

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

                                      Archivos adjuntos |
                                      Simple_AO.mq5 (1.01 KB)
                                      AO_Strength.mq5 (2.07 KB)
                                      DoEasy. Elementos de control (Parte 19): Scrolling de pestañas en el elemento TabControl, eventos de objetos WinForms DoEasy. Elementos de control (Parte 19): Scrolling de pestañas en el elemento TabControl, eventos de objetos WinForms
                                      En este artículo, crearemos la funcionalidad necesaria para el scrolling de los encabezados de las pestañas en TabControl usando los botones de control de scrolling. La funcionalidad servirá para organizar los encabezados de las pestañas en una sola línea a cualquier lado del control.
                                      Redes neuronales: así de sencillo (Parte 29): Algoritmo actor-crítico con ventaja (Advantage actor-critic) Redes neuronales: así de sencillo (Parte 29): Algoritmo actor-crítico con ventaja (Advantage actor-critic)
                                      En los artículos anteriores de esta serie, nos familiarizamos con dos algoritmos de aprendizaje por refuerzo. Obviamente, cada uno de ellos tiene sus propias ventajas y desventajas. Como suele suceder en estos casos, se nos ocurre combinar ambos métodos en un algoritmo que incorporaría lo mejor de los dos, y así compensar las carencias de cada uno de ellos. En este artículo, hablaremos de dicho método.
                                      Tablero de cotizaciones: Versión básica Tablero de cotizaciones: Versión básica
                                      Aquí te mostraré cómo crear esas pantallas en forma de banda, normalmente usadas para mostrar cotizaciones como en la bolsa, pero pura y simplemente usando MQL5, sin recurrir a programación externa complicada e innecesariamente sofisticada.
                                      DoEasy. Elementos de control (Parte 18): Preparamos la funcionalidad para el scrolling de las pestañas en TabControl DoEasy. Elementos de control (Parte 18): Preparamos la funcionalidad para el scrolling de las pestañas en TabControl
                                      En este artículo colocaremos los botones de control de scrolling del encabezado en el objeto WinForms TabControl en su lugar en caso de que la fila del encabezado no se ajuste al tamaño del control, y haremos que la fila del encabezado se desplace al clicar en un encabezado de pestaña recortado.