2.9 简单EA 程序(Expert Advisor/专业顾问)
关于EA ,是使用平均移动线来进行自动交易的。这个系统逻辑很简单:买单会在10 日线穿过20 日线时进行交易;相反,当10 日线向下穿过20 日线时进行卖出交易。当然,我们这里是用"日"来代表,单位是依照你所选的K 线图的周期而定。
这个EA 程序会自动选择空单或多单。当订单平仓时则是反向运作,或由止损或停利设定来决定。使用全局变量BuyTicket 和SellTicket 将存储最后一笔单。当开一个新单时,最后一笔单即会被消除。这可以防止多个订单开启。
2.9.1 简单EA 程序源代码




在订单编号储存在执行程序中之前,可以将BuyTicket 和SellTicket 设为总体变量,即为Start( )函数内的静态变量。添加Usepoint 和UseSlippage 为全局变量,计算这些数值。init ( )函数首先运行。而且pPoint( )和GetSlipp唔e() 函数将运算返回值到全局变量。使用这先函数前,必须参考点位或滑点,在其他EA 程序中也是一样。
接下来的start( )函数,为主要程序执行。iMA() 函数计算移动平均FastMA 变量保存10 期移动平均线,前面为使用FastMAPeriod。SlowMA 20 期移动平均线则使用了SlowMAPeriod 。一切设置为默认值(无移位,简单的移动平均线的收盘价计算) 。
我们使用IF 运算符来定义我们的开单情况。如果目前的10 期的移动平均( FastMA) 大于20 期的移动平均(在SLowMA) ,并BuyTicket 等于"0"; 在以上这些情况之下将会开启新仓。
在开新的多单时,我们会平仓目前的空单。使用OrderSelect ( )确认当前的SellTicket 。如果该订单的平仓时间为"0"( 这表示这一命令尚未执行) ,和SellTicket大于"0" (SellTicket 可能为有效) ,我们会继续给予空单指示。检索多笔空单和目前平仓的Ask 价格。然后再使用OrderClose ( )平仓空单。
接下来,运算当前Ask 价格来给予OpenPrice 变量,这是我们的买单开仓价格。先检查开盘价和计算止损、停利的关系,用以确保止损或停利值。然后,将使用OrderSend()函数并储存交易单编号在BuyTicket 。最后清除SellTicket 值,确保另一个卖单状态为有效。
空单命令块和多单命令块视为相同逻辑。我们先平仓多单,并使用Bid 价来当ClosePrice 。止损和利润的计算则是相反的。start( )函数结束与回报。定制PipPoint()和GetSlippage ( )函数被定义在start( )函数之后。
2.9.2 使用预挂单
修改EA 处理预挂单。在下面的例子中,我们将使用止损单。当快速移动平均线大于慢速移动平均线时,将买入止损单的价位挂在目前的高价上,往上加10 个点,而卖出止损订单价则低于目前低点的10 个点。PendingPips 为外部调整变量。

添加OrderDelete ( )函数用于在买单和卖单命令块来平仓预挂单操作。我们需要用SellTicket 检查订单类型,以确保使用正确的函数来平仓。

使用OrderType ( )函数来检查所选的卖单是否为市价单或停损单。如果是市价单,可用OrderC lose ( )来进行平仓;如果是预挂单,则可使用OrderDelete ( )函数语法。
关于预挂单价格的计算。现在来简单地转换PendingPips 与Usepoint 的分数值,并把它加到目前收盘价,且将此值存在PendingPrice 变量中。接下来,计算止损和利润,还有预挂单价格的相对关系。最后用OrderSend ( )下预挂单。交易结果相关信息存在BuyTicket 中。
以下为预挂单价格计算源代码:

以下为卖出止损单源代码:


本书附录A 中有更完整的程序源代码。