//+------------------------------------------------------------------+ //| ema33.mq4 | //| //| shenxinon@126.com | //+------------------------------------------------------------------+ #property copyright "sx" #property link "shenxinon@126.com" extern int sl =50; extern int tp =450; extern double ts =100; extern int fz =50; extern double Lots =1; extern string TicketComment ="ema3*3"; extern int MagicNumber =84; bool BC =false; bool SC =false; double EmaH4 =0.0; double EmaD =0.0; double NewOpenPriceH4 =0.0; double NewOpenPriceD =0.0; double Vol =0.0; double LevelUp =0.0; double LevelDown =0.0; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //+------------------------------------------------------------------+ //| CHECK CHART NEED MORE THAN 100 BARS | //+------------------------------------------------------------------+ if(Bars<100) { Print("bars less than 100"); return(0); } EmaH4=iMA(NULL,PERIOD_H4,3,3,MODE_EMA,PRICE_CLOSE,0); EmaD=iMA(NULL,PERIOD_D1,3,3,MODE_EMA,PRICE_CLOSE,0); NewOpenPriceH4=iOpen(NULL,PERIOD_H4,0); NewOpenPriceD =iOpen(NULL,PERIOD_D1,0); Vol=iVolume(NULL,PERIOD_D1,0); //---- go trading only for first tiks of new bar if(Vol<1 && NewOpenPriceH4>EmaH4 && NewOpenPriceD>EmaD) { BC=true; SC=false; sl=iLow(NULL,PERIOD_H4,1); } if(Vol<1 && NewOpenPriceH4<EmaH4 && NewOpenPriceD<EmaD) { BC=false; SC=true; sl=iHigh(NULL,PERIOD_H4,1); } if(BC==true) { if(subTotalTrade()==0) { subOpenOrder(OP_BUY,sl,tp); LevelUp=NormalizeDouble(Ask+fz*Point,4); LevelDown=NormalizeDouble(Ask-fz*Point,4); } } if(SC==true) { if(subTotalTrade()==0) { subOpenOrder(OP_SELL,sl,tp); LevelUp=NormalizeDouble(Bid+fz*Point,4); LevelDown=NormalizeDouble(Bid-fz*Point,4); } } if(subTotalTrade()>0) { if(subCheckOpenTrade()=="BUY" ) { if(Bid>LevelUp) { if(Bid<EmaH4) subCloseOrder(); } } if(subCheckOpenTrade()=="SELL") { if(Ask<LevelDown) { if(Ask>EmaH4) subCloseOrder(); } } } return(0); } //+------------------------------------------------------------------+ int subTotalTrade() { int cnt, total = 0; for(cnt=0;cnt<OrdersTotal();cnt++) { OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES); if(OrderType()<=OP_SELL && OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) total++; } return(total); } //+------------------------------------------------------------------+ int subOpenOrder(int type,int stoploss,int takeprofit) { int ticket =0, err =0, c =0; double aStopLoss = 0, aTakeProfit = 0, bStopLoss = 0, bTakeProfit = 0; if(stoploss!=0) { aStopLoss = NormalizeDouble(Ask-stoploss*Point,4); bStopLoss = NormalizeDouble(Bid+stoploss*Point,4); } if(takeprofit!=0) { aTakeProfit = NormalizeDouble(Ask+takeprofit*Point,4); bTakeProfit = NormalizeDouble(Bid-takeprofit*Point,4); } if(type==OP_BUY) { for(c=0;c<5;c++) { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,5,aStopLoss,aTakeProfit,TicketComment,MagicNumber,0,Green); err=GetLastError(); if(err==0) { if(ticket>0) break; } else { if(err==0 || err==4 || err==136 || err==137 || err==138 || err==146) //Busy errors { Sleep(5000); continue; } else //normal error { if(ticket>0) break; } } } } if(type==OP_SELL) { for(c=0;c<5;c++) { ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,5,bStopLoss,bTakeProfit,TicketComment,MagicNumber,0,Red); err=GetLastError(); if(err==0) { if(ticket>0) break; } else { if(err==0 || err==4 || err==136 || err==137 || err==138 || err==146) //Busy errors { Sleep(5000); continue; } else //normal error { if(ticket>0) break; } } } } return(ticket); } //+------------------------------------------------------------------+ string subCheckOpenTrade() { int cnt = 0; string lasttrade = "None"; for(cnt=0;cnt<OrdersTotal();cnt++) { OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES); if(OrderType()<=OP_SELL && OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) { if(OrderType()==OP_BUY ) lasttrade = "BUY"; if(OrderType()==OP_SELL) lasttrade = "SELL"; } } return(lasttrade); } //+------------------------------------------------------------------+ void subCloseOrder() { int cnt, total = 0, ticket = 0, err = 0, c = 0; total = OrdersTotal(); for(cnt=total-1;cnt>=0;cnt--) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) { switch(OrderType()) { case OP_BUY : for(c=0;c<5;c++) { ticket=OrderClose(OrderTicket(),OrderLots(),Bid,5,Violet); err=GetLastError(); if(err==0) { if(ticket>0) break; } else { if(err==0 || err==4 || err==136 || err==137 || err==138 || err==146) //Busy errors { Sleep(5000); continue; } else //normal error { if(ticket>0) break; } } } break; case OP_SELL : for(c=0;c<5;c++) { ticket=OrderClose(OrderTicket(),OrderLots(),Ask,5,Violet); err=GetLastError(); if(err==0) { if(ticket>0) break; } else { if(err==0 || err==4 || err==136 || err==137 || err==138 || err==146) //Busy errors { Sleep(5000); continue; } else //normal error { if(ticket>0) break; } } } break; case OP_BUYLIMIT : case OP_BUYSTOP : case OP_SELLLIMIT: case OP_SELLSTOP : OrderDelete(OrderTicket()); } } } }
Sample
Analysis
Market Information Used:
Series array that contains open prices of each bar
Series array that contains tick volumes of each bar
Series array that contains the lowest prices of each bar
Series array that contains the highest prices of each bar
Indicator Curves created:
Indicators Used:
Moving average indicator
Custom Indicators Used:
Order Management characteristics:
Checks for the total of open orders
It automatically opens orders when conditions are reached
It Closes Orders by itself
Other Features: