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函数结束。
