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

要在MT4中绘制一条指标线,在程序中明确以下几个要点即可:

首先,需要确定指标线显示的窗口,是在主图还是副图区域。

其次,必须建立一个数组,用于存储指标线在每个价格位置上的数值。

接着,要建立指标线与数组之间的对应关系,明确哪个数组对应哪条线。

然后,需定义指标线的样式,是曲线、柱线还是箭头符号。

如果选择箭头作为线型,还需要进一步指定所使用的箭头类型。

最后,就是对数组进行赋值计算。

这些步骤的代码编写位置有所不同:

其中,第二点关于数组的声明通常写在程序文件的头部。

第三、四、五点则写在init()初始化函数中(该函数仅在指标加载时运行一次)。

第六点赋值计算部分,写在start()函数中(该函数在价格数据变动时触发,每次变动运行一次)。

下面我们以经典的MACD指标为例进行具体说明。

标准的MACD指标由两条曲线和一组柱状线组成。

其中:

白线(DIF)是两条指数移动平均线的差值;

紫线(DEA)是白线的移动平均线;

红绿柱状线(MACD柱)则是白线与紫线的差值,当白线上穿紫线时显示为红柱,下穿时显示为绿柱。

为了简化理解,我们先忽略紫线和柱状线,仅关注如何画出那根白线。理解其绘制原理,对于后续进行更复杂的BCR指标或自定义指标开发都很有帮助。

以下是绘制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

{

buf[i] = iMA(NULL, 0, FMA, 0, MODE_EMA, PRICE_CLOSE, i) - iMA(NULL, 0, SMA, 0, MODE_EMA, PRICE_CLOSE, 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);

设置第一条指标线的样式为连续曲线。掌握这些基础设置,是未来开发类似BCR等自定义指标的前提。

return(0);

函数执行完毕的返回语句。

}

int start()

这是指标的核心计算函数。与init函数不同,每当图表上有新的价格数据产生或变动时,此函数就会被自动调用执行。start也是系统预定义的函数名,同样需要用int定义。

{

int limit = Bars - IndicatorCounted();

定义一个变量limit并赋值,用于优化计算。

Bars代表当前图表中的总K线柱数。

IndicatorCounted()返回已经计算过并缓存起来的K线柱数。

两者相减得到的limit,就是尚未计算的新K线柱数量,从而避免每次都对所有历史数据进行重复计算,提升效率。

for(int i=0; i

循环语句。

循环从i=0开始,每次循环i的值增加1,直到i小于limit的条件不满足为止。

由于循环计数器i是一个新变量,所以需要在循环开始时用int进行定义。

循环体(由大括号包围的部分)内的语句将被重复执行,本例中只有一条赋值语句。

{

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

}

为数组buf的每个元素赋值,其值为对应K线位置上,两条不同周期均线的差值。这是MACD指标的核心计算逻辑,理解它有助于你构建自己的交易策略或BCR分析工具。

变量i代表水平方向的位置索引,即K线从右向左的序号,图表最右侧最新的那根K线序号为0。

return(0);

start函数执行结束。

}