描述
CDEMAOnRingBuffer 类旨在使用环形缓冲区算法计算技术指标双指数移动平均线(Double Exponential Moving Average, DEMA)。
声明
class CDEMAOnRingBuffer : public CArrayRing
标题
#include <IncOnRingBuffer\CDEMAnRingBuffer.mqh>文件 CDEMAOnRingBuffer.mqh 必须放置在 MQL5\Include\IncOnRingBuffer 文件夹中。两个示例文件也附在描述中。与此类相关的环形缓冲区和移动平均线文件也必须放在该文件夹中。
类方法
//--- 初始化方法: bool Init( // 如果出错返回 false,成功返回 true int period = 12, // DEMA 周期 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( // 返回指定元素(K线)的 DEMA 值 const int rates_total, // 数组大小 const int prev_calculated, // 数组中处理的元素 const int begin, // 数组中重要数据的起始位置 const double value, // 元素(K线)值 const int index // 元素(K线)索引 );
//--- 访问数据的方法: int BarsRequired(); // 返回绘制指标所需的 K线数量 string Name(); // 返回指标名称 int Period(); // 返回周期 int Size(); // 返回环形缓冲区大小 double MA(int index); // 返回移动平均值,索引与时间序列相同
可以像处理普通数组一样从环形缓冲区获取指标的计算数据。例如:
//--- 计算 DEMA 指标的方法类: #include <IncOnRingBuffer\CDEMAOnRingBuffer.mqh> CDEMAOnRingBuffer dema; ... //+------------------------------------------------------------------+ //| 自定义指标计算函数 | //+------------------------------------------------------------------+ int OnCalculate (const int rates_total, // 数组 price[] 的大小 const int prev_calculated, // 上次调用处理的 K线 const int begin, // 重要数据起始位置 const double& price[]) // 计算所需数组 { //--- 基于时间序列计算指标: dema.MainOnArray(rates_total,prev_calculated,price); ... //--- 从 "dema" 环形缓冲区使用数据, // 例如,将数据复制到指标缓冲区: for(int i=start;i<rates_total && !IsStopped();i++) DEMA_Buffer[i] = dema[rates_total-1-i]; // DEMA 指标线 ... //--- 返回 prev_calculated 的值以供下次调用: return(rates_total); }
在计算 DEMA 时,还会计算具有相同参数的移动平均线。我们可以使用 MA 方法从 MA 环形缓冲区获取数据(int index):
//--- 从移动平均线环形缓冲区使用数据, // 例如,将数据复制到指标缓冲区: for(int i=start;i<rates_total && !IsStopped();i++) MA_Buffer[i] = dema.MA(rates_total-1-i); // 移动平均线指标线
请注意,环形缓冲区中的索引与 时间序列 中的索引相同。
示例
- 指标计算文件 Test_DEMA_OnArrayRB.mq5 基于价格时间序列。演示了 MainOnArray() 方法的应用。
- 文件 Test_DEMA_OnValueRB.mq5 演示了 MainOnValue() 方法的使用。首先计算并绘制 DEMA 指标。然后基于此指标环形缓冲区绘制另一条 DEMA。

Test_DEMA_OnArrayRB.mq5 的工作结果,环形缓冲区大小为 256 元素

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