Laman

Saturday, September 21, 2013

MACD Cross EA

 //+------------------------------------------------------------------+  
 //|                           MACD EA.mq4 |  
 //|                 Copyright © 2007, Forex-Experts |  
 //|                   http://www.forex-experts.com |  
 //+------------------------------------------------------------------+ 
 #property copyright     "Copyright © 2007, Forex-Experts"  
 #property link       "http://www.forex-experts.com"  
 #define OrderStr "MACD EA"  
 extern int  FastEMA = 12;  
 extern int  SlowEMA = 26;  
 extern int  MACD_SMA = 9;  
 extern double Lots = 0.1;  
 extern int          mm = 0;  
 extern double     Risk = 10;  
 extern int        StopLoss = 0;  
 extern int         TakeProfit = 0;  
 bool     TradeAtCloseBar = false;  
 extern bool     Reverse = false;  
 extern int         TrailingStop = 0;  
 extern int         TrailingStep = 1;   //Trailing step  
 extern int      BreakEven = 0;  
 extern int         MagicNumber=0;  
 //For alerts:  
 extern int   Repeat=3;  
 extern int   Periods=5;  
 extern bool  UseAlert=false;  
 extern bool  SendEmail=false;  
 extern string  
             TradeLog="MACD EA";  
 extern int Slippage = 3;  
 int          Crepeat=0;  
 int      AlertTime=0;  
 double     AheadTradeSec = 0;  
 double     AheadExitSec = 0;  
 int               TradeBar = 0;  
 double     MaxTradeTime = 300;  
 extern string   
      Indicator_Setting = "---------- Indicator Setting";  
 int  
                     NumberOfTries        = 1, //Number of tries to set, close orders;  
                     RetryTime            = 1;   
 double      
             Ilo                    =    0;  
 int DotLoc=7;  
 static int TradeLast=0;  
 string sound="alert.wav";  
 double sig_cur=0, sig_prev=0;  
 int Spread=0;  
 string filename="";  
 //+------------------------------------------------------------------+  
 //| expert initialization function                  |  
 //+------------------------------------------------------------------+  
 int init()  
  {  
 //----   
 Crepeat=Repeat;    
 //----  
   return(0);  
  }  
 //+------------------------------------------------------------------+  
 //| expert deinitialization function                 |  
 //+------------------------------------------------------------------+  
 int deinit()  
  {  
 //----   
 //----  
   return(0);  
  }  
 //+------------------------------------------------------------------+  
 //| expert start function                      |  
 //+------------------------------------------------------------------+  
 int start()  
  {  
 if (TradeAtCloseBar) TradeBar=1;  
 else TradeBar=0;  
 filename=Symbol() + TradeLog + "-" + Month() + "-" + Day() + ".log";  
 Spread=MarketInfo(Symbol(),MODE_SPREAD);  
 //----   
 int  i=0;  
 double  BuyValue=0, SellValue=0;  
 BuyValue=0; SellValue=0;  
 if (CntOrd(OP_BUY,MagicNumber)>0) TradeLast=1;  
 if (CntOrd(OP_SELL,MagicNumber)>0) TradeLast=-1;  
 bool Conflict=false;  
 int limit=100;  
 double Macd_1, Macd_2, Macd_3;  
 for (int shift=1; shift<=limit; shift++) {  
 Macd_1 = iMACD(NULL,0,FastEMA,SlowEMA,MACD_SMA,PRICE_CLOSE,MODE_MAIN,shift);  
 Macd_2 = iMACD(NULL,0,FastEMA,SlowEMA,MACD_SMA,PRICE_CLOSE,MODE_MAIN,shift+1);  
 Macd_3 = iMACD(NULL,0,FastEMA,SlowEMA,MACD_SMA,PRICE_CLOSE,MODE_MAIN,shift+2);  
     if (Macd_1>0 && Macd_2<0 && Macd_3<0)  
    {      
         if (Reverse) SellValue=1; else BuyValue=1;  
         break;  
     }  
     if (Macd_1<0 && Macd_2>0 && Macd_3>0)  
    {      
         if (Reverse) BuyValue=1; else SellValue=1;  
         break;  
     }  
 }  
 int cnt=0,OpenPos=0,OpenSell=0,OpenBuy=0,CloseSell=0,CloseBuy=0;  
 double    mode=0,Stop=0,NewBarTime=0;  
 //Here we found if new bar has just opened  
 static int prevtime=0;   
 int NewBar=0,FirstRun=1;  
 if (FirstRun==1) {  
 FirstRun=0;  
 prevtime=Time[0];  
 }  
 if ((prevtime == Time[0]) && (CurTime()-prevtime)>MaxTradeTime) {  
 NewBar=0;  
 }  
 else {  
 prevtime = Time[0];  
 NewBar=1;  
 }  
 int  AllowTrade=0,AllowExit=0;  
 //Trade before bar current bar closed  
 if (CurTime()>= Time[0]+Period()*60-AheadTradeSec) AllowTrade=1; else AllowTrade=0;  
 if (CurTime()>= Time[0]+Period()*60-AheadExitSec) AllowExit=1; else AllowExit=0;  
 if (AheadTradeSec==0) AllowTrade=1;  
 if (AheadExitSec==0) AllowExit=1;  
 /*====================== MONEY MANAGEMENT / COMPOUNDING ===========================================  
 Changing the value of mm will give you several money management options  
 mm = -1 : Fractional lots/ balance X the risk factor.(use for Mini accts)  
 mm = 0 : Single Lots.  
 mm = 1 : Full lots/ balance X the risk factor up to 100 lot orders.(use for Regular accounts)  
 ***************************************************************************************************  
 RISK FACTOR:  
 risk can be anything from 1 up.   
 Factor of 5 adds a lot for every $20,000.00 ($2000-MINI) added to the balance.   
 Factor of 10 adds a lot with every $10.000.00 ($1000-MINI) added to the balance.  
 The higher the risk, the easier it is to blow your margin..  
 ***************************************************************************************************/  
 Ilo=Lots;  
 if (mm<0)   
  {  
     Ilo=MathCeil(AccountEquity()*Risk/10000)/10-0.1;  
     if (Ilo<0.1) Ilo=0.1;          
  }  
 if (mm>0)   
  {  
     Ilo=MathCeil(AccountEquity()*Risk/10000)/10-1;  
     if (Ilo>1) Ilo=MathCeil(Ilo);  
   if (Ilo<1) Ilo=1;          
  }  
 if (Ilo>100) Ilo=100;  
 OpenPos=0;  
 for(cnt=0; cnt<OrdersTotal(); cnt++) {  
 OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);  
 if ((OrderType()==OP_SELL || OrderType()==OP_BUY) && OrderSymbol()==Symbol() && ((OrderMagicNumber () == MagicNumber) || MagicNumber==0)) OpenPos=OpenPos+1;  
 }  
 if (OpenPos>=1) {  
         OpenSell=0;    OpenBuy=0;  
 }  
 OpenBuy=0; OpenSell=0;  
 //Conditions to open the position  
 //  
 if (SellValue>0) {  
     OpenSell=1;  
     OpenBuy=0;  
 }  
 if (BuyValue>0) {  
     OpenBuy=1;  
     OpenSell=0;  
 }  
 //Print("OpenSell=",OpenSell," OpenBuy=",OpenBuy);  
 //Conditions to close the positions  
 if (SellValue>0) {  
     CloseBuy=1;  
 }  
 if (BuyValue>0) {  
     CloseSell=1;  
 }  
 subPrintDetails();  
 for(cnt=0; cnt<OrdersTotal(); cnt++) {  
 OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);  
     if (OrderType()==OP_BUY && OrderSymbol()==Symbol() && ((OrderMagicNumber () == MagicNumber) || MagicNumber==0)) {  
         if (CloseBuy==1 && AllowExit==1) {  
                 if (NewBar==1 && TradeBar>0)  
                 {  
                   SetText(Time[0],High[0]+1*DotLoc*Point,("CloseBuy"+DoubleToStr(Time[0],0)),CharToStr(251),Magenta);  
                   PlaySound("alert.wav");  
                   OrdClose(OrderTicket(),OrderLots(),Bid,Slippage,Red);   
                     Alerts(0, 0, CloseBuy, CloseSell,Bid,0,0,OrderTicket());  
                     return(0);      
                 }  
                 if (TradeBar==0)   
                 {   
                   SetText(Time[0],High[0]+1*DotLoc*Point,("CloseBuy"+DoubleToStr(Time[0],0)),CharToStr(251),Magenta);  
                   PlaySound("alert.wav");  
                   OrdClose(OrderTicket(),OrderLots(),Bid,Slippage,Red);  
                     Alerts(0, 0, CloseBuy, CloseSell,Bid,0,0,OrderTicket());  
                     return(0);      
                 }  
         }      
     }  
     if (OrderType()==OP_SELL && OrderSymbol()==Symbol() && ((OrderMagicNumber () == MagicNumber) || MagicNumber==0)) {  
         if (CloseSell==1 && AllowExit==1) {  
             if (NewBar==1 && TradeBar>0)  
             {  
                   SetText(Time[0],High[0]-0.3*DotLoc*Point,("CloseSell"+DoubleToStr(Time[0],0)),CharToStr(251),Magenta);  
                   PlaySound("alert.wav");  
                   OrdClose(OrderTicket(),OrderLots(),Ask,Slippage,Red);  
                     Alerts(0, 0, CloseBuy, CloseSell,Ask,0,0,OrderTicket());  
                     return(0);      
             }  
             if (TradeBar==0)  
             {  
         SetText(Time[0],High[0]-0.3*DotLoc*Point,("CloseSell"+DoubleToStr(Time[0],0)),CharToStr(251),Magenta);                    
                   PlaySound("alert.wav");  
                   OrdClose(OrderTicket(),OrderLots(),Ask,Slippage,Red);  
                     Alerts(0, 0, CloseBuy, CloseSell,Ask,0,0,OrderTicket());  
                     return(0);      
             }  
         }  
     }  
 }  
 double MyStopLoss=0, MyTakeProfit=0;  
 int ticket=0;  
 //Should we open a position?  
 if (OpenPos==0) {  
     if (OpenSell==1 && AllowTrade==1) {  
         if (NewBar==1 && TradeBar>0)   
         {  
    SetText(Time[0],High[0]+1*DotLoc*Point,("Sell"+DoubleToStr(Time[0],0)),CharToStr(234),Red);  
    if (TakeProfit==0) MyTakeProfit=0; else MyTakeProfit=Bid-TakeProfit*Point;  
          if (StopLoss==0) MyStopLoss=0; else MyStopLoss=Bid+StopLoss*Point;          
    PlaySound("alert.wav");  
    ticket=OrdSend(Symbol(),OP_SELL,Ilo,Bid,Slippage,MyStopLoss,MyTakeProfit,OrderStr,MagicNumber,0,Red);  
         Alerts(OpenBuy, OpenSell, 0, 0,Bid,MyStopLoss,MyTakeProfit,ticket);  
         OpenSell=0;  
         return(0);  
         }  
         if (TradeBar==0)  
         {  
         SetText(Time[0],High[0]+1*DotLoc*Point,("Sell"+DoubleToStr(Time[0],0)),CharToStr(234),Red);          
    if (TakeProfit==0) MyTakeProfit=0; else MyTakeProfit=Bid-TakeProfit*Point;  
          if (StopLoss==0) MyStopLoss=0; else MyStopLoss=Bid+StopLoss*Point;          
    PlaySound("alert.wav");  
    ticket=OrdSend(Symbol(),OP_SELL,Ilo,Bid,Slippage,MyStopLoss,MyTakeProfit,OrderStr,MagicNumber,0,Red);          
         Alerts(OpenBuy, OpenSell, 0, 0,Bid,MyStopLoss,MyTakeProfit,ticket);  
         OpenSell=0;  
         return(0);          
         }  
     }      
     if (OpenBuy==1 && AllowTrade==1) {  
         if (NewBar==1 && TradeBar>0)  
         {  
    SetText(Time[0],Low[0]-0.3*DotLoc*Point,("Buy"+DoubleToStr(Time[0],0)),CharToStr(233),Lime);  
    if (TakeProfit==0) MyTakeProfit=0; else MyTakeProfit=Ask+TakeProfit*Point;  
    if (StopLoss==0) MyStopLoss=0; else MyStopLoss=Ask-StopLoss*Point;             
    PlaySound("alert.wav");  
    ticket=OrdSend(Symbol(),OP_BUY,Ilo,Ask,Slippage,MyStopLoss,MyTakeProfit,OrderStr,MagicNumber,0,Lime);  
         Alerts(OpenBuy, OpenSell, 0, 0,Ask,MyStopLoss,MyTakeProfit,ticket);  
         OpenBuy=0;  
         return(0);  
         }  
         if (TradeBar==0)  
         {  
    SetText(Time[0],Low[0]-0.3*DotLoc*Point,("Buy"+DoubleToStr(Time[0],0)),CharToStr(233),Lime);  
    if (TakeProfit==0) MyTakeProfit=0; else MyTakeProfit=Ask+TakeProfit*Point;  
    if (StopLoss==0) MyStopLoss=0; else MyStopLoss=Ask-StopLoss*Point;             
    PlaySound("alert.wav");  
    ticket=OrdSend(Symbol(),OP_BUY,Ilo,Ask,Slippage,MyStopLoss,MyTakeProfit,OrderStr,MagicNumber,0,Lime);  
         Alerts(OpenBuy, OpenSell, 0, 0,Ask,MyStopLoss,MyTakeProfit,ticket);  
         OpenBuy=0;  
         return(0);  
         }  
     }  
 }  
 for (i=0; i<OrdersTotal(); i++) {  
   if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {  
    if (OrderSymbol()==Symbol() && ((OrderMagicNumber () == MagicNumber) || MagicNumber==0)) {  
      TrailingPositions();  
    }  
   }  
 }  
 Alerts(0, 0, 0, 0, 0, 0, 0, 0);  
 // the end  
 //----  
   return(0);  
  }  
 //+------------------------------------------------------------------+  
 //+------------------------------------------------------------------+  
 void SetText(int X1, double Y1, string TEXT_NAME, string TEXT_VALUE, int TEXT_COLOR) {  
 return;  
 if(ObjectFind(TEXT_NAME) != 0)  
 {  
   ObjectCreate(TEXT_NAME, OBJ_TEXT, 0, X1, Y1);  
   ObjectSet(TEXT_NAME,OBJPROP_COLOR,TEXT_COLOR);  
   ObjectSetText(TEXT_NAME, TEXT_VALUE, 10, "Wingdings", EMPTY);       
 }  
 else  
 {  
   ObjectMove(TEXT_NAME, 0, X1, Y1);  
 }           
 }  
 void Alerts(int _buy, int _sell, int _exitbuy, int _exitsell, double _op, double _sl, double _tp, int _ticket) {  
 string AlertStr="";  
 AlertStr="";  
 string CurDate="";  
 CurDate=TimeToStr(CurTime(),TIME_DATE|TIME_MINUTES);  
 //Alert system  
 if (UseAlert)  
 {  
 if (_buy==1)   
 {   
   if (Crepeat==Repeat)  
   {   
    AlertTime=0;  
   }  
   if (Crepeat>0 && (CurTime()-AlertTime)>Periods)  
   {  
   if (_buy==1) {  
   AlertStr=AlertStr+"Buy @ "+DoubleToStr(_op,Digits)+"; SL: "+DoubleToStr(_sl,Digits)+"; TP: "+DoubleToStr(_tp,Digits)+" at "+CurDate+" Order:"+DoubleToStr(_ticket,0)+".";   
   Alert(Symbol()," ",Period(), ": ",AlertStr);   
   if (SendEmail)   
   {  
    SendMail(Symbol()+" "+Period()+ ": ",Symbol()+" "+Period()+": "+AlertStr);  
   }  
    Crepeat=Crepeat-1;  
    AlertTime=CurTime();  
   }  
   }   
 }  
 if (_sell==1)   
 {   
   if (Crepeat==Repeat)  
   {   
    AlertTime=0;  
   }  
   if (Crepeat>0 && (CurTime()-AlertTime)>Periods)  
   {  
   if (_sell==1) {  
    AlertStr=AlertStr+"Sell @ "+DoubleToStr(_op,Digits)+"; SL: "+DoubleToStr(_sl,Digits)+"; TP: "+DoubleToStr(_tp,Digits)+" at "+CurDate+" Order:"+DoubleToStr(_ticket,0)+".";   
   Alert(Symbol()," ",Period(), ": ",AlertStr);   
   if (SendEmail)   
   {  
    SendMail(Symbol()+" "+Period()+ ": ",Symbol()+" "+Period()+": "+AlertStr);  
   }  
    Crepeat=Crepeat-1;  
    AlertTime=CurTime();  
   }  
   }   
 }  
 if (_exitsell==1)   
 {   
   if (Crepeat==Repeat)  
   {   
   AlertTime=0;  
   }  
 if (Crepeat>0 && (CurTime()-AlertTime)>Periods)  
 {  
   if (_exitsell==1) {  
   AlertStr=AlertStr+" Close Sell @ "+DoubleToStr(_op,Digits)+" at "+CurDate+" Order:"+DoubleToStr(_ticket,0)+".";   
   Alert(Symbol()," ",Period(), ": ", AlertStr);   
   if (SendEmail)   
   {  
    SendMail(Symbol()+" "+Period()+ ": ",Symbol()+" "+Period()+": "+AlertStr);  
   }  
   Crepeat=Crepeat-1;  
   AlertTime=CurTime();  
   }  
 }  
 }   
 if (_exitbuy==1)   
 {   
   if (Crepeat==Repeat)  
   {   
    AlertTime=0;  
   }  
   if (Crepeat>0 && (CurTime()-AlertTime)>Periods)  
   {  
   if (_exitbuy==1) {  
   AlertStr=AlertStr+" Close Buy @ "+DoubleToStr(_op,Digits)+" at "+CurDate+" Order:"+DoubleToStr(_ticket,0)+".";   
   Alert(Symbol()," ",Period(), ": ",AlertStr);   
   if (SendEmail)   
   {  
    SendMail(Symbol()+" "+Period()+ ": ",Symbol()+" "+Period()+": "+AlertStr);  
   }  
    Crepeat=Crepeat-1;  
    AlertTime=CurTime();  
   }  
   }   
 }  
 if (_exitbuy==0 && _exitsell==0 && _buy==0 && _sell==0)   
 {  
   Crepeat=Repeat;  
   AlertTime=0;  
 }  
 }  
 //  
 //----  
 return;  
 }  
 //----------------------- PRINT COMMENT FUNCTION  
 void subPrintDetails()  
 {  
   string sComment  = "";  
   string sp     = "----------------------------------------\n";  
   string NL     = "\n";  
     string sDirection = "";  
   sComment = "MACD EA" + NL;  
   sComment = sComment + "StopLoss=" + DoubleToStr(StopLoss,0) + " | ";   
   sComment = sComment + "TakeProfit=" + DoubleToStr(TakeProfit,0) + " | ";  
   sComment = sComment + "TrailingStop=" + DoubleToStr(TrailingStop,0) + NL;    
   sComment = sComment + sp;    
   sComment = sComment + "Lots=" + DoubleToStr(Ilo,2) + " | ";  
   sComment = sComment + "LastTrade=" + DoubleToStr(TradeLast,0) + NL;   
   sComment = sComment + sp;   
   Comment(sComment);  
 }  
 int CntOrd(int Type, int Magic) {  
 //return number of orders with specific parameters  
 int _CntOrd;  
 _CntOrd=0;  
 for(int i=0;i<OrdersTotal();i++)  
 {  
   OrderSelect(i, SELECT_BY_POS, MODE_TRADES);  
   if (OrderSymbol()==Symbol()) {  
    if ( (OrderType()==Type && (OrderMagicNumber()==Magic) || Magic==0)) _CntOrd++;  
   }  
 }  
 return(_CntOrd);  
 }  
 //+------------------------------------------------------------------+  
 //| return error description                     |  
 //+------------------------------------------------------------------+  
 string ErrorDescription(int error_code)  
  {  
   string error_string;  
 //----  
   switch(error_code)  
    {  
    //---- codes returned from trade server  
    case 0:  
    case 1:  error_string="no error";                         break;  
    case 2:  error_string="common error";                       break;  
    case 3:  error_string="invalid trade parameters";                 break;  
    case 4:  error_string="trade server is busy";                   break;  
    case 5:  error_string="old version of the client terminal";            break;  
    case 6:  error_string="no connection with trade server";              break;  
    case 7:  error_string="not enough rights";                     break;  
    case 8:  error_string="too frequent requests";                   break;  
    case 9:  error_string="malfunctional trade operation";               break;  
    case 64: error_string="account disabled";                     break;  
    case 65: error_string="invalid account";                      break;  
    case 128: error_string="trade timeout";                       break;  
    case 129: error_string="invalid price";                       break;  
    case 130: error_string="invalid stops";                       break;  
    case 131: error_string="invalid trade volume";                   break;  
    case 132: error_string="market is closed";                     break;  
    case 133: error_string="trade is disabled";                     break;  
    case 134: error_string="not enough money";                     break;  
    case 135: error_string="price changed";                       break;  
    case 136: error_string="off quotes";                        break;  
    case 137: error_string="broker is busy";                      break;  
    case 138: error_string="requote";                          break;  
    case 139: error_string="order is locked";                      break;  
    case 140: error_string="long positions only allowed";                break;  
    case 141: error_string="too many requests";                     break;  
    case 145: error_string="modification denied because order too close to market";   break;  
    case 146: error_string="trade context is busy";                   break;  
    //---- mql4 errors  
    case 4000: error_string="no error";                         break;  
    case 4001: error_string="wrong function pointer";                  break;  
    case 4002: error_string="array index is out of range";               break;  
    case 4003: error_string="no memory for function call stack";            break;  
    case 4004: error_string="recursive stack overflow";                 break;  
    case 4005: error_string="not enough stack for parameter";              break;  
    case 4006: error_string="no memory for parameter string";              break;  
    case 4007: error_string="no memory for temp string";                break;  
    case 4008: error_string="not initialized string";                  break;  
    case 4009: error_string="not initialized string in array";             break;  
    case 4010: error_string="no memory for array\' string";               break;  
    case 4011: error_string="too long string";                     break;  
    case 4012: error_string="remainder from zero divide";                break;  
    case 4013: error_string="zero divide";                       break;  
    case 4014: error_string="unknown command";                     break;  
    case 4015: error_string="wrong jump (never generated error)";            break;  
    case 4016: error_string="not initialized array";                  break;  
    case 4017: error_string="dll calls are not allowed";                break;  
    case 4018: error_string="cannot load library";                   break;  
    case 4019: error_string="cannot call function";                   break;  
    case 4020: error_string="expert function calls are not allowed";          break;  
    case 4021: error_string="not enough memory for temp string returned from function"; break;  
    case 4022: error_string="system is busy (never generated error)";          break;  
    case 4050: error_string="invalid function parameters count";            break;  
    case 4051: error_string="invalid function parameter value";             break;  
    case 4052: error_string="string function internal error";              break;  
    case 4053: error_string="some array error";                     break;  
    case 4054: error_string="incorrect series array using";               break;  
    case 4055: error_string="custom indicator error";                  break;  
    case 4056: error_string="arrays are incompatible";                 break;  
    case 4057: error_string="global variables processing error";            break;  
    case 4058: error_string="global variable not found";                break;  
    case 4059: error_string="function is not allowed in testing mode";         break;  
    case 4060: error_string="function is not confirmed";                break;  
    case 4061: error_string="send mail error";                     break;  
    case 4062: error_string="string parameter expected";                break;  
    case 4063: error_string="integer parameter expected";                break;  
    case 4064: error_string="double parameter expected";                break;  
    case 4065: error_string="array as parameter expected";               break;  
    case 4066: error_string="requested history data in update state";          break;  
    case 4099: error_string="end of file";                       break;  
    case 4100: error_string="some file error";                     break;  
    case 4101: error_string="wrong file name";                     break;  
    case 4102: error_string="too many opened files";                  break;  
    case 4103: error_string="cannot open file";                     break;  
    case 4104: error_string="incompatible access to a file";              break;  
    case 4105: error_string="no order selected";                    break;  
    case 4106: error_string="unknown symbol";                      break;  
    case 4107: error_string="invalid price parameter for trade function";        break;  
    case 4108: error_string="invalid ticket";                      break;  
    case 4109: error_string="trade is not allowed";                   break;  
    case 4110: error_string="longs are not allowed";                  break;  
    case 4111: error_string="shorts are not allowed";                  break;  
    case 4200: error_string="object is already exist";                 break;  
    case 4201: error_string="unknown object property";                 break;  
    case 4202: error_string="object is not exist";                   break;  
    case 4203: error_string="unknown object type";                   break;  
    case 4204: error_string="no object name";                      break;  
    case 4205: error_string="object coordinates error";                 break;  
    case 4206: error_string="no specified subwindow";                  break;  
    default:  error_string="unknown error";  
    }  
 //----  
   return(error_string);  
  }   
 //+------------------------------------------------------------------+  
 int Write(string str)  
 {  
 //Write log file  
   int handle;   
   handle = FileOpen(filename,FILE_READ|FILE_WRITE|FILE_CSV,"/t");  
   FileSeek(handle, 0, SEEK_END);     
   FileWrite(handle," Time " + TimeToStr(CurTime(),TIME_DATE|TIME_SECONDS) + ": " + str);  
   FileClose(handle);  
     Print(str);  
 }  
 int OrdSend(string _symbol, int _cmd, double _volume, double _price, int _slippage, double _stoploss, double _takeprofit, string _comment="", int _magic=0, datetime _expiration=0, color _arrow_color=CLR_NONE) {  
 //Send order with retry capabilities and log  
 int _stoplevel=MarketInfo(_symbol,MODE_STOPLEVEL);  
 double _priceop=0;  
 int ticket,err,tries;  
 tries = 0;  
 switch (_cmd) {  
     case OP_BUY:  
         if (!IsTradeContextBusy() && IsTradeAllowed()) {  
         while (tries < NumberOfTries) {  
             RefreshRates();  
             ticket = OrderSend(_symbol,OP_BUY,_volume,Ask,_slippage,NormalizeDouble(_stoploss,Digits),NormalizeDouble(_takeprofit,Digits),_comment,_magic,_expiration,_arrow_color);  
             if(ticket<=0) {  
                 Write("Error Occured : "+ErrorDescription(GetLastError()));  
                 Write(Symbol()+" Buy @ "+Ask+" SL @ "+_stoploss+" TP @"+_takeprofit+" ticket ="+ticket);  
                 tries++;  
             } else {  
                 tries = NumberOfTries;  
                 Write("Order opened : "+Symbol()+" Buy @ "+Ask+" SL @ "+_stoploss+" TP @"+_takeprofit+" ticket ="+ticket);  
             }  
             Sleep(RetryTime*1000);  
         }  
         }  
         err=ticket;  
         break;  
     case OP_SELL:  
         if (!IsTradeContextBusy() && IsTradeAllowed()) {  
         while (tries < NumberOfTries) {  
             RefreshRates();  
             ticket = OrderSend(_symbol,OP_SELL,_volume,Bid,_slippage,NormalizeDouble(_stoploss,Digits),NormalizeDouble(_takeprofit,Digits),_comment,_magic,_expiration,_arrow_color);  
             if(ticket<=0) {  
                 Write("Error Occured : "+ErrorDescription(GetLastError()));  
                 Write(Symbol()+" Sell @ "+Bid+" SL @ "+_stoploss+" TP @"+_takeprofit+" ticket ="+ticket);  
                 tries++;  
             } else {  
                 tries = NumberOfTries;  
                 Write("Order opened : "+Symbol()+" Sell @ "+Bid+" SL @ "+_stoploss+" TP @"+_takeprofit+" ticket ="+ticket);  
             }  
             Sleep(RetryTime*1000);      
         }  
         }  
         err=ticket;  
         break;  
     case OP_BUYSTOP:  
         while (tries < NumberOfTries) {  
             RefreshRates();  
             if ((_price-Ask)<_stoplevel*Point) _priceop=Ask+_stoplevel*Point; else _priceop=_price;              
             ticket = OrderSend(_symbol,OP_BUYSTOP,_volume,NormalizeDouble(_priceop,Digits),_slippage,NormalizeDouble(_stoploss,Digits),NormalizeDouble(_takeprofit,Digits),_comment,_magic,_expiration,_arrow_color);  
             if(ticket<=0) {  
                 Write("Error Occured : "+ErrorDescription(GetLastError()));  
                 Write(Symbol()+" Buy Stop @ "+_priceop+" SL @ "+_stoploss+" TP @"+_takeprofit+" ticket ="+ticket);  
                 tries++;  
             } else {  
                 tries = NumberOfTries;  
                 Write("Order opened : "+Symbol()+" Buy Stop@ "+_priceop+" SL @ "+_stoploss+" TP @"+_takeprofit+" ticket ="+ticket);  
             }  
             Sleep(RetryTime*1000);  
         }  
         err=ticket;  
         break;  
     case OP_SELLSTOP:  
         if (!IsTradeContextBusy() && IsTradeAllowed()) {  
         while (tries < NumberOfTries) {  
             RefreshRates();  
             if ((Bid-_price)<_stoplevel*Point) _priceop=Bid-_stoplevel*Point; else _priceop=_price;              
             ticket = OrderSend(_symbol,OP_SELLSTOP,_volume,NormalizeDouble(_priceop,Digits),_slippage,NormalizeDouble(_stoploss,Digits),NormalizeDouble(_takeprofit,Digits),_comment,_magic,_expiration,_arrow_color);  
             if(ticket<=0) {  
                 Write("Error Occured : "+ErrorDescription(GetLastError()));  
                 Write(Symbol()+" Sell Stop @ "+_priceop+" SL @ "+_stoploss+" TP @"+_takeprofit+" ticket ="+ticket);  
                 tries++;  
             } else {  
                 tries = NumberOfTries;  
                 Write("Order opened : "+Symbol()+" Sell Stop @ "+_priceop+" SL @ "+_stoploss+" TP @"+_takeprofit+" ticket ="+ticket);  
             }  
             Sleep(RetryTime*1000);  
         }  
         }  
         err=ticket;  
         break;  
     case OP_BUYLIMIT:  
         if (!IsTradeContextBusy() && IsTradeAllowed()) {  
         while (tries < NumberOfTries) {  
             RefreshRates();  
             if ((Ask-_price)<_stoplevel*Point) _priceop=Ask-_stoplevel*Point; else _priceop=_price;              
             ticket = OrderSend(_symbol,OP_BUYLIMIT,_volume,NormalizeDouble(_priceop,Digits),_slippage,NormalizeDouble(_stoploss,Digits),NormalizeDouble(_takeprofit,Digits),_comment,_magic,_expiration,_arrow_color);  
             if(ticket<=0) {  
                 Write("Error Occured : "+ErrorDescription(GetLastError()));  
                 Write(Symbol()+" Buy Limit @ "+_priceop+" SL @ "+_stoploss+" TP @"+_takeprofit+" ticket ="+ticket);  
                 tries++;  
             } else {  
                 tries = NumberOfTries;  
                 Write("Order opened : "+Symbol()+" Buy Limit @ "+_priceop+" SL @ "+_stoploss+" TP @"+_takeprofit+" ticket ="+ticket);  
             }  
             Sleep(RetryTime*1000);  
         }  
         }  
         err=ticket;  
         break;  
     case OP_SELLLIMIT:  
         if (!IsTradeContextBusy() && IsTradeAllowed()) {  
         while (tries < NumberOfTries) {  
             RefreshRates();  
             if ((_price-Bid)<_stoplevel*Point) _priceop=Bid+_stoplevel*Point; else _priceop=_price;              
             ticket = OrderSend(_symbol,OP_BUYLIMIT,_volume,NormalizeDouble(_priceop,Digits),_slippage,NormalizeDouble(_stoploss,Digits),NormalizeDouble(_takeprofit,Digits),_comment,_magic,_expiration,_arrow_color);  
             if(ticket<=0) {  
                 Write("Error Occured : "+ErrorDescription(GetLastError()));  
                 Write(Symbol()+" Sell Limit @ "+_priceop+" SL @ "+_stoploss+" TP @"+_takeprofit+" ticket ="+ticket);  
                 tries++;  
             } else {  
                 tries = NumberOfTries;  
                 Write("Order opened : "+Symbol()+" Sell Limit @ "+_priceop+" SL @ "+_stoploss+" TP @"+_takeprofit+" ticket ="+ticket);  
             }  
             Sleep(RetryTime*1000);  
         }  
         err=ticket;  
         }  
         break;  
     default:  
         Write("No valid type of order found");  
         err=-1;  
         break;  
 }  
 return(err);  
 }  
 int OrdClose(int _ticket, double _lots, double _price, int _slippage, color _color=CLR_NONE) {  
 //The function close order with log  
 double _priceop=0;  
 int ticket,err,tries;  
 tries = 0;  
         if (!IsTradeContextBusy() && IsTradeAllowed()) {  
         while (tries < NumberOfTries) {  
             RefreshRates();  
             ticket = OrderClose(_ticket,_lots,NormalizeDouble(_price,Digits),_slippage,_color);  
             if(ticket==0) {  
                 Write("Error Occured : "+ErrorDescription(GetLastError()));  
                 Write(Symbol()+" Close @ "+_price+" ticket ="+_ticket);  
                 tries++;  
             } else {  
                 tries = NumberOfTries;  
                 Write("Order closed : "+Symbol()+" Close @ "+_price+" ticket ="+_ticket);  
             }  
             Sleep(RetryTime*1000);  
         }  
         }  
         err=ticket;  
 return(err);  
 }  
 int OrdModify(int _ticket, double _price, double _stoploss, double _takeprofit, datetime _expiration, color _color=CLR_NONE) {  
 //The function modify order with log  
 double _priceop=0;  
 int ticket,err,tries;  
 tries = 0;                  
         if (!IsTradeContextBusy() && IsTradeAllowed()) {  
         while (tries < NumberOfTries) {  
             RefreshRates();  
             ticket = OrderModify(_ticket,NormalizeDouble(_price,Digits),NormalizeDouble(_stoploss,Digits),NormalizeDouble(_takeprofit,Digits),_expiration,_color);  
             if(ticket==0) {  
                 Write("Error Occured : "+ErrorDescription(GetLastError()));  
                 Write(Symbol()+" Modify @ "+_price+" SL @ "+_stoploss+" TP @"+_takeprofit+" ticket ="+_ticket);  
                 tries++;  
             } else {  
                 tries = NumberOfTries;  
                 Write("Order modified : "+Symbol()+" Modify @ "+_price+" SL @ "+_stoploss+" TP @"+_takeprofit+" ticket ="+_ticket);  
             }  
             Sleep(RetryTime*1000);  
         }  
         }  
         err=ticket;  
         return(err);  
 }  
 /*  
 int OrdDelete(int _ticket) {  
 //Delete pending order  
 double _priceop=0;  
 int ticket,err,tries;  
 tries = 0;  
         if (!IsTradeContextBusy() && IsTradeAllowed()) {  
         while (tries < NumberOfTries) {  
             RefreshRates();  
             ticket = OrderDelete(_ticket);  
             if(ticket==0) {  
                 Write("Error Occured : "+ErrorDescription(GetLastError()));  
                 Write(Symbol()+" Delete @ "+Bid+" ticket ="+_ticket);  
                 tries++;  
             } else {  
                 tries = NumberOfTries;  
                 Write("Order Deleted : "+Symbol()+" Delete @ "+Bid+" ticket ="+_ticket);  
             }  
             Sleep(RetryTime*1000);  
         }  
         }  
         err=ticket;          
         return(err);  
 }   
 */  
 void TrailingPositions() {  
  double pBid, pAsk, pp;  
  pp = MarketInfo(OrderSymbol(), MODE_POINT);  
  if (OrderType()==OP_BUY) {  
   pBid = MarketInfo(OrderSymbol(), MODE_BID);  
 //BreakEven routine  
   if (BreakEven>0) {  
    if ((pBid-OrderOpenPrice())>BreakEven*pp) {  
      if ((OrderStopLoss()-OrderOpenPrice())<0) {  
       ModifyStopLoss(OrderOpenPrice()+0*pp);  
      }    
    }    
   }  
   if (TrailingStop>0) {  
   if ((pBid-OrderOpenPrice())>TrailingStop*pp) {  
    if (OrderStopLoss()<pBid-(TrailingStop+TrailingStep-1)*pp) {  
     ModifyStopLoss(pBid-TrailingStop*pp);  
     return;  
    }  
   }  
   }  
  }  
  if (OrderType()==OP_SELL) {  
   pAsk = MarketInfo(OrderSymbol(), MODE_ASK);  
   if (BreakEven>0) {  
    if ((OrderOpenPrice()-pAsk)>BreakEven*pp) {  
      if ((OrderOpenPrice()-OrderStopLoss())<0) {  
       ModifyStopLoss(OrderOpenPrice()-0*pp);  
      }  
     }  
   }  
   if (TrailingStop>0) {  
   if (OrderOpenPrice()-pAsk>TrailingStop*pp) {  
    if (OrderStopLoss()>pAsk+(TrailingStop+TrailingStep-1)*pp || OrderStopLoss()==0) {  
     ModifyStopLoss(pAsk+TrailingStop*pp);  
     return;  
    }  
   }  
   }  
  }  
 }  
 //+------------------------------------------------------------------+  
 //| Modify StopLoss                         |  
 //| Parameters:                           |  
 //|  ldStopLoss - StopLoss Leve                   |  
 //+------------------------------------------------------------------+  
 void ModifyStopLoss(double ldStopLoss) {  
  bool fm;  
  PlaySound("alert.wav");  
  fm=OrdModify(OrderTicket(),OrderOpenPrice(),ldStopLoss,OrderTakeProfit(),0,CLR_NONE);  
 }  
 //+------------------------------------------------------------------+  

No comments:

Post a Comment