外汇MT4软件EA编程之MACD EA详解
在MT4安装后,默认会给用户提供几个例子程序,这些程序对于新学习EA开发过程中有很大的帮助,下面我们就来对MACD Sample这个例子EA来做个解读,来看看别人是如何开发一个EA的。
首先是注释,在MQL语言中所有//的这一行就是注释行,系统本身不会去执行它,它只是用来解释当前代码的含义的,我们在代码中加入这些注释为了是让我们能够清楚的阅读代码的含义,在程序中加入详细的注释是一个很好的编程习惯,我们鼓励大家多加入注释。很多人觉得注释这东西因为没用在写代码中觉得很麻烦而忽略它,但是即使是自己编写的程序如果不加注释过几天就会忘记意思,还要再一行一行地看这些代码,所以注释是非常重要的。
下面这些就是定义变量,我们发现前面加上了extern关键字,如果在定义变量的前面有这个词说明这个变量将会被作为EA运行的参数,举个例子,比如我要编写一个EA,在使用过程中我想改变它的止盈和止损值,如果我程序都是事先编好的止盈止损,那么以后要改动它必须要改代码,这样不仅麻烦也不灵活,如果我把这些信息作为EA运行参数,那么在EA运行中就可以随时调整它了。
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;
上面定义了6个变量并且都是当作参数,这里设定变量名称的时候尽量使用用户可以理解的词汇,在EA的参数设置里这些变量名就是参数的名字。值得注意的是EA里变量名称是可以用中文的。
int start()
start()函数是EA运行的核心,MQL语言规定了几个默认函数,其中EA第一次运行时会调用init()函数,在这个函数里我们可以放入一些需要初始化的信息,start()函数中放我们EA的核心代码,每次一个TICK(换句话说就是新报价)来到后,系统会自动调用start()函数。deinit()函数是当EA关闭的时候调用的,这里放一些我们程序停止后需要“善后”的代码。start()函数是必须要有的,其它两个函数如果不需要可以不用写。
if(Bars(MACDOpenLevel*Point) && MaCurrent0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
}
else
Print("Error opening SELL order : ",GetLastError());
return(0);
这段代码就是空单的进场条件,和上面的正相反。值得说明是这两个下单代码中会遇到下单失败的情况,因为当用OrderSend()函数下单后会返回一个大于0的整数订单号数值,利用这一点就可以很容易的知道下单是否成功了。
下面的代码是平仓和移动止损部分,这段代码比较难懂,但是却是非常重要的部分,因为在编写EA中这些操作会经常遇到,让我们来一点一点的拆解开来理解下它们的含义。
for(cnt=0; cnt(MACDCloseLevel*Point))
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position
return(0); // exit
}
多单的平仓部分代码,这里其实就是去掉均线条件的空单下单信号,平仓操作中一定要注意在平仓完成后必须终止这个遍历订单的循环,因为平仓后会打乱所有单子的顺序,造成误操作其他订单。
我们在这里举个例子就能明白为什么要这么做:比如当前有三个单子没有平仓,按照顺序排列序号是0、1、2,如果第二个单子平仓后第三个单子序号就会提前,这样当下一轮循环执行到OrderSelect()函数后会因为没有这个编号而出现错误。
if(TrailingStop>0)
{
if(Bid-OrderOpenPrice()>Point*TrailingStop)
{
if(OrderStopLoss()
当前位置:首页 > 大汇谈 > 外汇MT4软件EA编程之MACD EA详解
上一篇:外汇MT4软件EA编程入门
下一篇:外汇MT4编程:如何把指标应用到外汇EA上?