//+------------------------------------------------------------------+
//|                                             Goen Pivot Alert.mq4 |
//|                                           Copyright © 2008, Goen |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, Goen"

#property indicator_chart_window
#property indicator_buffers 3

extern int    Mode=0;
extern string MODE="0=HL 1=HLC 2=HLOC 3=HLCC";
extern color  Pivot4HColor=Aqua;
extern color  Pivot8HColor=Red;
extern color  Pivot12HColor=Yellow;
extern bool   ActivateAlert=True;
extern bool   ShowPrice=True;
extern color  PriceColor=Silver;

//---- buffers 
double Pivot4H[],Pivot8H[],Pivot12H[];
string sMode[]  = {"(HL/2)", "(HLC/3)", "(HLOC/4)", "(HLCC/4)"}; 

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   SetIndexStyle(0,DRAW_LINE,0,2,Pivot4HColor);
   SetIndexBuffer(0,Pivot4H);
   SetIndexLabel(0,"Pivot 4H " + sMode[Mode]);
   SetIndexStyle(1,DRAW_LINE,0,2,Pivot8HColor);
   SetIndexBuffer(1,Pivot8H);
   SetIndexLabel(1,"Pivot 8H " + sMode[Mode]);
   SetIndexStyle(2,DRAW_LINE,0,2,Pivot12HColor);
   SetIndexBuffer(2,Pivot12H);
   SetIndexLabel(2,"Pivot 12H " + sMode[Mode]);
   IndicatorShortName("Goen Pivot "+sMode[Mode]);

   int YPos=3;
   for(int i = 0; i<= ObjectsTotal() ; i++)
   {  if (ObjectGet(ObjectName(i),OBJPROP_YDISTANCE)==YPos && ObjectGet(ObjectName(i),OBJPROP_XDISTANCE)==3)
      {  YPos+=10;  i=0;}
   }
   
   string label0 = "GP8H"+Mode;
   ObjectCreate( label0, OBJ_LABEL, 0, 0, 0 );
   ObjectSetText(label0,"GOEN Pivot",8, "Arial Bold", Silver);
   ObjectSet( label0, OBJPROP_CORNER, 2 );
   ObjectSet( label0, OBJPROP_COLOR, Silver);
   ObjectSet( label0, OBJPROP_XDISTANCE, 3 );
   ObjectSet( label0, OBJPROP_YDISTANCE, YPos );
   return(0);  
  }
//----
   
int deinit()
  {
//----
   if (ShowPrice) ObjectDelete("Goen Pivot 4H"+Mode);
   if (ShowPrice) ObjectDelete("Goen Pivot 8H"+Mode);
   if (ShowPrice) ObjectDelete("Goen Pivot 12H"+Mode);
   ObjectDelete("GP8H"+Mode);
//----
   return(0);
  } 
//+------------------------------------------------------------------+
//| MTF Moving Average                                   |
//+------------------------------------------------------------------+
int start()
  {
   datetime TimeArray[];
   int    i,shift,limit,y=0,x=0,counted_bars=IndicatorCounted();
   
   if (Period()>240) return(0);
   ArrayCopySeries(TimeArray,MODE_TIME,Symbol(),240); 
   limit=Bars-counted_bars;
   for(i=0,y=0;i<limit;i++)
   {
      if (Time[i]<TimeArray[y]) y++;
      if (Mode==0)
      {  
         Pivot4H[i]=(iHigh(NULL,PERIOD_H4,y+1) + iLow(NULL,PERIOD_H4,y+1))/2;
         if (MathMod(TimeHour(Time[i]),8)<4)
         Pivot8H[i]= (MathMax(iHigh(NULL,PERIOD_H4,y+1),iHigh(NULL,PERIOD_H4,y+2)) + 
                      MathMin(iLow(NULL,PERIOD_H4,y+1),iLow(NULL,PERIOD_H4,y+2)))/2;
         else Pivot8H[i]= (MathMax(iHigh(NULL,PERIOD_H4,y+2),iHigh(NULL,PERIOD_H4,y+3)) + 
                           MathMin(iLow(NULL,PERIOD_H4,y+2),iLow(NULL,PERIOD_H4,y+3)))/2;

         if (MathMod(TimeHour(Time[i]),12)<4)
         Pivot12H[i]= (MathMax(MathMax(iHigh(NULL,PERIOD_H4,y+1),iHigh(NULL,PERIOD_H4,y+2)),iHigh(NULL,PERIOD_H4,y+3)) + 
                       MathMin(MathMin(iLow(NULL,PERIOD_H4,y+1),iLow(NULL,PERIOD_H4,y+2)),iLow(NULL,PERIOD_H4,y+3)))/2;
         else if (MathMod(TimeHour(Time[i]),12)<8)      
         Pivot12H[i]= (MathMax(MathMax(iHigh(NULL,PERIOD_H4,y+2),iHigh(NULL,PERIOD_H4,y+3)),iHigh(NULL,PERIOD_H4,y+4)) + 
                       MathMin(MathMin(iLow(NULL,PERIOD_H4,y+2),iLow(NULL,PERIOD_H4,y+3)),iLow(NULL,PERIOD_H4,y+4)))/2;
         else 
         Pivot12H[i]= (MathMax(MathMax(iHigh(NULL,PERIOD_H4,y+3),iHigh(NULL,PERIOD_H4,y+4)),iHigh(NULL,PERIOD_H4,y+5)) + 
                       MathMin(MathMin(iLow(NULL,PERIOD_H4,y+3),iLow(NULL,PERIOD_H4,y+4)),iLow(NULL,PERIOD_H4,y+5)))/2;
      }
      else if (Mode==1)
      {  
         Pivot4H[i]=(iHigh(NULL,PERIOD_H4,y+1) + iLow(NULL,PERIOD_H4,y+1)+
                     iClose(NULL,PERIOD_H4,y+1))/3;
         if (MathMod(TimeHour(Time[i]),8)<4)
         Pivot8H[i]= (MathMax(iHigh(NULL,PERIOD_H4,y+1),iHigh(NULL,PERIOD_H4,y+2)) + 
                      MathMin(iLow(NULL,PERIOD_H4,y+1),iLow(NULL,PERIOD_H4,y+2)) +
                      iClose(NULL,PERIOD_H4,y+1))/3;
         else Pivot8H[i]= (MathMax(iHigh(NULL,PERIOD_H4,y+2),iHigh(NULL,PERIOD_H4,y+3)) + 
                           MathMin(iLow(NULL,PERIOD_H4,y+2),iLow(NULL,PERIOD_H4,y+3)) +
                           iClose(NULL,PERIOD_H4,y+2))/3;
         if (MathMod(TimeHour(Time[i]),12)<4)
         Pivot12H[i]= (MathMax(MathMax(iHigh(NULL,PERIOD_H4,y+1),iHigh(NULL,PERIOD_H4,y+2)),iHigh(NULL,PERIOD_H4,y+3)) + 
                       MathMin(MathMin(iLow(NULL,PERIOD_H4,y+1),iLow(NULL,PERIOD_H4,y+2)),iLow(NULL,PERIOD_H4,y+3)) +
                       iClose(NULL,PERIOD_H4,y+1))/3;
         else if (MathMod(TimeHour(Time[i]),12)<8)      
         Pivot12H[i]= (MathMax(MathMax(iHigh(NULL,PERIOD_H4,y+2),iHigh(NULL,PERIOD_H4,y+3)),iHigh(NULL,PERIOD_H4,y+4)) + 
                       MathMin(MathMin(iLow(NULL,PERIOD_H4,y+2),iLow(NULL,PERIOD_H4,y+3)),iLow(NULL,PERIOD_H4,y+4)) +
                       iClose(NULL,PERIOD_H4,y+2))/3;
         else 
         Pivot12H[i]= (MathMax(MathMax(iHigh(NULL,PERIOD_H4,y+3),iHigh(NULL,PERIOD_H4,y+4)),iHigh(NULL,PERIOD_H4,y+5)) + 
                       MathMin(MathMin(iLow(NULL,PERIOD_H4,y+3),iLow(NULL,PERIOD_H4,y+4)),iLow(NULL,PERIOD_H4,y+5))+
                       iClose(NULL,PERIOD_H4,y+3))/3;
      }
      else if (Mode==2)
      {  Pivot4H[i]=(iHigh(NULL,PERIOD_H4,y+1) + iLow(NULL,PERIOD_H4,y+1)+
                     iOpen(NULL,PERIOD_H4,y+1) + iClose(NULL,PERIOD_H4,y+1))/4;
         if (MathMod(TimeHour(Time[i]),8)<4)
         Pivot8H[i]= (MathMax(iHigh(NULL,PERIOD_H4,y+1),iHigh(NULL,PERIOD_H4,y+2)) + 
                      MathMin(iLow(NULL,PERIOD_H4,y+1),iLow(NULL,PERIOD_H4,y+2)) +
                      iOpen(NULL,PERIOD_H4,y+2) + iClose(NULL,PERIOD_H4,y+1))/4;
         else Pivot8H[i]= (MathMax(iHigh(NULL,PERIOD_H4,y+2),iHigh(NULL,PERIOD_H4,y+3)) + 
                           MathMin(iLow(NULL,PERIOD_H4,y+2),iLow(NULL,PERIOD_H4,y+3)) +
                           iOpen(NULL,PERIOD_H4,y+3) + iClose(NULL,PERIOD_H4,y+2))/4;
         if (MathMod(TimeHour(Time[i]),12)<4)
         Pivot12H[i]= (MathMax(MathMax(iHigh(NULL,PERIOD_H4,y+1),iHigh(NULL,PERIOD_H4,y+2)),iHigh(NULL,PERIOD_H4,y+3)) + 
                       MathMin(MathMin(iLow(NULL,PERIOD_H4,y+1),iLow(NULL,PERIOD_H4,y+2)),iLow(NULL,PERIOD_H4,y+3)) +
                       iOpen(NULL,PERIOD_H4,y+3) + iClose(NULL,PERIOD_H4,y+1))/4;
         else if (MathMod(TimeHour(Time[i]),12)<8)      
         Pivot12H[i]= (MathMax(MathMax(iHigh(NULL,PERIOD_H4,y+2),iHigh(NULL,PERIOD_H4,y+3)),iHigh(NULL,PERIOD_H4,y+4)) + 
                       MathMin(MathMin(iLow(NULL,PERIOD_H4,y+2),iLow(NULL,PERIOD_H4,y+3)),iLow(NULL,PERIOD_H4,y+4)) +
                       iOpen(NULL,PERIOD_H4,y+4) + iClose(NULL,PERIOD_H4,y+2))/4;
         else 
         Pivot12H[i]= (MathMax(MathMax(iHigh(NULL,PERIOD_H4,y+3),iHigh(NULL,PERIOD_H4,y+4)),iHigh(NULL,PERIOD_H4,y+5)) + 
                       MathMin(MathMin(iLow(NULL,PERIOD_H4,y+3),iLow(NULL,PERIOD_H4,y+4)),iLow(NULL,PERIOD_H4,y+5))+
                       iOpen(NULL,PERIOD_H4,y+5) + iClose(NULL,PERIOD_H4,y+3))/4;

      }
      else if (Mode==3)
      {  
         Pivot4H[i]=(iHigh(NULL,PERIOD_H4,y+1) + iLow(NULL,PERIOD_H4,y+1)+
                     iClose(NULL,PERIOD_H4,y+1)*2)/4;
         if (MathMod(TimeHour(Time[i]),8)<4)
         Pivot8H[i]= (MathMax(iHigh(NULL,PERIOD_H4,y+1),iHigh(NULL,PERIOD_H4,y+2)) + 
                      MathMin(iLow(NULL,PERIOD_H4,y+1),iLow(NULL,PERIOD_H4,y+2)) +
                      iClose(NULL,PERIOD_H4,y+1)*2)/4;
         else Pivot8H[i]= (MathMax(iHigh(NULL,PERIOD_H4,y+2),iHigh(NULL,PERIOD_H4,y+3)) + 
                           MathMin(iLow(NULL,PERIOD_H4,y+2),iLow(NULL,PERIOD_H4,y+3)) +
                           iClose(NULL,PERIOD_H4,y+2)*2)/4;
         if (MathMod(TimeHour(Time[i]),12)<4)
         Pivot12H[i]= (MathMax(MathMax(iHigh(NULL,PERIOD_H4,y+1),iHigh(NULL,PERIOD_H4,y+2)),iHigh(NULL,PERIOD_H4,y+3)) + 
                       MathMin(MathMin(iLow(NULL,PERIOD_H4,y+1),iLow(NULL,PERIOD_H4,y+2)),iLow(NULL,PERIOD_H4,y+3)) +
                       iClose(NULL,PERIOD_H4,y+1)*2)/4;
         else if (MathMod(TimeHour(Time[i]),12)<8)      
         Pivot12H[i]= (MathMax(MathMax(iHigh(NULL,PERIOD_H4,y+2),iHigh(NULL,PERIOD_H4,y+3)),iHigh(NULL,PERIOD_H4,y+4)) + 
                       MathMin(MathMin(iLow(NULL,PERIOD_H4,y+2),iLow(NULL,PERIOD_H4,y+3)),iLow(NULL,PERIOD_H4,y+4)) +
                       iClose(NULL,PERIOD_H4,y+2)*2)/4;
         else 
         Pivot12H[i]= (MathMax(MathMax(iHigh(NULL,PERIOD_H4,y+3),iHigh(NULL,PERIOD_H4,y+4)),iHigh(NULL,PERIOD_H4,y+5)) + 
                       MathMin(MathMin(iLow(NULL,PERIOD_H4,y+3),iLow(NULL,PERIOD_H4,y+4)),iLow(NULL,PERIOD_H4,y+5))+
                       iClose(NULL,PERIOD_H4,y+3)*2)/4;
      }
   }
   
   if (ActivateAlert)
   {
   static int Last4H=0,Last8H=0,Last12H=0;
   if (Last4H!=Bars)
   {  if (Open[0]<Pivot4H[0] && Bid > Pivot4H[0]) Alert("Price crossing up Pivot 4H ("+sMode[Mode]+")");
      if (Open[0]>Pivot4H[0] && Bid < Pivot4H[0]) Alert("Price crossing down Pivot 4H ("+sMode[Mode]+")");
      Last4H=Bars;
   }
   if (Last8H!=Bars)
   {  if (Open[0]<Pivot8H[0] && Bid > Pivot8H[0]) Alert("Price crossing up Pivot 8H ("+sMode[Mode]+")");
      if (Open[0]>Pivot8H[0] && Bid < Pivot8H[0]) Alert("Price crossing down Pivot 8H ("+sMode[Mode]+")");
      Last8H=Bars;
   }
   if (Last12H!=Bars)
   {  if (Open[0]<Pivot12H[0] && Bid > Pivot12H[0]) Alert("Price crossing up Pivot 12H ("+sMode[Mode]+")");
      if (Open[0]>Pivot12H[0] && Bid < Pivot12H[0]) Alert("Price crossing down Pivot 12H ("+sMode[Mode]+")");
      Last12H=Bars;
   }
   }

   if (ShowPrice)
   {
      string label = "Goen Pivot 4H"+Mode;
      ObjectDelete(label);
      ObjectCreate( label, OBJ_ARROW, 0, 0, 0 );
      ObjectSet( label, OBJPROP_ARROWCODE, SYMBOL_RIGHTPRICE);
      ObjectSet( label, OBJPROP_COLOR, PriceColor);
      ObjectSet( label, OBJPROP_TIME1, Time[0]);
      ObjectSet( label, OBJPROP_PRICE1, Pivot4H[0]);  
      
      label = "Goen Pivot 8H"+Mode;
      ObjectDelete(label);
      ObjectCreate( label, OBJ_ARROW, 0, 0, 0 );
      ObjectSet( label, OBJPROP_ARROWCODE, SYMBOL_RIGHTPRICE);
      ObjectSet( label, OBJPROP_COLOR, PriceColor);
      ObjectSet( label, OBJPROP_TIME1, Time[0]);
      ObjectSet( label, OBJPROP_PRICE1, Pivot8H[0]);  
   
      label = "Goen Pivot 12H"+Mode;
      ObjectDelete(label);
      ObjectCreate( label, OBJ_ARROW, 0, 0, 0 );
      ObjectSet( label, OBJPROP_ARROWCODE, SYMBOL_RIGHTPRICE);
      ObjectSet( label, OBJPROP_COLOR, PriceColor);
      ObjectSet( label, OBJPROP_TIME1, Time[0]);
      ObjectSet( label, OBJPROP_PRICE1, Pivot12H[0]);  
   }   
   return(0);
  }
//+------------------------------------------------------------------+