描述
CTEMAOnRingBuffer类用于计算技术指标三重指数移动平均(Triple Exponential Moving Average, TEMA),其算法基于环形缓冲区。
声明
class CTEMAOnRingBuffer : public CArrayRing
标题
#include <IncOnRingBuffer\CTEMAnRingBuffer.mqh>CTEMAOnRingBuffer.mqh类文件必须放在MQL5\Include\IncOnRingBuffer文件夹中。该文件夹内附带用于此类的示例文件。同时,环形缓冲区的类文件、DEMA和移动平均文件也必须在此文件夹中。
类方法
//--- 初始化方法: bool Init( // 错误返回false,成功返回true int period = 12, // TEMA周期 ENUM_MA_METHOD method = MODE_EMA, // 平滑方法 int size_buffer = 256, // 环形缓冲区大小 bool as_series = false // 如果是时间序列则为true,否则为false );
//--- 基于时间序列或指标缓冲区的计算方法: int MainOnArray( // 返回处理的元素数量 const int rates_total, // 数组大小 const int prev_calculated, // 上次调用时处理的元素数量 const double& price[], // 用于计算的数组 );
//--- 基于数组单个元素的计算方法: double MainOnValue( // 返回指定元素(柱)的TEMA值 const int rates_total, // 数组大小 const int prev_calculated, // 数组处理的元素 const int begin, // 数组重要数据的起始位置 const double value, // 元素(柱)值 const int index // 元素(柱)索引 );
//--- 数据访问方法: int BarsRequired(); // 返回绘制指标所需的条数 string Name(); // 返回指标名称 int Period(); // 返回周期 int Size(); // 返回环形缓冲区大小 double MA(int index); // 返回移动平均值,索引与时间序列相同 double DEMA(int index); // 返回DEMA值,索引与时间序列相同
要从环形缓冲区获取计算数据,可以像从普通数组中一样提取。例如:
//--- TEMA指标计算类: #include <IncOnRingBuffer\CTEMAOnRingBuffer.mqh> CTEMAOnRingBuffer tema; ... //+------------------------------------------------------------------+ //| 自定义指标迭代函数 | //+------------------------------------------------------------------+ int OnCalculate (const int rates_total, // price[]数组大小 const int prev_calculated, // 上次调用时处理的柱数 const int begin, // 重要数据的起始位置 const double& price[]) // 用于计算的数组 { //--- 基于时间序列的指标计算: tema.MainOnArray(rates_total,prev_calculated,price); ... //--- 使用“tema”环形缓冲区中的数据,例如,将数据复制到指标缓冲区: for(int i=start;i<rates_total && !IsStopped();i++) TEMA_Buffer[i] = tema[rates_total-1-i]; // TEMA指标线 ... //--- 返回下次调用的prev_calculated值: return(rates_total); }
在计算TEMA时,还会根据相同参数计算移动平均和DEMA。我们可以使用MA方法(int index)和DEMA(int index)从MA和DEMA环形缓冲区获取数据:
//--- 使用移动平均和DEMA环形缓冲区中的数据,例如,将它们复制到指标缓冲区: for(int i=start;i<rates_total && !IsStopped();i++) { MA_Buffer[i] = dema.MA(rates_total-1-i); // 移动平均指标线 DEMA_Buffer[i] = dema.DEMA(rates_total-1-i); // DEMA指标线 }
请注意,环形缓冲区的索引与时间序列相同。
示例
- 指标计算的Test_TEMA_OnArrayRB.mq5文件基于价格时间序列,演示了MainOnArray()方法的应用。
- Test_TEMA_OnValueRB.mq5演示了MainOnValue()方法的使用。首先计算并绘制TEMA指标,然后基于此指标的环形缓冲区绘制另一条TEMA。

Test_TEMA_OnArrayRB.mq5的结果,环形缓冲区大小为256个元素

Test_TEMA_OnValueRB.mq5的结果,环形缓冲区大小为256个元素
在编写代码时,参考了MetaQuotes Software Corp.、Integer 和GODZILLA的开发成果。
评论 0