//+------------------------------------------------------------------+
//|                                      Geoff's Manual Setup v2.mq4 |
//|                        Copyright © 2010, Programming by SASHASAN |
//|                                               www.metaqoutes.com |
//+------------------------------------------------------------------+
#property copyright "GEOFFs Manual Setup v2, Programming by SASHASAN"
#property link      "www.metaqoutes.com"

#property indicator_chart_window
#property  indicator_buffers 2

extern int     FastEMAPeriod = 10;
extern int     SlowEMAPeriod = 197;
extern color   LongLabelColor = Green;
extern color   ShortLabelColor = Red;
extern color   BaseLabelColor = Gray;
extern color   EmasZoneColor  = Silver;
extern int     LabelsCoordinate = 100;
extern string  LabelsFont = "Courier New";
extern string  LabelAlertFont = "Arial Black";
extern int     M15FractalLockedBar = 3;
extern int     M5FractalLockedBar = 3;
extern int     AlertPlays = 1;
extern bool    M15FractalFor2HoursOnly = true;

double   BufferEma10 [];
double   BufferEma197[];
string   Labels[6];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorBuffers(2);
   SetIndexBuffer(0,BufferEma10);
   SetIndexBuffer(1,BufferEma197);
   SetIndexStyle(0,DRAW_NONE);
   SetIndexStyle(1,DRAW_NONE);
   Labels[0] = "LabelTime";
   Labels[1] = "LabelEma10";
   Labels[2] = "LabelEma197";
   Labels[3] = "LabelFractalM15";
   Labels[4] = "LabelFractalM5";
   Labels[5] = "LabelInfo";
   for(int i = 0; i < 6; i++)
      {
      ObjectCreate(Labels[i],OBJ_LABEL,0,0,0);
      ObjectSet(Labels[i],OBJPROP_CORNER,1);
      ObjectSet(Labels[i],OBJPROP_XDISTANCE,5);
      ObjectSet(Labels[i],OBJPROP_YDISTANCE,LabelsCoordinate);
      ObjectSetText(Labels[i],Labels[i],10,LabelsFont,BaseLabelColor);
      LabelsCoordinate += 15;      
      }
   ObjectCreate("Rect",OBJ_RECTANGLE,0,0,0);      
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   for(int i = 0; i < 6; i++)
      ObjectDelete(Labels[i]);
      ObjectDelete("Rect");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   ObjectSet("Rect",OBJPROP_TIME1,Time[2]);
   ObjectSet("Rect",OBJPROP_PRICE1,0);
   ObjectSet("Rect",OBJPROP_TIME2,Time[1]);
   ObjectSet("Rect",OBJPROP_PRICE2,iHighest(Symbol(),NULL,MODE_HIGH,300,0));
   ObjectSet("Rect",OBJPROP_COLOR,EmasZoneColor);   
   for(int i = 0; i < 3; i++)
      {
      BufferEma10 [i] = iMA(Symbol(),NULL,FastEMAPeriod,0,MODE_SMA,PRICE_CLOSE,i);
      BufferEma197[i] = iMA(Symbol(),NULL,SlowEMAPeriod,0,MODE_SMA,PRICE_CLOSE,i);
      }

   if(BufferEma10[2] > BufferEma10[1])
      string ema10 = "DOWN";
   if(BufferEma10[2] < BufferEma10[1])
      ema10 = "UP";   
   if(BufferEma197[2] > BufferEma197[1])
      string ema197 = "DOWN";
   if(BufferEma197[2] < BufferEma197[1])
      ema197 = "UP";   

      int up15 = LastUpFractal(PERIOD_M15,M15FractalLockedBar);
      int dn15 = LastDownFractal(PERIOD_M15,M15FractalLockedBar);
      if(!M15FractalFor2HoursOnly)
         {
         if(up15 < dn15)
            string fr15 = "UP";
         if(up15 > dn15)
            fr15 = "DOWN";
         if(up15 == dn15)
            fr15 = "DBL";
         }
      if(M15FractalFor2HoursOnly)
         {
         if(up15 < dn15)
            {
            datetime t = TimeCurrent() - 900 * up15;
            if(t < Time[1])
               {
               fr15 = "UPGONE";
               string UpGoneTime = OpenTime(t);
               }
            if(t > Time[1])
               fr15 = "UP";
            }
         if(up15 > dn15)
            {
            t = TimeCurrent() - 900 * dn15;
            if(t < Time[1])
               {
               fr15 = "DNGONE";
               string DnGoneTime = OpenTime(t);
               }
            if(t > Time[1])
               fr15 = "DOWN";
            }
         if(up15 == dn15)
            {
            fr15 = "DBL";
            }            
         }

      int up5 = LastUpFractal(PERIOD_M5,M5FractalLockedBar);
      int dn5 = LastDownFractal(PERIOD_M5,M5FractalLockedBar);
      if(up5 < dn5)
         {
         if(up5 == M5FractalLockedBar)
            string fr5 = "UP";
         if(up5 > M5FractalLockedBar)
            fr5 = "UPGONE";
         }
      if(up5 > dn5)
         {
         if(dn5 == M5FractalLockedBar)
            fr5 = "DOWN";         
         if(dn5 > M5FractalLockedBar)
            fr5 = "DNGONE";
         }
      if(up5 == dn5)
         {
         fr5 = "DBL";
         }         

   ObjectSetText(Labels[0],StringConcatenate("Time :   ",TimeToStr(Time[2],TIME_MINUTES),"     ",
                              TimeToStr(Time[1],TIME_MINUTES)));
   if(ema10 == "DOWN" && ema197 == "DOWN")
      {
      ObjectSetText(Labels[1],StringConcatenate("SMA 10 : ",DoubleToStr(BufferEma10[2],Digits)," > ",
                              DoubleToStr(BufferEma10[1],Digits)),10,LabelsFont,ShortLabelColor);
      ObjectSetText(Labels[2],StringConcatenate("SMA 197 : ",DoubleToStr(BufferEma197[2],Digits)," > ",
                              DoubleToStr(BufferEma197[1],Digits)),10,LabelsFont,ShortLabelColor);
      if(fr15 == "DOWN")
         {
         ObjectSetText(Labels[3],"LOW M15 ^ : FORMED",10,LabelsFont,ShortLabelColor);
            if(fr5 == "UP")
            {
            ObjectSetText(Labels[4],"UP M5 ^ : FORMED",10,LabelsFont,ShortLabelColor);
            ObjectSetText(Labels[5],"ENTER TRADE NOW",10,LabelAlertFont,ShortLabelColor);
            if(AlertPlays > 0)
               {
               Alert(Symbol()," - ENTER SHORT TRADE NOW!");
               //PlaySound("alert.wav");   
               AlertPlays--;
               }
            }
            if(fr5 == "UPGONE")
            {
            ObjectSetText(Labels[4],StringConcatenate("UP M5 ^ : ON EXCEEDED BAR (",
                              up5,")"),10,LabelsFont,ShortLabelColor);
            ObjectSetText(Labels[5],"ENTRY POINT EXPECTED",10,LabelAlertFont,ShortLabelColor);
            }
            if(fr5 == "DNGONE" || fr5 == "DOWN")
            {
            ObjectSetText(Labels[4],"UP M5 ^ : NOT FORMED YET",10,LabelsFont,BaseLabelColor);
            ObjectSetText(Labels[5],"ENTRY POINT EXPECTED",10,LabelAlertFont,ShortLabelColor);
            }
            if(fr5 == "DBL")
            {
            ObjectSetText(Labels[4],"UP M5 ^ : DOUBLE FORMED",10,LabelsFont,BaseLabelColor);
            ObjectSetText(Labels[5],"ENTRY POINT EXPECTED",10,LabelAlertFont,ShortLabelColor);
            }
         }
      if(fr15 == "DNGONE")
         {
         ObjectSetText(Labels[3],StringConcatenate("LOW M15 ^ : ON EXCEEDED TIME (",DnGoneTime,")"),
                        10,LabelsFont,ShortLabelColor);
            if(fr5 == "UP")
            {
            ObjectSetText(Labels[4],"UP M5 ^ : FORMED",10,LabelsFont,ShortLabelColor);
            ObjectSetText(Labels[5],"ENTER TRADE NOW",10,LabelAlertFont,ShortLabelColor);
            if(AlertPlays > 0)
               {
               Alert(Symbol()," - ENTER SHORT TRADE NOW!");
               //PlaySound("alert.wav");   
               AlertPlays--;
               }
            }
            if(fr5 == "UPGONE")
            {
            ObjectSetText(Labels[4],StringConcatenate("UP M5 ^ : ON EXCEEDED BAR (",
                              up5,")"),10,LabelsFont,ShortLabelColor);
            ObjectSetText(Labels[5],"ENTRY POINT EXPECTED",10,LabelAlertFont,ShortLabelColor);
            }
            if(fr5 == "DNGONE" || fr5 == "DOWN")
            {
            ObjectSetText(Labels[4],"UP M5 ^ : NOT FORMED YET",10,LabelsFont,BaseLabelColor);
            ObjectSetText(Labels[5],"ENTRY POINT EXPECTED",10,LabelAlertFont,ShortLabelColor);
            }
            if(fr5 == "DBL")
            {
            ObjectSetText(Labels[4],"UP M5 ^ : DOUBLE FORMED",10,LabelsFont,BaseLabelColor);
            ObjectSetText(Labels[5],"ENTRY POINT EXPECTED",10,LabelAlertFont,ShortLabelColor);
            }             
         }
      if(fr15 == "UP" || fr15 == "UPGONE" || fr15 == "DBL")
         {
         ObjectSetText(Labels[3],"LOW M15 ^ : NOT FORMED YET",10,LabelsFont,BaseLabelColor);
            if(fr5 == "UP")
               {
               ObjectSetText(Labels[4],"UP M5 ^ : FORMED",10,LabelsFont,ShortLabelColor);
               ObjectSetText(Labels[5],"ENTRY POINT EXPECTED",10,LabelAlertFont,BaseLabelColor);
               }
            if(fr5 == "UPGONE")
               {
               ObjectSetText(Labels[4],StringConcatenate("UP M5 ^ : ON EXCEEDED BAR (",
                              up5,")"),10,LabelsFont,ShortLabelColor);
               ObjectSetText(Labels[5],"ENTRY POINT EXPECTED",10,LabelAlertFont,ShortLabelColor);
               }
               if(fr5 == "DNGONE" || fr5 == "DOWN")
               {
               ObjectSetText(Labels[4],"UP M5 ^ : NOT FORMED YET",10,LabelsFont,BaseLabelColor);
               ObjectSetText(Labels[5],"ENTRY POINT EXPECTED",10,LabelAlertFont,ShortLabelColor);
               }
               if(fr5 == "DBL")
               {
               ObjectSetText(Labels[4],"UP M5 ^ : DOUBLE FORMED",10,LabelsFont,BaseLabelColor);
               ObjectSetText(Labels[5],"ENTRY POINT EXPECTED",10,LabelAlertFont,ShortLabelColor);
               }                
         } 
      }
   if(ema10 == "UP" && ema197 == "UP")
      {
      ObjectSetText(Labels[1],StringConcatenate("SMA 10 : ",DoubleToStr(BufferEma10[2],Digits)," < ",
                              DoubleToStr(BufferEma10[1],Digits)),10,LabelsFont,LongLabelColor);
      ObjectSetText(Labels[2],StringConcatenate("SMA 197 : ",DoubleToStr(BufferEma197[2],Digits)," < ",
                              DoubleToStr(BufferEma197[1],Digits)),10,LabelsFont,LongLabelColor);
      if(fr15 == "UP")
         {
         ObjectSetText(Labels[3],"UP M15 ^ : FORMED",10,LabelsFont,LongLabelColor);
         if(fr5 == "DOWN")
            {
            ObjectSetText(Labels[4],"LOW M5 ^ : FORMED",10,LabelsFont,LongLabelColor);
            ObjectSetText(Labels[5],"ENTER TRADE NOW",10,LabelAlertFont,LongLabelColor);
            if(AlertPlays > 0)
               {
               Alert(Symbol()," - ENTER LONG TRADE NOW!");
               //PlaySound("alert.wav");   
               AlertPlays--;
               }
            }
         if(fr5 == "DNGONE")
            {
            ObjectSetText(Labels[4],StringConcatenate("LOW M5 ^ : ON EXCEEDED BAR (",dn5,")"),
                                    10,LabelsFont,LongLabelColor);
            ObjectSetText(Labels[5],"ENTER TRADE NOW",10,LabelAlertFont,LongLabelColor);
            }
         if(fr5 == "UP" || fr5 == "UPGONE")
            {
            ObjectSetText(Labels[4],"LOW M5 ^ : NOT FORMED YET",10,LabelsFont,BaseLabelColor);
            ObjectSetText(Labels[5],"ENTRY POINT EXPECTED",10,LabelAlertFont,LongLabelColor);
            }
         if(fr5 == "DBL")
            {
            ObjectSetText(Labels[4],"UP M5 ^ : DOUBLE FORMED",10,LabelsFont,BaseLabelColor);
            ObjectSetText(Labels[5],"ENTRY POINT EXPECTED",10,LabelAlertFont,LongLabelColor);
            }             
         }
      if(fr15 == "UPGONE")
         {
         ObjectSetText(Labels[3],StringConcatenate("UP M15 ^ : ON EXCCEDED TIME (",UpGoneTime,")"),
                     10,LabelsFont,LongLabelColor);
         if(fr5 == "DOWN")
            {
            ObjectSetText(Labels[4],"LOW M5 ^ : FORMED",10,LabelsFont,LongLabelColor);
            ObjectSetText(Labels[5],"ENTER TRADE NOW",10,LabelAlertFont,LongLabelColor);
            if(AlertPlays > 0)
               {
               Alert(Symbol()," - ENTER LONG TRADE NOW!");
               //PlaySound("alert.wav");   
               AlertPlays--;
               }
            }
         if(fr5 == "DNGONE")
            {
            ObjectSetText(Labels[4],StringConcatenate("LOW M5 ^ : ON EXCEEDED BAR (",dn5,")"),
                                    10,LabelsFont,LongLabelColor);
            ObjectSetText(Labels[5],"ENTRY POINT EXPECTED",10,LabelAlertFont,LongLabelColor);
            }            
         if(fr5 == "UP" || fr5 == "UPGONE")
            {
            ObjectSetText(Labels[4],"LOW M5 ^ : NOT FORMED YET",10,LabelsFont,BaseLabelColor);
            ObjectSetText(Labels[5],"ENTRY POINT EXPECTED",10,LabelAlertFont,LongLabelColor);
            }
         if(fr5 == "DBL")
            {
            ObjectSetText(Labels[4],"UP M5 ^ : DOUBLE FORMED",10,LabelsFont,BaseLabelColor);
            ObjectSetText(Labels[5],"ENTRY POINT EXPECTED",10,LabelAlertFont,LongLabelColor);
            }             
         }
      if(fr15 == "DOWN" || fr15 == "DNGONE" || fr15 == "DBL")
         {
         ObjectSetText(Labels[3],"UP M15 ^ : NOT FORMED YET",10,LabelsFont,BaseLabelColor);
         if(fr5 == "DOWN")
            {
            ObjectSetText(Labels[4],"LOW M5 ^ : FORMED",10,LabelsFont,LongLabelColor);
            ObjectSetText(Labels[5],"ENTRY POINT EXPECTED",10,LabelAlertFont,LongLabelColor);
            }
         if(fr5 == "DNGONE")
            {
            ObjectSetText(Labels[4],StringConcatenate("LOW M5 ^ : ON EXCEEDED BAR (",dn5,")"),
                                    10,LabelsFont,LongLabelColor);
            ObjectSetText(Labels[5],"ENTRY POINT EXPECTED",10,LabelAlertFont,LongLabelColor);
            }
         if(fr5 == "UP" || fr5 == "UPGONE")
            {
            ObjectSetText(Labels[4],"LOW M5 ^ : NOT FORMED YET",10,LabelsFont,BaseLabelColor);
            ObjectSetText(Labels[5],"ENTRY POINT EXPECTED",10,LabelAlertFont,LongLabelColor);
         if(fr5 == "DBL")
            {
            ObjectSetText(Labels[4],"UP M5 ^ : DOUBLE FORMED",10,LabelsFont,BaseLabelColor);
            ObjectSetText(Labels[5],"ENTRY POINT EXPECTED",10,LabelAlertFont,LongLabelColor);
            }             
            }
         }
      }
   if(ema10 == "UP" && ema197 == "DOWN")
      {
      ObjectSetText(Labels[1],StringConcatenate("SMA 10 : ",DoubleToStr(BufferEma10[2],Digits)," < ",
                              DoubleToStr(BufferEma10[1],Digits)),10,LabelsFont,BaseLabelColor);
      ObjectSetText(Labels[2],StringConcatenate("SMA 197 : ",DoubleToStr(BufferEma197[2],Digits)," > ",
                              DoubleToStr(BufferEma197[1],Digits)),10,LabelsFont,BaseLabelColor);
      ObjectSetText(Labels[3],"M15 ^ : NOT CALCULATED",10,LabelsFont,BaseLabelColor);
      ObjectSetText(Labels[4],"M5 ^ : NOT CALCULATED",10,LabelsFont,BaseLabelColor);
      ObjectSetText(Labels[5],"NO TRADES EXPECTED",10,LabelsFont,BaseLabelColor);
      }
   if(ema10 == "DOWN" && ema197 == "UP")
      {
      ObjectSetText(Labels[1],StringConcatenate("SMA 10 : ",DoubleToStr(BufferEma10[2],Digits)," > ",
                              DoubleToStr(BufferEma10[1],Digits)),10,LabelsFont,BaseLabelColor);
      ObjectSetText(Labels[2],StringConcatenate("SMA 197 : ",DoubleToStr(BufferEma197[2],Digits)," < ",
                              DoubleToStr(BufferEma197[1],Digits)),10,LabelsFont,BaseLabelColor);
      ObjectSetText(Labels[3],"M15 ^ : NOT CALCULATED",10,LabelsFont,BaseLabelColor);
      ObjectSetText(Labels[4],"M5 ^ : NOT CALCULATED",10,LabelsFont,BaseLabelColor);
      ObjectSetText(Labels[5],"NO TRADES EXPECTED",10,LabelsFont,BaseLabelColor);
      }
   return(0);
  }
//+------------------------------------------------------------------+

int LastUpFractal(int period, int startbar)
{
   for(int i = startbar; i < Bars; i++)
   {
   if(iFractals(Symbol(),period,MODE_UPPER,i)!= NULL)
    return(i);
   }
   return(-1);
}

//-----------------------------------------------------------------------

int LastDownFractal(int period, int startbar)
{
   for(int i = startbar; i < Bars; i++)
   {
   if(iFractals(Symbol(),period,MODE_LOWER,i)!= NULL)
    return(i);
   }
   return(-1);
}
//------------------------------------------------------------------------

string OpenTime(datetime min)
{
   int a[5];
   int m = TimeMinute(min);
   int h = TimeHour(min);
   a[0] = 0;
   a[1] = 15;
   a[2] = 30;
   a[3] = 45;
   a[4] = 60;
   
   for(int i = 0; i < ArraySize(a); i++)
      {
      if(m != a[i])
         {
         if(m > a[i] && m < a[i+1])
            return(StringConcatenate(h,":",a[i]));
         }
      else
         {
         if(m == a[0])  
            string mi = "00";
         else
            mi = m;
         return(StringConcatenate(h,":",mi));         
         }
      }
}
//------------------------------------------------------------------------

