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

Aprendiendo a diseñar un sistema de trading con Force Index

MetaTrader 5Trading | 21 septiembre 2022, 10:21
718 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. En este artículo, aprenderemos a crear sistemas comerciales basados en las lecturas del Índice de Fuerza, o Force Index. Asimismo, exploraremos con detalle qué supone esta herramienta técnica. Para ello, veremos los siguientes temas:

  1. Definición del Índice de Fuerza
  2. Estrategias del Índice de Fuerza
  3. Esquemas de la estrategia del Índice de Fuerza
  4. Sistemas comerciales del Índice de Fuerza
  5. Conclusión

Con la ayuda de estos temas, podremos entender las características del indicador y aprender a utilizarlo. Vamos a descubrir qué es el indicador, qué mide y cómo se calcula. Una vez entendidos los fundamentos, pasaremos a las estrategias del Índice de Fuerza. A continuación, sistematizaremos nuestras ideas antes de desarrollar un sistema comercial para cualquiera de las estrategias analizadas. Para ello, elaboraremos un plan de desarrollo para cada una de las estrategias. Luego pasaremos al tema más interesante: la creación de sistemas comerciales de MQL5 basados en estas estrategias; estos podrán generar señales de forma automática y precisa para su uso en la plataforma comercial MetaTrader 5.

Escribiremos el código en el lenguaje de programación incorporado MQL5 (MetaQuotes Language) y usaremos la plataforma comercial MetaTrader 5 para su ejecución. Si no sabe cómo descargar o usar el MetaEditor, le recomendamos leer la sección "Escribiendo el código MQL5 en el MetaEditor" de uno de mis artículos anteriores. Asimismo, le recomendamos que lleve a la práctica todo lo leído y estudie los materiales por sí mismo. Esto le ayudará a comprender mejor los materiales y sacarles el máximo partido posible. Además, asegúrese de probar todo en el simulador de estrategias antes de utilizarlo en una cuenta real.

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

Pues bien, echemos un vistazo al indicador.


Definición del Índice de Fuerza

En esta sección estudiaremos el indicador de Índice de Fuerza con detalle, y descubriremos qué es, qué mide y cómo calcularlo. Nuestra intención es llegar hasta los cimientos del mismo, para comprender todo mejor. Esto le permitirá no solo aprovechar mejor las herramientas, sino también desarrollar otras ideas. El Índice de Fuerza fue desarrollado por Alexander Elder, que lo introdujo en su libro «Cómo jugar y ganar en la Bolsa». El indicador mide la fuerza del movimiento e identifica posibles puntos de pivote. El Índice de Fuerza usa el precio y el volumen en sus cálculos, y esto le permite medir la fuerza de cualquier movimiento en el mercado.

Para entender mejor los fundamentos del indicador, vamos a ver cómo calcularlo manualmente. El cálculo no es muy complicado y consta de dos pasos:

1. Índice de fuerza del periodo 1 = (cierre del periodo - cierre del periodo anterior) * volumen

2. Índice de fuerza de 13 periodos = EMA de 13 periodos del índice de fuerza 1 periodo

Estudiamos el cálculo del indicador solo para tener una mejor comprensión. Pero ahora no necesitamos calcular el indicador manualmente, ya que existe un indicador listo para usar en el terminal comercial MetaTrader 5: lo único que debemos hacer es seleccionarlo de la lista de indicadores. En la plataforma comercial MetaTrader 5, seleccionaremos el menú "Insertar" --> Indicadores --> Tendencia --> Force Index.

Este será su aspecto en el terminal:

Seleccionamos el indicador de Índice de Fuerza en la plataforma

Una vez seleccionado el Índice de Fuerza, se abrirá una ventana para configurar los ajustes del indicador:

Parámetros del indicador de Índice de Fuerza

1 — periodo del indicador. Utilizaremos (13) como ajuste del indicador por defecto.

2 — tipo de media móvil. Usaremos la exponencial.

3 — tipo de volúmenes. Usaremos el volumen de ticks.

4 — color de la línea del indicador.

5 — estilo de línea del indicador.

6 — grosor de la línea del indicador.

Después de ajustar los parámetros, el indicador aparecerá en el gráfico como mostramos a continuación.

Índice de Fuerza en el gráfico

El indicador Force Index es un oscilador, por lo que se mostrará en una ventana gráfica adicional, dibujando una línea que oscila por encima y por debajo de cero.


Estrategias del Índice de Fuerza

En esta parte, aprenderemos a usar el indicador Force Index según su concepto, utilizando como ejemplo estrategias simples. Solo utilizaremos estrategias sencillas para entender el concepto básico, como ejemplo de la forma en que podemos usar un indicador y crear un sistema comercial con él. Recuerde que siempre deberá probarlos antes de utilizarlos en una cuenta real. En cualquier caso, el objetivo principal de estas estrategias es únicamente ilustrativo.

    Estrategia uno: Índice de Fuerza - identificador de tendencia

      Usando como base esta estrategia, obtendremos señales alcistas o bajistas en función del cruce del nivel cero por parte del indicador. Si el Índice de Fuerza es mayor que cero, esto indicará un movimiento alcista. Por el contrario, si el Índice de Fuerza está por debajo de cero, señalará un movimiento bajista.

      Es decir:

      Índice de Fuerza > Nivel cero --> Movimiento alcista.

      Índice de Fuerza < Nivel cero --> Movimiento bajista.

        Estrategia dos: Índice de Fuerza - alcista o divergencia

          Utilizaremos esta estrategia para determinar si el mercado se encuentra ahora en un fuerte movimiento alcista o si se ha formado una divergencia. Si el máximo actual es mayor que el máximo anterior y el valor actual del Índice de Fuerza es mayor que su valor anterior, será la señal de un fuerte movimiento alcista. Y si el máximo actual es mayor que el anterior, pero el valor del Índice de Fuerza actual es menor que su valor anterior, será una señal de divergencia bajista.

          Así, tenemos lo siguiente:

          Máximo actual > Máximo anterior e Índice de Fuerza actual > Índice de Fuerza anterior --> Fuerte movimiento alcista.

          Máximo actual > Máximo anterior e Índice de Fuerza actual < Índice de Fuerza anterior --> Divergencia bajista.

            Estrategia tres: Índice de Fuerza - bajista o divergencia

              Esta estrategia es la opuesta a la anterior. Generará señales de un fuerte movimiento bajista o de divergencia según ciertas condiciones. Si el mínimo actual es inferior al mínimo anterior y el valor del oscilador actual es inferior a la lectura anterior, esto indicará que el movimiento bajista es fuerte. Si el mínimo actual es menor que el máximo anterior y el valor del Índice de Fuerza actual es mayor que su valor anterior, será una señal de divergencia alcista (divergencia).

              Por lo tanto:

              Mínimo actual < Mínimo anterior e Índice de Fuerza actual < Índice de Fuerza anterior --> Movimiento bajista fuerte.

              Mínimo actual < Mínimo anterior e Índice de fuerza actual > Índice de Fuerza anterior --> Divergencia alcista.

                Estrategia cuatro: Señales del Índice de Fuerza

                  Esta estrategia puede generar señales de compra y venta basadas en condiciones determinadas. Si el precio de cierre está por encima de la media móvil exponencial, el Índice de Fuerza anterior está por debajo de cero y su valor actual está por encima de cero, será una señal de compra. Por el contrario, si el precio de cierre está por debajo de la media móvil exponencial, el Índice de Fuerza anterior está por encima de cero y su valor actual es inferior a cero, será una señal de venta.

                  Precio de cierre > EMA, Índice de Fuerza anterior < Nivel cero e Índice de Fuerza actual > Nivel cero --> Señal de compra.

                  Precio de cierre < EMA, Índice de Fuerza anterior > Nivel cero e Índice de Fuerza actual < Nivel cero --> Señal de venta.


                  Esquemas de la estrategia del Índice de Fuerza

                  En esta sección, crearemos un plan de desarrollo paso a paso que nos ayudará a escribir el código del sistema comercial. Este paso es muy importante, ya que ayuda a organizar las ideas de forma que resulte más sencillo convertirlas en un sistema comercial.

                    Estrategia uno: Índice de Fuerza - identificador de tendencia

                      Un sistema comercial basado en esta estrategia debería generar automáticamente una señal alcista o bajista y mostrarla en los comentarios del gráfico. El asesor deberá comprobar el valor del Índice de Fuerza actual en cada tick y determinar su posición respecto a cero. Si el valor actual es superior a cero, mostraremos un comentario en el gráfico indicando que en el mercado hay movimiento alcista, así como el valor del propio Índice de Fuerza. Por el contrario, si el valor actual del Índice de Fuerza es inferior a cero, el asesor deberá mostrar un comentario en el gráfico indicando que el movimiento es bajista y también mostrar este valor actual.

                      Esquema de la estrategia de Force Index - Identificador de tendencia

                        Estrategia dos: Índice de Fuerza - alcista o divergencia

                          En esta estrategia, crearemos un asesor que generará una señal para un fuerte movimiento alcista o una divergencia bajista. Para ello, el sistema comercial comprobará continuamente cuatro valores: los máximos actuales y anteriores y el valor del Índice de Fuerza actual y anterior, para así compararlos y determinar qué valor es mayor en cada par. Si el máximo actual es mayor que el anterior y el Índice de Fuerza actual es mayor que su valor anterior, el asesor deberá mostrar este comentario en el gráfico (cada valor en una línea aparte):

                          • Strong up move (fuerte movimiento alcista)
                          • Máximo actual
                          • Máximo anterior
                          • Valor actual del Índice de Fuerza
                          • Valor anterior del Índice de Fuerza

                          Si el máximo actual es mayor que el anterior, pero el Índice de Fuerza actual es menor que su valor anterior, el asesor deberá mostrar este comentario en el gráfico (de nuevo, cada valor en una línea distinta):

                          • Bearish divergence (divergencia bajista)
                          • Máximo actual
                          • Máximo anterior
                          • Valor actual del Índice de Fuerza
                          • Valor anterior del Índice de Fuerza

                          El esquema de la estrategia en sí tendrá el aspecto que sigue:

                          Índice de Fuerza - Alcista o divergencia

                            Estrategia tres: Índice de Fuerza - bajista o divergencia

                              Con esta estrategia, crearemos un asesor que generará una señal para un fuerte movimiento bajista o una divergencia alcista. Para ello, el asesor deberá comprobar constantemente cuatro valores: el mínimo actual y el anterior, así como el valor del Índice de Fuerza actual y el anterior. Tiene que compararlos y determinar qué valor es menor en cada par. Si el mínimo actual es inferior al mínimo anterior y el Índice de Fuerza actual también es inferior a su valor anterior, el asesor deberá mostrar un comentario sobre ello en el gráfico (de nuevo, cada valor en una línea distinta):

                              • Strong down move (fuerte movimiento bajista)
                              • Mínimo actual
                              • Mínimo actual
                              • Valor actual del Índice de Fuerza
                              • Valor anterior del Índice de Fuerza

                              Si el mínimo actual es inferior al mínimo anterior y el Índice de Fuerza actual, por el contrario, es superior a su valor anterior, el asesor deberá mostrar este comentario en el gráfico (de nuevo, cada valor en una línea distinta):

                              • Bullish divergence (divergencia alcista)
                              • Mínimo actual
                              • Mínimo actual
                              • Valor actual del Índice de Fuerza
                              • Valor anterior del Índice de Fuerza

                              A continuación, le mostramos el esquema de esta estrategia:

                              Esquema de la estrategia de Force Index - Bajista o divergencia

                                Estrategia cuatro: Señales del Índice de Fuerza

                                  Esta estrategia puede generar señales de compra y venta basadas en condiciones determinadas. Una vez más, el asesor comprobará continuamente los cuatro valores. Esta vez serán: el precio de cierre, la media móvil y los valores del Índice de Fuerza actual y anterior. Si el precio de cierre es superior al valor actual de la media móvil, el valor anterior del Índice de Fuerza es inferior a cero y el valor actual es superior a cero, el asesor mostrará un comentario en el gráfico con los siguientes valores:

                                  • Señal de compra
                                  • Precio de cierre actual
                                  • Valor actual de la media móvil exponencial
                                  • Valor actual del Índice de Fuerza
                                  • Valor anterior del Índice de Fuerza

                                  Si el precio de cierre es inferior al valor actual de la media móvil, el valor anterior del Índice de Fuerza es superior a cero y el valor actual es inferior a cero, el asesor mostrará un comentario en el gráfico con los siguientes valores:

                                  • Señal de venta
                                  • Precio de cierre actual
                                  • Valor actual de la media móvil exponencial
                                  • Valor actual del Índice de Fuerza
                                  • Valor anterior del Índice de Fuerza

                                  La siguiente figura muestra el esquema de esta estrategia:

                                  Esquemas de la estrategia Señales del Índice de Fuerza

                                  Sistemas comerciales del Índice de Fuerza

                                  Veamos ahora cómo crear un sistema comercial en MQL5 para cada una de estas estrategias y cómo recibir señales automáticas en la plataforma MetaTrader 5. En primer lugar, escribiremos un programa simple que mostrará un comentario en el gráfico con el valor del indicador Force Index. Esto servirá como base para todos los demás sistemas.

                                  • Creamos el array fiArray usando una función de tipo "double".
                                  double fiArray[];
                                  • A continuación, clasificamos el array en orden inverso empezando por los datos actuales, utilizando la función ArraySetAsSeries. Esta retornará true o false: Los parámetros de esta función serán:
                                    • array[]
                                    • flag
                                  ArraySetAsSeries(fiArray,true);
                                  • Ahora, definimos el volumen usando la función iForce; para ello, hemos creado la variable fiDef. La función iForce retornará el manejador del indicador de Índice de Fuerza. Los parámetros de esta función serán:
                                    • symbol — utilizaremos el valor _Symbol, que indica el cálculo a partir del símbolo actual.
                                    • period — utilizaremos el valor _Period para realizar los cálculos según el periodo o marco temporal actual.
                                    • ma_period — periodo de MA (13) como la longitud de la media móvil utilizada.
                                    • ma_method — tipo de media móvil, aquí será MODE_EMA
                                    • applied_volume — utilizaremos volúmenes de ticks (VOLUME_TICK)
                                  int fiDef = iForce(_Symbol,_Period,13,MODE_EMA,VOLUME_TICK);
                                  • Rellenamos el array usando la función CopyBuffer con los datos del indicador Force Index. Los parámetros de esta función serán:
                                    • indicator_handle — manejador del indicador, usaremos fiDef.     
                                    • buffer_num — número del búfer de indicador, lo estableceremos en 0.
                                    • start_pos — hora de inicio del cálculo, pondremos (0).         
                                    • count — número de datos a copiar, usaremos (13).                
                                    • buffer[] — búfer de destino para copiar, usaremos nuestro fiArray.
                                  CopyBuffer(fiDef,0,0,3,fiArray);
                                  • Definiremos el valor actual del Índice de Fuerza utilizando la función NormalizeDouble después de crear una variable para fiVal. La función NormalizeDouble retornará un valor de tipo double. Sus parámetros serán:
                                    • value — valor normalizado, en nuestro caso será fiArray[0].
                                    • digits — número de dígitos decimales después de la normalización, usaremos 6.
                                  double fiVal = NormalizeDouble(fiArray[0],6);
                                  • Con la ayuda de la función Comment, mostraremos un comentario con el valor de Force Index.
                                  Comment("Force Index Value is ",fiVal);

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

                                  //+------------------------------------------------------------------+
                                  //|                                           Simple Force Index.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 fiArray[];
                                  
                                     ArraySetAsSeries(fiArray,true);
                                  
                                     int fiDef = iForce(_Symbol,_Period,13,MODE_EMA,VOLUME_TICK);
                                  
                                     CopyBuffer(fiDef,0,0,3,fiArray);
                                  
                                     double fiVal = NormalizeDouble(fiArray[0],6);
                                  
                                     Comment("Force Index Value is ",fiVal);
                                  
                                    }
                                  //+------------------------------------------------------------------+
                                  
                                  

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

                                  Force Index en el Navegador 1

                                  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 de sistema simple según el indicador Force Index

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

                                  Sistema simple según el indicador Force Index en el gráfico

                                  Como podemos ver, en la esquina superior derecha del gráfico ha aparecido una indicación señalando que el asesor está funcionando en el gráfico.

                                  El sistema generará señales. En la siguiente captura de pantalla, le mostramos ejemplos de estas señales:

                                  Señal del sistema según el indicador Force Index en el gráfico

                                  En la esquina superior izquierda del gráfico aparecerá un comentario con una señal del valor actual del Índice de Fuerza.

                                  Podemos comprobar si las señales generadas son efectivamente las mismas que las del indicador incorporado en MetaTrader 5. Para ello, ejecutaremos el indicador con la misma configuración en el gráfico donde se ejecuta el asesor. Las lecturas de ambos programas son las mismas:

                                  Indicador Force Index - señales coincidentes

                                  En la esquina superior derecha del gráfico habrá una indicación sobre la presencia de un asesor adjunto, y en la esquina superior izquierda, tendremos un comentario con el valor del Índice de Fuerza que genera este asesor. El Índice de Fuerza en sí se muestra en una ventana adicional del indicador, debajo del gráfico principal de precios. Podemos ver claramente que ambos valores son iguales.

                                    Estrategia uno: Índice de Fuerza - identificador de tendencia

                                      El código completo del sistema comercial que opera según esta estrategia tiene el aspecto que sigue:

                                      //+------------------------------------------------------------------+
                                      //|                               Force Index - 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()
                                        {
                                         double fiArray[];
                                      
                                         ArraySetAsSeries(fiArray,true);
                                      
                                         int fiDef = iForce(_Symbol,_Period,100,MODE_EMA,VOLUME_TICK);
                                      
                                         CopyBuffer(fiDef,0,0,3,fiArray);
                                      
                                         double fiVal = NormalizeDouble(fiArray[0],6);
                                      
                                         if(fiVal>0)
                                           {
                                            Comment("Bullish Movement","\n","Force Index Value is ",fiVal);
                                           }
                                      
                                         if(fiVal<0)
                                           {
                                            Comment("Bearish Movement","\n","Force Index Value is ",fiVal);
                                           }
                                      
                                        }
                                      //+------------------------------------------------------------------+
                                      

                                      Este código se diferencia en las condiciones de la estrategia.

                                      En caso de movimiento alcista

                                         if(fiVal>0)
                                           {
                                            Comment("Bullish Movement","\n","Force Index Value is ",fiVal);
                                           }
                                      

                                      En caso de movimiento bajista

                                         if(fiVal<0)
                                           {
                                            Comment("Bearish Movement","\n","Force Index Value is ",fiVal);
                                           }
                                      

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

                                      Force Index 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 de la estrategia de Force Index - Identificador de tendencia

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

                                      Sistema de Force Index - Identificador de tendencia en el gráfico

                                      Como podemos ver, en la esquina superior derecha del gráfico ha aparecido una indicación señalando que el asesor está funcionando en el gráfico.

                                      A continuación, mostramos algunos ejemplos de señales generadas por este sistema comercial durante las pruebas.

                                      En caso de movimiento alcista:

                                      Force Index - Indicador de tendencia en el gráfico - Señal alcista

                                      En la esquina superior izquierda del gráfico, aparece un comentario indicando que ahora hay un movimiento alcista, además del valor actual del Índice de Fuerza.

                                      En caso de movimiento bajista

                                      Force Index - identificador de tendencia en el gráfico - señal bajista

                                      En la esquina superior izquierda del gráfico, aparece un comentario indicando que ahora hay un movimiento bajista, además del valor actual del Índice de Fuerza.

                                        Estrategia dos: Índice de Fuerza - alcista o divergencia

                                          A continuación, le mostraremos el código completo para crear dicha estrategia:

                                          //+------------------------------------------------------------------+
                                          //|                               Force Index - Up or Divergence.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 fiArray[];
                                             MqlRates pArray[];
                                          
                                             ArraySetAsSeries(fiArray,true);
                                             int Data=CopyRates(_Symbol,_Period,0,3,pArray);
                                          
                                             int fiDef = iForce(_Symbol,_Period,13,MODE_EMA,VOLUME_TICK);
                                          
                                             CopyBuffer(fiDef,0,0,3,fiArray);
                                          
                                             double fiCurrentVal = NormalizeDouble(fiArray[0],6);
                                             double fiPrevVal = NormalizeDouble(fiArray[1],6);
                                          
                                             double currentHighVal=NormalizeDouble(pArray[2].high,6);
                                             double prevHighVal=NormalizeDouble(pArray[1].high,6);
                                          
                                             if(currentHighVal>prevHighVal && fiCurrentVal>fiPrevVal)
                                               {
                                                Comment("Strong up move","\n",
                                                "Current High is ",currentHighVal,"\n",
                                                "Previous High is ",prevHighVal,"\n",
                                                "Current Force Index Value is ",fiCurrentVal,"\n",
                                                "Previous Force Index Value is ",fiPrevVal);
                                               }
                                          
                                             if(currentHighVal>prevHighVal && fiCurrentVal<fiPrevVal)
                                               {
                                                Comment("Bearish Divergence","\n",
                                                "Current High is ",currentHighVal,"\n",
                                                "Previous High is ",prevHighVal,"\n",
                                                "Current Force Index Value is ",fiCurrentVal,"\n",
                                                "Previous Force Index Value is ",fiPrevVal);
                                               }
                                          
                                            }
                                          //+------------------------------------------------------------------+
                                          

                                          Qué ha cambiado en el código con respecto al anterior:

                                          Aquí crearemos dos arrays, uno para los valores de fiArray utilizando la función double, como en el sistema anterior, y otro para el array de precios usando la función MqlRates, que almacenará la información del precio, el volumen y el spread.

                                             double fiArray[];
                                             MqlRates pArray[];
                                          

                                          Clasificamos estos arrays: Para fiArray, utilizaremos la función ArraySetAsSeries como hicimos en el ejemplo anterior. Para pArray, usaremos la función CopyRates y obtendremos los datos históricos de MqlRates. Parámetros de la función:

                                          • symbol name — nombre del símbolo, utilizaremos _Symbol.
                                          • timeframe — utilizaremos el periodo _Period actual.
                                          • start time — hora de inicio, usaremos 0.
                                          • stop time — hora de parada, utilizaremos 3.
                                          • rates array — indicaremos pArray.
                                             ArraySetAsSeries(fiArray,true);
                                             int Data=CopyRates(_Symbol,_Period,0,3,pArray);
                                          

                                          Determinación de los valores del Índice de Fuerza actual y anterior

                                             double fiCurrentVal = NormalizeDouble(fiArray[0],6);
                                             double fiPrevVal = NormalizeDouble(fiArray[1],6);
                                          

                                          Determinación del máximo actual y del máximo anterior

                                             double currentHighVal=NormalizeDouble(pArray[2].high,6);
                                             double prevHighVal=NormalizeDouble(pArray[1].high,6);
                                          

                                          Condiciones de la estrategia.

                                          Fuerte movimiento alcista

                                             if(currentHighVal>prevHighVal && fiCurrentVal>fiPrevVal)
                                               {
                                                Comment("Strong up move","\n",
                                                "Current High is ",currentHighVal,"\n",
                                                "Previous High is ",prevHighVal,"\n",
                                                "Current Force Index Value is ",fiCurrentVal,"\n",
                                                "Previous Force Index Value is ",fiPrevVal);
                                               }
                                          

                                          En caso de divergencia bajista:

                                           
                                             if(currentHighVal>prevHighVal && fiCurrentVal<fiPrevVal)
                                               {
                                                Comment("Bearish Divergence","\n",
                                                "Current High is ",currentHighVal,"\n",
                                                "Previous High is ",prevHighVal,"\n",
                                                "Current Force Index Value is ",fiCurrentVal,"\n",
                                                "Previous Force Index Value is ",fiPrevVal);
                                               }
                                          

                                          Después compilamos el código del asesor, y este aparecerá en la ventana del Navegador, en el terminal de MetaTrader 5:

                                          Indicador Force Index 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 de la estrategia de Force Index - Alcista o divergencia

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

                                          Sistema de la estrategia de Force Index - Alcista o divergencia - en el gráfico

                                          De nuevo veremos una indicación en el gráfico de que el asesor está funcionando.

                                          Entonces podremos recibir señales basadas en las condiciones del mercado, siempre que coincidan con las condiciones de esta estrategia. Más abajo, podemos ver ejemplos obtenidos en las pruebas.

                                          En caso de movimiento fuerte + datos actuales:

                                          Estrategia de Force Index - Alcista o divergencia - Señal fuerte - Datos actuales

                                          Datos anteriores en la ventana:

                                           Estrategia de Force Index - Alcista o divergencia - Señal fuerte - Datos anteriores

                                          Divergencia bajista y datos actuales

                                          Estrategia de Force Index - Alcista o divergencia - Señal de divergencia - Datos actuales

                                          Datos anteriores en la ventana:

                                          Estrategia de Force Index - Alcista o divergencia - Señal de divergencia - Datos anteriores

                                            Estrategia tres: Índice de Fuerza - bajista o divergencia

                                              El código completo del sistema comercial que opera según esta estrategia tiene el aspecto siguiente:

                                              //+------------------------------------------------------------------+
                                              //|                             Force Index - Down or Divergence.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 fiArray[];
                                                 MqlRates pArray[];
                                              
                                                 ArraySetAsSeries(fiArray,true);
                                                 int Data=CopyRates(_Symbol,_Period,0,3,pArray);
                                              
                                                 int fiDef = iForce(_Symbol,_Period,13,MODE_EMA,VOLUME_TICK);
                                              
                                                 CopyBuffer(fiDef,0,0,3,fiArray);
                                              
                                                 double fiCurrentVal = NormalizeDouble(fiArray[0],6);
                                                 double fiPrevVal = NormalizeDouble(fiArray[1],6);
                                              
                                                 double currentLowVal=NormalizeDouble(pArray[2].low,6);
                                                 double prevLowVal=NormalizeDouble(pArray[1].low,6);
                                              
                                                 if(currentLowVal<prevLowVal && fiCurrentVal<fiPrevVal)
                                                   {
                                                    Comment("Strong down move","\n",
                                                    "Current Low is ",currentLowVal,"\n",
                                                    "Previous Low is ",prevLowVal,"\n",
                                                    "Current Force Index Value is ",fiCurrentVal,"\n",
                                                    "Previous Force Index Value is ",fiPrevVal);
                                                   }
                                              
                                                 if(currentLowVal<prevLowVal && fiCurrentVal>fiPrevVal)
                                                   {
                                                    Comment("Bullish Divergence","\n",
                                                    "Current Low is ",currentLowVal,"\n",
                                                    "Previous Low is ",prevLowVal,"\n",
                                                    "Current Force Index Value is ",fiCurrentVal,"\n",
                                                    "Previous Force Index Value is ",fiPrevVal);
                                                   }
                                              
                                                }
                                              //+------------------------------------------------------------------+
                                              

                                              Qué ha cambiado en el código con respecto al anterior:

                                              Determinación del mínimo actual y el mínimo anterior:

                                                 double currentLowVal=NormalizeDouble(pArray[2].low,6);
                                                 double prevLowVal=NormalizeDouble(pArray[1].low,6);
                                              

                                              Condiciones de esta estrategia:

                                              En caso de fuerte movimiento bajista:

                                                 if(currentLowVal<prevLowVal && fiCurrentVal<fiPrevVal)
                                                   {
                                                    Comment("Strong down move","\n",
                                                    "Current Low is ",currentLowVal,"\n",
                                                    "Previous Low is ",prevLowVal,"\n",
                                                    "Current Force Index Value is ",fiCurrentVal,"\n",
                                                    "Previous Force Index Value is ",fiPrevVal);
                                                   }
                                              

                                              En caso de divergencia alcista:

                                                 if(currentLowVal<prevLowVal && fiCurrentVal>fiPrevVal)
                                                   {
                                                    Comment("Bullish Divergence","\n",
                                                    "Current Low is ",currentLowVal,"\n",
                                                    "Previous Low is ",prevLowVal,"\n",
                                                    "Current Force Index Value is ",fiCurrentVal,"\n",
                                                    "Previous Force Index Value is ",fiPrevVal);
                                                   }
                                              

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

                                              Indicador Force Index 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 de la estrategia de Force Index - Bajista o divergencia

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

                                              Sistema según la estrategia de Force Index - Bajista o divergencia - en el gráfico

                                              De nuevo veremos una indicación en el gráfico de que el asesor está funcionando.

                                              A continuación, mostramos algunos ejemplos de señales generadas por este sistema comercial durante las pruebas.

                                              Fuerte movimiento bajista y datos actuales:

                                              Estrategia de Force Index - Bajista o divergencia - Señal fuerte bajista - Datos actuales

                                              Datos anteriores:

                                              Estrategia de Force Index - Bajista o divergencia - Señal fuerte bajista - Datos anteriores

                                              Divergencia alcista y datos actuales

                                              Estrategia de Force Index - Bajista o divergencia - Señal de divergencia - Datos actuales

                                              Datos anteriores:

                                              Estrategia de Force Index - Bajista o divergencia - Señal de divergencia - Datos anteriores

                                                Estrategia cuatro: Señales del Índice de Fuerza

                                                  El código completo del sistema comercial que opera según esta estrategia tiene el aspecto que sigue:

                                                  //+------------------------------------------------------------------+
                                                  //|                                          Force Index signals.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 fiArray[];
                                                     double maArray[];
                                                     MqlRates pArray[];
                                                  
                                                  
                                                  
                                                     ArraySetAsSeries(fiArray,true);
                                                     ArraySetAsSeries(maArray,true);
                                                  
                                                  
                                                     int fiDef = iForce(_Symbol,_Period,13,MODE_EMA,VOLUME_TICK);
                                                     int maDef = iMA(_Symbol,_Period,50,0,MODE_EMA,PRICE_CLOSE);
                                                     int Data=CopyRates(_Symbol,_Period,0,3,pArray);
                                                  
                                                     CopyBuffer(fiDef,0,0,3,fiArray);
                                                     CopyBuffer(maDef,0,0,3,maArray);
                                                  
                                                     double fiCurrentVal = NormalizeDouble(fiArray[0],6);
                                                     double fiPrevVal = NormalizeDouble(fiArray[1],6);
                                                  
                                                     double maCurrentVal = NormalizeDouble(maArray[0],6);
                                                     double closePrice = NormalizeDouble(pArray[2].close,6);
                                                  
                                                  
                                                     if(closePrice>maCurrentVal && fiPrevVal<0 && fiCurrentVal>0)
                                                       {
                                                        Comment("Buy Signal","\n",
                                                                "Current Closing Price ",closePrice,"\n",
                                                                "EMA is ",maCurrentVal,"\n",
                                                                "Current Force Index Value is ",fiCurrentVal,"\n",
                                                                "Previous Force Index Value is ",fiPrevVal);
                                                       }
                                                  
                                                     if(closePrice<maCurrentVal && fiPrevVal>0 && fiCurrentVal<0)
                                                       {
                                                        Comment("Sell Signal","\n",
                                                                "Current Closing Price ",closePrice,"\n",
                                                                "EMA is ",maCurrentVal,"\n",
                                                                "Current Force Index Value is ",fiCurrentVal,"\n",
                                                                "Previous Force Index Value is ",fiPrevVal);
                                                       }
                                                  
                                                    }
                                                  //+------------------------------------------------------------------+
                                                  

                                                  Diferencias en este código:

                                                  Creación de tres variables: fiArray, maArray y MqlRates

                                                     double fiArray[];
                                                     double maArray[];
                                                     MqlRates pArray[];
                                                  

                                                  Clasificación de los arrays fiArray y maArray

                                                     ArraySetAsSeries(fiArray,true);
                                                     ArraySetAsSeries(maArray,true);
                                                  

                                                  Definición de fiDef para el Índice de Fuerza, maDef para la media móvil

                                                     int fiDef = iForce(_Symbol,_Period,13,MODE_EMA,VOLUME_TICK);
                                                     int maDef = iMA(_Symbol,_Period,50,0,MODE_EMA,PRICE_CLOSE);
                                                  

                                                  Clasificación de pArray con la función CopyRates

                                                  int Data=CopyRates(_Symbol,_Period,0,3,pArray);

                                                  Rellenamos los arrays

                                                     CopyBuffer(fiDef,0,0,3,fiArray);
                                                     CopyBuffer(maDef,0,0,3,maArray);
                                                  

                                                  Definimos cuatro valores: el valor del Índice de Fuerza actual y el anterior, la media móvil actual y el precio de cierre

                                                     double fiCurrentVal = NormalizeDouble(fiArray[0],6);
                                                     double fiPrevVal = NormalizeDouble(fiArray[1],6);
                                                  
                                                     double maCurrentVal = NormalizeDouble(maArray[0],6);
                                                     double closePrice = NormalizeDouble(pArray[2].close,6);
                                                  

                                                  Condiciones de la estrategia.

                                                  Si hay una señal de compra:

                                                     if(closePrice>maCurrentVal && fiPrevVal<0 && fiCurrentVal>0)
                                                       {
                                                        Comment("Buy Signal","\n",
                                                                "Current Closing Price ",closePrice,"\n",
                                                                "EMA is ",maCurrentVal,"\n",
                                                                "Current Force Index Value is ",fiCurrentVal,"\n",
                                                                "Previous Force Index Value is ",fiPrevVal);
                                                       }
                                                  

                                                  Si hay una señal de venta:

                                                     if(closePrice<maCurrentVal && fiPrevVal>0 && fiCurrentVal<0)
                                                       {
                                                        Comment("Sell Signal","\n",
                                                                "Current Closing Price ",closePrice,"\n",
                                                                "EMA is ",maCurrentVal,"\n",
                                                                "Current Force Index Value is ",fiCurrentVal,"\n",
                                                                "Previous Force Index Value is ",fiPrevVal);
                                                       }
                                                  

                                                  Después compilamos el código del asesor, y este aparecerá en la ventana del Navegador, en el terminal de MetaTrader 5:

                                                  Indicador Force Index 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 de la estrategia de Señales según el Índice de Fuerza

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

                                                   Señales según Force Index en el gráfico

                                                  Si el asesor se ha iniciado y está funcionando, la información debería aparecer en el gráfico.

                                                  Ejemplo de señal de compra y representación de los datos actuales:

                                                  Estrategia de Force Index - Señal de compra - Datos actuales

                                                  Datos anteriores:

                                                  Estrategia de Force Index - Señal de compra - Datos anteriores

                                                  Ejemplo de señal de venta y representación de los datos actuales:

                                                  Estrategia de Force Index - señal de venta - datos actuales

                                                  Datos anteriores:

                                                   Estrategia de Force Index - Señal de venta - Datos anteriores


                                                  Conclusión

                                                  El Índice de Fuerza es una excelente herramienta técnica que ofrece información importante para tomar decisiones fundamentadas. En este artículo, hemos analizado el indicador desde diferentes ángulos, aprendiendo qué es, qué mide, cómo se construye y cómo calcularlo. También hemos aprendido a utilizar el indicador usando estrategias sencillas:

                                                  • Force Index — identificador de tendencia: para señales alcistas y bajistas.
                                                  • Índice de fuerza — alcista o divergente: para obtener señales de fuerte movimiento alcista o divergencia bajista.
                                                  • Índice de Fuerza — bajista o Divergencia: para obtener señales de fuerte movimiento bajista o divergencia bajista.
                                                  • Señales del Índice de Fuerza: para obtener señales de compra o venta basadas en el análisis del precio de cierre, el valor del Índice de Fuerza y la media móvil exponencial.

                                                  Después, hemos desarrollado un plan paso a paso para cada estrategia analizada, que debería ayudarnos a crear un sistema comerciar al organizar todos los pasos necesarios en un esquema comprensible. Después, hemos escrito sistemas comerciales en MQL5 para cada estrategia analizada para su uso posterior en MetaTrader 5.

                                                  Una vez más, resulta esencial que el lector pruebe a fondo los materiales antes de aplicarlos a una cuenta real. No existen estrategias que se adapten a todo el mundo. Esperamos que pueda aplicar lo aprendido e intentar programar por su cuenta, ya que la práctica es un factor importante en cualquier proceso de aprendizaje. Experimente con el uso del indicador. El objetivo del análisis técnico consiste en aprender a aplicar correctamente las distintas herramientas para tomar decisiones comerciales más fundamentadas.

                                                  En mi opinión, resulta vital aprender programación, o al menos prestarle la debida atención, ya que su importancia aumenta día a día en diferentes campos. En lo que respecta al trading, la programación tiene muchas características que hacen recomendable prestarle atención; además, la programación nos ahorra tiempo, ya que las aplicaciones pueden ejecutar las transacciones por nosotros o, al menos, ayudarnos a comerciar de forma más eficiente. Además, la programación nos ayuda a obtener señales más precisas. Lo más útil es la posibilidad de evitar la interferencia de las emociones.

                                                  También esperamos que el artículo le haya sido útil y le haya mostrado nuevas estrategias de trabajo, o quizá inspirado nuevas ideas relacionadas o no con el tema. Si le ha gustado este artículo, o si le ha resultado útil, podrá leer mis artículos anteriores de la misma serie.

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

                                                  Indicador CCI. Modernización y nuevas posibilidades Indicador CCI. Modernización y nuevas posibilidades
                                                  En este artículo, analizaremos la posibilidad de modernizar el indicador CCI. Además, presentaremos un ejemplo de modificación de este indicador.
                                                  Aprendiendo a diseñar un sistema de trading con el oscilador Chaikin Aprendiendo a diseñar un sistema de trading con el oscilador Chaikin
                                                  Aquí tenemos un nuevo artículo de nuestra serie destinada al estudio de indicadores técnicos populares y la creación de sistemas comerciales basados en ellos. En este artículo, trabajaremos con el indicador Chaikin Oscillator, el oscilador de Chaikin.
                                                  Características del Wizard MQL5 que debe conocer (Parte 02): Mapas de Kohonen Características del Wizard MQL5 que debe conocer (Parte 02): Mapas de Kohonen
                                                  Gracias al Wizard, el tráder podrá ahorrar tiempo a la hora de poner en práctica sus ideas. Asimismo, podrá reducir la probabilidad de que surjan errores por duplicación de código. En lugar de perder el tiempo con el código, los tráders tendrán la posibilidad de poner en práctica su filosofía comercial.
                                                  Redes neuronales: así de sencillo (Parte 19): Reglas asociativas usando MQL5 Redes neuronales: así de sencillo (Parte 19): Reglas asociativas usando MQL5
                                                  Continuamos con el tema de la búsqueda de reglas asociativas. En el artículo anterior, vimos los aspectos teóricos de este tipo de problemas. En el presente artículo, mostraremos la implementación del método FP-Growth usando MQL5. Y también pondremos a prueba nuestra aplicación con datos reales.