//+------------------------------------------------------------------+ //| MACD Sample.mq4 | //| Copyright © 2004, MetaQuotes Software Corp. | //| http://www.metaquotes.net/ | //+------------------------------------------------------------------+ 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; //+------------------------------------------------------------------+ //| Initialization | //+------------------------------------------------------------------+ int init () { Points = MarketInfo (Symbol(), MODE_POINT); //---- return(0); } //+------------------------------------------------------------------+ //| Deinitialization | //+------------------------------------------------------------------+ int deinit() { return(0); } //+------------------------------------------------------------------+ //| On every tick execution function | //+------------------------------------------------------------------+ int start() { double MacdCurrent=0, MacdPrevious=0, SignalCurrent=0; double SignalPrevious=0, MaCurrent=0, MaPrevious=0; int cnt=0, total; // initial data checks // it is important to make sure that the expert works with a normal // chart and the user made no mistakes setting external variables // in our case we check g_TakeProfit // on a chart of less than 100 bars if(Bars<100) { Print("bars less than 100"); return(0); // check bars } if(TakeProfit<10) { Print("TakeProfit less than 10"); return(0); // chech TakeProfit } // 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,MODE_EMA,0,PRICE_CLOSE,0); MaPrevious=iMA(NULL,0,MATrendPeriod,MODE_EMA,0,PRICE_CLOSE,1); // no opened orders identified if(OrdersTotal()<1) { // value 1000 only for example, // usually this amount is necessary for 1 lot if(AccountFreeMargin()<(1000*Lots)) { Print("We have no money"); return(0); // exit } // check for long position (BUY) possibility if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious(MACDOpenLevel*Points) && MaCurrent>MaPrevious) { OrderSend(OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Points,0,0,Red); // execution if(GetLastError()==0)Print("Order opened : ",OrderOpenPrice()); return(0); // exit } // check for short position (SELL) possibility if(MacdCurrent>0 && MacdCurrentSignalPrevious && MacdCurrent>(MACDOpenLevel*Points) && MaCurrent0 && MacdCurrentSignalPrevious && MacdCurrent>(MACDCloseLevel*Points)) { OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position return(0); // exit }; // check for trailing stop if(TrailingStop>0) { if(Bid-OrderOpenPrice()>Points*TrailingStop) { if(OrderStopLoss()SignalCurrent && MacdPrevious(MACDCloseLevel*Points)) { OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // close position return(0); // exit } // check for trailing stop 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.