//+------------------------------------------------------------------+
//|                                                mn Owl Pivots.mq4 |
//+------------------------------------------------------------------+
#property copyright "mn"
#property indicator_chart_window

extern int   mLineExtend = 10;  
extern bool  mExtendEnd  = false,    // True ... Extend lines to end of chart
             mSendAlerts = true;                     
extern color mColPivsUp  = Red,
             mColPivsDn  = Blue,
             mCol        = Aqua,
             mTxtCol     = Black;  
extern int   mLineWidth  = 1,
             mCheckSwingBars = 30;             
             
double mPivs[7];
string mPivName[7] = {"Piv", "R1", "R2", "R3", "S1", "S2", "S3"};
double mPipFact = 1, mH, mL, mC;
int    mT1, mLabT;

//------------------------------------------------------------------|
int init()
  {
   if(Digits == 3 || Digits == 5)
     mPipFact = 10;
  
   return(0);
  }

//+------------------------------------------------------------------+
int deinit()
  {
   for(int i = ObjectsTotal(); i >= 0; i--)
     if(StringSubstr(ObjectName(i), 0, 2) == "m.")
       ObjectDelete(ObjectName(i));

   return(0);
  }

//+------------------------------------------------------------------+
int start()
  {
    CreateObj();

    mT1 = iBarShift(NULL, 0, ObjectGet("m.HL", 0));
    if(Close[mT1] > Open[mT1] && Close[mT1 - 1] > Open[mT1 - 1] && 
       High[mT1 - 1] - Close[mT1 - 1] > High[mT1] - Close[mT1])
      { 
        mH = High[mT1 - 1];
        mC = Close[mT1 - 1];
        mL = Low[iLowest(NULL, 0, MODE_LOW, 20, mT1 + 1)];
        
        SetPivs(mColPivsUp);
      }
    else  if(Close[mT1] < Open[mT1] && Close[mT1 - 1] < Open[mT1 - 1] && 
       Close[mT1 - 1] - Low[mT1 - 1] > Close[mT1] - Low[mT1])
      { 
        mH = High[iHighest(NULL, 0, MODE_HIGH, mCheckSwingBars, mT1 + 1)];
        mC = Close[mT1 - 1];
        mL = Low[mT1 - 1];
        
        SetPivs(mColPivsDn);
      }
    else 
      ClearPivs();

    if(mSendAlerts)
      CheckAlerts();
    
    return(0);
  }
  
//+------------------------------------------------------------------+
void CreateObj()
 {
   if(ObjectFind("m.HL") == -1)
     {
       ObjectCreate("m.HL", OBJ_VLINE, 0, Time[5], 0, Time[5], 0);
       ObjectSet("m.HL", OBJPROP_WIDTH, 2);
       ObjectSet("m.HL", OBJPROP_BACK, true);
       ObjectSet("m.HL", OBJPROP_COLOR, mCol);
     }
   
   for(int c = 0; c < 7; c++)
     {
         if(ObjectFind("m.HL"+c) == -1)
           {
             ObjectCreate("m.HL"+c, OBJ_TREND, 0, 0, 0, 0, 0);
             if(mExtendEnd)  ObjectSet("m.HL"+c, OBJPROP_RAY, true);
             else            ObjectSet("m.HL"+c, OBJPROP_RAY, false);
             ObjectSet("m.HL"+c, OBJPROP_WIDTH, mLineWidth);

             ObjectCreate("m.Lab"+c, OBJ_TEXT, 0, 0, 0, 0, 0);
           }
     }

   return(0);
  }
  
//+------------------------------------------------------------------+
void SetPivs(color mClr)
 {
   double mRange;
   
    mPivs[0] = (mH + mL + mL) / 3;                     // Piv
    mPivs[1] = (2 * mPivs[0]) - mL;                    // R1
    mPivs[4] = 2 * mPivs[0] - mH;                      // S1
    mPivs[2] = mPivs[0] + (mH - mL);                   // R2
    mPivs[5] = mPivs[0] - (mH - mL);                   // S2
    mPivs[3] = 2 * mPivs[0] + (mH - (2 * mL));        // R3
    mPivs[6] = 2 * mPivs[0] - ((2 * mH) - mL);        // S3

   for(int y = 0; y < 7; y++)
     {
         ObjectSet("m.HL"+y, OBJPROP_TIME1, Time[mT1]);
         int mT2 = MathMax(0, mT1 - 5 - mLineExtend);
         ObjectSet("m.HL"+y, OBJPROP_TIME2, Time[mT2]);
         ObjectSet("m.HL"+y, OBJPROP_PRICE1, mPivs[y]);
         ObjectSet("m.HL"+y, OBJPROP_PRICE2, mPivs[y]);
         ObjectSet("m.HL"+y, OBJPROP_COLOR, mClr);
         
         ObjectSetText("m.Lab"+y, mPivName[y], 7, "Arial", mTxtCol);
         ObjectSet("m.Lab"+y, OBJPROP_TIME1, Time[mT1 + 3]);
         ObjectSet("m.Lab"+y, OBJPROP_PRICE1, mPivs[y]);
     }

   return(0);
 }
  
//+------------------------------------------------------------------+
void ClearPivs()
 {
   for(int r = 0; r < 7; r++)
     {
       ObjectSet("m.HL"+r, OBJPROP_COLOR, CLR_NONE);
       ObjectSetText("m.Lab"+r, "", 7, "Arial", CLR_NONE);
     }

   return(0);
 }
  
//+------------------------------------------------------------------+
void CheckAlerts()
 {
   static int mTime;
   
   for(int z = 0; z < 7; z++)
     {
       if(Close[0] >= mPivs[z] && High[1] < mPivs[z] && Time[0] > mTime)
         {
           Alert(Symbol(), "  Crossing Up "); 
           SendMail(Symbol(), "  Crossing Up "); 
           mTime = Time[0];
         }
       
       else if(Close[0] <= mPivs[z] && Low[1] > mPivs[z] && Time[0] > mTime)
         {
           Alert(Symbol(), "  Crossing Down "); 
           SendMail(Symbol(), "  Crossing Down "); 
           mTime = Time[0];
         }
     }
     
   return(0);
 }
  
//+------------------------------------------------------------------+

