首页 技术指标 帖子

使用环形缓冲区绘制OBV指标的类 - MetaTrader 5指示器

附件
1402.zip (6.42 KB, 下载 0次)

描述

COBVOnRingBuffer类旨在通过环形缓冲区算法计算技术指标——平衡成交量(On Balance Volume, OBV)。

声明

class COBVOnRingBuffer : public CArrayRing

标题

#include <IncOnRingBuffer\COBVnRingBuffer.mqh>

COBVOnRingBuffer.mqh类文件必须放置在MQL5\Include\IncOnRingBuffer文件夹中。此文件夹中附带了使用该类的示例文件。环形缓冲区的类文件也必须在该文件夹中。

类方法

//--- 初始化方法:
bool Init(                                        // 如果出错返回false,成功返回true
   int                 period      = 0,           // OBV周期
   int                 size_buffer = 256,         // 环形缓冲区大小
   bool                as_series   = false        // 如果是时间序列则为true,否则为false
   );

OBV周期的使用和Integer相同:如果值为0(默认值),指标将像终端中包含的指标一样,计算所有图表的柱。如果指定其他正值,则将使用指定数量的柱(按照移动平均的原则)来计算每个图表柱的值。

//--- 基于时间序列或指标缓冲区的计算方法:
int MainOnArray(                  // 返回处理的元素数量
   const int     rates_total,     // 数组大小
   const int     prev_calculated, // 上次调用处理的元素
   const double& price[],         // 价格
   const long&   volume[]);       // 成交量
   );
//--- 基于数组单独元素的计算方法:
double MainOnValue(              // 返回设定元素(柱)的OBV值
   const int    rates_total,     // 数组大小
   const int    prev_calculated, // 处理的数组元素
   const int    begin,           // 数组重要数据的起始位置
   const double price,           // 价格
   const long   volume,          // 成交量
   const int    index            // 元素(柱)索引
   );
//--- 访问数据的方法:
int                 BarsRequired(); // 返回绘制指标所需的柱数
string              Name();         // 返回指标名称
int                 Period();       // 返回周期
int                 Size();         // 返回环形缓冲区大小

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

//--- 计算OBV指标的方法类:
#include <IncOnRingBuffer\COBVOnRingBuffer.mqh>
COBVOnRingBuffer obv;

...

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

...

//--- 使用来自环形缓冲区 "obv" 的数据,
//    例如,将数据复制到指标缓冲区:
   for(int i=start;i<rates_total && !IsStopped();i++)
      OBV_Buffer[i] = obv[rates_total-1-i]; // 指标线

...

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

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

示例

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


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



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

 

在编写代码时使用了MetaQuotes Software Corp.Integer GODZILLA的开发成果。

相关帖子

评论 (0)