MT4指标编程入门:绘制指标线详解

要绘制指标线,只需在程序中明确以下几个要点:

确认指标线显示的窗口,是在主图还是副图中展示。

需要创建数组,用于存储指标线在不同位置上的数值。

建立指标线和数组之间的关联,明确哪个数组对应哪条指标线。

指定指标线的样式,是线性、柱状图还是箭头形式。

若指标线为箭头,还需定义具体的箭头类型。

为数组赋予相应的数值。

其中:

第二条写在文件头部区域中。

第三、四、五条写在init()函数中(此函数仅在指标加载时执行一次)。

第六条写在start()函数中(该函数在数据变动时被触发,每次变动都会运行一次)。

下面以MACD指标为例进行讲解。

我们知道,MACD指标由两条曲线和一组红绿柱线构成(见下方图一)。

其中:

白色线是两条均线的差值;

紫色线是对白线进行移动平均计算得出的结果;

红绿柱线则是白线与紫线的差值,当白线上穿紫线时出现红柱,下穿时出现绿柱。

我们由简入繁,先暂时去掉紫线和红绿柱线,只保留白线,观察它是如何被绘制出来的。

以下是完整的代码语句:

#property indicator_separate_window

#property indicator_color1 White

#property indicator_level1 0

extern int FMA = 12;

extern int SMA = 26;

double buf[];

int init()

{

SetIndexBuffer(0, buf);

SetIndexStyle(0, DRAW_LINE);

return(0);

}

int start()

{

int limit = Bars - IndicatorCounted();

for(int i = 0; i < limit; i++)

{

buf[i] = iMA(NULL, 0, FMA, 0, 1, 0, i) - iMA(NULL, 0, SMA, 0, 1, 0, i);

}

return(0);

}

代码说明如下:

==============================================

==============================================

以下为上述语句的简要解释

#property indicator_separate_window

指标显示在副图中。

#property indicator_color1 White

第一条指标线设置为白色。

#property indicator_level1 0

在副图的零值位置绘制一条水平参考线。

extern int FMA = 12;

extern int SMA = 26;

定义两个整数型变量,默认值分别为12和26,并允许在外部修改。

double buf[];

定义一个数组。

int init()

初始化函数。该函数在指标加载时仅运行一次。init是系统默认的函数名,但在使用时仍需进行声明,因此需要添加定义符int。

{

SetIndexBuffer(0, buf);

将数组buf指定为第一条指标线。

SetIndexStyle(0, DRAW_LINE);

将第一条指标线的样式设置为连续曲线。

return(0);

函数结束语句。

}

int start()

指标触发函数。与init函数不同,该函数在数据发生变化时被触发,如果数据持续更新,该函数将反复执行。start也是系统默认的函数名,使用时同样需要声明,因此也需添加定义符int。

{

int limit = Bars - IndicatorCounted();

自定义一个变量limit,并为其赋值。

Bars是图表中的柱总数。

IndicatorCounted()返回缓存中已计算过的柱数,即已有数值的柱数。

因此limit的值就是尚未计算的柱数,这样可以有效优化程序性能。

for(int i = 0; i < limit; i++)

循环语句。

循环从i=0开始,每执行一次循环,i的值增加1,直到i达到limit为止。

由于循环变量i是一个新变量,因此需要先定义,添加整型定义符int。

下面大括号内为循环体,本例中只包含一条语句。

{

buf[i] = iMA(NULL, 0, FMA, 0, 1, 0, i) - iMA(NULL, 0, SMA, 0, 1, 0, i);

}

给数组buf赋值,其值分别为对应位置上两条均线的差值。

i是水平位置序号,即蜡烛柱从右到左的序号,最右边的蜡烛柱序号为0。

return(0);

start函数结束。