6.2 指标
交易系统核心是用指标来决定交易信号。MetaTrader 包含了超过20 个一般性指标,包括"移动平均""MACD" " 相对强弱指标"和"随机指标。MQL 已内建了指标所用函数,你也可以在你的EA 中使用自制指标。
另外, MT4 平台集成了30 个默认技术指标,指标按照类型分为成交量指标、趋势指标、振荡指标和比尔威廉指标四类。我们在表6-1 中总结了30 个指标的基本特性,推荐指数星数越多,说明实用性越好。


6.2.1 趋势指标
"移动平均"(MA) 是我们在本书中已经使用多次的指标,移动平均是一个趋势指标,它显示出在指标期间内价格是否有上扬或下降。"移动平均"在K 线图上画出一条线,以显示在过去x个K 棒的平均价格。
这是"移动平均"函数的语法:

函数说明:
Symbol一一主用"移动平均"的线图的符号。
Timeframe一一适用"移动平均"的线图的时间周期。在MQL 中每个指标函数都以这两个参数开始,在这之后则为指标专用参数。这些参数要与Indicator Properties中的Parameters 内容一致。
MAPeriod一一移动平均的周期。几乎每个指标都有至少一个周期参数。大部分的指标是用之前的K 棒中的价格计算出来的。例如,周期设定为10 ,意指指标使用过去10 个K 棒的价格数据计算指标数值。
MAShift一一K 棒中移动平均线的向前位移。这和以下的Shift 参数不同。
MAMethod一一移动平均的计算方法。可选择"简易""指数""平滑""线性加权" 。使用任何移动平均指标可能会让你选择MA 计算方法。本章稍后将讨论移动平均方法。
MAPrice一一计算移动平均时所使用的价格数组。可以是开盘、收盘、高点、低点或某种形态的平均,如中位数、典型或加全价格。本章稍后将探讨适用价格常数。
Shift一一用以回传计算值的K 棒的向后位移。Sh证t 参数是所有指标函数的最后一个参数。这是用以回传指标值的K 棒指数。当数值为"0" 时回传目前K 棒的指标值,当数值为"3" 时回传从第三个K 棒以前的指标值。
移动平均和相似的指标都直接画于K 线图上,你可根据指标和价格之间的关系创造交易条件。我们的移动平均交叉是一个在两个指标之间价格关系的范例。当一个指标价格高于另一个时,"买"或"卖"的讯号就会产生; 当目前价格高于或低于指标线时,也可以产出交易讯号。例如, Bollinger Bands 指标可根据价格高区间和低区间比较,用来产出交易讯号。
6.2.2 振荡指标
另一个主要的指标是"振荡指标"。振荡指标被绘制于分别的窗口中,而且图如其名,它们在最高价与最低价之间摆荡。摆荡器或是对齐中间轴(一般为"0") ,或是界定于上下界限之间(如0~100) 。振荡指标包括"动量""随机"和"相对强弱指标" 。
振荡指标暗示"超买"和"超卖"水平。它们除了作为趋势指标,更常被用作标记接近反转的区域,亦被用来产生反趋势交易讯号。
我们来探讨一个特殊的振荡指标一一随机振荡指标。随机振荡指标由两条线组成,随机线(也称"百分比K 线")及讯号线(也称"百分比D 线") 。随机振荡指标在"0" 和100之间。当"随机振荡指标"高于70 时,表示超买,正逼近一个可能的反转; 若是低于30 ,表示超卖。
随机振荡指标的语法:

我们已经熟悉两个参数Symbol 和Timeframe 。让我们来检视指标专用参数:
● KPeriod一一百分比K 线周期。
● DPeriod一一百分比D 线周期。
● Slowing一一随机钝性值。值低,表示快速的随机摆荡;值高,则是缓慢的随机摆荡。
● MAMethod一一百分比D 线有一个适用的移动平均方法。这和移动平均的设定是一样的。我们将很快复习移动平均方法。
● PriceField一一决定给百分比K 线所使用的价格数据。本值若为非"0": 低点/高点或1 :关闭/关闭值为1 时表示"随机"在其极限区交易的可能性更大。
● Mode一一决定计算的随机线。"0" 表示百分比K 线, " 1 "表示百分比D 线。
我们来看一下Mode 参数。有些指标在K 线图上画多条线。随机指标有两条线,我们用iStochastic ( )函数计算%K 线及%D 线,程序源代码如下:

注意: 当Mode 参数为"0" 时,表示%K 线;当Mode 参数为1 时,表示%D 线。在MQL 参照标题Standard Constants-Indicator lines 中列出了多种使用Mode 参数指标所用的有效整数常数。
你可以在指标线和特定指标水平之间的关系基础上产出交易信号,例如先前提到的70 超卖和30 超买。你也可以在指标线彼此关系的基础上评估交易信号。例如,想要开启一个购买订单,唯有当%K 线高于%D 线的情况发生时才可执行。以下是范例:

6.2.3 自定义指标
数以百计的供MetaTrader 使用的自定义指标可上线取得。若决定在EA 中使用自制指标,有一些烦琐的工作是必须要做的。当使用自定义指标时,最好备有. mq4 源代码档案。虽然没有的话或许也能使用,但是备有源代码能更容易理解Mode 参数中的记忆指数。
MQL 有内建函数以处理自定义指标iCustom( ) ,源代码如下:

在本章稍前,我们已熟悉了Symbol 、Timeframe 、Mode 和抽出。在此,我们从IndicatorName开始。
Indicator Name 指标档案的名字出现在Navigator 窗口的Custom Indicators 名目中,例如, "Slope Direction Line" 或" super_signal" 。
Indicator Parameters 是我们插入参数予自制指标之处。Custom Indicator Properties窗口中的Inputs 表将展示自制指标的参数。每个参数左边的图像意指数据类别。若你没有指标的. mq4 档案,将必须从这个对话框中决定指标参数。
一个更简易的寻找参数的方法是在指标源代码档案的开始部分检查extern 变量。所有指标参数及数据类型、默认值将在这里列出来,你可以简单地复制这些程序代码到你的EA 的外部变数一节。
在自制指标中,每一个外部变量必须在iCustom( )函数中有一对应参数,且它们必须和在指标中出现的顺序一致。若该参数无须被改变,你可以使用一个常数值(诸如信息化字符串,或非关键设定) 。

这里是一个范例: 热门的自制指标Slope Direction Line 在源代码中列出这些外部变数。我们将在EA 中创造这些设定的外部变量:

我们在EA 的外部变量中使用识别符号SlopePeriod 、SlopeMethod 和SlopePrice 。

以下是iCustom( )函数将如何沿着外部变量寻找这个特殊指标的程序代码:

NULL 表示我们正在使用当前的线图记号,而"0" 是目前线图的周期。Slope Direction Line 是指标档案的名字。SlopePeriod , SlopeMethod 和SlopePrice 是三个指标参数。我们使用默认模式指数"0" ,而位移值则是目前的K 棒。
虽然Slope Direction Line 指标被画成一条线,但实际上是由两个不同的缓冲存储器所组成。监视指标价格是往上还是往下,颜色(和缓冲存储器)也因此而改变。
若在K 线图上附上指标,然后观看MetaTrader 中的数据窗口(Data Window) ,将会看到给Slope Direction Line 的两个值: 第一个值是当指标值增加时显示的价格。这条线预设为蓝色;第二个值是当指标值减少时显示的价格,这条线预设为红色。
我们需要为这两条线决定模式指数。最简单的方法是查看源代码。在init( )函数中,你将看到多条程序代码用以执行和设定指标缓冲存储器的预定义参量:

第一个SetlndexBuffer( )函数设定一个指标缓冲存储器搭配"0" 的指数,并使用数组Uptrend 。我们可以借由数组名猜出这适用于蓝色的指标线。第二个类似函数则搭配着数组DnTrend 。注意:最底下的SetlndexStyle ( )函数设定缓冲存储器"0" 和" 1 " ,以便刻画出一条实线。
第三个缓冲存储器,搭配指数2 和数组ExtMapBuffer ,是用来单纯计算的。因此,我们可以推论出"0" 和"1" 是包含在我们指标价格数据中的缓冲存储器指数。根据数组识别符号, 0 是指上扬的趋势线, 1 则是指下滑的趋势线。这里告诉我们如何执行指标:

注意Mode 参数,倒数第二个,已被设定成合适的指标缓冲存储器指数一一"0" 是SlopeUp , "1 "是SlopeDown.Shift 参数,倒数第一个,被设定为"1" ,以检查最后K 棒的收盘值。
重复检查是否使用正确的Mode 参数是个好主意。加上一个Print( )函数到你的EA 中,然后在Strategy Tester 中使用Open PriceOnly 作为测试模型,以执行一个回头测试。确认在iCustom( )函数中Shift 参数设为"1" 。

Print( )函数会沿着先前K 棒的时间和日期,打印出我们的指标缓冲存储器到记录中。你可以在Strategy Tester 窗口的Journal 表中看到记录。这里是记录中print( )函数的输出值:

SlopeUp 的值, 2147483647 ,用以表示一个自制指标的状态EMPfY_VALUE ,是一个非常大的整数值。你可以用它作为交易条件。SlopeDown 回传了前一个K 棒的指标值。Time 表示我们想在线图中所找的K 棒。
点选Strategy Tester 窗口中的Open Chart 按钮,已开启一个你的指标适用的K线图。用Time 来找记录中的K 棒,并确认在数据窗口中的指标值与记录中打印的相符合。若不符合,调整iCustom( )函数中的Mode 参数,你便可以发现到正确的缓冲存储器。
这里告诉我们如何在我们的EA 中使用Slope Direction Line 指标。若坡度是趋势向上, SlopeUp 会回传一个价格值,而SlopeDown 会回传EMPTY_VALUE 或2 ,147483647 。相反的情况则应用于当坡度趋势向下时。

这些条件是简易地区分EMPTY_VALUE 的线。