使用环形缓冲区计算分形指标的类 - MetaTrader 5

Mike 2013.01.18 22:00 47 0 0
附件

简介

CFractalsOnRingBuffer 是一个为计算分形技术指标而设计的类,采用了环形缓冲区的算法。想了解分形指标的更多信息,可以查看 这里

类声明

class CFractalsOnRingBuffer

文件引用

#include <IncOnRingBuffer\CFractalsOnRingBuffer.mqh>

请将 CFractalsOnRingBuffer.mqh 文件放置在 MQL5\Include\IncOnRingBuffer 文件夹中。该文件夹需要先行创建。附带的示例文件也会在此文件夹中。环形缓冲区类 CFractalsOnRingBuffer 的文件同样需要放在此文件夹中。

类方法

//--- 初始化方法:
bool Init(  // 如果出错返回 false,成功返回 true
    int bars_right = 2,  // 极值右侧的柱子数量
    int bars_left = 2,   // 极值左侧的柱子数量
    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[]  // 最小值数组
);
//--- 根据 high[] 数组的单独元素计算上分形的方法:
double MainOnHigh(  // 返回 index-bars_right 元素的上分形值
    const int rates_total,  // 数组的大小
    const int prev_calculated,  // 数组处理的元素数量
    const int begin,  // 数组重要数据的起始位置
    const double high,  // 当前柱的最大值
    const int index  // 当前元素(柱)的索引
);
//--- 根据 low[] 数组的单独元素计算下分形的方法:
double MainOnLow(  // 返回 index-bars_right 元素的下分形值
    const int rates_total,  // 数组的大小
    const int prev_calculated,  // 数组处理的元素数量
    const int begin,  // 数组重要数据的起始位置
    const double low,  // 当前柱的最小值
    const int index  // 当前元素(柱)的索引
);
//--- 访问数据的方法:
int BarsRequired();  // 返回绘制指标所需的柱子数量
string Name();  // 返回指标名称
string NameUpper();  // 返回上分形名称
string NameLower();  // 返回下分形名称
int BarsRight();  // 返回极值右侧的柱子数量
int BarsLeft();  // 返回极值左侧的柱子数量
int Size();  // 返回环形缓冲区的大小

从环形缓冲区获取计算出的指标数据和从普通数组中获取数据的方法相同。例如:

//--- 计算分形指标的方法类:
#include <IncOnRingBuffer\CFractalsOnRingBuffer.mqh>
CFractalsOnRingBuffer fractals;

...

//+------------------------------------------------------------------+
//| 自定义指标迭代函数                              |
//+------------------------------------------------------------------+
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[])  
  {
//--- 基于价格时间序列计算指标:
   fractals.MainOnArray(rates_total,prev_calculated,high,low);

...

//--- 使用来自环形缓冲区的数据 "fractals",
//    例如将数据复制到指标缓冲区:
   for(int i=start;i<rates_total-BarsRight && !IsStopped();i++)
     {
      UpperBuffer[i] = fractals.upper[rates_total-1-i]; // 上分形
      LowerBuffer[i] = fractals.lower[rates_total-1-i]; // 下分形
     }

...

//--- 返回 prev_calculated 的值以供下次调用:
   return(rates_total);
  }

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

示例

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


Test_Fractals_OnArrayRB.mq5 运行结果,环形缓冲区大小为 256 个元素



Test_Fractals_OnValueRB.mq5 运行结果,环形缓冲区大小为 256 个元素

 

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

列表
评论 0