使用环形缓冲区绘制TEMA指标的类 - MetaTrader 5的操作指南

Mike 2013.01.17 00:39 40 0 0
附件

描述

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指标线
     }

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

示例

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


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



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

 

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

列表
评论 0