描述
本文将介绍 CStochasticOnRingBuffer 类的使用,该类用于计算随机振荡器(Stochastic Oscillator)指标,采用环形缓冲区算法(ring buffer)。
类声明
class CStochasticOnRingBuffer标题
#include <IncOnRingBuffer\CStochasticOnRingBuffer.mqh>将 CStochasticOnRingBuffer.mqh 文件放置在 MQL5\Include\IncOnRingBuffer 文件夹中。此文件夹内还附带了两个示例文件。环形缓冲区类(ring buffer)和移动平均类(Moving Average)也需放在此文件夹内。
类方法
//--- 初始化方法:
bool Init( // 如果出错返回 false,成功则返回 true
int period_k = 5, // %K 的周期
int period_d = 3, // %D 的周期
int period_s = 3, // %K 的减速周期
ENUM_MA_METHOD method = MODE_SMA, // %D 的平滑方法
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( // 返回指定元素的随机值
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 Name(); // 返回指标名称
string NameSignal(); // 返回信号线指标名称
string Method(); // 返回平滑方法的文本形式
int PeriodK(); // 返回 %K 的周期
int PeriodS(); // 返回 %K 的减速周期
int PeriodD(); // 返回 %D 的周期
int Size(); // 返回环形缓冲区的大小
可以像访问普通数组一样从环形缓冲区获取指标计算数据。例如:
//--- 计算随机指标的类:
#include <IncOnRingBuffer\CStochasticOnRingBuffer.mqh>
CStochasticOnRingBuffer st;
...
//+------------------------------------------------------------------+
//| 自定义指标迭代函数 |
//+------------------------------------------------------------------+
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[])
{
//--- 基于价格时间序列计算指标:
st.MainOnArray(rates_total,prev_calculated,high,low,close);
...
//--- 使用环形缓冲区 "st" 中的数据,
// 例如,将数据复制到指标缓冲区:
for(int i=start;i<rates_total && !IsStopped();i++)
{
MainBuffer[i] = st[rates_total-1-i]; // 指标主线
SignalBuffer[i] = st.signal[rates_total-1-i]; // 指标信号线
}
...
//--- 返回 prev_calculated 值以供下次调用:
return(rates_total);
}
请注意,环形缓冲区的索引与时间序列的索引相同。
示例
- Test_Stochastic_OnArrayRB.mq5 文件基于价格时间序列计算指标,演示了 MainOnArray() 方法的应用。
- Test_Stochastic_OnValueRB.mq5 文件展示了 MainOnValue() 方法的使用,首先计算并绘制随机振荡器指标,随后基于环形缓冲区绘制另外两条随机振荡器线。

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

Test_Stochastic_OnValueRB.mq5 的运行结果,环形缓冲区大小为 256 个元素
在编写代码时参考了 MetaQuotes Software Corp. 的开发成果,Integer 和 GODZILLA 的研究。