乐于分享
好东西不私藏

基于MACD指标的EA源码展示:经典值得学习

基于MACD指标的EA源码展示:经典值得学习
MACD Sample 是学习 MT4 EA 开发最好的入门范本,演示指标取数、开平仓、移动止损、简单过滤逻辑。
优点:思路朴素,顺势 + MACD 信号,一单模式,无马丁,双重出场。
致命短板:缺少初始硬止损,实盘必须修改源码增加 StopLoss,不能直接拿来跑真实账户!因为这个只是为了让大家学习MACD的指标玩法,所以大家记得拿模拟来玩哈!
参数翻译:
extern double TakeProfit = 50;      // 止盈,点数 
extern double Lots = 0.1;           // 交易手数 
extern double TrailingStop = 30;    // 移动止损,点数 
extern double MACDOpenLevel=3;      // MACD开仓阈值(点数) extern double MACDCloseLevel=2;     // MACD平仓阈值(点数) extern double MATrendPeriod=26;     // 趋势MA周期
源码:
//+------------------------------------------------------------------+//|                                                  MACD Sample.mq4 |//|                      Copyright , 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;double Points;//+------------------------------------------------------------------+//|                                                                  |//+------------------------------------------------------------------+intinit()  {   Points = MarketInfo (Symbol(), MODE_POINT);//----   return(0);  }//+------------------------------------------------------------------+//|                                                                  |//+------------------------------------------------------------------+intdeinit()  {   return(0);  }//+------------------------------------------------------------------+//|                                                                  |//+------------------------------------------------------------------+intstart()  {   double MacdCurrent=0, MacdPrevious=0, SignalCurrent=0;   double SignalPrevious=0, MaCurrent=0, MaPrevious=0;   int cnt=0, total;   if(Bars<100)     {      Print("bars less than 100");      return(0);  // 磬 沭圄桕?戾礤?100 徉痤?     }   if(TakeProfit<10)     {      Print("TakeProfit less than 10");      return(0);  // 镳钼屦屐 TakeProfit     }// 疣滂 箫痤龛 ?篑觐疱龛 觐溧, 耦躔囗桁 礤钺躅滂禧?// 溧眄 桧滂赅蝾痤?忸 怵屐屙睇?镥疱戾眄   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,MODE_EMA,0,PRICE_CLOSE,0);   MaPrevious=iMA(NULL,0,MATrendPeriod,MODE_EMA,0,PRICE_CLOSE,1);// 蝈镥瘘 磬漕 铒疱溴腓螯? - ?赅觐?耦耱?龛?蝾疸钼 蝈痨桧嚯?// 镳钼屦桁, 羼螯 腓 疣礤?铗牮 镱玷鲨?桦?铕溴瘥?   if(OrdersTotal()<1     {      // 礤?龛 钿眍泐 铗牮钽?铕溴疣      // 磬 怦觇?耠篦嚅 镳钼屦桁, 羼腓 ?磬?疋钺钿睇?溴睃汨 磬 聍弪?      // 珥圜屙桢 1000 忡蝾 潆 镳桁屦? 钺眍 祛骓?铗牮?1 腩?      if(AccountFreeMargin()<(1000*Lots))        {         Print("We have no money");         return(0);  // 溴礤?礤?- 恹躅滂?        }      // 镳钼屦桁, 礤 耠桫觐?腓 鬣耱?稃蜞屐? 铗牮?      // 羼腓 镱耠邃龛?疣?蝾疸钼嚯?戾礤?麇?5 扈眢?5*60=300 皴?      // 磬玎? 蝾 恹躅滂?      // If((CurTime-LastTradeTime)<300) { Exit }      // 镳钼屦屐 磬 忸珈铈眍耱?怦蜞螯 ?潆桧眢?镱玷鲨?(BUY)      if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious &&         MathAbs(MacdCurrent)>(MACDOpenLevel*Points) && MaCurrent>MaPrevious)        {         OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Points,"macd sample",16384,0,Red); // 桉镱腠屐         if(GetLastError()==0)Print("Order opened : ",OrderOpenPrice());         return(0); // 恹躅滂? 蜞?赅?怦?疣忭?镱耠?耦忮瘌屙? 蝾疸钼铋 铒屦圉梃            // 磬耱箫桦 10-蜩 皴牦礓睇?蜞殪囿?磬 耦忮瘌屙桢 蝾疸钼 铒屦圉栝        }      // 镳钼屦屐 磬 忸珈铈眍耱?怦蜞螯 ?觐痤蜿簋 镱玷鲨?(SELL)      if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&         MacdCurrent>(MACDOpenLevel*Points) && MaCurrent<MaPrevious)        {         OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Points,"macd sample",16384,0,Red); // 桉镱腠屐         if(GetLastError()==0)Print("Order opened : ",OrderOpenPrice());         return(0); // 恹躅滂?        };      // 玟羼?禧 玎忮瘌桦?镳钼屦牦 磬 忸珈铈眍耱?铗牮? 眍恹?镱玷鲨?      // 眍恹?镱玷鲨?铗牮?礤 猁腓 ?镳铖蝾 恹躅滂?镱 Exit, 蜞?赅?      // 怦?疣忭?囗嚯桤桊钼囹?礤麇泐      return(0);     };   // 镥疱躅滂??忄骓铋 鬣耱?耧屦蜞 - 觐眚痤膻 铗牮 镱玷鲨?   // '忄骓?镳噔桦?忸轵??瘥眍? 眍 恹轵?- 妁?忄骓邋...'   total=OrdersTotal();   for(cnt=0;cnt<total;cnt++)     {      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);      if(OrderType()<=OP_SELL && // ?铗牮? 镱玷鲨? OP_BUY 桦?OP_SELL          OrderSymbol()==Symbol())    // 桧耱痼戾眚 耦怙噤噱?        {         if(OrderType()==OP_BUY)   // 铗牮?潆桧磬 镱玷鲨           {            // 镳钼屦桁, 祛驽?箧?镱疣 玎牮囹?            if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&               MacdCurrent>(MACDCloseLevel*Points))                {                 OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // 玎牮噱?镱玷鲨?                 return(0); // 恹躅滂?                };            // 镳钼屦桁 - 祛驽?祛骓?眢骓?箧?蝠彘腓磴 耱铒 耱噔栩?            if(TrailingStop>0)  // 镱朦珙忄蝈朦 恹耱噔桦 ?磬耱痤殛圊 蝠彘腓磴耱铒              {                 // 珥圜栩 禧 桎屐 邈?镳钼屦螯               if(Bid-OrderOpenPrice()>Points*TrailingStop)                 {                  if(OrderStopLoss()<Bid-Points*TrailingStop)                    {                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Points*TrailingStop,OrderTakeProfit(),0,Red);                     return(0);                    }                 }              }           }         else // 桧圜??觐痤蜿? 镱玷鲨           {            // 镳钼屦桁, 祛驽?箧?镱疣 玎牮囹?            if(MacdCurrent<0 && MacdCurrent>SignalCurrent &&               MacdPrevious<SignalPrevious && MathAbs(MacdCurrent)>(MACDCloseLevel*Points))              {               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // 玎牮噱?镱玷鲨?               return(0); // 恹躅滂?              }            // 镳钼屦桁 - 祛驽?祛骓?眢骓?箧?蝠彘腓磴 耱铒 耱噔栩?            if(TrailingStop>0)  // 镱朦珙忄蝈朦 恹耱噔桦 ?磬耱痤殛圊 蝠彘腓磴耱铒              {                 // 珥圜栩 禧 桎屐 邈?镳钼屦螯               if((OrderOpenPrice()-Ask)>(Points*TrailingStop))                 {                  if(OrderStopLoss()==0.0 ||                      OrderStopLoss()>(Ask+Points*TrailingStop))                    {                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Points*TrailingStop,OrderTakeProfit(),0,Red);                     return(0);                    }                 }              }           }        }     }   return(0);  }// the end.