简介
CFractalsOnRingBuffer 是一个为计算分形技术指标而设计的类,采用了环形缓冲区的算法。想了解分形指标的更多信息,可以查看 这里。
类声明
class CFractalsOnRingBuffer文件引用
#include <IncOnRingBuffer\CFractalsOnRingBuffer.mqh>请将 CFractalsOnRingBuffer.mqh 文件放置在 MQL5\Include\IncOnRingBuffer 文件夹中。该文件夹需要先行创建。附带的示例文件也会在此文件夹中。环形缓冲区类 CFractalsOnRingBuffer 的文件同样需要放在此文件夹中。
类方法
//--- 初始化方法:bool Init( // 如果出错返回 false,成功返回 trueint bars_right = 2, // 极值右侧的柱子数量int bars_left = 2, // 极值左侧的柱子数量int size_buffer = 256, // 环形缓冲区的大小bool as_series = false// 如果是时间序列则为 true,否则为 false );
//--- 基于时间序列或指标缓冲区的计算方法:int MainOnArray( // 返回处理的元素数量constint rates_total, // 数组的大小constint prev_calculated, // 上次调用处理的元素数量constdouble& high[], // 最大值数组constdouble& low[] // 最小值数组 );
//--- 根据 high[] 数组的单独元素计算上分形的方法:double MainOnHigh( // 返回 index-bars_right 元素的上分形值constint rates_total, // 数组的大小constint prev_calculated, // 数组处理的元素数量constint begin, // 数组重要数据的起始位置constdouble high, // 当前柱的最大值constint index // 当前元素(柱)的索引 );
//--- 根据 low[] 数组的单独元素计算下分形的方法:double MainOnLow( // 返回 index-bars_right 元素的下分形值constint rates_total, // 数组的大小constint prev_calculated, // 数组处理的元素数量constint begin, // 数组重要数据的起始位置constdouble low, // 当前柱的最小值constint index // 当前元素(柱)的索引 );
//--- 访问数据的方法:int BarsRequired(); // 返回绘制指标所需的柱子数量string Name(); // 返回指标名称string NameUpper(); // 返回上分形名称string NameLower(); // 返回下分形名称int BarsRight(); // 返回极值右侧的柱子数量int BarsLeft(); // 返回极值左侧的柱子数量int Size(); // 返回环形缓冲区的大小
从环形缓冲区获取计算出的指标数据和从普通数组中获取数据的方法相同。例如:
//--- 计算分形指标的方法类:#include <IncOnRingBuffer\CFractalsOnRingBuffer.mqh> CFractalsOnRingBuffer fractals; ... //+------------------------------------------------------------------+//| 自定义指标迭代函数 |//+------------------------------------------------------------------+intOnCalculate(constint rates_total, constint prev_calculated, constdatetime& time[], constdouble& open[], constdouble& high[], constdouble& low[], constdouble& close[], constlong& tick_volume[], constlong& volume[], constint& 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); }
请注意,环形缓冲区的索引与 时间序列 的索引相同。
示例
- 指标基于价格时间序列计算,Test_Fractals_OnArrayRB.mq5 文件演示了 MainOnArray() 方法的应用。
- Test_Fractals_OnValueRB.mq5 文件演示了 MainOnValue() 方法的使用。首先计算并绘制分形指标,然后基于该指标的环形缓冲区绘制另一个分形。

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

Test_Fractals_OnValueRB.mq5 运行结果,环形缓冲区大小为 256 个元素
本文代码参考了 MetaQuotes Software Corp.、Integer 和 GODZILLA 的开发成果。

评论 0