首页 技术指标 帖子

使用环形缓冲区绘制Wilder ADX指标的教程 - MetaTrader 5

附件
1356.zip (10.07 KB, 下载 0次)

描述

CADXWOnRingBuffer类旨在使用环形缓冲区算法计算技术指标Wilder平均方向运动指标(ADX Wilder)。

声明

class CADXWOnRingBuffer

标题

#include <IncOnRingBuffer\CADXWOnRingBuffer.mqh>

CADXWOnRingBuffer.mqh类文件应放置在MQL5\Include\IncOnRingBuffer文件夹中。附带的描述中提供了该文件夹中使用的两个示例文件。环形缓冲区的类文件和移动平均的类文件也必须放在此文件夹中。

类方法

//--- 初始化方法:
bool Init(                                 // 如果出错则返回false,成功则返回true
   int            ma_period   = 14,        // 移动平均平滑的周期
   ENUM_MA_METHOD ma_method   = MODE_SMMA, // 移动平均平滑的方法
   int            size_buffer = 256,       // 环形缓冲区的大小,存储的数据量
   bool           as_series   = false      // true表示时间序列,false表示普通的输入数据索引
   );             
//--- 基于时间序列或指标缓冲区的计算方法:
int MainOnArray(                  // 返回处理的元素数量
   const int     rates_total,     // 数组的大小
   const int     prev_calculated, // 上一次调用处理的元素
   const double &high[]           // 最高值数组
   const double &low[]            // 最低值数组
   const double &close[]          // 收盘价数组
   );
//--- 基于数组单独系列元素的计算方法
double MainOnValue(              // 返回特定元素的ADXW值
   const int    rates_total,     // 数组的大小
   const int    prev_calculated, // 数组中已处理的元素
   const int    begin,           // 数组显著数据的起始位置
   const double high,            // 最高值
   const double low,             // 最低值
   const double close,           // 收盘价
   const int    index            // 元素索引
   );
//--- 数据访问方法:
int    BarsRequired();   // 返回绘制指标所需的条数
string NameADXW();       // 返回指标名称
string NameNDI();        // 返回负方向运动指标线的名称
string NamePDI();        // 返回正方向指标线的名称
string MAMethod();       // 返回平滑方法的文本行
int    MAPeriod();       // 返回平滑周期
int    Size();           // 返回环形缓冲区的大小

要从环形缓冲区获取指标的计算数据,可以像从普通数组中一样访问。例如:

#include <IncOnRingBuffer\CADXWOnRingBuffer.mqh>
CADXWOnRingBuffer adxw;

...

//+------------------------------------------------------------------+
//| 自定义指标迭代函数                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime& time[],
                const double& open[],
                const double& high[],
                const double& low[],
                const double& close[],
                const long& tick_volume[],
                const long& volume[],
                const int& spread[])
  {
//--- 指标计算:
   adxw.MainOnArray(rates_total,prev_calculated,high,low,close);

   ...
     
//--- 将“adxw”环形缓冲区中的数据复制到指标中:
   for(int i=start;i<rates_total;i++)
     {
      ADXW_Buffer[i] = adxw[rates_total-1-i];      // 平均方向运动指标Wilder
      PDI_Buffer[i]  = adxw.pdi[rates_total-1-i];  // 正方向指标
      NDI_Buffer[i]  = adxw.ndi[rates_total-1-i];  // 负方向指标
     }

   ...
  }

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

示例

  1. Test_ADXW_OnArrayRB.mq5文件根据价格时间序列计算指标,展示了MainOnArray()方法的应用
  2. Test_ADXW_OnValueRB.mq5文件展示了MainOnValue()方法的使用。首先计算并绘制ADXW指标。然后基于该指标的环形缓冲区计算三条ADXW指标线。


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



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

 

本代码编写参考了MetaQuotes Software Corp.IntegerGODZILLA的开发成果。

相关帖子

评论 (0)