//+------------------------------------------------------------------+//| MACD Sample.mq4 |//| Copyright ?2005, MetaQuotes Software Corp. |//| http://www.metaquotes.net/ |//+-------------------------- ...
// ------------------------------------------------------------------ //| MACD Sample.mq4 | //| Copyright ?2005, MetaQuotes Software Corp. | //| http://www.metaquotes.net/ | // ------------------------------------------------------------------ ////////////////////////////////////下面的为启动参数设置,在启动前这些参数允许使用者修改////////////////////////////////////////// extern double TakeProfit = 50; //定义一个双精度浮点数数据类型的参数,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;////定义了三个整数类型的变量 // 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 //首先我们必须认识到,让ea工作在一个正常的图表上是非常重要的,并且使用者不能有任何的设置错误 // variables (Lots, StopLoss, TakeProfit, // TrailingStop) in our case, we check TakeProfit // on a chart of less than 100 bars //在我们这个ea中,有这样几个变量Lots, StopLoss, TakeProfit, TrailingStop //我们检查TakeProfit需要最少100个bar的数据,int Bars为mt4预定义的变量,用来表示当前图表的柱数 //通俗的说,就是表示当前图表有几个蜡烛 if(Bars<100) //如果k线柱数少于100,则执行括号内的操作,如果k线数大于或者等于100,就跳过大括号内的语句继续执行 { Print("bars less than 100"); //在日志里面显示如下内容bars less than 100 return(0); } //上面的if判断执行完成以后,开始执行下面的if判断 //简单的说一下,下面的判断,首先if,然后一对小圆括号里面的是判断条件 //如果判断结果为真,则执行下面的一对大括号里面的语句 //如果判断结果为假,则跳过这个判断继续执行下面的内容,大括号的内容就不会被执行 if(TakeProfit<10) { Print("TakeProfit less than 10"); return(0); // check TakeProfit } //如果TakeProfit小于10,输出日志TakeProfit less than 10,并且返回错误代码0,表示没有出错 // to simplify the coding and speed up access // data are put into internal variables //为了促使程序简化,加速数据的存取速度,我们把 iMACD后面的这一长串定义赋值给一个内部变量 //这样程序可以更加简洁明了,程序也可以执行的比较快 //这里简单的说一下iMACD函数的后面几个参数的意义 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) { // no opened orders identified if(AccountFreeMargin()<(1000*Lots)) { Print("We have no money. Free Margin = ", AccountFreeMargin()); return(0); } // check for long position (BUY) possibility if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious && MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious) { 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)) Print("BUY order opened : ",OrderOpenPrice()); } else Print("Error opening BUY order : ",GetLastError()); return(0); } // check for short position (SELL) possibility if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious && MacdCurrent>(MACDOpenLevel*Point) && MaCurrent<MaPrevious) { ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"macd sample",16384,0,Red); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice()); } else Print("Error opening SELL order : ",GetLastError()); return(0); } return(0); } // it is important to enter the market correctly, // but it is more important to exit it correctly... for(cnt=0;cnt<total;cnt ) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderType()<=OP_SELL && // check for opened position OrderSymbol()==Symbol()) // check for symbol { if(OrderType()==OP_BUY) // long position is opened { // should it be closed? if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious && MacdCurrent>(MACDCloseLevel*Point)) { OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position return(0); // exit } // check for trailing stop if(TrailingStop>0) { if(Bid-OrderOpenPrice()>Point*TrailingStop) { if(OrderStopLoss()<Bid-Point*TrailingStop) { OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green); return(0); } } } } else // go to short position { // should it be closed? if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious && MathAbs(MacdCurrent)>(MACDCloseLevel*Point)) { OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // close position return(0); // exit } // check for trailing stop if(TrailingStop>0) { 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); } // the end. 本文来自网络,如若转载引用本网站内容须注明原网址,并标明本网站网址(www.anwei66.com)。 对于不当转载或引用本网站内容而引起的民事纷争、行政处理或其他损失,本网站不承担责任。 |
0