9.2 创造一个自制指标
让我们使用两个内建MetaTrader 指标建立一个自制指标来计算我们的行。我们将建造一个修正的Bollinger Bands 指标。Bollinger Bands 由三行组成,中心行是简单的移动平均,上、下行的值则由标准偏差决定。
我们用移动平均和标准偏差指标来创造自己的Bollinger Bands 指标。若想创造一个指标,可使用指数移动平均来计算行,这和简单移动平均指标不一样。
我们先创造我们的指标档案。从File 选择项中选取New ,创造一个自制指标。填入指标名称,加上你想要的参数。在最末页,我们加上三个同颜色的指标行。这就是结果,在这个程序中我们省略了. start( )函数:

#property 为指标缓冲存储器设定参数。indicator_ chart_ window 预定义参量在主要线图窗口中画出指标。若我们创造一个振荡指标,想在不同的窗口中画出一个指标,我们使用indicator_seperate window 预定义参量来取代。
indicator_buffers 属性设定了指标缓冲存储器的数量。在这个例子中我们使用三个缓冲存储器。indicator_ color 属性设定三行的颜色均为DeepSkyBlue 。
接着是缓冲存储器数组的执行。我们有三个缓冲存储器命名为ExtMapBuffer(1-3) 。稍后我们将把这些数组识别符号修改得较易理解。
我们设定的指标缓冲存储器的预定义参量在init ( )函数中。SetIndexBuffer ( )把缓冲存储器和缓冲存储器指数结合一起。当我们从EA 中用iCustom( )函数调出一个指标线时,这一指标就为缓冲存储器指数。第一个参数是整数0~7 ,第二个参数是缓冲存储器数组的名字。
9.2.1 绘制预定义参量
SetlndexStyle( )函数依照该线性的类别来画线。每个指标线将有一个相符合SetlndexStyle( )函数。这是其语法:

参数说明:
Buffelndex一一缓冲存储器的指数,为0~7 。
LineType一一设定要画的线的类别。DRAW _LINE 画单线, DRAW _ HISTOGGRAM 画一垂直直方图(见OsMA 或Awesome Oscillators 指标) ,DRAW _ ARROW 画一个记号,而DRAW_NONE 则不画线。
LineStyle一一一个非必要的参数,并说明画线的形态。我们主要使用DRAW_LINE 类别的线。预设上,会画一条实线( STYLE_SOLID) ,也可以画虚线(STYLE_DASH) 和点线( STYLE_DOT) 。
LineWidth一一一个非必要的参数,说明线的宽度。默认值是1 。
LineColor一一一个非必要的参数,说明线的颜色。颜色可以用#prope冉来设定,但也可以在这里设定颜色。
若使用DRAW_ARROW 作为LineType , SetArrow( )函数允许你设定Wingdings字体符号以画在K 线图上。第一个参数是缓冲存储器指数,第二个参数是代表面当前商品的整数常数。符号可在MQL 参照中Standard Constants - Arrow Codes 下面看到。
我们若想加上能显示在工具表或数据窗口内的指标线的说明,要做到这一点,可以使用SetlndexLabel ( )函数。第一个函数是缓冲存储器的指数,第二个参数是一个文字说明。我们稍后将把这些加到我们的指标中。
若你的指标画于不同的窗口(例如一个振荡指标) ,想加上水平以暗示超买或超卖水平(例如随机或相对强弱指标) ,或零水平(例如CCI 指标) ,这时则可以使用SetLevelStyle ( )函数和SetLevelValue ( )函数。
你若想明确定义一个简短的指标名称用于显示在指标窗口的左上角,可使用IndicatorShortName( )函数来设定这个值。唯一的参数是文字字符串,其将出现于指标窗口的左上角和数据窗口中。
9.2.2 使用描述性的缓冲存储器名称
这是我们更新的指标程序代码。注意: 我们已为缓冲存储器数组重新命名,使其对实际函数更具描述性。我们已改变SetlndexBuffer ( )函数的第二个参数,以反映新的缓冲存储器名称。我们也为每行加上了SetlndexLahel ( ) ,以在数据窗口中显示名称。源代码如下:


我们将缓冲存储器名称从预设的名称( ExtMapBuffer) 改为更具描述性的名称。EMA[ ]是中心线的缓冲存储器,而UpperBand [ ]和LowerBand [ ]是相对的上、下间带。
SetlndexBuffer( )函数将缓冲存储器指数和缓冲存储器数组结合在一起。其中, EMA 是"0" , UpperBand 是" 1 " ,Lower8and 是"2" 。注意:这里省略了第二个参数SetIndexBuffer( )的数组辨识符号名称的大括号。
SetlndexLabel ( )函数为每一个指标缓冲存储器设定一个描述性的名称。在这个例子中,行的名称和我们的辨识符号名称一样。这些名称将出现于鼠标的工具栏和数据窗口中。若另一位程序人员决定在一个EA 中使用这个指标,上方的格式将很清楚地让程序人员知道他们该用哪个指标缓冲存储器指数、用在哪一行上。
9.2.3 start( )函数
在start( )函数里面插入一个表达式:

IndicatorCounted ( )回传指标已经计算好的线图上的柱的数量。当EA 被启动时,这个值将是"0" 。该指标在每一个K 线图上都会被计算。我们检查IndicatorCounted ( )函数以得知随后的柱体有多少已被计算,进而知道还需要计算多少新柱体。
该指标的计算将发生在for 循环内。起始点是第一个没有被计算的K 棒,终点是目前的K 棒。我们将比较IndicatorCounted ( )的值和事先定义的Bars 变量,该变量回传目前K 线图上的K 棒数量,这将决定我们的起始点。以下是for 循环的程序代码:

第一个if语法在计算新柱体时将对counted_bars 递减1 。我们会永远至少计算前两个柱体。这是由于有时候最后阶段的柱体可能不会被计算到。接着决定要计算的柱体数量,方法是用先定义的Bars 变量减去counted_bars ,该值会储存于变量CalculateBars 中。
在for 循环中,递增变量Count 被设定为CalculateBars 的值,当Count 小于"0"时,计算结束,而Count 变量在每次重复时递减,并且从左至右计算K 线图中的每个柱体。
以下是计算Bollinger Bands 的程序代码。档案开始处我们将执行外部变量BandsPeriod。For 循环与我们上面创造的是同一个。

首先,我们使用iMA ( )函数执行内建移动平均指标,并回传值到EMA[ Count] 。注意:数组指数和移动平均指标的Shift 参数都使用目前的Count 值。
接着,我们用iStdDev( )呼叫标准偏差指标。若要计算上方带,我们只需把标准偏差加到移动平均线即可,该值会储存于缓冲存储器UpperBand [ ]中。我们用移动平均减去标准偏差来计算LowerBand [ ] 。
给指标全范围的设定以延展指标。我们设定调整向前位移,可用移动平均法、应用价格参数和标准偏差调整:


我们加入外部变数以调整iMA( )函数和iStdDev( )函数,也加入一个参数以调整标准偏差的数量。要计算本值,只需简单的把StdDev 和Deviations 相乘。现在有一个可调整Bollinger Bands 的指标,其和标准的MetaTrader 指标相比更具弹性。完整的程序代码请见本书附录E 。
除了重算内建指标,你还可以让自制指标具有更多功能。依据投资者所具备的数学知识,可以编写出不包含在MetaTrader 中的指标,甚至创造只属于你自己的指标,也可以标记要操作的对象。
9.2.4 自定义指标: 回顾历史交易的图形化
在这里我们提供一个好用的指标给读者参考;该程序可将过去事务历史记录在主图中用不同的颜色标注箭头并联机,鼠标移动到箭头上能看到开仓平仓价,鼠标移动到线条上能看到交易单号,同时在主图的左上部分显示交易统计数据。如图9-1 所示:

通过这个例子,你有机会很好地理解指标的编写,同时熟练运用一些MQL4 内置的函数。源代码如下:




