在这篇文章中,我们将探讨如何使用环形缓冲区算法来计算自适应移动平均线(AMA)指标,适用于MetaTrader 5交易平台。
概述
CAMAOnRingBuffer类专为计算技术指标自适应移动平均线(AMA)而设计,利用环形缓冲区算法进行计算。
类的声明
class CAMAOnRingBuffer : public CArrayRing
文件引用
#include <IncOnRingBuffer\CAMAOnRingBuffer.mqh>请将CAMAOnRingBuffer.mqh文件放置在MQL5\Include\IncOnRingBuffer文件夹中。该文件夹内还需包含两个示例文件。环形缓冲区类和效率比类的文件也应放在该文件夹中。
类的方法
//--- 初始化方法:
bool Init(// 如果出错返回false,成功则返回true
int period = 10, // AMA周期
int fast_period = 2, // 快速EMA周期
int slow_period = 30, // 慢速EMA周期
int size_buffer = 256, // 环形缓冲区大小
bool as_series = false // true表示时间序列,false表示普通数据索引
);
//--- 基于时间序列或指标缓冲区的计算方法:
int MainOnArray(// 返回处理元素的数量
const int rates_total,
const int prev_calculated,
const double &array[]
);
//--- 基于数组单独元素的计算方法:
double MainOnValue(// 返回指定元素的AMA值
const int rates_total,
const int prev_calculated,
const int begin,
const double value,
const int index
);
//--- 数据访问方法:
int BarsRequired(); // 返回绘制指标所需的条数
string Name(); // 返回指标名称
string FastPeriod(); // 返回快速EMA平滑周期
int SlowPeriod(); // 返回慢速EMA平滑周期
int Period(); // 返回AMA周期
int Size(); // 返回环形缓冲区大小
从环形缓冲区获取指标计算数据的方式与普通数组相同。例如:
//--- 计算AMA指标的类:
#include <IncOnRingBuffer\CAMAOnRingBuffer.mqh>
CAMAOnRingBuffer ama;
...
//+---------------------------------------------------------------+
//| 自定义指标迭代函数 |
//+---------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const int begin,
const double &price[])
{
//--- 基于价格时间序列计算指标:
ama.MainOnArray(rates_total,prev_calculated,price);
...
//--- 使用来自环形缓冲区的数据
for(int i=start;i<rates_total;i++)
AMA_Buffer[i] = ama[rates_total-1-i]; // 指标线
//--- 返回prev_calculated以备下次调用:
return(rates_total);
}
请注意,环形缓冲区的索引与时间序列的索引相同。
示例
- Test_AMA_OnArrayRB.mq5文件基于价格时间序列计算指标,演示了MainOnArray()方法的使用。
- Test_AMA_OnValueRB.mq5文件展示了MainOnValue()方法的应用。首先计算并绘制AMA指标,然后基于该指标的环形缓冲区绘制另一条AMA。

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

Test_AMA_OnValueRB.mq5运行结果,环形缓冲区大小为256个元素
在代码编写中使用了MetaQuotes Software Corp.、Integer和GODZILLA的开发成果。