首页 技术指标 帖子

使用环形缓冲区绘制双指数移动平均线(DEMA)的类 - MetaTrader 5 指标解析

附件
1416.zip (9.14 KB, 下载 0次)

描述

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); // 移动平均线指标线

请注意,环形缓冲区中的索引与 时间序列 中的索引相同。

示例

  1. 指标计算文件 Test_DEMA_OnArrayRB.mq5 基于价格时间序列。演示了 MainOnArray() 方法的应用。
  2. 文件 Test_DEMA_OnValueRB.mq5 演示了 MainOnValue() 方法的使用。首先计算并绘制 DEMA 指标。然后基于此指标环形缓冲区绘制另一条 DEMA。


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



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

 

在编写代码时,参考了 MetaQuotes Software Corp.Integer GODZILLA 的开发成果。

相关帖子

评论 (0)