//+------------------------------------------------------------------+
//|                                                     Wealth_EA.mq4 |
//|                                                Developed by Atper |
//|                                     Copyrighted for David Agboola |
//|                                      http://www.wizzywealth.co.za |
//+------------------------------------------------------------------+

#property copyright "David Agboola"
#property link      "http://www.wizzywealth.co.za"

string   ver  = "Last Modified: 2007.03.06 20:05";

//---- Trades limits
extern   double      distance             = 10;
extern   double      stoploss             = 10;
extern   double      takeprofit           = 10;
extern   double      lots                 = 0.1;
extern   double      trailingStop         = 0; 
extern   int         slippage             = 0;
extern   int         hour_start           = 08;
extern   int         minute_start         = 35;


bool     Alert_ON             = false;
bool     OpenStopOrder        = true;
bool     StraddlePerLoad      = true;

int      NumberOfTries        = 10; 
string   ExpertComment        = "Wealth_EA";


//+------------------------------------------------------------------
int init()
{
   return(0);
}

int deinit() 
{
   return(0);
}
int start() 
{
      
   int cnt,long_ticket,short_ticket;
   
   static bool Straddled = false;
   
   RefreshRates();
   if(MarketInfo(Symbol(),MODE_STOPLEVEL)>stoploss)
   {
      Alert ("You have to set stoploss value greater than " + DoubleToStr(MarketInfo(Symbol(),MODE_STOPLEVEL),0));
   }

   if(isNewSymbol(Symbol(),UniqueMagicNumber(Symbol())) && IsTime() && Straddled == false)
   {
         if(OpenStopOrder==true) short_ticket=OpenPendingOrder(OP_SELLSTOP,lots,distance,5,stoploss,takeprofit+5,ExpertComment+"_SELLSTOP",UniqueMagicNumber(Symbol()),0);
         if(OpenStopOrder==false)short_ticket=OpenPendingOrder(OP_SELLLIMIT,lots,distance,5,stoploss,takeprofit+5,ExpertComment+"_SELLLIMIT",UniqueMagicNumber(Symbol()),0);
         
         if(OpenStopOrder==true) long_ticket=OpenPendingOrder(OP_BUYSTOP,lots,distance,5,stoploss,takeprofit+5,ExpertComment+"_BUYSTOP",UniqueMagicNumber(Symbol()),0);
         if(OpenStopOrder==false)long_ticket=OpenPendingOrder(OP_BUYLIMIT,lots,distance,5,stoploss,takeprofit+5,ExpertComment+"_BUYLIMIT",UniqueMagicNumber(Symbol()),0);
         
         if(StraddlePerLoad==true) Straddled = true;
         Sleep(5000);
   }
   
   Print (Symbol() + " - Straddled= " , Straddled);
 
   int total = OrdersTotal();
   for (cnt = total ; cnt >=0 ; cnt--)
   {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      
      if(OrderSymbol()==Symbol() && OrderMagicNumber() == UniqueMagicNumber(Symbol()))
      {
         if(OrderType()==OP_BUY)   //<-- Long position is opened
         {
            CloseOposite(OP_SELLSTOP,OrderSymbol());
            CloseOposite(OP_SELLLIMIT,OrderSymbol());
            
          if(Profit(OrderType(),OrderSymbol(),OrderOpenPrice()) >= takeprofit && strstr(OrderComment(),"_O1"))
          {
            CloseOrder(OrderType(),OrderSymbol());
            CloseOposite(OP_SELLSTOP,OrderSymbol());
            CloseOposite(OP_SELLLIMIT,OrderSymbol());
          }

            if(trailingStop > 0 && Bid-OrderOpenPrice()>Point*trailingStop)
            {
               if(OrderStopLoss()<Bid-Point*trailingStop)
               {
                  OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*trailingStop,OrderTakeProfit(),0,Green);
               }
            }
         }
            
         if(OrderType()==OP_SELL) //<-- Go to short position
         {
            //CloseOposite(OP_BUYSTOP,OrderSymbol());
            //CloseOposite(OP_BUYLIMIT,OrderSymbol());
            
            

            if(trailingStop > 0 && (OrderOpenPrice()-Ask)>(Point*trailingStop))
            {
               if((OrderStopLoss()>(Ask+Point*trailingStop)) || (OrderStopLoss()==0))
               {
                  OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*trailingStop,OrderTakeProfit(),0,Red);
               }
            }
         }
      }
   }
   //ConfirmLimitedPairs();
   return(0);
}

/*void ConfirmLimitedPairs()
{
   string pairs="";
   int cnt,total;
   total = OrdersTotal();
   for (cnt = total ; cnt >=0 ; cnt--)
   {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderMagicNumber() == UniqueMagicNumber(Symbol()) && OrderType() > 1) 
      {
         pairs = pairs + "-" + OrderSymbol(); 
      }
   }

   for (cnt = total ; cnt >=0 ; cnt--)
   {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderMagicNumber() == UniqueMagicNumber(Symbol()) && OrderType() > 1) 
      {
         if(CheckDoublicate(pairs,OrderSymbol())==0)
         {
             DeletePair(OrderType(),OrderSymbol()); 
         }
      }
   }
}

int CheckDoublicate (string text , string matched_text)
{
   int f1 =  StringFind(text,matched_text,0);
   if (f1 == -1) return(-1);
   int f2 =  StringFind(text,matched_text,f1+1);
   if (f2 == -1) 
      return(0);
   else
      return(1);
}

void DeletePair(int type , string currency)
{
   int cnt,total;
   int err=0, c = 0;
   total = OrdersTotal();
   for (cnt = total-1 ; cnt >=0 ; cnt--)
   {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderSymbol()== currency && OrderType()==type && OrderMagicNumber() == UniqueMagicNumber(Symbol())) 
      {  
         for(c = 0 ; c < NumberOfTries ; c++)
         {
            OrderDelete(OrderTicket());
            err=GetLastError();
            if(err==0)
            {
               break;
            }
            else
            {
               if(err==4 || err==137 ||err==146 || err==136) //Busy errors
               {
                  Sleep(5000);
                  continue;
               }
              else //normal error
              {
                  break;
              }  
            }
         }
      }
   }
}*/

void CloseOposite(int type , string currency)
{
   int cnt,total;
   int err=0, c = 0;
   total = OrdersTotal();
   for (cnt = total ; cnt >=0 ; cnt--)
   {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderSymbol()==Symbol() && OrderType()== type && OrderSymbol() == currency && OrderMagicNumber() == UniqueMagicNumber(Symbol())) 
      {  
         for(c = 0 ; c < NumberOfTries ; c++)
         {
            OrderDelete(OrderTicket());
            err=GetLastError();
            if(err==0)
            {
               break;
            }
            else
            {
               if(err==4 || err==137 ||err==146 || err==136) //Busy errors
               {
                  Sleep(5000);
                  continue;
               }
              else //normal error
              {
                  break;
              }  
            }
         }
      }
   }
}

int OpenPendingOrder(int pType=OP_BUYLIMIT,double pLots=1,double pLevel=5,int sp=0, double sl=0,double tp=0,string pComment="",int pMagic=123,datetime pExpiration=0,color pColor=Yellow)
{
  
  int err=0, c=0;

  switch (pType)
  {
      case OP_BUYLIMIT:
      {
         if(Alert_ON) Alert("BUYLIMIT - Ask:",Ask," Bid:",Bid," Open price:",Ask-(pLevel*Point)," StopLoss:",(Ask-pLevel*Point)-sl*Point);
         for(c = 0 ; c < NumberOfTries ; c++)
         {
            OrderSend(Symbol(),OP_BUYLIMIT,pLots,Ask-(pLevel*Point),sp,(Ask-pLevel*Point)-sl*Point,(Ask-pLevel*Point)+tp*Point,pComment,pMagic,pExpiration,pColor);    
            err=GetLastError(); 
            if(err==0)
            {
               break;
            }
            else
            {
               if(IsTradeContextBusy() || err==4 || err==137 ||err==146 || err==136) //Busy errors
               {
                  Sleep(5000);
                  continue;
               }
               else //normal error
               {
                  break;
               }  
           }
         }
         break;
      }
      case OP_BUYSTOP:
      {
         if(Alert_ON) Alert("BUYSTOP - Ask:",Ask," Bid:",Bid," Open price:",Ask+(pLevel*Point)," StopLoss:",(Ask+pLevel*Point)-sl*Point);
         for(c = 0 ; c < NumberOfTries ; c++)
         {
            OrderSend(Symbol(),OP_BUYSTOP,pLots,Ask+(pLevel*Point),sp,(Ask+pLevel*Point)-sl*Point,(Ask+pLevel*Point)+tp*Point,pComment,pMagic,pExpiration,pColor);
            err=GetLastError();
            if(err==0)
            {
               break;
            }
            else
            {
               if(IsTradeContextBusy() || err==4 || err==137 ||err==146 || err==136) //Busy errors
               {
                  Sleep(5000);
                  continue;
               }
               else //normal error
               {
                  break;
               }  
           }
         }
         break;
      }
      case OP_SELLLIMIT:
      {
         if(Alert_ON) Alert("SELLLIMIT - Ask:",Ask," Bid:",Bid," Open price:",Bid+(pLevel*Point)," StopLoss:",(Bid+pLevel*Point)+sl*Point);
         for(c = 0 ; c < NumberOfTries ; c++)
         {
            OrderSend(Symbol(),OP_SELLLIMIT,pLots,Bid+(pLevel*Point),sp,(Bid+pLevel*Point)+sl*Point,(Bid+pLevel*Point)-tp*Point,pComment,pMagic,pExpiration,pColor);
            err=GetLastError();
            if(err==0)
            {
               break;
            }
            else
            {
               if(IsTradeContextBusy() || err==4 || err==137 ||err==146 || err==136) //Busy errors
               {
                  Sleep(5000);
                  continue;
               }
               else //normal error
               {
                  break;
               }  
           }
         }
         break;
      }
      case OP_SELLSTOP:
      {
         if(Alert_ON) Alert("SELLSTOP - Ask:",Ask," Bid:",Bid," Open price:",Bid-(pLevel*Point)," StopLoss:",(Bid-pLevel*Point)+sl*Point);
         for(c = 0 ; c < NumberOfTries ; c++)
         {
            OrderSend(Symbol(),OP_SELLSTOP,pLots,Bid-(pLevel*Point),sp,(Bid-pLevel*Point)+sl*Point,(Bid-pLevel*Point)-tp*Point,pComment,pMagic,pExpiration,pColor);    
            err=GetLastError();
            if(err==0)
            {
               break;
            }
            else
            {
               if(IsTradeContextBusy() || err==4 || err==137 ||err==146 || err==136) //Busy errors
               {
                  Sleep(5000);
                  continue;
               }
               else //normal error
               {
                  break;
               }  
           }
         }
         break;
      }
  } 
}

bool isNewSymbol(string current_symbol, int magic)
  {
   //loop through all the opened order and compare the symbols
   int total  = OrdersTotal();
   for(int cnt = 0 ; cnt < total ; cnt++)
   {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      string selected_symbol = OrderSymbol();
      if (current_symbol == selected_symbol && OrderMagicNumber()== magic)
      return (False);
    }
    return (True);
}

int UniqueMagicNumber( string currency)
{
 string temp;
 for (int cnt = 0 ; cnt < 6 ; cnt++)
 {
   if (cnt == 0 || cnt == 1 || cnt == 3 || cnt == 4) //get the first, second, fourth and fifth characters.
   temp = temp + StringGetChar(currency,cnt);
 }
 if (StrToInteger(temp)>0)
   return (StrToInteger(temp));
 else
    return (999999); //anything else.
}

bool IsTime ()
{
   int current_hour = TimeHour(TimeCurrent());
   int current_minute = TimeMinute(TimeCurrent());
   int minute_max = 0;
   
   if (current_hour == hour_start && current_minute >= minute_start && current_minute < (minute_start + 2))
      return (true);
   
   Print ("not time of trade (" , TimeToStr(TimeCurrent(),TIME_MINUTES)," - ", hour_start,":",minute_start,")");
   return (false); //else
}

double Profit(int type, string currency, double open)
{
   if(type==OP_BUY) return((MarketInfo(currency,MODE_BID) - open) / MarketInfo(currency,MODE_POINT) ); //case buy
   if(type ==OP_SELL) return((open - MarketInfo(currency,MODE_ASK)) / MarketInfo(currency,MODE_POINT)); //case buy
   return(-1);
}

bool strstr(string str1, string str2)
{
   if (StringFind(str1,str2,0)>-1) 
      return(true);
   else
      return(false);
}

bool CloseOrder(int type, string currency)
{
   if(OrderMagicNumber() == UniqueMagicNumber(currency))
   {
      if(type==OP_BUY)
         return (OrderClose(OrderTicket(),OrderLots(),Bid,5,Violet));
      if(type==OP_SELL)   
         return (OrderClose(OrderTicket(),OrderLots(),Ask,5,Violet));
   }
}











