Clase para Calcular el OBV con Ring Buffer en MetaTrader 5

Mike 2013.01.17 00:38 38 0 0
Archivos adjuntos

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 - trueint period = 0, // el periodo del OBVint size_buffer = 256, // tamaño del ring bufferbool 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 procesadosconstint rates_total, // tamaño de los arraysconstint prev_calculated, // elementos procesados en la llamada anteriorconstdouble& price[], // precioconstlong& volume[]); // volumen
);
//--- método de cálculo basado en elementos individuales del arraydouble MainOnValue( // devuelve el valor OBV para el elemento (barra)constint rates_total, // tamaño del arrayconstint prev_calculated, // elementos procesados del arrayconstint begin, // desde dónde empiezan los datos significativos del arrayconstdouble price, // precioconstlong volume, // volumenconstint 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 indicadorstring Name(); // Devuelve el nombre del indicadorintPeriod(); // Devuelve el periodoint 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                  |//+------------------------------------------------------------------+intOnCalculate(constint rates_total,
    constint prev_calculated,
    constdatetime& time[],
    constdouble& open[],
    constdouble& high[],
    constdouble& low[],
    constdouble& close[],
    constlong& tick_volume[],
    constlong& volume[],
    constint& 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.

Lista
Comentarios 0