
Aprendiendo a diseñar un sistema de trading con Force Index
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:
- Definición del Índice de Fuerza
- Estrategias del Índice de Fuerza
- Esquemas de la estrategia del Índice de Fuerza
- Sistemas comerciales del Índice de Fuerza
- 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:
Una vez seleccionado el Índice de Fuerza, se abrirá una ventana para configurar los ajustes del indicador:
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.
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.
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.
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.
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.
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.
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.
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:
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:
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:
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:
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:
Pulsamos OK y el programa (asesor) se iniciará en el gráfico como se muestra en la figura siguiente:
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:
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:
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.
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:
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:
Pulsamos OK y el programa (asesor) se iniciará en el gráfico como se muestra en la figura siguiente:
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:
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
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.
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:
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:
Pulsamos OK y el programa (asesor) se iniciará en el gráfico como se muestra en la figura siguiente:
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:
Datos anteriores en la ventana:
Divergencia bajista y datos actuales
Datos anteriores en la ventana:
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:
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:
Pulsamos OK y el programa (asesor) se iniciará en el gráfico como se muestra en la figura siguiente:
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:
Datos anteriores:
Divergencia alcista y datos actuales
Datos anteriores:
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:
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:
Pulsamos OK y el programa (asesor) se iniciará en el gráfico como se muestra en la figura siguiente:
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:
Datos anteriores:
Ejemplo de señal de venta y representación de los datos actuales:
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





- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso