一步一步解读MT4的例子EA(新版MACD Sample).doc_第1页
一步一步解读MT4的例子EA(新版MACD Sample).doc_第2页
一步一步解读MT4的例子EA(新版MACD Sample).doc_第3页
一步一步解读MT4的例子EA(新版MACD Sample).doc_第4页
一步一步解读MT4的例子EA(新版MACD Sample).doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/+-+/| MACD Sample.mq4 |/| Copyright 2005-2014, MetaQuotes Software Corp. |/| |/+-+#property copyright 2005-2014, MetaQuotes Software Corp./该部分属于预处理程序,#property:编译参数定义,还有#define定义常数,等。#property link input double TakeProfit =50;/用input输入变量,也可用Extern声明外部变量,二者基本等效。input double Lots =0.1;input double TrailingStop =30;input double MACDOpenLevel =3;input double MACDCloseLevel=2;input int MATrendPeriod =26;/+-+/| |/+-+void OnTick()/*void为空值函数,不能有返回值(只能是return),目的只是执行程序内容,每个价格波动 就执行一次。 旧版int start()函数:当数据变动时触发,对于自定义指标或者自动交易的编程主要依靠此函数进行,int start()函数需要有返回值,如return(0)。*/ double MacdCurrent,MacdPrevious;/声明变量:类型 变量名 double SignalCurrent,SignalPrevious; double MaCurrent,MaPrevious; int cnt,ticket,total;/-/ initial data checks/ it is important to make sure that the expert works with a normal/ chart and the user did not make any mistakes setting external / variables (Lots, StopLoss, TakeProfit, / TrailingStop) in our case, we check TakeProfit/ on a chart of less than 100 bars/- if(Bars100)/如果当前图表中的k线(Bars)少于100根将会结束OnTick()函数的执行。 /如果在程序中判断出有错误,下面的代码无法继续执行了,调用return函数让其退出OnTick()函数的执行。 Print(bars less than 100); return; if(TakeProfit10)/*如果参数里的TakeProfit(止盈)变量小于10也提示一条信息并结束执行, 有些平台会限制下单时的止盈点数不得小于某个点,如果小于某值会在下单时报错,为了避免这种错误应限制参数中止盈的设定。 其实这里可以调用MarketInfo()函数得到我们当前平台中允许的止盈止损最小值从而根据平台的不同自动计算出最小的止盈点数, 详细情况请参阅文档MarketInfo()函数的描述。*/ Print(TakeProfit less than 10); return; /- to simplify the coding and speed up access data are put into internal variables 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); /*以上语句是调用了MQL的一些内置指标函数, 在MQL语言中,对于常用的指标如均线,MACD,KD等MQL已经提供给我们现成的函数,我们只要调用他即可得到指标的值。 就上面的代码,MacdCurrent的值是参数为12,26,9的MACD主线当前K线的值,MacdPrevious则是MacdCurrent前一根K线的值, SignalCurrent和SignalPrevious则是相同参数信号线的当前值和前一根值。 后两个是调用均线指标函数,这里的均线周期参数则是使用了EA的参数变量MATrendPeriod, 这样写是个好习惯,把调用指标的参数放到EA参数里,这样可以随时在运行中调整这些参数方便我们改变策略。 MaCurrent和MaPrevious是得到26均线的当前K线值和前一根的值。*/ total=OrdersTotal(); if(total1) /*判断我们当前是否有单子在做,他调用了OrdersTotal()函数, 它可以计算当前账户中还没有平仓的单子和挂单的总的个数,如果它小于1说明当前没有任何单子, 这种判断方法只是一种简单的判断法,如果这个EA在运行过程中手工也去下单则EA永远不会下单了, 如果要更加精确的计算这个EA所下的单子数量还需要利用其他方法。*/ /- no opened orders identified if(AccountFreeMargin()(1000*Lots) Print(We have no money. Free Margin = ,AccountFreeMargin(); return;/计算当前的剩余保证金是否小于1000,如果太少钱会不够用,所以会输出下当前的保证金还剩多少并退出。 /- check for long position (BUY) possibility if(MacdCurrentSignalCurrent & MacdPrevious(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(BUY order opened : ,OrderOpenPrice(); else Print(Error opening BUY order : ,GetLastError(); return; /*上面这段就是多单开仓部分了,条件是这样:如果当前MACD主线在0轴以下,MACD金叉, MACD的主线不在0轴附近(这块是EA的参数来指定0轴附近多少点)并且还要当前的均线是上升的。 这里最精彩的部分在于如何判断MACD金叉,如何判断MACD值不在0轴附近和均线目前是上升的还是下降的。 金叉的判断是EA里用的比较多的,这里我们用了判断大小的方法就能很容易的计算它,首先得到MACD两根线当前的值和上一根K线的MACD值, 如果上一根K线的MACD主线大于信号线并且当前的MACD主线小于信号线那么就相当于这两根线做了一个交叉,因此我们可以认为MACD金叉了。 从这里我们也能看出来用计算机的方法来解决我们人类所认知的问题靠的都是这种具体数值的计算, 所以计算机还是比较死板的,如果两根线扭在了一起那么用计算机程序很难判断出来,这些就是目前计算机程序的缺点。 0轴附近这种判断方法这里利用了一点数学方面的知识,不过不用担心都是很简单的算法。 把MACD值做绝对值运算然后判断是否大于指定的值,因为MACD会是负值做绝对值运算后直接判断是否大于设定的值就行了,这块相当于是简化了判断语句的条件。 均线的上升和下降判断和金叉的算法差不多,得到当前均线值和前一根线的均线值,如果前一根均线值小于当前值那么就说明均线是上升的。*/ /- check for short position (SELL) possibility if(MacdCurrent0 & MacdCurrentSignalPrevious & MacdCurrent(MACDOpenLevel*Point) & MaCurrent0) if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES) Print(SELL order opened : ,OrderOpenPrice(); else Print(Error opening SELL order : ,GetLastError(); /- exit from the no opened orders block return;/*这段代码就是空单的进场条件,和上面的正相反。值得说明是这两个下单代码中会遇到下单失败的情况, 因为当用OrderSend()函数下单后会返回一个大于0的整数订单号数值,利用这一点就可以很容易的知道下单是否成功了。 下面的代码是平仓和移动止损部分,这段代码比较难懂,但是却是非常重要的部分,因为在编写EA中这些操作会经常遇到,。*/ /- it is important to enter the market correctly, but it is more important to exit it correctly. for(cnt=0;cnttotal;cnt+) /*当前存在的订单中我们要判断是否到达平仓的条件, 所以第一步我们首先要对所有在下的单子进行一次遍历,一个一个的去判断它们是否达到平仓条件。 此代码中利用了一个循环语句从第一单开始一单一单的循环,这里值得注意的是所有单子都是按照下单的先后顺序存放的, 第一张单子的编号是0而不是1,这是编程语言中一般都采取的方法,我们在编写程序的时候一定要注意它的值要从0开始。*/ if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES) continue; /*上面是选择订单操作,当循环一次订单后,必须调用OrderSelect()函数来锁定这一订单,这样下面的操作才可以正常运行。 这里最容易出错的地方是函数的第二个参数如果查一下文档我们会发现它有两个选项:SELECT_BY_POS和SELECT_BY_TICKET。 第一种方式是根据订单的位置进行选定操作,这个例子中就是使用了这种方式, 第二种方式是根据订单号来进行选定操作,因为我们并不知道所有单子的订单号是多少所以我们只能使用第一种方式来选择订单, 刚才说过订单是按照下单的先后顺序来存放的,因此如果是第一个单子那么就是0,如果是第二个单子就是1,最后一个单子是总单子数减一。*/ if(OrderType()0 & MacdCurrentSignalPrevious & MacdCurrent(MACDCloseLevel*Point) /- close order and exit if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet) Print(OrderClose error ,GetLastError(); return; /- check for trailing stop if(TrailingStop0) if(Bid-OrderOpenPrice()Point*TrailingStop) if(OrderStopLoss()Bid-Point*TrailingStop) /- modify order and exit if(!OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green) Print(OrderModify error ,GetLastError(); return; /*多单的平仓部分代码,这里其实就是去掉均线条件的空单下单信号, 平仓操作中一定要注意在平仓完成后必须终止这个遍历订单的循环, 因为平仓后会打乱所有单子的顺序,造成误操作其他订单。 我们在这里举个例子就能明白为什么要这么做:比如当前有三个单子没有平仓, 按照顺序排列序号是0、1、2,如果第二个单子平仓后第三个单子序号就会提前, 这样当下一轮循环执行到OrderSelect()函数后会因为没有这个编号而出现错误。*/ else / go to short position /- should it be closed? if(MacdCurrentSignalCurrent & MacdPrevious(MACDCloseLevel*Point) /- close order and exit if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet) Print(OrderClose error ,GetLastError(); return; /- check for trailing stop if(TrailingStop0) if(OrderOpenPrice()-Ask)(Point*TrailingStop) if(OrderStopLoss()(Ask+Point*TrailingStop) | (OrderStopLoss()=0) /- modify order and exit if(!OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red) Print(OrderModify error ,GetLastEr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论