- 显示:
- 1871
- 等级:
- 已发布:
- 2014.02.07 08:53
- 已更新:
- 2016.11.22 07:33
-
需要基于此代码的EA交易或指标吗?请在自由职业者服务中订购 进入自由职业者服务
描述
CTEMAOnRingBuffer 类设计为使用环形缓冲区算法计算三重指数移动平均技术指标 (Triple Exponential Moving Average, TEMA).
声明
class CTEMAOnRingBuffer : public CArrayRing
标题
#include <IncOnRingBuffer\CTEMAnRingBuffer.mqh>
CTEMAOnRingBuffer.mqh 类文件必须放置在 IncOnRingBuffer 文件夹下, 而该文件夹需要在 MQL5\Include\ 下创建. 在描述部分附加了使用本类的两个例子文件. 环形缓冲区, DEMA 和 移动平均 类文件也需要在此文件夹下.
类方法
//--- 初始化方法: bool Init( // 如果出错返回false, 成功返回true int period = 12, // TEMA 周期数 ENUM_MA_METHOD method = MODE_EMA, // 平滑方法 int size_buffer = 256, // 环形缓冲区大小 bool as_series = false // 如果是时间序列为true, 否则为false );
//--- 基于时间序列或者指标缓冲区计算的方法: int MainOnArray( // 返回处理过的元素的数量 const int rates_total, // 数组的大小 const int prev_calculated, // 前一次调用处理过的元素数量 const double& price[], // 计算的数组 );
//--- 基于数组中独立序列元素计算的方法 double MainOnValue( // 返回集合元素(柱)的 TEMA 值 const int rates_total, // 数组的大小 const int prev_calculated, // 数组中处理过的元素数 const int begin, // 数组中的数据起点 const double value, // 元素 (柱) 值 const int index // 元素 (柱) 索引 );
//--- 访问数据的方法: int BarsRequired(); // 返回绘制指标所需的柱数 string Name(); // 返回指标的名称 int Period(); // 返回周期数 int Size(); // 返回环形缓冲区的大小 double MA(int index); // 返回移动平均值, 索引方式类似于时间序列 double DEMA(int index); // 返回 DEMA 值, 索引方式类似于时间序列
以通常数组的方式从环形缓冲区取得计算的指标值. 例子:
//--- 计算 TEMA 指标的方法类: #include <IncOnRingBuffer\CTEMAOnRingBuffer.mqh> CTEMAOnRingBuffer tema; ... //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate (const int rates_total, // price[] 数组的大小 const int prev_calculated, // 前一次调用处理过的柱数 const int begin, // 数据起点 const double& price[]) // 计算方法 { //--- 基于时间序列计算指标: tema.MainOnArray(rates_total,prev_calculated,price); ... //--- 使用 "tema" 环形缓冲区的数据, // 例如, 复制指标缓冲区的数据: for(int i=start;i<rates_total && !IsStopped();i++) TEMA_Buffer[i] = tema[rates_total-1-i]; // TEMA 指标线 ... //--- 返回 prev_calculated 值以便下次调用: return(rates_total); }
当计算 TEMA 时, 同时也会以相同参数计算 移动平均和DEMA. 我们可以分别使用MA(int index) 和 DEMA(int index)取得对应的MA环形缓冲区和DEMA数据:
//--- 使用移动平均和DEMA环形缓冲区的数据, // 例如复制指标缓冲区中的数据: for(int i=start;i<rates_total && !IsStopped();i++) { MA_Buffer[i] = dema.MA(rates_total-1-i); // 移动平均指标线 DEMA_Buffer[i] = dema.DEMA(rates_total-1-i); // DEMA 指标线 }
请注意, 环形缓冲区的索引方式和时间序列相同.
例子
- Test_TEMA_OnArrayRB.mq5 文件基于价格时间序列计算指标值. 演示了 MainOnArray() 方法的应用
- Test_TEMA_OnValueRB.mq5 文件演示了 MainOnValue() 方法的使用. 首先计算和绘制 TEMA 指标值. 然后基于此指标的环形缓冲区绘制另外一条 TEMA 指标.
Test_TEMA_OnArrayRB.mq5 使用256个元素大小环形缓冲区的运行结果 在MetaQuotes 软件公司.开发过程中, 使用了Integer 和 GODZILLA的部分代码.
Test_TEMA_OnValueRB.mq5 使用256个元素大小环形缓冲区的运行结果
由MetaQuotes Ltd译自俄语
原代码: https://www.mql5.com/ru/code/1417

本类设计为使用环形缓冲区算法计算双指数移动平均技术指标(Double Exponential Moving Average, DEMA).

本类设计为使用环形缓冲区算法计算平衡交易量 (On Balance Volume, OBV).