//+------------------------------------------------------------------+
//|                                                       DTEA.mq4 |
//|                      Copyright © 2012, Praktan Software Solutions |
//|                                        http://www.praktan.com |
//|Date: 18/10/2012 with Average out Trading
//+------------------------------------------------------------------+
#property copyright "Copyright © 2012, Praktan Software Solutions"
#property link      "http://www.praktan.com"

#import "user32.dll"
int GetAncestor(int,int);
#import
#include <WinUser32.mqh>
//---- Includes
#include <stdlib.mqh>

extern double LotSize = 0.1;
extern int    Slippage = 5;
//extern int MaxTrade=10;
extern double    ParaSARStep = 0.02;
extern double    ParaSARMax = 0.2;
extern int BBPeriod = 20;
extern int BBShift = 0;
extern int BBDeviation = 2;
extern int StochKPeriod = 5;
extern int StochDPeriod = 3;
extern int StochSlowing = 3;
extern int StochMethod = 0;


//--- Global variables
string ExpertComment = "NO COMMENT",PreviousTrend="",TrendChange="",CloseOrderType="",CandleStatus="",CandleStatusHL="",Strt1="",Strt2="";
double CurrentLotSize=0,Spread=0,TralingStopValue=0,Buy0,Buy2,Sell1,Sell3,TrendValue=0,FirstOrderPrice=0,CurrentStep=0;
int i=0,MagicNumber = 123456,OrderTradeType,NumberOfTries = 10,CurrentOrders=0,OTP=0,OSL=0,IntPeriod=0;
datetime oldBarTime;
bool New_Bar,result = false,OrderCloseStatus=false,TrailingStart=false,AvgStart=false;
double firstOrderPriceBuy=0,firstOrderPriceSell=0,PHValue=0,PLValue=0;


//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   oldBarTime = Time[0];
//----
   Spread = (MarketInfo(Symbol(),MODE_SPREAD)/100000);
   CurrentLotSize = LotSize;
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   double tival=0;
   int ticket=0;
   
            if(oldBarTime != Time[0])
            {
              oldBarTime = Time[0];
              
              double BUpper = iCustom(NULL, 0, "Bands",BBPeriod,BBShift,BBDeviation,1,1);
              double BLower = iCustom(NULL, 0, "Bands",BBPeriod,BBShift,BBDeviation,2,1);
              //Alert("Upper: " + iCustom(NULL, 0, "Bands",BBPeriod,BBShift,BBDeviation,1,1));
              //Alert("Lower: " + iCustom(NULL, 0, "Bands",BBPeriod,BBShift,BBDeviation,2,1));
              double SARValue = iSAR(NULL,0,ParaSARStep,ParaSARMax,1);
              //double Pinaca = iCustom(NULL, 0, "BreakOut_PANCA_EAGLE__1",0,1);
              //Alert("Pinaca: " + Pinaca);
              double m = iStochastic(Symbol(),0,StochKPeriod,StochDPeriod,StochSlowing,StochMethod,0,MODE_MAIN,0);
              double s=  iStochastic(Symbol(),0,StochKPeriod,StochDPeriod,StochSlowing,StochMethod,0,MODE_SIGNAL,0);

              double m1 = iStochastic(Symbol(),0,StochKPeriod,StochDPeriod,StochSlowing,StochMethod,0,MODE_MAIN,1);
              double s1= iStochastic(Symbol(),0,StochKPeriod,StochDPeriod,StochSlowing,StochMethod,0,MODE_SIGNAL,1);
              
              if(Close[1] > BUpper)
              {
                  CandleStatus="BreakUp";
              }
              else if(Close[1] < BLower)
              {
                  CandleStatus="BreakDown";
              }
              
              if(SARValue < Close[1] && m1 < 80 && m1 > 20 && s1 < 80 && s1 > 20 && Close[1] < BUpper && Close[1] > BLower && CandleStatus=="BreakDown")
              {
                  TrendChange="UP";
              }
              else if(SARValue > Close[1] && m1 < 80 && m1 > 20 && s1 < 80 && s1 > 20 && Close[1] < BUpper && Close[1] > BLower && CandleStatus=="BreakUp")
              {
                  TrendChange="DOWN";
              }
              else
              {
                  TrendChange="";
              }
              
              Alert("BUpper: " + BUpper + " BLower: " + BLower + " Close[1]: " + Close[1] + " CandleStatus: " + CandleStatus + " SARValue: " + SARValue);
              
              if((m > s && m1 < s1) || (m < s && m1 > s1))
              {
                  OrderCloseStatus=true;
              }
              else
              {
                  OrderCloseStatus=false;
                  //Alert("m: " + m + " s: " + s + " m1: " + m1 + " s1: " + s1);
              }
            
           }
           else
           {
               CloseOrderType="";
               TrendChange="";
           }
           if((m > s && m1 < s1) || (m < s && m1 > s1)) 
              {
                  OrderCloseStatus=true;
              }
              else
              {
                  OrderCloseStatus=false;
                  //Alert("m: " + m + " s: " + s + " m1: " + m1 + " s1: " + s1);
              }
           
           if(OrderCloseStatus==true) //CloseOrderType!="" ||  
           {
               int totalOrdersUD2 = OrdersTotal();
               for(int ip2=totalOrdersUD2-1;ip2>=0;ip2--)
               {
                 OrderSelect(ip2, SELECT_BY_POS);
                  if(OrderSymbol()==Symbol())
                  {
                     result = CloseOrder(OrderType(),OrderTicket(), OrderLots());
                  } 
               }//For loop Closed
               CloseOrderType="";
           }
           

               int TotalBy=0,TotalSel=0;
               
                  CurrentOrders = OrdersTotal();
                  if(CurrentOrders > 0)
                  {
                     for(i=CurrentOrders-1;i>=0;i--)
                     {
                       OrderSelect(i, SELECT_BY_POS);
                       OrderTradeType   = OrderType();
                       if(OrderTradeType==OP_BUY && OrderSymbol()==Symbol()){TotalBy++;}
                       else if(OrderTradeType==OP_SELL && OrderSymbol()==Symbol()){TotalSel++;}
                     }//For close
                  }
                  
                  if(TotalBy ==0 && TotalSel == 0)
                  {
                        if(TrendChange=="UP") 
                        {  //Alert("BUY senkouspanA: " + senkouspanA + " senkouspanB: " + senkouspanB + " macdMain: " + macdMain + " macdMain2: " + macdMain2 + " macdSignal: " + macdSignal + " Stochmain: " + Stochmain + " StochSignal: " + StochSignal + " Close[1]: " + Close[1] + " TrendChange: " + TrendChange + " PreviousTrend: " + PreviousTrend);
                              ticket = OpenOrder(OP_BUY,CurrentLotSize,MagicNumber);
                              CheckError(ticket,"BUY");
                              CandleStatus="";
                        }
                        else if(TrendChange=="DOWN")
                        {     //Alert("SELL senkouspanA: " + senkouspanA + " senkouspanB: " + senkouspanB + " macdMain: " + macdMain + " macdMain2: " + macdMain2 + " macdSignal: " + macdSignal + " Stochmain: " + Stochmain + " StochSignal: " + StochSignal + " Close[1]: " + Close[1] + " TrendChange: " + TrendChange + " PreviousTrend: " + PreviousTrend);
                              ticket = OpenOrder(OP_SELL,CurrentLotSize,MagicNumber);
                              CheckError(ticket,"SELL");
                              CandleStatus="";
                        }
                  }
                  /*
                  if((TotalBy ==1 || TotalSel == 1) && (TotalBy + TotalSel) <= MaxTrade )
                  {
                        if(TrendChange=="UP") 
                        {  //Alert("BUY senkouspanA: " + senkouspanA + " senkouspanB: " + senkouspanB + " macdMain: " + macdMain + " macdMain2: " + macdMain2 + " macdSignal: " + macdSignal + " Stochmain: " + Stochmain + " StochSignal: " + StochSignal + " Close[1]: " + Close[1] + " TrendChange: " + TrendChange + " PreviousTrend: " + PreviousTrend);
                              ticket = OpenOrder(OP_BUY,CurrentLotSize,MagicNumber);
                              CheckError(ticket,"BUY");
                              CandleStatus="";
                        }
                        else if(TrendChange=="DOWN")
                        {     //Alert("SELL senkouspanA: " + senkouspanA + " senkouspanB: " + senkouspanB + " macdMain: " + macdMain + " macdMain2: " + macdMain2 + " macdSignal: " + macdSignal + " Stochmain: " + Stochmain + " StochSignal: " + StochSignal + " Close[1]: " + Close[1] + " TrendChange: " + TrendChange + " PreviousTrend: " + PreviousTrend);
                              ticket = OpenOrder(OP_SELL,CurrentLotSize,MagicNumber);
                              CheckError(ticket,"SELL");
                              CandleStatus="";
                        }
                  }
                  */
                  
           OrderCloseStatus=false;
          
   return(0);
  }

//------------------------------------------------------------------------------------------------------
//=================================FUNCTIONS=====================================================================
int OpenOrder(int type,double NewLot,int OrdMagicNumber)
{
   int ticket=0;
   int err=0;
   int c = 0;
   int cx=0;
   int MgcNo=OrdMagicNumber;
   double dsl=0;
   double dtp=0;
       
   if(type==OP_BUY)
   {
      if(OSL > 0)
      {dsl = NormalizeDouble((Ask - OSL * Point),Digits);}
      else{dsl=0;}
      if(OTP > 0)
      {dtp = NormalizeDouble((Ask + OTP* Point),Digits);}
      else{dtp = 0;}
      //Alert("for Buy dsl: " + dsl + "dtp: " + dtp + " SL: " + OSL + " Ask: " + Ask + " Point: " + Point + " SL: " + OSL + " TP: " + OTP);
      for(c = 0 ; c < NumberOfTries ; c++)
      {
         RefreshRates();
         ticket= OrderSend(Symbol(),OP_BUY,NewLot,NormalizeDouble(Ask,Digits),Slippage,dsl,dtp,"expert comment",MgcNo,0,CLR_NONE);
         err=GetLastError();
         if(err==0)
         { 
            break;
         }
         else
         {
            if(err==4 || err==137 ||err==146 || err==136) //Busy errors
            {
               Sleep(5000);
               continue;
            }
            else if(c==NumberOfTries-1 && cx <= 10)
            {
               cx=cx+1;
               Sleep(5000);
               c=0;
               continue;
            }  
            else
            {
               break;
            }
            
         }
      }   
   }
   if(type==OP_SELL)
   {   
      if(OSL > 0)
      {dsl = NormalizeDouble((Bid + OSL * Point),Digits);}
      else{dsl=0;}
      if(OTP > 0)
      {dtp = NormalizeDouble((Bid - OTP * Point),Digits);}
      else{dtp = 0;}
      //Alert("for Sell dsl: " + dsl + "dtp: " + dtp + " SL: " + OSL + " Ask: " + Ask + " Point: " + Point + " SL: " + OSL + " TP: " + OTP);

      for(c = 0 ; c < NumberOfTries ; c++)
      {
         RefreshRates();
         
         ticket = OrderSend(Symbol(),OP_SELL,NewLot,NormalizeDouble(Bid,Digits),Slippage,dsl,dtp,"expert comment",MgcNo,0,CLR_NONE);
         err=GetLastError();
         if(err==0)
         { 
            break;
         }
         else
         {
            if(err==4 || err==137 ||err==146 || err==136) //Busy errors
            {
               Sleep(5000);
               continue;
            }
            else if(c==NumberOfTries-1 && cx <= 10)
            {
               cx=cx+1;
               Sleep(5000);
               c=0;
               continue;
            }  
            else
            {
               break;
            }
         }
      }   
   }  
   return(ticket);
}
void CheckError(int ticket, string Type)
{
    if(ticket>0)
    {
      if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print(Type + " order opened : ",OrderOpenPrice());
    }   
    else Print("Error opening " + Type + " order : ", ErrorDescription(GetLastError()));
}
bool CloseOrder(int type,int OrderTicketNo,double OrderLotSize)
{
   int ticket=0;
   int err=0;
   int c = 0;
   int cx=0;
   bool status;

   if(type==OP_BUY)
   {
      for(c = 0 ; c < NumberOfTries ; c++)
      {
         RefreshRates();
         status = OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slippage,Violet);
         err=GetLastError();
         if(status==true && err==0)
         {
            break;
         }
         else
         {
            if(err==4 || err==137 ||err==146 || err==136) //Busy errors
            {
               Sleep(5000);
               continue;
            }
            else if(c==NumberOfTries-1 && cx <= 10)
            {
               cx=cx+1;
               Sleep(5000);
               c=0;
               continue;
            }  
            else
            {
               break;
            }
         }
      }   
   }
   if(type==OP_SELL)
   {   
      for(c = 0 ; c < NumberOfTries ; c++)
      {
         RefreshRates();
         status = OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slippage,Violet);
         err=GetLastError();
         if(status==true && err==0)
         {
            break;
         }
         else
         {
            if(err==4 || err==137 ||err==146 || err==136) //Busy errors
            {
               Sleep(5000);
               continue;
            }
            else if(c==NumberOfTries-1 && cx <= 10)
            {
               cx=cx+1;
               Sleep(5000);
               c=0;
               continue;
            }  
            else
            {
               break;
            }
         }
      }   
   }  
   return(status);
}

//==================================================================================================================         
//+------------------------------------------------------------------+