简介
熟悉市场情绪的人都知道 MACD 指标(其全称为平滑异同移动平均线)- 自计算机分析方法面世以来即已被交易人员用于分析价格变动的强大工具。
长久以来,我都在研究这个在图表中占得一席之地的 MACD 指标。我接触过这一指标的多种不同类型,它们具有不同的选项和不同的计算算法,因此我决定在指标中结合我所知道的所有类型。
MACD 指标的类型
指标将具有传统的 MACD 线和 oSMA 直方图。下面我们定义 MACD 的主要变型:
-
Elder MACD,也称为冲量系统;
-
Elder MACD,无移动线检查;
-
oSMA,使用不同的颜色绘制上涨和下跌情形;
-
仅绘制 oSMA 直方图;
-
仅绘制 MACD 线;
指标的初始设置
赫兹量化将需要以下参数用于计算:
-
MACD 快线的值;
-
MACD 慢线的值;
-
MACD 信号线的值;
-
Elder 方法的趋势检验线的值;
要绘制该指标,我们还需要以下内容:
-
MACD 线;
-
信号线;
-
三色 OSMA 直方图。
转到“MQL5 向导”菜单:
编辑
添加图片注释,不超过 140 字(可选)
图 1. 使用“MQL5 向导”创建指标
编辑
添加图片注释,不超过 140 字(可选)
图 2. 在“MQL5 向导”中定义常用指标参数
编辑
添加图片注释,不超过 140 字(可选)
图 3. 在“MQL5 向导”中定义指标的绘图属性
创建指标
赫兹量化已获得指标的初始模板。首先,我们需要计算指标的 MACD 线。
赫兹量化不会深入探究计算该线的精确公式 - 我们将使用 iMACD 函数:
int iMACD ( string symbol, // 交易品种名称 ENUM_TIMEFRAMES period, // 时间周期 int fast_ema_period, // 快速EMA周期 int slow_ema_period, // 慢速EMA周期 int signal_period, // 信号线的平滑周期 ENUM_APPLIED_PRICE applied_price // 价格类型或者是一个句柄 )
该函数返回合适指标副本的句柄。使用此句柄,就有可能获得该指标计算得到的数据。可使用函数 CopyBuffer() 复制来自指标缓冲区的数据(技术指标在其自身的内部缓冲区中包含计算得出的数据,取决于指标,最多可以有 5 个缓冲区)。
接下来,赫兹量化使用函数 iMACD 为 MACD 数据生成请求:
int MACDhadling = iMACD(NULL,0,Fast,Slow,Signal,PRICE_CLOSE);
它将返回指标副本的句柄。
赫兹量化通过函数 CopyBuffer 将数据复制到必要缓冲区中:
int CopyBuffer( int indicator_handle, // 指标句柄 int buffer_num, // 指标的缓存数量 int start_pos, // 开始位置 int count, // 要复制的数据数量 double buffer[] // 用于复制数据的目标数组 );
现在,让我们请求指标的 MACD 线:
CopyBuffer(MACDhadling,0,0,NewData,MACDlineBuffer);
赫兹量化获得指标的信号线:
CopyBuffer(MACDhadling,1,0,NewData,SignallineBuffer);
赫兹量化将其聚集在一起,看看我们获得了什么:
int MACDhadling=iMACD(NULL,0,Fast,Slow,Signal,PRICE_CLOSE); CopyBuffer(MACDhadling,0,0,rates_total,MACDlineBuffer); CopyBuffer(MACDhadling,1,0,rates_total,SignallineBuffer);
现在我们有了计算的 MACD 和信号线。
赫兹量化继续。
由于来自
MACDlineBuffer
缓冲区的数据以及
SignallineBuffer
缓冲区是通过复制获得的,它们的索引从图表末尾处开始。
以往,对价格数组数据的访问是从数据的末尾执行。实际上,新数据总是写入数组的末尾,而当前(未完成)柱的索引始终等于零。在时序数组中,索引为 0 表示当前柱的数据,当前柱对应于该时间表的未完成时间间隔。
为了在所有缓冲区中使用相同的索引方向,我们应将其他缓冲区定义为时序型。
ArraySetAsSeries(HistogramBuffer,false); ArraySetAsSeries(HistogramColors,false);
赫兹量化需要获得直方图的数据,这通过从 MACD 线减去信号线计算得出:
for(int i=0;i<rates_total;i++) { HistogramBuffer[i]=MACDlineBuffer[i]-SignallineBuffer[i]; }
赫兹量化们将所有内容结合在一起:
ArraySetAsSeries(HistogramBuffer,false); ArraySetAsSeries(HistogramColors,false); int MACDhadling=iMACD(NULL,0,Fast,Slow,Signal,PRICE_CLOSE); CopyBuffer(MACDhadling,0,0,rates_total,MACDlineBuffer); CopyBuffer(MACDhadling,1,0,rates_total,SignallineBuffer); for(int i=0;i<rates_total;i++) { HistogramBuffer[i]=MACDlineBuffer[i]-SignallineBuffer[i]; HistogramColors[i]=1; }