微智科技网
您的当前位置:首页MT 的MACD编程EA详解 K

MT 的MACD编程EA详解 K

来源:微智科技网
MT4的MACD编程EA详解

在MT4安装后,默认会给用户提供几个例子程序,这些程序对于新学习EA开发过程中有很大的帮助,下面我们就来对MACD Sample这个例子EA来做个解读,来看看别人是如何开发一个EA的。

首先是注释,在MQL语言中所有Free Margin = \", AccountFreeMargin()); return(0); }

上面的代码是计算当前的剩余保证金是否小于1000,如果太少钱会不够用,所以会输出下当前的保证金还剩多少并退出。

if(MacdCurrent<0 {

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,\"macd sample\16384,0,Green);

if(ticket>0) {

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) \OrderOpenPrice());

}

else Print(\"Error opening BUY order : \",GetLastError()); return(0); }

上面这段就是多单开仓部分了,条件是这样:如果当前MACD主线在0轴以下,MACD“金叉”,MACD的主线不在0轴附近(这块是EA的参数来指定0轴附近多少点)并且还要当前的均线是上升的。

这里最精彩的部分在于如何判断MACD“金叉”,如何判断MACD值不在0轴附近和均线目前是上升的还是下降的。 “金叉”的判断是EA里用的比较多的,这里我们用了判断大小的方法就能很容易的计算它,首先得到MACD两根线当前的值和上一根K线的MACD值,如果上一根K线的MACD主线大于信号线并且当前的MACD主线小于信号线那么就相当于这两根线做了一个“交叉”,因此我们可以认为MACD“金叉”了。从这里我们也能看出来用计算机的方法来解决我们人类所认知的问题靠的都是这种具体数值的计算,所以计算机还是比较“死板”的,如果两根线“扭”在了一起那么用计算机程序很难判断出来,这些就是目前计算机程序的缺点。

0轴附近这种判断方法这里利用了一点数学方面的知识,不过不用担心都是很简单的算法。把MACD值做绝对值运算然后判断是否大于指定的值,因为MACD会是负值做绝对值运算后直接判断是否大于设定的值就行了,这块相当于是简化了判断语句的条件。

均线的上升和下降判断和“金叉”的算法差不多,得到当前均线值和前一根线的均线值,如果前一根均线值小于当前值那么就说明均线是上升的。

if(MacdCurrent>0&&MacdCurrentSignalPrevious&& MacdCurrent>(MACDOpenLevel*Point) && MaCurrent{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,\"macd sample\

if(ticket>0) {

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print(\"SELL order opened :

\OrderOpenPrice());

Print(\"BUY

order

opened

:

&&

MacdCurrent>SignalCurrent

&&

MacdPrevious&&

MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious)

} else

Print(\"Error opening SELL order : \",GetLastError()); return(0);

这段代码就是空单的进场条件,和上面的正相反。值得说明是这两个下单代码中会遇到下单失败的情况,因为当用OrderSend()函数下单后会返回一个大于0的整数订单号数值,利用这一点就可以很容易的知道下单是否成功了。

下面的代码是平仓和移动止损部分,这段代码比较难懂,但是却是非常重要的部分,因为在编写EA中这些操作会经常遇到,让我们来一点一点的拆解开来理解下它们的含义。

for(cnt=0; cnt当前存在的订单中我们要判断是否到达平仓的条件,所以第一步我们首先要对所有在下的单子进行一次遍历,一个一个的去判断它们是否达到平仓条件。

此代码中利用了一个循环语句从第一单开始一单一单的循环,这里值得注意的是所有单子都是按照下单的先后顺序存放的,第一张单子的编号是0而不是1,这是编程语言中一般都采取的方法,我们在编写程序的时候一定要注意它的值要从0开始。

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

上面是选择订单操作,当循环一次订单后,必须调用OrderSelect()函数来锁定这一订单,这样下面的操作才可以正常运行。这里最容易出错的地方是函数的第二个参数如果查一下文档我们会发现它有两个选项:SELECT_BY_POS和SELECT_BY_TICKET。第一种方式是根据订单的位置进行选定操作,这个例子中就是使用了这种方式,第二种方式是根据订单号来进行选定操作,因为我们并不知道所有单子的订单号是多少所以我们只能使用第一种方式来选择订单,刚才说过订单是按照下单的先后顺序来存放的,因此如果是第一个单子那么就是0,如果是第二个单子就是1,最后一个单子是总单子数减一。

if(OrderType()<=OP_SELL && 盒校验(即查看源码)

直接看源码中的循环部分,如果有修改曲线数组的行为,则可以立刻断定有未来函数。 2.黑盒观察

当没有源码的时候,可以将指标加载到1分钟的图线上,连续不断观察其标示的变化,尤其注意与当前K线状态最接近的历史K线标示的变化。如果随着当前K线的变化出现过历史变化更改,则也可以确定有未来函数

指标EA化之前必须要确认的事情:

如果一个指标含有 未来函数,那么这个指标是没有多大意义的。也就是说,我们要将指标改为EA前,必须确认这个指标是不含未来函数的,这样指标EA化才有意义。

第二部分 指标EA化

接下来将指标EA化大致的做法是:

在EA中通过函数iCustom读取这个指标的当前K线输出值,得出当前的状态,来决定是否入场或者平仓并反向入场。

iCustom的具体用法:

指标一般都是曲线或者箭头两种。在这里我们要把曲线和箭头都看成是数组就容易理解了。

对于指标来说每一条曲线或者箭头都是写在与每个K线对应的数组中的,也就是说一条曲线对应一个数组,一个方向的箭头也是对应一个数组(有箭头的数组值是当时的,没箭头地方的数组值是“空”)

iCustom MT4的帮助里说的是:“计算指定的客户指标并且退回它的值”,即这个函数可以让你获取指定指标的第几个数组对应第几根K线上的计算数值。

具体如下:

double iCustom(string symbol, int timeframe, string name, ..., int mode, int shift)

计算指定的客户指标并且退回它的值。 必须在terminal_directory\\experts\\indicators目录内编写客户指标(*.EX4文件)。

参量:

symbol - 计算指标数据上的货币对名称. NULL表示当前货币对.

timeframe -周期。 可以时间周期列举任意值. 0表示当前图表的时间周期. name - 客户指标完整的程序名称

.... - 参量设置(如果需要)。通过的参量和他们的顺序必须与desclaration命令和客户指标的外部可变物的种类对应。

mode - 索引行。 从0到7并且必须对应以其中一个使用的索引的 SetIndexBuffer 函数. shift - 从显示缓冲采取的值的索引(转移相对当前柱特定相当数量期间前). 示例:

double val=iCustom(NULL, 0, \"示例Ind\double va2=iCustom(NULL, 0, \"示例Ind\

例如:一个指标,画了两条曲线,则可以用iCustom取得这个指标在第4根K线上对应的第一条曲线的数值。 我们现在已经可以根据自己的想法去获得一个指定指标的任何K线上的状态数值了。那麽下一步我们就要开始EA的概念。

因为EA只针对当前价格状态下的动作进行控制。所以一般而言我们就取指定指标在当前K线下的计算数值用于EA的条件。

如果你认为当前K线没有,其数值始终在变化,有可能一会有讯号一会没讯号,那麽你可以采用取前一K线的指标数值的方式作为基础。(如果用当前K线指标数值作为条件会有不确定的结果,但如果用前一K线数值做条件则有“错过最佳入场点”的问题。这是需要程序设计者权衡的问题。)

另外的一个问题,就是怎末去判断指标输出的数值与我们肉眼看到的讯号一致起来的问题。

如果参考的指标是一种变色线,则一定是一种颜色一个数组的方式叠加起来显示的。我们在取其数值的时候只需要看看不同颜色的数组的数值比较一下就知道其结果是哪种颜色,并作为EA的条件进行动作就行了。

如果是箭头的方式,则一样是去取其数值,无箭头的K线上指标对应的数值是“空”,有箭头的地方数组对应的数值肯定不是空。用这个来判断是否发生了讯号就行了。

比如双色线,就一定是两个数组分别显示不同颜色,当指标认为应该显示其中一种颜色的时候就将这个颜色对应的数组在当前K线中的数值设成当前价。反之则设为“空”。这样循环一遍后 你肉眼看到的就是变色线了

现在我们可以轻松获得指标的当前讯号状态了! 下一步就是结合进EA中,就是把指标中的数组值拿过来 第三部分 EA 编程逻辑

EA就是一个循环往复的过程。每来一个价格就运行一次。

EA是电脑,并不知道你现在的仓位情况也不知道指标的情况,除了计算什么都不知道,一切都是编程者赋予的。因此,编程者脑子里一定要建立一种综合状态的概念。

EA的一开始一定要先进行仓位的情况检查。大致的逻辑如下: 1 先查出持仓情况和持仓单的方向。 2.然后获得指标的数值。 3 判断并操作

持仓状态下:根据持仓单的方向进行对应来判断反向讯号是否发生。如果发生则平仓并反向入场。如果没发生则直接返回,等待下一次价格的而到来。

空仓状态下:则两个方向的讯号都做判断,哪边发生了就按那边的方向入场。 4.其他的的细节

不论入场还是出场都要在发出动作后马上判断是否正确执行的判断。如果没有执行成功则一定要立刻放弃后面的操作直接返回。等待下一个价格来的时候在此发出同样的动作。

另外说明的是数据是自动更新的。

因篇幅问题不能全部显示,请点此查看更多更全内容