下载MetaTrader 5

请观看如何免费下载自动交易

有趣的脚本?
因此发布一个链接 -
让其他人评价

喜欢这个脚本? 在MetaTrader 5客户端尝试它

2014.02.07 08:53
指标

使用环形缓冲区绘制 TEMA 的类 - MetaTrader 5脚本

| Chinese English Русский Español Deutsch 日本語 Português

显示:
442
等级:
投票: 20
\MQL5\Include\IncOnRingBuffer\\MQL5\Indicators\OnRingBuffer\

描述

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 指标线
     }

请注意, 环形缓冲区的索引方式和时间序列相同.

例子

  1. Test_TEMA_OnArrayRB.mq5 文件基于价格时间序列计算指标值. 演示了 MainOnArray() 方法的应用
  2. Test_TEMA_OnValueRB.mq5 文件演示了 MainOnValue() 方法的使用. 首先计算和绘制 TEMA 指标值. 然后基于此指标的环形缓冲区绘制另外一条 TEMA 指标. 


Test_TEMA_OnArrayRB.mq5 使用256个元素大小环形缓冲区的运行结果



Test_TEMA_OnValueRB.mq5 使用256个元素大小环形缓冲区的运行结果

 

MetaQuotes 软件公司.开发过程中, 使用了Integer 和 GODZILLA的部分代码.

本文译自 MetaQuotes Software Corp. 撰写的俄文原文
官方代码: https://www.mql5.com/ru/code/1417

使用环形缓冲区绘制 DEMA 的类 使用环形缓冲区绘制 DEMA 的类

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

使用环形缓冲区绘制 OBV 的类 使用环形缓冲区绘制 OBV 的类

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

ytg_MA_TF ytg_MA_TF

选择TF 的移动平均.

使用环形缓冲区绘制分形的类 使用环形缓冲区绘制分形的类

本类设计为使用环形缓冲区算法绘制分形技术指标 (Fractals).