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

Aprendiendo a diseñar un sistema de trading con Relative Vigor Index

MetaTrader 5Trading | 16 diciembre 2022, 15:53
568 0
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

Introducción

Le presentamos un nuevo artículo de la serie en la que estudiamos herramientas técnicas populares y aprendemos a crear sistemas comerciales basados en ellas. Hoy veremos el Índice de Vigor Relativo (Relative Vigor Index, RVI). El tema se dividirá en varias secciones:

  1. Definición de Relative Vigor Index
  2. Estrategias de Relative Vigor Index
  3. Esquemas de la estrategia de Relative Vigor Index
  4. Sistemas comerciales con Relative Vigor Index
  5. Conclusión

Escribiremos los códigos de este artículo en MQL5 (MetaQuotes Language 5) y ejecutaremos las aplicaciones resultantes en el terminal comercial MetaTrader 5. Recomendamos a todos los principiantes, y también a los programadores experimentados que lleven a la práctica por su cuenta todas las cosas de las que hablamos aquí: es precisamente la práctica la que desarrollará sus habilidades. Si aún no está familiarizado con MetaTrader 5 y MQL5, por favor lea "Escribiendo el código MQL5 en el MetaEditor" en uno de los artículos anteriores, ahí podrá encontrar instrucciones detalladas sobre cómo descargarlos y utilizarlos.

Todas las estrategias de las que hablaremos aquí se presentan exclusivamente como material de aprendizaje. No obstante, si está interesado en alguna de ellas, tenga en cuenta que deberá optimizarla en cualquier caso. Una vez más, el objetivo principal de este artículo y de las estrategias simples presentadas en él es aprender y asimilar el material. En general, antes de usar cualquiera de las técnicas en una cuenta real, siempre deberá probar esta para asegurarse de que resulta adecuada para usted.

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


Definición de Relative Vigor Index

En este apartado aprenderemos con detalle qué es el Índice de Vigor Relativo (RVI). Se trata de un indicador técnico de impulso y un oscilador. Mide la fuerza de la tendencia, comparando para ello el precio de cierre con el nivel de apertura. Durante una tendencia alcista, el precio de cierre será superior al de apertura, y durante una tendencia bajista, el precio de cierre será inferior al de apertura. Además, se usa una media móvil simple para suavizar los valores. Debido a la naturaleza de los cálculos, el indicador RVI se comporta mejor en los mercados con tendencia que en los periodos planos. El cálculo del RVI es similar al del oscilador estocástico, solo que el RVI compara los precios de cierre con los de apertura, mientras que el estocástico compara el rango de precios durante un periodo determinado. El indicador RVI puede calcularse manualmente de la forma que sigue:

RVI = (CLOSE - OPEN) / (HIGH - LOW)

donde:

CLOSE es el precio de cierre;

OPEN es el precio de apertura;

HIGH es el máximo;

LOW es el mínimo.

No obstante, la mayoría de las veces, el RVI que usamos se mostrará en dos líneas, cada una de las cuales utilizará componentes diferentes para el cálculo.

Cálculo de la primera línea

  • Cálculo del numerador:

MovAverage = (CLOSE-OPEN) + 2 * (CLOSE-1 - OPEN-1) + 2 * (CLOSE-2 - OPEN-2) + (CLOSE-3 - OPEN-3)

donde:

CLOSE — precio de cierre actual

CLOSE 1, CLOSE 2, CLOSE 3 — precios de cierre de 1, 2 y 3 periodos atrás

OPEN — precio de apertura actual

OPEN 1, OPEN 2, OPEN 3 — precios de apertura de 1, 2 y 3 periodos atrás

  • Cálculo del denominador:

RangeAverage = (HIGH-LOW) + 2 x (HIGH-1 - LOW-1) + 2 x (HIGH-2 - LOW-2) + (HIGH-3 - LOW-3)

donde:

HIGH — último precio máximo

HIGH, HIGH 2, HIGH 3 — precio del máximo 1, 2 y 3 periodos atrás

LOW — último mínimo

LOW 1, LOW 2, LOW 3 — precio del mínimo 1, 2 y 3 periodos atrás

  • Calculamos la suma de estas medias:

Media de RVI

Calculamos la segunda línea

RVIsignal = (RVIaverage + 2 * RVIaverage-1 + 2 * RVIaverage-2 + RVIaverage-3)/6

El concepto básico del indicador puede entenderse partiendo de las características del cálculo. Sin embargo, no deberemos hacerlo ahora porque se calcula automáticamente en el terminal comercial MetaTrader 5: todo lo que tenemos que hacer es seleccionarlo de la lista de indicadores disponibles. Cómo adjuntar el indicador al gráfico:

En MetaTrader 5, entre en "Insertar" --> "Indicadores" --> "Indicadores de Volumen" --> Relative Vigor Index

Insertando RVI

Tras seleccionar Relative Vigor Index, se abrirá una ventana con sus parámetros:

Parámetros de RVI

1 - periodo del indicador

2 - color de la línea RVI

3 - estilo de la línea RVI

4 - grosor de la línea RVI

5 - color de la línea de señal

6 - estilo de línea de señal

7 - grosor de la línea de señal

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

RVI en el gráfico

En la captura de pantalla anterior, podemos ver que el indicador se ha iniciado y está funcionando en el gráfico: muestra dos líneas que oscilan alrededor del nivel cero.


Estrategias de Relative Vigor Index

Tras los aspectos teóricos, veamos cómo usar el indicador RVI. Para ello, veremos algunas estrategias sencillas. Antes de pasar a las estrategias en sí, queremos reiterar la necesidad de probar cualquier estrategia antes de usarla en una cuenta real. Compruebe si la estrategia resulta adecuada para sus operaciones y si es rentable. Esto resulta especialmente actual en el caso de las estrategias ilustrativas, como las de este artículo.

  • Estrategia uno: cruce de RVI — tendencia alcista

Esta estrategia puede generar señales de compra y cierre durante una tendencia alcista según determinadas condiciones. Si el valor actual de RVI y el valor actual de la línea de señal RVI están ambos por encima de cero y el valor actual de RVI está por encima de la señal RVI, tendremos una señal de compra. Por el contrario, si el valor actual de RVI y el valor actual de la línea de señal RVI está por debajo de cero, y el valor actual de RVI está por debajo de la señal RVI, tendremos una señal de cierre de posición.

Esquemáticamente:

RVI > 0 y señal RVI > 0 y además RVI > señal RVI --> Compra

RVI < 0 y señal RVI < 0 y además RVI < señal RVI --> Cierre

  • Estrategia dos: cruce de RVI — tendencia bajista

Las señales de esta estrategia serán las contrarias a la anterior, pues generará señales de venta y el cierre correspondiente. Si el valor actual de RVI y el valor actual de la línea de señal RVI están ambos por debajo de cero y el valor actual de RVI está por debajo de la señal RVI, tendremos una señal de venta. Por el contrario, si el valor actual de RVI y el valor actual de la línea de señal RVI están ambos por encima de cero, y el valor actual de RVI está por encima de la señal RVI, tendremos una señal de cierre de posición.

Esquemáticamente:

RVI < 0 y señal RVI < 0 y además RVI < señal RVI --> Apertura de una posición corta

RVI > 0 y señal RVI > 0 y además RVI > señal RVI --> Cierre 

  • Estrategia tres: cruce de RVI y MA

Esta estrategia producirá señales de compra y venta en ciertas condiciones. Se generará una señal de compra cuando el precio de cierre sea mayor que la media móvil de 100 periodos y el valor actual de RVI sea mayor que el valor actual de la línea de señal de RVI. Si el precio de cierre está por debajo de la media móvil de 100 periodos y el valor actual de RVI está por debajo del valor de la señal, será una señal de venta.

Esquemáticamente:

Precio de cierre > media móvil de 100 periodos y valor RVI > señal RVI --> Compra

Precio de cierre < media móvil de 100 periodos y valor de RVI < señal RVI --> Venta


Esquemas de las estrategias de Relative Vigor Index

Ahora es el momento de considerar la creación de sistemas comerciales. En esta parte crearemos esquemas paso a paso para cada estrategia para ayudar a desarrollar sistemas comerciales.

  • Estrategia uno: cruce de RVI — tendencia alcista

Basándonos en esta estrategia, crearemos un sistema comercial que pueda utilizarse para generar señales de apertura y cierre de operaciones de compra durante una tendencia alcista. Para ello, deberemos comprobar los siguientes valores:

  • El valor actual de RVI
  • El valor actual de la línea de señal RVI
  • El nivel cero

Si el valor actual de RVI es superior a cero, la línea de señal de RVI es superior a cero y el valor actual de RVI es superior a la línea de señal, el sistema comercial deberá retornar un comentario con los siguientes valores:

  • La señal de compra
  • El valor de Relative Vigor Index
  • La señal RVI

De lo contrario, si el valor actual de RVI es inferior a cero, la línea de señal de RVI es inferior a cero y el valor actual de RVI es inferior a la línea de señal, el sistema comercial deberá retornar un comentario con los siguientes valores:

  • La señal de cierre
  • El valor de Relative Vigor Index
  • La señal RVI

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

Esquema de la estrategia de cruce de RVI durante la tendencia ascendente

  • Estrategia dos: cruce de RVI — tendencia bajista

Basándonos en esta estrategia, crearemos un sistema comercial que se podrá utilizar para generar señales de apertura y cierre de operaciones de venta durante una tendencia alcista. Para ello, deberemos comprobar los siguientes valores:

  • El valor actual de RVI
  • El valor actual de la línea de señal RVI
  • El nivel cero

Las condiciones serán ligeramente distintas. Si el valor actual de RVI es inferior a cero, la línea de señal de RVI es inferior a cero y el valor actual de RVI es inferior a la línea de señal, el sistema comercial deberá retornar un comentario con los siguientes valores:

  • La señal de apertura de una operación en corto
  • El valor de Relative Vigor Index
  • La señal RVI

Si el valor actual de RVI está por debajo de cero y la línea de señal de RVI está por encima de cero, y al mismo tiempo el valor actual de RVI está por encima de la línea de señal, el sistema comercial deberá mostrar un comentario en el gráfico con los siguientes valores:

  • Cerrar
  • El valor de Relative Vigor Index
  • La señal RVI

Esquema paso a paso para desarrollar un sistema comercial utilizando esta estrategia:

Esquema de la estrategia de cruce de RVI durante la tendencia descendente

  • Estrategia tres: cruce de RVI y MA

El sistema comercial generará señales de compra y venta. Para ello, se monitorearán los siguientes valores:

  • El precio de cierre
  • La media móvil (MA) de 100 periodos
  • El valor actual de RVI
  • El valor actual de la línea de señal RVI

Si el precio de cierre está por encima de la MA de 100 periodos y el valor actual de RVI está por encima de la línea de señal de RVI, necesitaremos que el sistema comercial retorne los siguientes valores como comentario en el gráfico:

  • La señal de compra
  • El precio de cierre
  • El valor de la media móvil
  • El valor de Relative Vigor Index
  • La señal RVI

Si el precio de cierre está por debajo de la MA de 100 periodos y el valor actual de RVI está por debajo del valor actual de la señal de RVI, el sistema comercial retornará los siguientes valores como comentario en el gráfico:

  • La señal de venta
  • El precio de cierre
  • El valor de la media móvil
  • El valor de Relative Vigor Index
  • La señal RVI

La siguiente figura muestra el esquema de esta estrategia:

 Esquema de la estrategia RVI, MA crossover

Sistemas comerciales con Relative Vigor Index

Así pues, hemos analizado algunas estrategias sencillas utilizando el indicador RVI y hemos elaborado sus esquemas de desarrollo. Ahora procederemos directamente a escribir los códigos de los sistemas comerciales. Para empezar, escribiremos un sistema sencillo que retorne el valor actual de RVI como un comentario en el gráfico. Vamos a ver todos los pasos necesarios para crear el código de un sistema de este tipo.

Crearemos dos arrays para el RVI y el RVI de la señal utilizando la función double:

   double rviArray[];
   double rviSignalArray[];

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

   ArraySetAsSeries(rviArray,true);
   ArraySetAsSeries(rviSignalArray,true);

A continuación, definiremos el Índice de Vigor Relativo usando la función iRVI, que retorna el manejador del indicador. Parámetros de la función:

  • symbol — nombre del símbolo; nosotros tenemos "_Symbol", es decir, calcularemos el indicador según el símbolo del gráfico actual. 
  • period — marco temporal para el cálculo; el valor "_Period" señalará que el indicador se calculará en el marco temporal actual. 
  •  ma_period — periodo de promediación; usaremos 10.
int rviDef = iRVI(_Symbol,_Period,10);

Después obtendremos los datos del búfer del indicador RVI usando la función CopyBuffer. Parámetros de la función: 

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

Luego definiremos los valores RVI y RVI de la señal usando la función NormalizeDouble, que retorna un valor de tipo double. Parámetros de la función:

  • value — número normalizado; usaremos (rviArray[0], rviSignalArray[0]).
  • digits — número de dígitos después del punto decimal. Usaremos 3.
   double rviVal = NormalizeDouble(rviArray[0],3);
   double rviSignalVal = NormalizeDouble(rviSignalArray[0],3);

Con la ayuda de la función Comment, mostraremos un comentario en el gráfico con el valor actual del indicador RVI.

   Comment("Relative Vigor Index Value is ",rviVal,"\n",
           "RVI Signal Value is ",rviSignalVal);

El código completo de este sistema tendrá el aspecto siguiente:

//+------------------------------------------------------------------+
//|                                                   Simple RVI.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 rviArray[];
   double rviSignalArray[];

   ArraySetAsSeries(rviArray,true);
   ArraySetAsSeries(rviSignalArray,true);

   int rviDef = iRVI(_Symbol,_Period,10);

   CopyBuffer(rviDef,0,0,3,rviArray);
   CopyBuffer(rviDef,1,0,3,rviSignalArray);

   double rviVal = NormalizeDouble(rviArray[0],3);
   double rviSignalVal = NormalizeDouble(rviSignalArray[0],3);

   Comment("Relative Vigor Index Value is ",rviVal,"\n",
           "RVI Signal Value is ",rviSignalVal);

  }
//+------------------------------------------------------------------+


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

 RVI en el navegador

Luego clicaremos dos veces para ejecutar el sistema en el terminal y se abrirá la ventana de configuración del asesor:

Ventana de la estrategia RVI simple

A continuación, permitiremos el trading automático "Allow Algo Trading", pulsaremos OK y el programa se iniciará en el gráfico:

 Programa RVI simple en el gráfico

El programa funciona y genera las señales correspondientes. Ejemplo de señal en el gráfico:

Señal del asesor Simple RVI

Como podemos ver, en la esquina superior izquierda del gráfico tenemos un comentario con el valor actual de RVI.

  • Estrategia uno: cruce de RVI — tendencia alcista

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

//+------------------------------------------------------------------+
//|                                      RVI Crossover - Uptrend.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 rviArray[];
   double rviSignalArray[];

   ArraySetAsSeries(rviArray,true);
   ArraySetAsSeries(rviSignalArray,true);

   int rviDef = iRVI(_Symbol,_Period,10);

   CopyBuffer(rviDef,0,0,3,rviArray);
   CopyBuffer(rviDef,1,0,3,rviSignalArray);

   double rviVal = NormalizeDouble(rviArray[0],3);
   double rviSignalVal = NormalizeDouble(rviSignalArray[0],3);

   if(rviVal>0 && rviSignalVal>0 && rviVal>rviSignalVal)
     {
      Comment("Buy Signal","\n",
              "Relative Vigor Index Value is ",rviVal,"\n",
              "RVI Signal Value is ",rviSignalVal);
     }
   if(rviVal<0 && rviSignalVal<0 && rviVal<rviSignalVal)
     {
      Comment("Close","\n",
              "Relative Vigor Index Value is ",rviVal,"\n",
              "RVI Signal Value is ",rviSignalVal);
     }


  }
//+------------------------------------------------------------------+


Diferencias en este código:

Las condiciones de la estrategia.

Con una señal de compra

   if(rviVal>0 && rviSignalVal>0 && rviVal>rviSignalVal)
     {
      Comment("Buy Signal","\n",
              "Relative Vigor Index Value is ",rviVal,"\n",
              "RVI Signal Value is ",rviSignalVal);
     }

La señal de cierre

   if(rviVal<0 && rviSignalVal<0 && rviVal<rviSignalVal)
     {
      Comment("Close","\n",
              "Relative Vigor Index Value is ",rviVal,"\n",
              "RVI Signal Value is ",rviSignalVal);
     }

Recompilamos el código, lo buscamos en el Navegador y lo ejecutamos en el gráfico. El asesor se adjuntará al gráfico de la misma forma que se muestra a continuación:

Sistema de cruce de RVI con tendencia alcista en el gráfico

El sistema comercial genera señales con el aspecto siguiente:

Señal de compra:

 RVI crossover - U - señal de compra

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

  • La señal de compra
  • El valor de Relative Vigor Index
  • El valor de la línea de señal RVI

En el caso de una señal de cierre:

 RVI crossover - U - señal de cierre

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

  • Cierre
  • El valor de Relative Vigor Index
  • El valor de la línea de señal RVI

Estas han sido las señales del sistema comercial de la estrategia comentada anteriormente, que opera en una tendencia alcista.

  • Estrategia dos: cruce de RVI — tendencia bajista

A continuación, mostraremos el código completo para crear un sistema comercial de este tipo:

//+------------------------------------------------------------------+
//|                                    RVI Crossover - Downtrend.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 rviArray[];
   double rviSignalArray[];

   ArraySetAsSeries(rviArray,true);
   ArraySetAsSeries(rviSignalArray,true);

   int rviDef = iRVI(_Symbol,_Period,10);

   CopyBuffer(rviDef,0,0,3,rviArray);
   CopyBuffer(rviDef,1,0,3,rviSignalArray);

   double rviVal = NormalizeDouble(rviArray[0],3);
   double rviSignalVal = NormalizeDouble(rviSignalArray[0],3);

   if(rviVal<0 && rviSignalVal<0 && rviVal<rviSignalVal)
     {
      Comment("Short Signal","\n",
              "Relative Vigor Index Value is ",rviVal,"\n",
              "RVI Signal Value is ",rviSignalVal);
     }
   if(rviVal>0 && rviSignalVal>0 && rviVal>rviSignalVal)
     {
      Comment("Cover","\n",
              "Relative Vigor Index Value is ",rviVal,"\n",
              "RVI Signal Value is ",rviSignalVal);
     }
  }
//+------------------------------------------------------------------+  

Diferencias en este código:

Las condiciones de la estrategia.

Con una señal corta

   if(rviVal<0 && rviSignalVal<0 && rviVal<rviSignalVal)
     {
      Comment("Short Signal","\n",
              "Relative Vigor Index Value is ",rviVal,"\n",
              "RVI Signal Value is ",rviSignalVal);
     }

La señal de cierre

   if(rviVal>0 && rviSignalVal>0 && rviVal>rviSignalVal)
     {
      Comment("Cover","\n",
              "Relative Vigor Index Value is ",rviVal,"\n",
              "RVI Signal Value is ",rviSignalVal);
     }

Después de compilar el código, ejecutaremos el archivo resultante en el terminal. El asesor se ejecutará en el gráfico y tendrá un aspecto parecido al siguiente:

 Sistema de la estrategia RVI crossover - D en el gráfico

Ahora podremos obtener señales basadas en esta estrategia y el sistema comercial. Ejemplos de señales generadas a partir de esta estrategia.

Con una señal corta:

 RVI crossover - D - en corto

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

  • Una transacción corta
  • El valor de Relative Vigor Index
  • El valor de la línea de señal RVI 

La señal de cierre

RVI crossover - D - señal de cierre

Como podemos ver, tenemos una señal y los siguientes valores:

  • Cerrar
  • El valor de Relative Vigor Index
  • El valor de la línea de señal RVI

Así que hemos creado un sistema comercial basado en la estrategia RVI Crossover - Downtrend para trabajar en una tendencia bajista.

  • Estrategia tres: cruce de RVI y MA

A continuación, mostraremos el código completo para crear un sistema comercial de este tipo:

//+------------------------------------------------------------------+
//|                                           RVI & MA Crossover.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
void OnTick()
  {
   MqlRates pArray[];
   double maArray[];
   double rviArray[];
   double rviSignalArray[];

   int Data=CopyRates(_Symbol,_Period,0,1,pArray);
   ArraySetAsSeries(maArray,true);
   ArraySetAsSeries(rviArray,true);
   ArraySetAsSeries(rviSignalArray,true);

   int rviDef = iRVI(_Symbol,_Period,10);
   int maDef = iMA(_Symbol,_Period,100,0,MODE_EMA,PRICE_CLOSE);

   CopyBuffer(rviDef,0,0,3,rviArray);
   CopyBuffer(rviDef,1,0,3,rviSignalArray);
   CopyBuffer(maDef,0,0,3,maArray);

   double rviVal = NormalizeDouble(rviArray[0],3);
   double rviSignalVal = NormalizeDouble(rviSignalArray[0],3);
   double maVal = NormalizeDouble(maArray[0],3);

   if(pArray[0].close>maVal && rviVal>rviSignalVal)
     {
      Comment("Buy Signal","\n",
              "Closing price is ",pArray[0].close,"\n",
              "MA Value is ",maVal,"\n",
              "Relative Vigor Index Value is ",rviVal,"\n",
              "RVI Signal Value is ",rviSignalVal);
     }
   if(pArray[0].close<maVal && rviVal<rviSignalVal)
     {
      Comment("Sell Signal","\n",
              "Closing price is ",pArray[0].close,"\n",
              "MA Value is ",maVal,"\n",
              "Relative Vigor Index Value is ",rviVal,"\n",
              "RVI Signal Value is ",rviSignalVal);
     }


  }
//+------------------------------------------------------------------+


Diferencias en este código:

Creamos cuatro arrays (pArray, maArray, rviArray, rviSignalArray). Luego utilizaremos la función double, pero en lugar de pArray usaremos la función MqlRates, que almacena la información sobre el precio, el volumen y el spread.

   MqlRates pArray[];
   double maArray[];
   double rviArray[];
   double rviSignalArray[];


A continuación, estableceremos la bandera de clasificación como en la serie temporal AS_SERIES utilizando la función ArraySetAsSeries, que retorna true o false. Después usaremos la función CopyRates para rellenar el array y obtener los datos históricos de MqlRates. Parámetros de la función:

  • symbol — nombre del símbolo; nosotros tenemos "_Symbol", es decir, calcularemos el indicador según el símbolo del gráfico actual.
  • period — marco temporal para el cálculo; el valor "_Period" señalará que el indicador se calculará en el marco temporal actual.
  • start_pos — indica la posición del inicio del cálculo; especificaremos 0. 
  • count — cantidad de datos para copiar; indicaremos 1.
  • rates_array[] — array en el que se copian los datos
   int Data=CopyRates(_Symbol,_Period,0,1,pArray);
   ArraySetAsSeries(maArray,true);
   ArraySetAsSeries(rviArray,true);
   ArraySetAsSeries(rviSignalArray,true);

Para determinar el indicador RVI usaremos la función iRVI, y para la media móvil, utilizaremos iMA, que retorna el manejador del indicador MA. Parámetros de la función iMA:

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

Después recuperaremos los datos del búfer de los indicadores RVI y MA usando la función "CopyBuffer".

   CopyBuffer(rviDef,0,0,3,rviArray);
   CopyBuffer(rviDef,1,0,3,rviSignalArray);
   CopyBuffer(maDef,0,0,3,maArray);

Luego determinaremos el RVI, el RVI de la señal y los valores medios utilizando la función NormalizeDouble.

   double rviVal = NormalizeDouble(rviArray[0],3);
   double rviSignalVal = NormalizeDouble(rviSignalArray[0],3);
   double maVal = NormalizeDouble(maArray[0],3);

Las condiciones de la estrategia.

Con una señal de compra

   if(pArray[0].close>maVal && rviVal>rviSignalVal)
     {
      Comment("Buy Signal","\n",
              "Closing price is ",pArray[0].close,"\n",
              "MA Value is ",maVal,"\n",
              "Relative Vigor Index Value is ",rviVal,"\n",
              "RVI Signal Value is ",rviSignalVal);
     }

Con una señal de venta

   if(pArray[0].close<maVal && rviVal<rviSignalVal)
     {
      Comment("Sell Signal","\n",
              "Closing price is ",pArray[0].close,"\n",
              "MA Value is ",maVal,"\n",
              "Relative Vigor Index Value is ",rviVal,"\n",
              "RVI Signal Value is ",rviSignalVal);
     }

A continuación, compilaremos el código, buscaremos el archivo resultante en el Navegador del terminal y ejecutaremos el asesor en el gráfico del símbolo comercial:

 Sistema RVI, MA en el gráfico

El sistema comercial funciona y genera señales según la estrategia, y se ven así.

Señal de compra:

 RVI, MA crossover - señal de compra

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

  • La señal de compra
  • El precio de cierre
  • El valor de la media móvil
  • El valor de Relative Vigor Index
  • La señal RVI

La señal de venta

RVI, MA crossover - señal de venta

Tenemos una señal con los siguientes valores:

  • La señal de venta
  • El precio de cierre
  • El valor de la media móvil
  • El valor de Relative Vigor Index
  • La señal RVI

Eso es todo, ya hemos creado sistemas automáticos basados en cada una de las estrategias analizadas. Todos ellos generan señales según las instrucciones mostradas en los esquemas anteriores.


Conclusión

En este artículo hemos analizado otra herramienta técnica, el Índice de Vigor Relativo RVI. Hemos descubierto qué es este indicador, qué mide y cómo se puede calcular manualmente. También hemos visto opciones de uso del indicador en estrategias sencillas:

  • RVI Crossover - Uptrend: formación de señales de compra y cierre en una tendencia alcista.
  • RVI Crossover - Downtrend: genera señales en corto y señales de cierre en una tendencia bajista.
  • RVI & MA Crossover: señales de compra y venta basadas en los cruces de los dos indicadores.

Asimismo, hemos desarrollado esquemas paso a paso para cada estrategia analizada que nos serán útiles a la hora de escribir el código del sistema comercial. Eso es todo, ya hemos creado sistemas automáticos basados en cada una de las estrategias estudiadas. Dichos sistemas han sido diseñados para funcionar en el terminal MetaTrader 5.

Esperamos que el lector escriba su propio código repitiendo todo lo que hemos hablado en este artículo. También esperamos que este artículo le ayude a encontrar nuevas ideas o una nueva forma de ver las antiguas, y también a mejorar sus resultados comerciales en general. Si le ha gustado este artículo y le ha resultado útil, lea los artículos anteriores de la misma serie para aprender a desarrollar sistemas comerciales basados en otros indicadores técnicos populares.

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

DoEasy. Elementos de control (Parte 18): Preparamos la funcionalidad para el scrolling de las pestañas en TabControl DoEasy. Elementos de control (Parte 18): Preparamos la funcionalidad para el scrolling de las pestañas en TabControl
En este artículo colocaremos los botones de control de scrolling del encabezado en el objeto WinForms TabControl en su lugar en caso de que la fila del encabezado no se ajuste al tamaño del control, y haremos que la fila del encabezado se desplace al clicar en un encabezado de pestaña recortado.
Gráfico de montaña o gráfico de iceberg Gráfico de montaña o gráfico de iceberg
¿Qué tal si añadimos un nuevo tipo de gráfico a MetaTrader 5? Mucha gente dice que le faltan algunas cosas que ya están presentes en otras plataformas, pero lo cierto es que MetaTrader 5 es una plataforma muy práctica que nos permite hacer cosas que no es posible hacer en muchas otras plataformas, al menos no tan fácilmente.
Redes neuronales: así de sencillo (Parte 29): Algoritmo actor-crítico con ventaja (Advantage actor-critic) Redes neuronales: así de sencillo (Parte 29): Algoritmo actor-crítico con ventaja (Advantage actor-critic)
En los artículos anteriores de esta serie, nos familiarizamos con dos algoritmos de aprendizaje por refuerzo. Obviamente, cada uno de ellos tiene sus propias ventajas y desventajas. Como suele suceder en estos casos, se nos ocurre combinar ambos métodos en un algoritmo que incorporaría lo mejor de los dos, y así compensar las carencias de cada uno de ellos. En este artículo, hablaremos de dicho método.
DoEasy. Elementos de control (Parte 17): Recortando partes invisibles de objetos, objetos WinForms auxiliares de botón con flechas DoEasy. Elementos de control (Parte 17): Recortando partes invisibles de objetos, objetos WinForms auxiliares de botón con flechas
En el artículo, crearemos la funcionalidad necesaria para ocultar secciones de objetos que quedan más allá de su contenedor; asimismo, crearemos objetos de botón auxiliares con flechas para usarlos como parte de otros objetos WinForms.