Descripción
La clase CAMAOnRingBuffer está diseñada para calcular el indicador técnico Media Móvil Adaptativa (AMA) utilizando el algoritmo del buffer circular.
Declaración
class CAMAOnRingBuffer : public CArrayRing
Título
#include <IncOnRingBuffer\CAMAOnRingBuffer.mqh>El archivo de la clase CAMAOnRingBuffer.mqh debe colocarse en la carpeta IncOnRingBuffer, que debe establecerse en MQL5\Include\. Se adjuntan dos archivos con los ejemplos utilizados por la clase desde esta carpeta. El archivo de la clase del buffer circular y la clase del Ratio de Eficiencia también deben estar en esta carpeta.
Métodos de la clase
//--- método de inicialización: bool Init( // si hay error devuelve falso, si es exitoso - verdadero int periodo = 10, // el periodo de AMA int periodo_rapido = 2, // el periodo de EMA rápido int periodo_lento = 30, // el periodo de EMA lento int tamaño_buffer = 256, // el tamaño del buffer circular, número de datos almacenados bool como_serie = false // verdadero, si es una serie temporal, falso - si es un índice normal de los datos de entrada );
//--- el método de cálculo basado en una serie temporal o buffer de indicador: int MainOnArray( // devuelve el número de elementos procesados const int total_rates, // el tamaño de la array array[] const int prev_calculado, // elementos procesados en la llamada anterior const double &array[] // el array de los valores de entrada );
//--- //--- el método de cálculo basado en los elementos separados de la serie del array
double MainOnValue( // devuelve el valor de la AMA para el elemento establecido
const int total_rates, // el tamaño del array
const int prev_calculado, // elementos procesados del array
const int inicio, // desde dónde comienzan los datos significativos del array
const double valor, // el valor del elemento del array
const int índice // el índice del elemento
);//--- 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 string FastPeriod(); // Devuelve el periodo de suavizado EMA rápido int SlowPeriod(); // Devuelve el periodo de suavizado EMA lento int Periodo(); // Devuelve el periodo de AMA int Tamaño(); // Devuelve el tamaño del buffer circular
Para obtener los datos calculados del indicador desde el buffer circular, es posible hacerlo como desde un array normal. Por ejemplo:
//--- la clase con métodos de cálculo del indicador AMA: #include <IncOnRingBuffer\CAMAOnRingBuffer.mqh> CAMAOnRingBuffer ama; ... //+------------------------------------------------------------------+ //| Función de iteración del indicador personalizado | //+------------------------------------------------------------------+ int OnCalculate(const int total_rates, const int prev_calculado, const int inicio, const double &precio[]) { //--- cálculo del indicador basado en la serie temporal de precios: ama.MainOnArray(total_rates,prev_calculado,precio); ... //--- usar los datos del buffer circular "ama", // por ejemplo, copiar los datos en el buffer del indicador: for(int i=inicio;i<total_rates;i++) AMA_Buffer[i] = ama[total_rates-1-i]; // línea del indicador //--- valor de retorno de prev_calculado para la próxima llamada: return(total_rates); }
Por favor, ten en cuenta que el indexado en el buffer circular es el mismo que en la serie temporal.
Ejemplos
- El archivo Test_AMA_OnArrayRB.mq5 calcula el indicador basado en la serie temporal de precios. Se demuestra la aplicación del método MainOnArray().
- El archivo Test_AMA_OnValueRB.mq5 demuestra el uso del método MainOnValue(). Primero se calcula y dibuja el indicador AMA. Luego, sobre la base de este buffer circular del indicador, se dibuja otra AMA.

El resultado del trabajo del Test_AMA_OnArrayRB.mq5 con el tamaño del buffer circular de 256 elementos

El resultado del trabajo del Test_AMA_OnValueRB.mq5 con el tamaño del buffer circular de 256 elementos
Al escribir el código se utilizaron los desarrollos de MetaQuotes Software Corp., Integer y GODZILLA.