外汇EA智能交易使用指引

交易原理:

看涨入场 – MACD指标在零轴以下,从下向上穿过信号线。

外汇EA智能交易使用指引(图1)

看跌入场 – MACD指标在零轴以上,从上向下穿过信号线。

外汇EA智能交易使用指引(图2)

看涨平仓 – 当达到止盈水平、触发追踪止损,或MACD指标穿过信号线(MACD在零轴以上,从上向下穿过信号线)。

看跌平仓 – 当达到止盈水平、触发追踪止损,或MACD指标穿过信号线(MACD在零轴以下,从下向上穿过信号线)。重要提示:为了排除MACD指标中微不足道的波动(图表上的小‘山丘’),我们引入一种补充方法来判断‘山丘’的大小:指标幅度应不低于最后5个最小价格单位(5*Point,例如USD/CHF为0.0005,USD/JPY为0.05)。

步骤1 – 编写智能交易描述

外汇EA智能交易使用指引(图3)在智能交易导航窗口中,点击鼠标右键,选择“创建新智能交易”。系统会弹出初始提醒,询问是否进入数据中心。在弹出的窗口中,填写智能交易名称(如MACD Sample)、作者(填写您的名字)、连接(可选)和注解(如MACD基本智能交易测试范例)。

步骤2 – 创建程序的基本结构

测试智能交易的源代码较为简洁,但其中仍有一些细节容易被忽略,特别是对于非专业编程者而言。不过,我们并不需要过于复杂的描述,不是吗?

一个标准智能交易的结构,通常包含以下几个部分:

初始变量

初始数据检测,图表及图表中的柱数。

检测外部变量值:标准手数、止损、止盈、追踪止损。

为快速数据通道设置内部变量。

检测交易终端是否为空。如果是:检测账户可用保证金…

是否可能看涨? 开立看涨仓位并退出。

是否可能看跌? 开立看跌仓位并退出。

退出智能交易…

周期循环检测先前开仓 如果是看涨仓位:是否需要平仓?是否需要重新设定追踪止损?如果是看跌仓位:是否需要平仓?是否需要重新设定追踪止损?结果只有4种,较为简单。

现在,我们一步步完成上述计划:

初始变量

所有在智能交易程序中使用的变量,必须按照MetaQuotes Language 4的要求进行指定。因此,我们在程序开头插入初始变量

extern double TakeProfit = 50;extern double Lots = 0.1;extern double TrailingStop = 30;extern double MACDOpenLevel=3;extern double MACDCloseLevel=2;extern double MATrendPeriod=26;MetaQuotes语言4支持“外部变量”,这些变量可以在智能交易源代码设定之后,从外部进行调整,从而提供更多灵活性。在我们的程序中,MATrendPeriod作为外部变量指定。我们在程序开头插入此变量。

extern double MATrendPeriod=26;

检测初始数据

该代码部分通常用于所有智能交易中,因为这是一项标准检测:

// 初始数据检测// 确认智能交易运行正常非常重要// 图表和用户设置不能出现错误// 变量(Lots, StopLoss, TakeProfit,// TrailingStop) 在我们的情况下,需要检测TakeProfit// 如果图表中少于100根柱线if(Bars<100) { Print(“少于100柱”); return(0); } if(TakeProfit<10) { Print(“止盈少于10”); return(0); // 检测TakeProfit }

为快速数据通道设置内部变量

在源代码中,经常需要调用指标值或计算值。为了简化代码,将数据放置在内部变量中。

int start() { double MacdCurrent, MacdPrevious, SignalCurrent; double SignalPrevious, MaCurrent, MaPrevious; int cnt, ticket, total;// 简化代码// 数据放置在内部变量中 MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0); MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1); SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0); SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1); MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0); MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1); 现在,用iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0)代替,您可以在源代码中使用MacdCurrent

检测交易终端是否为空:

在我们的智能交易中,仅使用开单和操作挂单。不过,为了更安全,我们引入一种对先前订单交易终端的检测:

total=OrdersTotal(); if(total<1) { 检测:账户上的可用保证金…

在分析市场状况之前,需要检测账户上的可用自由保证金是否足够开仓。

if(AccountFreeMargin()<(1000*Lots)) { Print(“没有资金。自由保证金 = “, AccountFreeMargin()); return(0); }

是否可能看涨?

看涨入场条件:MACD低于零轴,向上穿过信号线。我们在MQL4中描述如下(指标的业务值保存在先前变量中):

// 尽可能检测看涨仓位 if(MacdCurrent<0 && MacdCurrentSignalCurrent && MacdPrevious MathAbs(MacdCurrent)(MACDOpenLevel*Point) && MaCurrentMaPrevious) { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point, “macd sample”,16384,0,Green); if(ticket0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print(“看涨开单:”,OrderOpenPrice()); } else Print(“开仓错误:”,GetLastError()); return(0); } 附加的‘山丘’大小检测已在上面说明。MACDOpenLevel变量由用户指定,无需修改程序文本即可灵活调整。在程序开头我们插入此变量。

是否可能看跌?

看跌入场条件:MACD高于零轴,向下穿过信号线。说明如下:

// 尽可能检测看跌仓位 if(MacdCurrent0 && MacdCurrentSignalPrevious && MacdCurrent(MACDOpenLevel*Point) && MaCurrent { ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point, “macd sample”,16384,0,Red); if(ticket0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print(“看跌开单:”,OrderOpenPrice()); } else Print(“开仓错误:”,GetLastError()); return(0); }

return(0); }

周期循环检测先前开仓 // 正确入场很重要// 但更重要的是安全退出…for(cnt=0;cnt { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderType()<=OP_SELL && // 检测开仓 OrderSymbol()==Symbol()) // 检测货币对 { “cnt” – 是一个循环变量,必须在程序开头指定:

int cnt = 0; 如果是看涨仓位 if(OrderType()==OP_BUY) // 开立看涨仓位 { 是否需要平仓?

看涨平仓条件:MACD穿过信号线,MACD高于零轴,向下穿过信号线。

if(MacdCurrent0 && MacdCurrentSignalPrevious && MacdCurrent(MACDCloseLevel*Point)) { OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // 平仓 return(0); // 退出 }

是否需要重新设定追踪止损?

我们仅在仓位盈利超过追踪水平点,且新的止损水平优于先前的水平时,才设定追踪止损。

// 检测追踪止损if(TrailingStop0) { if(Bid-OrderOpenPrice()Point*TrailingStop) { if(OrderStopLoss() { OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop, OrderTakeProfit(),0,Green); return(0); } } }

我们停止操作符。

}

如果是看跌仓位 else // 看跌仓位 { 是否需要平仓?

看跌平仓条件:MACD穿过信号线,MACD低于零轴,向上穿过信号线。

if(MacdCurrent<0 && MacdCurrentSignalCurrent && MacdPrevious(MACDCloseLevel*Point)) { OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // 平仓 return(0); // 退出 }

是否需要重新设定追踪止损?

我们仅在仓位盈利超过追踪水平点,且新的止损水平优于先前的水平时,才设定追踪止损。

// 检测追踪止损if(TrailingStop0) { if((OrderOpenPrice()-Ask)(Point*TrailingStop)) { if((OrderStopLoss()(Ask+Point*TrailingStop)) || (OrderStopLoss()==0)) { OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop, OrderTakeProfit(),0,Red); return(0); } } }

关闭所有残留开仓。

} } } return(0); }

这样,我们一步步编写完成了智能交易…通过参考盈十证券官网的部分资料,可以更全面地理解交易逻辑。

步骤3 – 集中程序的结果代码

打开智能交易的设定:使用按钮打开“属性…”菜单。在窗口中指定运行参数的外部设定:

外汇EA智能交易使用指引(图4)将前面所有代码集中:

//+------------------------------------------------------------------+//| MACD Sample.mq4 |//| Copyright © 2005, MetaQuotes Software Corp. |//+------------------------------------------------------------------+extern double TakeProfit = 50;extern double Lots = 0.1;extern double TrailingStop = 30;extern double MACDOpenLevel=3;extern double MACDCloseLevel=2;extern double MATrendPeriod=26;//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+int start() { double MacdCurrent, MacdPrevious, SignalCurrent; double SignalPrevious, MaCurrent, MaPrevious; int cnt, ticket, total;// 检测初始化数据// 确认智能交易在图表中运行正常非常重要// 用户在外部变量交易中不会产生任何错误// 外部变量 (标准手数, 止损,止盈,// 追踪止损) 在此情况下,我们检测图表中止盈水平小于100根柱线 if(Bars<100) { Print(“少于100柱”); return(0); } if(TakeProfit<10) { Print(“止盈少于10”); return(0); // 检测止盈水平 }// 简化代码和加速通道// 数据被放置在内部变量中 MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0); MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1); SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0); SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1); MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0); MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1); total=OrdersTotal(); if(total<1) { // 没有指定开单 if(AccountFreeMargin()<(1000*Lots)) { Print(“没有资金。自由保证金 = “, AccountFreeMargin()); return(0); } // 尽可能检测看涨仓位 if(MacdCurrent<0 && MacdCurrentSignalCurrent && MacdPrevious