Inicio Indicador técnico Publicación

Clase para Calcular el OBV con Ring Buffer en MetaTrader 5

Archivos adjuntos
1402.zip (6.42 KB, Descargar 0 veces)

Descripción

La clase COBVOnRingBuffer está diseñada para calcular el indicador técnico On Balance Volume (OBV) utilizando el algoritmo de ring buffer.

Declaración

class COBVOnRingBuffer : public CArrayRing

Título

#include <IncOnRingBuffer\COBVOnRingBuffer.mqh>

El archivo de la clase COBVOnRingBuffer.mqh debe colocarse en la carpeta IncOnRingBuffer, que debe establecerse en MQL5\Include\. Dos archivos con ejemplos utilizados por la clase de esta carpeta están adjuntos a la descripción. El archivo con la clase de ring buffer también debe estar en esta carpeta.

Métodos de la Clase

//--- método de inicialización:
bool Init( // si hay error devuelve false, si es exitoso - true
    int period = 0, // el periodo del OBV
    int size_buffer = 256, // tamaño del ring buffer
    bool as_series = false // true, si es una serie temporal, de lo contrario - false
);

El periodo del OBV se utiliza como en el caso de Integer: si el valor es 0 (predeterminado) el indicador funciona como el incluido en el terminal, se calculará para todas las barras del gráfico. Si se especifica cualquier otro valor positivo, se utilizará el número especificado de barras (principio de Media Móvil) para el cálculo del valor en cada barra del gráfico.

//--- método de cálculo basado en una serie temporal o los buffers del indicador:
int MainOnArray( // devuelve el número de elementos procesados
    const int rates_total, // tamaño de los arrays
    const int prev_calculated, // elementos procesados en la llamada anterior
    const double& price[], // precio
    const long& volume[]); // volumen
);
//--- método de cálculo basado en elementos individuales del array
double MainOnValue( // devuelve el valor OBV para el elemento (barra)
    const int rates_total, // tamaño del array
    const int prev_calculated, // elementos procesados del array
    const int begin, // desde dónde empiezan los datos significativos del array
    const double price, // precio
    const long volume, // volumen
    const int index // el índice del elemento (barra)
);
//--- métodos de acceso a los datos:
int BarsRequired(); // Devuelve el número necesario de barras para dibujar el indicador
string Name(); // Devuelve el nombre del indicador
int Period(); // Devuelve el periodo
int Size(); // Devuelve el tamaño del ring buffer

Para obtener los datos calculados del indicador desde el ring buffer, es posible hacerlo como desde un array normal. Por ejemplo:

//--- la clase con los métodos de cálculo del indicador OBV:
#include <IncOnRingBuffer\COBVOnRingBuffer.mqh>
COBVOnRingBuffer obv;

...

//+------------------------------------------------------------------+
//| Función de iteración del indicador personalizado                  |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
    const int prev_calculated,
    const datetime& time[],
    const double& open[],
    const double& high[],
    const double& low[],
    const double& close[],
    const long& tick_volume[],
    const long& volume[],
    const int& spread[])
{//--- el cálculo del indicador basado en una serie temporal:
    obv.MainOnArray(rates_total, prev_calculated, close, tick_volume);

...

//--- usa los datos del ring buffer "obv",
// por ejemplo, copia los datos en el buffer del indicador:
    for(int i=start; i<rates_total && !IsStopped(); i++)
        OBV_Buffer[i] = obv[rates_total-1-i]; // línea del indicador

...

//--- devuelve el valor de prev_calculated para la próxima llamada:
    return(rates_total);
}

Recuerda que la indexación en el ring buffer es la misma que en la serie temporal.

Ejemplos

  1. El indicador calcula el archivo Test_OBV_OnArrayRB.mq5 sobre la base de la serie temporal de precios. Se demuestra la aplicación del método MainOnArray().
  2. El archivo Test_OBV_OnValueRB.mq5 demuestra el uso del método MainOnValue(). Primero se calcula y dibuja el indicador OBV. Luego, con base en este ring buffer de indicadores, se dibuja otro OBV.


El resultado del trabajo del Test_OBV_OnArrayRB.mq5 con el tamaño del ring buffer de 256 elementos



El resultado del trabajo del Test_OBV_OnValueRB.mq5 con el tamaño del ring buffer de 256 elementos

 

Al escribir el código se utilizaron los desarrollos de MetaQuotes Software Corp., Integer y GODZILLA.

Publicaciones relacionadas

Comentarios (0)