Aprendiendo a diseñar un sistema de trading con OBV

2 agosto 2022, 12:58
Mohamed Abdelmaaboud
0
443

Introducción

En este artículo, analizaremos un nuevo indicador técnico que trabaja con volúmenes y que permite ver lo que ocurre en el mercado desde un punto de vista distinto: hablaremos del indicador de On Balance Volume (OBV) y de sus ventajas, y también intentaremos aprender a usarlo en nuestro beneficio propio en el trading. En el presente artículo, se tratarán los siguientes temas:

  1. Definición del indicador OBV
  2. Estrategia del indicador OBV
  3. Esquema de la estrategia de OBV
  4. Sistema comercial de OBV
  5. Conclusión

En "Definición del indicador OBV", exploraremos el indicador con detalle, veremos qué es, qué mide y cómo se calcula, y también analizaremos un ejemplo de cálculo. Esto nos permitirá aprender a entender el indicador y usarlo correctamente. A continuación, aprenderemos a usar el indicador OBV con estrategias sencillas basadas en el concepto de este indicador (véase "Estrategia del indicador OBV"). Después de aprender a utilizarlo usando estrategias simples, desarrollaremos un esquema que nos ayudará a escribir el código MQL5 para estas estrategias. Este esquema/plan nos ayudará a racionalizar y organizar los pasos para crear un asesor. Una vez desarrollado el esquema, podremos proceder a escribir el código en MQL5 y obtener un asesor que pueda ser utilizado en MetaTrader 5 para la ejecución automatizada y precisa de estrategias comerciales.

En este artículo, al igual que en los anteriores, usaremos MQL5 (MetaQuotes Language) para crear nuestro asesor. El programa resultante se ejecutará en la plataforma comercial MetaTrader 5. Si quiere saber más sobre la plataforma y el editor, le recomiendo que lea "Cómo escribir código MQL5 en el MetaEditor" en uno de mis artículos anteriores. Ahí se describe con detalle cómo instalar el terminal y dónde encontrar el editor de código. También le recomiendo a los lectores que trabajen por su cuenta cada uno de los fragmentos de código de este artículo, ya que la práctica supone una parte esencial del aprendizaje.

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

Ahora, vamos a explorar este tema para añadir otra herramienta a nuestro arsenal técnico.


Definición del indicador OBV

En esta parte, aprenderemos más sobre el indicador de volumen de balance OBV. Pero primero, hablaremos un poco del volumen, porque OBV es uno de los indicadores de volumen. Así, el volumen es el número de acciones o contratos negociados durante un periodo de tiempo. Si el volumen es alto, significará que el instrumento se negocia activamente, y viceversa, si vemos un volumen bajo, significará que los tráders no comercian activamente con el instrumento.

El concepto de volumen resulta esencial, porque si el movimiento de un instrumento hacia arriba o hacia abajo se ve acompañado por un volumen alto, el movimiento será más fuerte que si va acompañado por un volumen bajo. El movimiento del volumen dependerá de la tendencia: por ejemplo, en una tendencia alcista, el volumen debería aumentar cuando el precio está subiendo, y disminuir cuando el precio está corrigiendo a la baja. Por el contrario, cuando nos encontramos en una tendencia bajista, el volumen aumentará al darse un movimiento descendente y disminuirá al darse una corrección alcista.

El volumen también puede servir como confirmación de las rupturas, sean estas reales o no: si una ruptura se produce con un volumen elevado, podría ser una señal de que la ruptura continuará. 

Si la relación entre la tendencia y el volumen se mantiene como hemos visto, esto supondrá una señal de la fuerza de la tendencia actual, y si cambia, será una señal de debilidad. Si quiere saber más sobre las tendencias, le recomiendo que lea la sección "Definición de la tendencia" de mi artículo publicado anteriormente.

El indicador OBV (On-balance volume) fue desarrollado por Joseph Granville, y mide el flujo de volumen positivo y negativo. Veamos cómo se calcula. Así, los pasos para realizar el cálculo del indicador serán los siguientes:

  1. Comprobamos el precio de cierre, si está por encima o por debajo del cierre anterior.
  2. Si el precio de cierre es mayor que el precio de cierre anterior, añadiremos el volumen al valor de OBV anterior.
  3. Si es inferior, restaremos el volumen del valor de OBV anterior.
  4. Si el cierre de hoy es igual al de ayer, entonces el OBV de hoy será igual al de ayer.

Vamos a ver un ejemplo y a calcular el indicador OBV paso a paso. Supongamos que tenemos los siguientes datos para un instrumento:

Día Cerrar Volumen
1 54
2 55 10000
3 60 15000
4 65 20000
5 60 10000
6 55 5000
7 60 7000
8 50 7500
9 48.75 8000
10 49 5000
11 48 6000
12 47.75 7500
13 48 9000
14 47.50 10000
15 48 7000
16 47 7500
17 46 6000
18 44 5000
19 45 15000

Para calcular el indicador OBV a partir de los datos anteriores:

Comprobamos los precios de cierre y decidimos o no si son más altos que el precio de cierre anterior. Si son superiores al cierre del día anterior, añadimos una marca positiva al lado para indicar que el movimiento del día ha sido ascendente. Si están por debajo del cierre del día anterior, ponemos una marca negativa para indicar que el día tiene un movimiento descendente.

Cálculo de OBV 1

A continuación, sumamos el volumen de los días positivos al valor de OBV anterior y restamos el volumen de los días negativos al valor de OBV anterior.

Cálculo de OBV 2

Bien, hemos calculado los valores de OBV y los hemos dibujado como una curva, midiendo los volúmenes positivos y negativos. Afortunadamente, no necesitamos calcular el OBV manualmente, pues existe un indicador listo para usar que viene de serie con la plataforma MetaTrader 5. La siguiente ilustración muestra cómo ejecutar este indicador en el gráfico:

Ejecutando OBV en un gráfico

Una vez hayamos seleccionado el indicador, se abrirá su ventana de configuración:

Iniciando OBV en el gráfico 1

1 - tipo de volúmenes

2 - color de la curva de volumen OBV

3 - estilo de línea de la curva OBV

4 - grosor de la línea de la curva OBV

Establecemos los parámetros necesarios, pulsamos Ok y el indicador se iniciará en el gráfico:

OBV en el gráfico


Estrategia del indicador OBV

En esta parte, aprenderemos cómo utilizar el indicador OBV según su concepto. También veremos varias estrategias sencillas. No obstante, debemos tener en cuenta que las estrategias podrían no ser adecuadas para todo el mundo. Por lo tanto, tenemos que probar las estrategias antes de utilizarlas, para así evaluar su utilidad específica para nosotros. Aquí veremos todas estas estrategias con el objetivo principal de aprender los fundamentos del indicador OBV y ver cómo funciona este.

  • Estrategia uno: movimiento simple de OBV

Según esta estrategia, determinaremos la dirección de la curva de OBV comparando el valor actual de OBV con el valor anterior: si el valor actual es mayor que el anterior, significará que el indicador OBV está subiendo. Por el contrario, si el valor actual es inferior al anterior, el OBV desciende.

En la práctica, podemos cambiar la longitud de los datos usados para comparar el OBV actual con los datos anteriores. No obstante, aquí consideraremos solo la propia idea del uso del indicador y veremos cómo este uso puede ser escrito en forma de programa MQL5. Ya después de ello, podremos optimizarlo según nuestras propias preferencias.

OBV actual > OBV anterior --> OBV crece

OBV actual < OBV anterior --> OBV disminuye

  • Segunda estrategia: fuerza de OBV simple

Como parte de esta estrategia, debemos determinar la fuerza del valor OBV actual comparándolo este con la media de los cuatro valores OBV anteriores. Si el valor OBV actual es superior a la media de los cuatro anteriores, el OBV será fuerte, y viceversa, si el valor OBV actual es inferior a la media de los cuatro anteriores, el OBV será débil.

Aquí también podemos aumentar la longitud de la media que estamos comparando con los datos actuales. No lo haremos aquí, ya que solo estamos familiarizándonos con las formas en que podemos usar el indicador. A continuación, podemos ajustar el indicador para que se adapte a nuestras necesidades según los resultados de la simulación. 

OBV actual > Media de los cuatro valores anteriores de OBV --> OBV fuerte

OBV actual < Media de los cuatro valores anteriores de OBV --> OBV débil

  • Estrategia tres: estrategia OBV simple - tendencia alcista

Como ya hemos aprendido, durante una tendencia alcista, será mejor que el volumen se mueva con la tendencia. Por lo tanto, el OBV debería aumentar siguiendo el movimiento alcista. Esta estrategia nos permite evaluar si un movimiento es fuerte o no. Vamos a comparar el valor OBV actual con el valor anterior, y también compararemos el máximo actual con el máximo anterior. Cuando el valor OBV actual es mayor que el valor OBV anterior y el máximo actual es mayor que el máximo anterior, el movimiento alcista es fuerte.

OBV actual > OBV anterior y máximo actual > máximo anterior --> Movimiento fuerte durante la tendencia alcista

  • Estrategia cuatro: estrategia OBV simple - tendencia bajista

Durante la tendencia bajista, el volumen cambia con la fuerza de la tendencia, y el OBV debería aumentar a medida que se desplaza hacia abajo. Esto nos permite evaluar si el movimiento es fuerte o no. Vamos a comparar el valor OBV actual con el valor OBV anterior, y también compararemos el mínimo actual con el mínimo anterior. Cuando el OBV actual es inferior al OBV anterior y el mínimo actual es inferior al mínimo anterior, el movimiento bajista es fuerte.

OBV actual < OBV anterior y mínimo actual < mínimo anterior --> Movimiento fuerte durante la tendencia bajista


Esquema de la estrategia de OBV

A continuación, vamos a describir las estrategias analizadas. De este modo, prepararemos una descripción clara y pormenorizada sobre el desarrollo de un sistema comercial para cada una de ellas. Empezaremos por desarrollar un sencillo programa para el indicador OBV, que mostrará un comentario en el gráfico con el valor OBV actual. Aquí vemos el esquema de un programa de este tipo:

Esquema de OBV sencillo

  • Estrategia uno: movimiento simple de OBV

En esta estrategia, determinaremos la dirección de la curva de OBV comparando el valor OBV actual con el valor anterior. En cada tic el programa deberá comprobar el valor actual y el valor anterior de OBV, y cuando el valor actual sea mayor que el anterior, indicar que OBV está aumentando, y a la inversa, cuando el valor actual sea menor que el anterior, deberá indicar que OBV está disminuyendo.

A continuación, le mostramos un esquema paso a paso que le ayudará a desarrollar un sistema comercial para esta estrategia:

Esquema OBV - Movimiento simple

  • Segunda estrategia: fuerza de OBV simple

En esta estrategia, la fuerza del valor OBV actual deberá determinarse comparándolo con la media de los cuatro valores OBV anteriores. Si el valor OBV actual es superior a la media de los cuatro anteriores, el OBV será fuerte, y viceversa, si el valor OBV actual es inferior a la media de los cuatro anteriores, el OBV será débil.

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

Esquema de OBV - Fuerza simple

  • Estrategia tres: estrategia OBV simple - tendencia alcista

En esta estrategia usaremos un indicador de volumen para medir el movimiento actual del precio. Durante la tendencia alcista, comprobaremos el valor OBV actual y lo compararemos con el valor OBV anterior. Si el valor actual es superior al anterior, deberemos comprobar el precio máximo actual y compararlo con el precio máximo anterior. Si el máximo actual es más alto, esto nos indicará que el movimiento alcista actual durante una tendencia alcista es fuerte.

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

OBV - Gráfico de estrategia alcista

  • Estrategia cuatro: estrategia OBV simple - tendencia bajista

En esta estrategia, durante una tendencia bajista, comprobaremos el valor OBV actual y lo compararemos con el valor OBV anterior. Si el valor actual es inferior al anterior, deberemos comprobar el precio mínimo actual y compararlo con el precio mínimo anterior. Si el mínimo actual es más bajo, esto nos indicará que hay un fuerte movimiento a la baja durante una tendencia bajista.

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

Esquema de la estrategia OBV - Downtrend


Sistema comercial de OBV

En esta parte, aprenderemos a crear un sistema comercial basado en cada una de las estrategias que hemos comentado, para aprovechar al máximo las posibilidades de la programación y el lenguaje MQL5. Al fin y al cabo, la programación es una herramienta mágica que puede facilitarnos la vida, pues podemos crear un sistema que ejecute automáticamente el algoritmo deseado. Además, no solo nos ahorraremos acciones manuales, sino que también disfrutaremos de las ventajas que ofrecen la rapidez y la precisión.

Ahora vamos a empezar a construir un sistema comercial para cada estrategia. En primer lugar, crearemos un sencillo sistema comercial que mostrará un comentario en el gráfico con el valor actual del OBV.

  • Para ello, crearemos un array para los valores OBV usando la función double. El tipo double es un tipo real único, un número de punto flotante, es decir, un valor con una parte fraccionaria. En general, existen dos tipos de números de punto flotante: double y float. El nombre double indica que estos números son el doble de precisos que los de tipo float:
double OBVArray[];
  • Clasificamos el array en orden inverso empezando por los datos actuales usando la función ArraySetAsSeries; esta retorna true o false:
ArraySetAsSeries(OBVArray,true);

  • También definimos OBV usando la función iOBV, creando una variable integer OBVDef. La función iOBV retorna el manejador del indicador On Balance Volume y sus parámetros (símbolo, periodo, precio de cálculo):
int OBVDef =iOBV(_Symbol, _Period,VOLUME_TICK);
  • Rellenamos el array OBVArray con los valores OBVDef usando la función CopyBuffer, que retorna el número de datos copiados. Los parámetros de la función son: el manejador del indicador, el número de búfer, la hora de inicio, la hora de finalización y el búfer:
CopyBuffer(OBVDef,0,0,3,OBVArray);
  • Calculamos el valor OBV actual. Para ello, primero crearemos la variable double OBVValue:
double OBVValue=OBVArray[0];
  • Después, crearemos un comentario usando la función comment, que mostrará un mensaje en el gráfico con el valor OBV actual:
Comment("OBV Value is: ",OBVValue);

Este es el aspecto del código completo del sistema comercial, que muestra un comentario en el gráfico con el valor actual del indicador OBV:

//+------------------------------------------------------------------+
//|                                                   Simple OBV.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()
  {
   //creating an array for OBV
   double OBVArray[];
   
   //sorting the array from the current data
   ArraySetAsSeries(OBVArray,true);
   
   //defining OBV
   int OBVDef =iOBV(_Symbol, _Period,VOLUME_TICK);
   
   //defining EA, buffer, sorting in array
   CopyBuffer(OBVDef,0,0,3,OBVArray);
   
   //calculating current OBV value
   double OBVValue=OBVArray[0];
   
   //creating a comment with OBV value
   Comment("OBV Value is: ",OBVValue);  
  }
//+------------------------------------------------------------------+

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

OBV en el Navegador 1

Clique dos veces en el archivo o arrástrelo y suéltelo en el gráfico, y aparecerá la siguiente ventana:

Ventana de OBV simple

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

OBV simple en un gráfico

Podrá saber que el programa está funcionando por los comentarios que aparecen en el gráfico, como en este ejemplo:

Señal de prueba de OBV simple

También podemos comprobar que se trata del mismo valor que muestra el indicador OBV incorporado en MetaTrader 5. Para ello, ejecutaremos el asesor que hemos creado y el indicador estándar On Balance Volume en el gráfico. Al hacerlo, ambos programas mostrarán los mismos valores, como vemos en el ejemplo de la siguiente captura de pantalla:

La misma señal de OBV simple y el indicador

 A continuación, escribiremos los sistemas comerciales para cada estrategia analizada.

  • Estrategia uno: movimiento simple de OBV

Como ya hemos dicho antes, esta estrategia requiere que el programa determine la dirección de la curva de OBV comparando el valor OBV actual con el valor anterior: si el valor actual es mayor que el valor anterior, significará que el OBV está subiendo, y el comentario "el OBV está subiendo" deberá aparecer en el gráfico junto con los dos valores de OBV, el actual y el anterior. A continuación, le mostramos el código completo para crear dicha estrategia:

//+------------------------------------------------------------------+
//|                                          Simple OBV movement.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()
  {
//creating an two arrays for OBV
   double OBVArray1[];
   double OBVArray2[];

//sorting the array from the current data
   ArraySetAsSeries(OBVArray1,true);
   ArraySetAsSeries(OBVArray2,true);

//defining OBV
   int OBVDef =iOBV(_Symbol, _Period,VOLUME_TICK);

//defining EA, buffer, sorting in array
   CopyBuffer(OBVDef,0,0,3,OBVArray1);
   CopyBuffer(OBVDef,0,0,3,OBVArray2);

//getting the value of current OBV & the previous value
   double OBVCurrentValue=NormalizeDouble(OBVArray1[0],5);
   double OBVPrevValue=NormalizeDouble(OBVArray2[1],5);

//creating conditions of rising and declining OBV based on its values   
   if(OBVCurrentValue>OBVPrevValue)
     {
      Comment("OBV is rising","\n","OBV current is ",OBVCurrentValue,"\n","OBV previous is ",OBVPrevValue);
     }

   if(OBVCurrentValue<OBVPrevValue)
     {
      Comment("OBV is declining","\n","OBV current is ",OBVCurrentValue,"\n","OBV previous is ",OBVPrevValue);
     }

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

  • Diferencias en este código:
 Hemos creado dos arrays para OBV:
double OBVArray1[];
double OBVArray2[];

Hemos clasificado los dos arrays a partir de los datos actuales:

ArraySetAsSeries(OBVArray1,true);
ArraySetAsSeries(OBVArray2,true);

Rellenando estos dos arrays:

CopyBuffer(OBVDef,0,0,3,OBVArray1);
CopyBuffer(OBVDef,0,0,3,OBVArray2);

Obtenemos los valores OBV actual y anterior usando la función NormalizeDouble, que retorna un valor de tipo double con la precisión especificada. También crearemos las variables double OBVCurrentValue y OBVPrevValue para este propósito. Los parámetros de la función NormalizeDouble son el valor y la precisión; el valor será OBVArray y las cifras serán 5, es decir, el número de dígitos después del punto decimal:

double OBVCurrentValue=NormalizeDouble(OBVArray1[0],5);
double OBVPrevValue=NormalizeDouble(OBVArray2[1],5);

Configuración de las condiciones de aumento y disminución de OBV usando la función if:

if(OBVCurrentValue>OBVPrevValue)
   {
    Comment("OBV is rising","\n","OBV current is ",OBVCurrentValue,"\n","OBV previous is ",OBVPrevValue);
   }

if(OBVCurrentValue<OBVPrevValue)
   {
    Comment("OBV is declining","\n","OBV current is ",OBVCurrentValue,"\n","OBV previous is ",OBVPrevValue);
   }

Una vez compilado, el asesor experto aparecerá en la ventana del Navegador en MetaTrader 5, en la subcarpeta "Asesores Expertos", como se muestra en la captura de pantalla siguiente:

OBV en el Navigator 2

Clique dos veces en el archivo o arrástrelo y suéltelo en el gráfico, y aparecerá la siguiente ventana:

Ventana del programa OBV - Movimiento simple

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

OBV - Movimiento simple - en el gráfico

A continuación, le mostramos varios ejemplos de señales de prueba generadas por esta estrategia.

OBV aumenta:

OBV - Movimiento simple - señal de crecimiento

OBV disminuye:

OBV - Movimiento simple - Señal de descenso

  • Segunda estrategia: fuerza de OBV simple

Según esta estrategia, el programa comparará dos valores: el valor OBV actual y la media de los cuatro valores OBV anteriores. Si el valor actual es superior a la media calculada, significará que el OBV es fuerte y viceversa, si el valor actual es inferior a la media calculada, el OBV actual se considerará débil. A continuación, le mostramos el código completo para crear dicha estrategia:

//+------------------------------------------------------------------+
//|                                          Simple OBV Strength.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
void OnTick()
  {
   //creating an six arrays for OBV
   double OBVArray0[];
   double OBVArray1[];
   double OBVArray2[];
   double OBVArray3[];
   double OBVArray4[];
   
   //sorting arrays from the current data
   ArraySetAsSeries(OBVArray0,true);   
   ArraySetAsSeries(OBVArray1,true);
   ArraySetAsSeries(OBVArray2,true);
   ArraySetAsSeries(OBVArray3,true);
   ArraySetAsSeries(OBVArray4,true);
   
   //defining OBV
   int OBVDef =iOBV(_Symbol, _Period,VOLUME_TICK);
   
   //defining EA, buffer, sorting in arrays
   CopyBuffer(OBVDef,0,0,5,OBVArray0);
   CopyBuffer(OBVDef,0,0,5,OBVArray1);
   CopyBuffer(OBVDef,0,0,5,OBVArray2);
   CopyBuffer(OBVDef,0,0,5,OBVArray3);
   CopyBuffer(OBVDef,0,0,5,OBVArray4);
   
   //getting the value of current OBV & previous 5 values
   double OBVCurrentValue=NormalizeDouble(OBVArray0[0],5);         
   double OBVPrevValue1=NormalizeDouble(OBVArray1[1],5);
   double OBVPrevValue2=NormalizeDouble(OBVArray2[2],5);
   double OBVPrevValue3=NormalizeDouble(OBVArray3[3],5);
   double OBVPrevValue4=NormalizeDouble(OBVArray4[4],5);
   
   //calculating average of previous OBV value
   double OBVAVG=((OBVPrevValue1+OBVPrevValue2+OBVPrevValue3+OBVPrevValue4)/4);
   
   if(OBVCurrentValue>OBVAVG)
   {
      Comment("OBV is strong","\n","OBV current is ",OBVCurrentValue,"\n","OBV Average is ",OBVAVG,"\n","Previous four OBV Values: ", 
      "\n", "1= ",OBVPrevValue1,"\n", "2= ",OBVPrevValue2,"\n", "3= ",OBVPrevValue3,"\n", "4= ",OBVPrevValue4);
   }
   
   if(OBVCurrentValue<OBVAVG)
   {
      Comment("OBV is weak","\n","OBV current is ",OBVCurrentValue,"\n","OBV Average is ",OBVAVG,"\n","Previous four OBV Values: ",
      "\n", "1= ",OBVPrevValue1,"\n", "2= ",OBVPrevValue2,"\n", "3= ",OBVPrevValue3,"\n", "4= ",OBVPrevValue4);
   }
   
  }
//+------------------------------------------------------------------+

  • Diferencias en este código:

Hemos creado cinco arrays de valores OBV:

double OBVArray0[];
double OBVArray1[];
double OBVArray2[];
double OBVArray3[];
double OBVArray4[];

Hemos clasificado los arrays creados a partir de los datos actuales:

ArraySetAsSeries(OBVArray0,true);   
ArraySetAsSeries(OBVArray1,true);
ArraySetAsSeries(OBVArray2,true);
ArraySetAsSeries(OBVArray3,true);
ArraySetAsSeries(OBVArray4,true);

Hemos rellenado estos con un OBVDef específico:

CopyBuffer(OBVDef,0,0,5,OBVArray0);
CopyBuffer(OBVDef,0,0,5,OBVArray1);
CopyBuffer(OBVDef,0,0,5,OBVArray2);
CopyBuffer(OBVDef,0,0,5,OBVArray3);
CopyBuffer(OBVDef,0,0,5,OBVArray4);

Hemos obtenido el valor OBV actual y los cuatro valores OBV anteriores:

double OBVCurrentValue=NormalizeDouble(OBVArray0[0],5);         
double OBVPrevValue1=NormalizeDouble(OBVArray1[1],5);
double OBVPrevValue2=NormalizeDouble(OBVArray2[2],5);
double OBVPrevValue3=NormalizeDouble(OBVArray3[3],5);
double OBVPrevValue4=NormalizeDouble(OBVArray4[4],5);

Hemos calculado la media de los cuatro valores OBV anteriores tras crear la variable double OBVAVG:

double OBVAVG=((OBVPrevValue1+OBVPrevValue2+OBVPrevValue3+OBVPrevValue4)/4);

Hemos establecido las condiciones de OBV fuertes y débiles con la pertinente muestra de comentarios:

if(OBVCurrentValue>OBVAVG)
{
 Comment("OBV is strong","\n","OBV current is ",OBVCurrentValue,"\n","OBV Average is ",OBVAVG,"\n","Previous four OBV Values: ", 
  "\n", "1= ",OBVPrevValue1,"\n", "2= ",OBVPrevValue2,"\n", "3= ",OBVPrevValue3,"\n", "4= ",OBVPrevValue4);
}
   
if(OBVCurrentValue<OBVAVG)
{
 Comment("OBV is weak","\n","OBV current is ",OBVCurrentValue,"\n","OBV Average is ",OBVAVG,"\n","Previous four OBV Values: ",
  "\n", "1= ",OBVPrevValue1,"\n", "2= ",OBVPrevValue2,"\n", "3= ",OBVPrevValue3,"\n", "4= ",OBVPrevValue4);
}

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

OBV en el Navigator 3

Una vez seleccionado el archivo para su ejecución en MetaTrader 5, se abrirá la ventana del asesor experto que se muestra a continuación:

Ventana de la estrategia OBV - Fuerza Simple

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

OBV - Fuerza de la llanura - en el gráfico

Los siguientes son ejemplos de señales de este programa:

OBV fuerte:

OBV - Fuerza - señal de OBV fuerte

OBV débil:

OBV - Fuerza - señal OBV débil

  • Estrategia tres: estrategia OBV simple - tendencia alcista

Según esta estrategia, deberemos determinar si el máximo actual ha superado el máximo anterior y si el OBV actual ha superado el máximo anterior. Por lo tanto, compararemos los dos valores de OBV (el actual y el anterior) y los dos máximos (el actual y el anterior): si las condiciones se confirman, obtendremos una señal que indicará un fuerte movimiento durante la tendencia alcista "Strong move during uptrend". A continuación, le mostramos el código completo para crear dicha estrategia:

//+------------------------------------------------------------------+
//|                                         Simple OBV - 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()
  {
   //create a string variable for signal
   string signal="";
   
   //creating two OBV arrays
   double OBVArray0[];
   double OBVArray1[];
   
   //creating two price arrays
   MqlRates PriceArray0[];
   MqlRates PriceArray1[];
   
   //sorting OBV arrays from the current data
   ArraySetAsSeries(OBVArray0,true);   
   ArraySetAsSeries(OBVArray1,true);   
   
   //sorting Price arrays from the current data
   ArraySetAsSeries(PriceArray0,true);
   ArraySetAsSeries(PriceArray1,true);     
      
   //fill arrays with price data
   int Data0=CopyRates(_Symbol,_Period,0,3,PriceArray0);
   int Data1=CopyRates(_Symbol,_Period,0,3,PriceArray1);
   
   //defining OBV
   int OBVDef =iOBV(_Symbol, _Period,VOLUME_TICK);

   //defining EA, buffer, sorting in arrays
   CopyBuffer(OBVDef,0,0,3,OBVArray0);
   CopyBuffer(OBVDef,0,0,3,OBVArray1);
            
   //getting the value of current & the previous OBV
   double OBVCurrentValue=NormalizeDouble(OBVArray0[0],5);         
   double OBVPrevValue=NormalizeDouble(OBVArray1[1],5);
    
   //getting the value of current high & the previous high
   double CurrentHighValue=NormalizeDouble(PriceArray0[0].high,5);         
   double PrevHighValue=NormalizeDouble(PriceArray1[1].high,5); 
      
   //strong move signal
   //if OBVCurrentValue>OBVPrevValue && current high> previous high
   if(OBVCurrentValue > OBVPrevValue && PriceArray0[0].high>PriceArray0[1].high)
   {
      signal="Strong move during uptrend";
   }

   //comment with the signal
   Comment("The signal is ",signal,"\n","OBVCurrentValue is :",OBVCurrentValue,
   "\n","OBVPrevValue is :", OBVPrevValue,"\n","Current high is :",CurrentHighValue,"\n","Previous high is :",PrevHighValue);            
  }
//+------------------------------------------------------------------+

Diferencias en este código:

Hemos creado una variable de cadena para la señal usando la función string, que almacena los datos de texto. Inicialmente estará en blanco. La calcularemos y rellenaremos más tarde:

string signal="";

Creamos dos arrays para los valores OBV usando una función double y dos arrays de precios utilizando la función MqlRates para almacenar la información sobre el precio, el volumen y el spread:

//creating two OBV arrays
double OBVArray0[];
double OBVArray1[];
   
//creating two price arrays
MqlRates PriceArray0[];
MqlRates PriceArray1[];1[];

Clasificamos estos arrays como una serie temporal, empezando por los datos actuales:

//sorting OBV arrays from the current data
ArraySetAsSeries(OBVArray0,true);   
ArraySetAsSeries(OBVArray1,true);   
   
//sorting Price arrays from the current data
ArraySetAsSeries(PriceArray0,true);
ArraySetAsSeries(PriceArray1,true);

Luego rellenamos las matrices de precios con los precios usando la función CopyRates, que recupera los datos históricos de la estructura MqlRates. Para ello, crearemos las variables enteras Data0 y Data1 para cada array:

int Data0=CopyRates(_Symbol,_Period,0,3,PriceArray0);
int Data1=CopyRates(_Symbol,_Period,0,3,PriceArray1);

Definimos el OBV y rellenamos los dos arrays OBVArrays con él:

int OBVDef =iOBV(_Symbol, _Period,VOLUME_TICK);

CopyBuffer(OBVDef,0,0,3,OBVArray0);
CopyBuffer(OBVDef,0,0,3,OBVArray1);

Obtenemos los valores OBV y los máximos:

//getting the value of current & the previous OBV
double OBVCurrentValue=NormalizeDouble(OBVArray0[0],5);         
double OBVPrevValue=NormalizeDouble(OBVArray1[1],5);
    
//getting the value of current high & the previous high
double CurrentHighValue=NormalizeDouble(PriceArray0[0].high,5);         
double PrevHighValue=NormalizeDouble(PriceArray1[1].high,5); 

A continuación, definimos las condiciones para un movimiento fuerte durante la tendencia alcista y mostramos el comentario "Strong move during uptrend":

Comment("The signal is ",signal,"\n","OBVCurrentValue is :",OBVCurrentValue,
"\n","OBVPrevValue is :", OBVPrevValue,"\n","Current high is :",CurrentHighValue,"\n","Previous high is :",PrevHighValue); 

Si compilamos el código, el asesor aparecerá en la ventana del Navegador:

OBV en el Navigator 4

Una vez seleccionado el archivo para su ejecución en MetaTrader 5, se abrirá la ventana del asesor experto que se muestra a continuación:

Ventana de la estrategia OBV - Uptrend

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

Asesor según la estrategia de OBV - Uptrend en el gráfico

Los siguientes son ejemplos de prueba para las señales,

Señal con ventana de datos y valor actual:

Señal del asesor según la estrategia OBV Uptrend con la ventana de datos actual

Señal con la ventana de datos y el valor anterior:

Señal del asesor según la estrategia OBV Uptrend con la ventana de datos anterior

  • Estrategia cuatro: estrategia OBV simple - tendencia bajista

Esta estrategia es la opuesta a la anterior: según las condiciones de esta estrategia, deberemos determinar si el mínimo actual es menor que el anterior y si el OBV actual es menor que el anterior. Por lo tanto, compararemos los dos valores OBV (el actual y el anterior) y los dos mínimos (el actual y el anterior); si las condiciones se confirman, obtendremos la señal de un movimiento fuerte durante la tendencia bajista "Strong move during downtrend". A continuación, le mostramos el código completo para crear dicha estrategia:


//+------------------------------------------------------------------+
//|                                       Simple OBV - 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()
  {
   //create a string variable for signal
   string signal="";
   
   //creating two OBV arrays
   double OBVArray0[];
   double OBVArray1[];
   
   //creating two price arrays
   MqlRates PriceArray0[];
   MqlRates PriceArray1[];
   
   //sorting OBV arrays from the current data
   ArraySetAsSeries(OBVArray0,true);   
   ArraySetAsSeries(OBVArray1,true);   
   
   //sorting Price arrays from the current data
   ArraySetAsSeries(PriceArray0,true);
   ArraySetAsSeries(PriceArray1,true);     
      
   //fill array with price data
   int Data0=CopyRates(_Symbol,_Period,0,3,PriceArray0);
   int Data1=CopyRates(_Symbol,_Period,0,3,PriceArray1);
   
   //defining OBV
   int OBVDef =iOBV(_Symbol, _Period,VOLUME_TICK);

   //defining EA, buffer, sorting in arrays
   CopyBuffer(OBVDef,0,0,3,OBVArray0);
   CopyBuffer(OBVDef,0,0,3,OBVArray1);
            
   //getting the value of current OBV & the previous value
   double OBVCurrentValue=NormalizeDouble(OBVArray0[0],5);         
   double OBVPrevValue=NormalizeDouble(OBVArray1[1],5);
    
   //getting the value of current OBV & the previous value
   double CurrentLowValue=NormalizeDouble(PriceArray0[0].low,5);         
   double PrevLowValue=NormalizeDouble(PriceArray1[1].low,5); 
       
   //strong move signal
   //if OBVCurrentValue>OBVPrevValue && current low> previous low
   if(OBVCurrentValue < OBVPrevValue && PriceArray0[0].low<PriceArray0[1].low)
   {
      signal="Strong move during downtrend";
   }

   //comment with the signal
   Comment("The signal is ",signal,"\n","OBVCurrentValue is :",OBVCurrentValue,
   "\n","OBVPrevValue is :", OBVPrevValue,"\n","Current low is :",CurrentLowValue,"\n","Previous low is :",PrevLowValue);            
  }
//+------------------------------------------------------------------+


  • Diferencias en este código:

Definimos las condiciones para un movimiento fuerte durante una tendencia bajista y mostramos el comentario "Strong move during downtrend":

Comment("The signal is ",signal,"\n","OBVCurrentValue is :",OBVCurrentValue,
"\n","OBVPrevValue is :", OBVPrevValue,"\n","Current low is :",CurrentLowValue,"\n","Previous low is :",PrevLowValue); 

Compilamos el código y encontramos el asesor experto en la ventana del Navegador en MetaTrader 5:

OBV en el Navigator 5

Arrastramos nuestro programa desde el Navegador al gráfico y lo soltamos. Se abrirá una ventana como esta:

Asesor según la estrategia de OBV - Downtrend

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

Asesor según la estrategia de OBV - Downtrend en el gráfico

Ejemplos de señales generadas a partir de esta estrategia.

Señal del asesor con la ventana de datos y los datos actuales:

Señal del asesor según la estrategia de OBV Downtrend con la ventana de datos actual

Señal del asesor con la ventana de datos y los datos anteriores:

Señal del asesor según la estrategia de OBV Downtrend con la ventana de datos anterior


Conclusión

Bien, en el presente artículo hemos presentado otro indicador técnico que utiliza los volúmenes en sus cálculos. Estos datos ofrecen una perspectiva diferente del gráfico que nos puede ayudar a tomar mejores decisiones comerciales. Hablamos del indicador On Balance Volume (OBV). Hemos aprendido lo que indica, qué mide y cómo calcularlo manualmente (simplemente para entender su esencia, aunque no lo calculemos nosotros mismos). También hemos aprendido a usar este indicador y hemos presentado algunas estrategias sencillas basadas en él que podrán sernos de utilidad en el trading o ayudarnos a poner en práctica nuevas ideas, que es el objetivo principal de este y otros artículos de esta serie. Hemos desarrollado un esquema para cada estrategia analizada que ayuda a escribir un código para el sistema comercial basado en cada estrategia. Y luego, para cada estrategia, hemos creado un asesor en MQL5 que se puede ejecutar en la plataforma comercial MetaTrader 5 para generar automáticamente y con precisión las señales según las condiciones y reglas dadas de cada estrategia.

Querríamos señalar que una de las cosas más útiles del análisis técnico es que permite mantener más de un punto de vista sobre un instrumento financiero, y también permite combinar más de un instrumento/indicador. Algunas herramientas nos ayudan a ver una imagen más completa de un instrumento financiero, permitiéndonos tomar decisiones claras y adecuadas. Con ayuda de este enfoque, podemos crear un sistema comercial más sólido. No olvide esta posibilidad al leer o estudiar algo, así podrá entender qué herramientas se pueden combinar.

También querríamos reiterar que este artículo y los otros de esta serie tienen un fin exclusivamente educativo y que su lectura está destinada a tráders principiantes. Su principal objetivo es ayudar a comprender la esencia de las cosas y entender lo que se puede hacer con la programación MQL5, logrando que el trading sea más fácil y preciso. Asegúrese de probar todas las estrategias por usted mismo antes de utilizarlas en el comercio para evaluar su utilidad. Le recomendamos repetir por su cuenta todo lo visto en el artículo. De este modo, desarrollará sus habilidades más rápidamente y comprenderá mejor el tema.

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

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

Redes neuronales: así de sencillo (Parte 16): Uso práctico de la clusterización Redes neuronales: así de sencillo (Parte 16): Uso práctico de la clusterización
En el artículo anterior, creamos una clase para la clusterización de datos. En este artículo, queremos compartir con el lector diferentes opciones de uso de los resultados obtenidos para resolver problemas prácticos en el trading.
Redes neuronales: así de sencillo (Parte 15): Clusterización de datos usando MQL5 Redes neuronales: así de sencillo (Parte 15): Clusterización de datos usando MQL5
Continuamos analizando el método de clusterización. En este artículo, crearemos una nueva clase CKmeans para implementar uno de los métodos de clusterización de k-medias más extendidos. Según los resultados de la prueba, el modelo ha podido identificar alrededor de 500 patrones.
Aprendiendo a diseñar un sistema de trading con el indicador de Acumulación/Distribución Aprendiendo a diseñar un sistema de trading con el indicador de Acumulación/Distribución
En este nuevo artículo de la serie sobre la creación de sistemas comerciales basados en indicadores técnicos populares, analizaremos el indicador de Acumulación/Distribución (A/D). También desarrollaremos un sistema comercial para la plataforma MetaTrader 5 utilizando algunas estrategias simples.
Aprendiendo a diseñar un sistema comercial basado en Parabolic SAR Aprendiendo a diseñar un sistema comercial basado en Parabolic SAR
Esta es la continuación de una serie de artículos en los que aprendemos cómo crear sistemas comerciales usando los indicadores más populares. En el presente artículo, analizaremos el indicador Parabolic SAR. También desarrollaremos un sistema comercial para la plataforma MetaTrader 5 usando algunas estrategias simples.