描述
COsMAOnRingBuffer 类旨在使用环形缓冲区算法计算技术指标移动平均振荡器(Moving Average of Oscillator,简称OsMA)。
类的声明
class COsMAOnRingBuffer : public CArrayRing
文件引用
#include <IncOnRingBuffer\COsMAOnRingBuffer.mqh>COsMAOnRingBuffer.mqh 文件应放置在 MQL5\Include\ IncOnRingBuffer 文件夹中。示例文件也附在该描述中。环形缓冲区、MACD 和移动平均类的文件也应位于此文件夹中。
类方法
//--- 初始化方法: bool Init( // 如果出错返回 false,成功则返回 true int fast_period = 12, // 快速移动平均平滑周期 int slow_period = 26, // 慢速移动平均平滑周期 int signal_period = 9, // 信号移动平均平滑周期 ENUM_MA_METHOD fast_method = MODE_EMA, // 快速移动平均平滑方法 ENUM_MA_METHOD slow_method = MODE_EMA, // 慢速移动平均平滑方法 ENUM_MA_METHOD signal_method = MODE_SMA, // 信号移动平均平滑方法 int size_buffer = 256, // 环形缓冲区大小,存储数据的数量 bool as_series = false // true 表示时间序列,false 表示常规索引输入数据 );
//--- 基于时间序列或指标缓冲区的计算方法: int MainOnArray( // 返回处理的元素数量 const int rates_total, // 数组的大小 array[] const int prev_calculated, // 上一次调用处理的元素数量 const double &array[] // 输入值的数组 );
//--- 基于数组的单独系列元素的计算方法 double MainOnValue( // 返回设定元素的 OsMA 值 const int rates_total, // 数组的大小 const int prev_calculated, // 数组已经处理的元素 const int begin, // 数组重要数据开始的位置 const double value, // 数组的重要元素 const int index // 元素索引 );
//--- 访问数据的方法: int BarsRequired(); // 返回绘制指标所需的条形数量 string Name() // 返回指标名称 string FastMethod() // 返回快速线平滑方法的文字描述 string SlowMethod() // 返回慢速线平滑方法的文字描述 string SignalMethod() // 返回信号线平滑方法的文字描述 int FastPeriod() // 返回快速线平滑周期 int SlowPeriod() // 返回慢速线平滑周期 int SignalPeriod() // 返回信号线平滑周期 int Size(); // 返回环形缓冲区的大小
从环形缓冲区获取计算出的指标数据与从普通数组中获取数据的方式相同。例如:
//--- 指标计算类 OsMA: #include <IncOnRingBuffer\COsMAOnRingBuffer.mqh> COsMAOnRingBuffer osma; ... //+------------------------------------------------------------------+ //| 自定义指标迭代函数 | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) { //--- 基于价格时间序列的指标计算: osma.MainOnArray(rates_total,prev_calculated,price); ... //--- 使用“osma”环形缓冲区中的数据, // 将数据复制到指标缓冲区: for(int i=start;i<rates_total;i++) OsMABuffer[i]=osma[rates_total-1-i]; // 指标直方图 //--- 返回下次调用的 prev_calculated 值: return(rates_total); }
请注意,环形缓冲区中的索引与时间序列中的索引相同。
示例
- Test_OsMA_OnArrayRB.mq5 文件基于价格时间序列计算指标。演示了 MainOnArray() 方法的应用。
- Test_OsMA_OnValueRB.mq5 文件展示了 MainOnValue() 方法的使用。首先计算并绘制 OsMA 指标。然后基于该指标的环形缓冲区绘制另一个 OsMA 指标。

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

Test_OsMA_OnValueRB.mq5 的工作结果,环形缓冲区大小为 256 个元素。
代码编写过程中参考了MetaQuotes Software Corp.、Integer 和 GODZILLA 的开发成果。