Description
If you're looking to enhance your trading strategy, the CTEMAOnRingBuffer class is a game changer for calculating the Triple Exponential Moving Average (TEMA) using a ring buffer algorithm. This lightweight solution for MetaTrader 5 will help you streamline your trading decisions.
Declaration
class CTEMAOnRingBuffer : public CArrayRing
Title
#include <IncOnRingBuffer\CTEMAnRingBuffer.mqh>To get started, you’ll need to place the CTEMAOnRingBuffer.mqh file in the IncOnRingBuffer folder within your MQL5\Include directory. You’ll also find two example files included to guide you through the process. Don’t forget to add the necessary files for the ring buffer, DEMA, and standard Moving Average to this folder as well.
Class Methods
//--- initialization method:bool Init( // returns false on error, true on success int period = 12, // TEMA period ENUM_MA_METHOD method = MODE_EMA, // smoothing method int size_buffer = 256, // ring buffer size bool as_series = false// true for time series, false otherwise );
//--- calculation method based on a time series or indicator buffers:int MainOnArray( // returns the number of processed elements constint rates_total, // size of the array constint prev_calculated, // processed elements from the previous call constdouble& price[], // array for calculation );
//--- calculation method for a specific element in the array:double MainOnValue( // returns TEMA value for a specific element (bar) constint rates_total, // size of the array constint prev_calculated, // processed elements of the array constint begin, // start of significant data in the array constdouble value, // value of the element (bar) constint index // index of the element (bar) );
//--- methods for data access:int BarsRequired(); // returns necessary bars to draw the indicatorstring Name(); // returns the name of the indicatorint Period(); // returns the periodint Size(); // returns the size of the ring bufferdouble MA(int index); // returns Moving Average value, indexed like a time seriesdouble DEMA(int index); // returns DEMA value, indexed like a time series
Accessing the calculated indicator data from the ring buffer is just like accessing a standard array. Here’s how you can implement that:
//--- class with TEMA calculation methods:#include <IncOnRingBuffer\CTEMAOnRingBuffer.mqh> CTEMAOnRingBuffer tema; ... //+------------------------------------------------------------------+//| Custom indicator iteration function |//+------------------------------------------------------------------+intOnCalculate (constint rates_total, // size of the price[] array constint prev_calculated, // processed bars on the previous call constint begin, // start of significant data constdouble& price[]) // array for calculation { //--- calculate indicator based on time series: tema.MainOnArray(rates_total, prev_calculated, price); ... //--- use data from the "tema" ring buffer,// for example, copy data into the indicator buffer: for(int i=start; i<rates_total && !IsStopped(); i++) TEMA_Buffer[i] = tema[rates_total - 1 - i]; // TEMA indicator line ... //--- return value of prev_calculated for next call: return(rates_total); }
When you calculate the TEMA, the Moving Average and DEMA are also computed with the same parameters. You can access the data from the MA ring buffer and DEMA using the MA() and DEMA() methods respectively:
//--- use data from Moving Average and DEMA ring buffers,// for example, copy them into indicator buffers: for(int i=start; i<rates_total && !IsStopped(); i++) { MA_Buffer[i] = dema.MA(rates_total - 1 - i); // Moving Average indicator line DEMA_Buffer[i] = dema.DEMA(rates_total - 1 - i); // DEMA indicator line }
Keep in mind that indexing in the ring buffers works just like in the time series.
Examples
- The Test_TEMA_OnArrayRB.mq5 file showcases the indicator based on the price time series, demonstrating the use of the MainOnArray() method.
- The Test_TEMA_OnValueRB.mq5 file illustrates the MainOnValue() method; first calculating and drawing the TEMA indicator, then drawing another TEMA based on the initial indicator's ring buffer.

Output from Test_TEMA_OnArrayRB.mq5 with a ring buffer size of 256 elements

Output from Test_TEMA_OnValueRB.mq5 with a ring buffer size of 256 elements
Development for this code draws on the expertise of MetaQuotes Software Corp., Integer, and GODZILLA.

Comments 0