//+------------------------------------------------------------------+
//|                                                  FiboSRZones.mq4 |
//|                                           Inthe Name of Almighty |
//|                                  https://jain.ramzamma@gmail.com |
//|                                                 Sep 16th  2017   |
//+------------------------------------------------------------------+
#property copyright "Inthe Name of Almighty"
#property link      "https://jain.ramzamma@gmail.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

const string short_name = "Range_Levels";
const int NOSHIFT     = 0;
const int CHARTWINDOW = 0;
extern bool Daily      = True;
extern bool Weekly     = True;            
extern bool Monthly    = True;   
//False ; //

  double Day_Price[][6];
  datetime dopen;
  double A , B , D, E, A1, B1, D1, E1 , A2, B2, D2, E2,TdayOpen,YdayHigh,YdayLow,YdayClose ;

  int timeshift = 0, timeshifts = 0, beginner = 0;
   int periods ;

   double Weekly_Price[][6];
   datetime wopen;
   double WA, WB, WD, WE, WA1, WB1, WD1, WE1,WOpn,WHigh,WLow,WClose,TWOpn;
  
   double Month_Price[][6];
   datetime mopen;
  
   double MClose, MHigh, MLow, MOpn,TMOpn, MA, MB, MD, ME, MA1, MB1, MD1, ME1;
   
   double YearClose, YearHigh,YearLow,YearOpen;
   double Year_Price[][6];
   datetime yopen;
   double YBL, YBTP1, YBTP2, YBTP3, YBETP1, YR5, YR6, YPIV;
   double YSL, YSTP1, YSTP2, YSTP3, YSETP1, YSETP2, YSETP3, YFP;
  
enum ANCHOR_POINTS {ANCHOR_POINT_ZERO, ANCHOR_POINT_ONE};
enum PIVOT_IDX { DAY_PIVOT, WEEK_PIVOT, MONTH_PIVOT,YEAR_PIVOT, END_PIVOT_IDX};
ENUM_TIMEFRAMES pivotTF[END_PIVOT_IDX] = {PERIOD_D1, PERIOD_W1, PERIOD_MN1,};
//-------------------------------------------------------- 
int OnInit()
 {
   IndicatorShortName(short_name);
   return(INIT_SUCCEEDED);
 }
  
//-------------------------------------------------------- 
void OnDeinit(const int reason)
 {
//----
   for(int i = ObjectsTotal() - 1; i >= 0; i--)
      ObjectDelete(ObjectName(i));
      
   Comment(" ");
 }

//--------------------------------------------------------- 
bool NewBar(PIVOT_IDX indexToCheck)
{
   static datetime ary_BarZeroValues[END_PIVOT_IDX];
   bool isNewBar = false;
   datetime barZeroTime = iTime(Symbol(),pivotTF[indexToCheck],NOSHIFT);
   datetime lastBarZeroTime = ary_BarZeroValues[indexToCheck];
   if(lastBarZeroTime!=barZeroTime)
   {
      ary_BarZeroValues[indexToCheck] = barZeroTime;
      isNewBar = true;
   }
   return(isNewBar);
}    
//

int OnCalculate(const int rates_total,  
                const int prev_calculated, 
                const datetime &time[], 
                const double &open[], 
                const double &high[],
                const double &low[], 
                const double &close[], 
                const long& tick_volume[], 
                const long& volume[], 
                const int& spread[] )
{
   MainRun(rates_total - prev_calculated);
   return(rates_total);
}
void MainRun(int lastbar)
{   
   // static int counter = 0;  counter++;
   // Print("MainRun called ",IntegerToString(counter)," times, Last Bar = ",IntegerToString(lastbar));
   if(NewBar(DAY_PIVOT))
   {
      DoDailyRates();
   }
   DoDailyLines();
     //
   if(NewBar(WEEK_PIVOT))
   {
      DoWeeklyRates();
   }
   DoWeeklyLines();
   //
   if(NewBar(MONTH_PIVOT))
   {
      DoMonthlyRates();
   }
   DoMonthlyLines();
   //
  /* if(NewBar(YEAR_PIVOT))
   {
      DoYearlyRates();
   }
   DoYearlyLines();*/
   //
}

//=============================GOOD LUCK========================

//==============================================================
void DoDailyRates(void)
{
   dopen=iTime(Symbol(),PERIOD_D1,0);
   ArrayCopyRates(Day_Price,(Symbol()), PERIOD_D1);
   
   YdayClose =  iClose(Symbol(), PERIOD_D1, 1);  //Day_Price[1][4];
   YdayHigh  =  iHigh(Symbol(), PERIOD_D1, 1); //Day_Price[1][3];
   YdayLow   =  iLow(Symbol(), PERIOD_D1, 1); //Day_Price[1][2];
 //  YdayOpen  =  iOpen(Symbol(), PERIOD_D1, 1); //Day_Price[1][1];
  
   TdayOpen =  iOpen(Symbol(), PERIOD_D1, 0); //Day_Price[0][1];
   D= YdayClose + ((YdayHigh-YdayLow) *1.618);
   D1=YdayClose + ((YdayHigh-YdayLow)*1.786);
   E= YdayClose + ((YdayHigh-YdayLow) *2.17);
   E1=YdayClose + ((YdayHigh-YdayLow) *2.618);
   D2=YdayClose + ((YdayHigh-YdayLow) *3.33);
   E2=YdayClose + ((YdayHigh-YdayLow) *4.236);
  
   B= YdayClose - ((YdayHigh-YdayLow) *1.618);
   B1=YdayClose - ((YdayHigh-YdayLow) *1.786);
   A= YdayClose - ((YdayHigh-YdayLow) *2.17);
   A1=YdayClose - ((YdayHigh-YdayLow) *2.618);
   A2=YdayClose - ((YdayHigh-YdayLow) *3.33);
   B2=YdayClose - ((YdayHigh-YdayLow) *4.236);

}
void DoWeeklyRates(void)
{
   ArrayCopyRates(Weekly_Price, Symbol(), PERIOD_W1);  
   WClose = iClose(Symbol(), PERIOD_W1, 1);  //Weekly_Price[1][4];  
   WHigh  = iHigh(Symbol(), PERIOD_W1, 1);  //Weekly_Price[1][3];
   WLow   = iLow(Symbol(), PERIOD_W1, 1);  //Weekly_Price[1][2]; 
   WOpn  = iOpen(Symbol(), PERIOD_W1, 1);   //Weekly_Price[1][1]; 
  
   TWOpn = iOpen(Symbol(), PERIOD_W1, 0);   //Weekly_Price[0][1]; 
   
   WD= WClose + ((WHigh-WLow) *1.618);
   WD1=WClose + ((WHigh-WLow)*1.786);
   WE= WClose + ((WHigh-WLow) *2.17);
   WE1=WClose + ((WHigh-WLow) *2.618);
   
   WB= WClose - ((WHigh-WLow) *1.618);
   WB1=WClose - ((WHigh-WLow) *1.786);
   WA= WClose - ((WHigh-WLow) *2.17);
   WA1=WClose - ((WHigh-WLow) *2.618);
  
}

void DoMonthlyRates(void)
{
   ArrayCopyRates(Month_Price, Symbol(), PERIOD_MN1);   
   MClose = iClose(Symbol(), PERIOD_MN1, 1);  //Month_Price[1][4];
   MHigh  = iHigh(Symbol(), PERIOD_MN1, 1);  //Month_Price[1][3];
   MLow   = iLow(Symbol(), PERIOD_MN1, 1);  //Month_Price[1][2];
   MOpn  = iOpen(Symbol(), PERIOD_MN1, 1);  //Month_Price[1][1];
  
   TMOpn = iOpen(Symbol(), PERIOD_MN1, 0);  //Month_Price[0][1];
    
   MD= MClose + ((MHigh-MLow) *1.618);
   MD1=MClose + ((MHigh-MLow)  *1.786);
   ME= MClose + ((MHigh-MLow)  *2.17);
   ME1=MClose + ((MHigh-MLow)  *2.618);
  
   MB= MClose - ((MHigh-MLow)  *1.618);
   MB1=MClose - ((MHigh-MLow)  *1.786);
   MA= MClose - ((MHigh-MLow)  *2.17);
   MA1=MClose - ((MHigh-MLow)  *2.618);
 
}

void ManageLine(string lName, datetime startTime, double lPrice, datetime endTime,color lColor, ENUM_LINE_STYLE lStyle, int lWidth)
{
   if (ObjectFind(lName) < 0 )
   {
         ObjectCreate(lName, OBJ_RECTANGLE, CHARTWINDOW,startTime,lPrice, endTime,lPrice);
         ObjectSet(lName, OBJPROP_COLOR, lColor);
         ObjectSet(lName, OBJPROP_STYLE, lStyle);
         ObjectSet(lName, OBJPROP_WIDTH, lWidth);
         ObjectSet(lName, OBJPROP_RAY,false);
    } else
    {
      ObjectMove(lName,ANCHOR_POINT_ZERO,startTime,lPrice);
      ObjectMove(lName,ANCHOR_POINT_ONE,endTime,lPrice); 
    }
}
void ManageLabel(string lName, string lText, datetime lTime, double lPrice, color lColor)
{
   if(ObjectFind(lName) < 0)
   {
      ObjectCreate(lName, OBJ_TEXT,CHARTWINDOW, lTime, lPrice);
   } else
   {
      ObjectMove(lName, ANCHOR_POINT_ZERO, lTime, lPrice);
   }
   ObjectSetText(lName, lText,7, "Century Gothic", lColor);
}
void DoDailyLines(void)
{
   if (Daily==true)
   {
      datetime currStartTime = iTime(Symbol(),PERIOD_D1,0); //(Time[0]  );  // + (60*60*1) //  //dopen=iTime(Symbol(),PERIOD_D1,0);
      datetime currEndTime = (Time[0] + 8* PeriodSeconds()); 
     
      datetime labelTime1 = (Time[0] - 6 * PeriodSeconds());  //(Time[0]-18* PeriodSeconds())
     
      ManageLine("TdayOpen_Line", currStartTime, TdayOpen, currEndTime ,clrGoldenrod,STYLE_DOT,1);
      ManageLabel("TdayOpenLabel",("D Open : ")+ DoubleToStr(TdayOpen,2),labelTime1, TdayOpen, clrGoldenrod); 
            
}

}
//==============================================================
void DoWeeklyLines(void)
{
   wopen=iTime(Symbol(),PERIOD_W1,NOSHIFT);
   if (Weekly==true)
   {
      datetime currStartTime = iTime(Symbol(),PERIOD_W1,0); //datetime timeTime       = Time[0]+(Time[0]-Time[5]);
      datetime currEndTime = (Time[0] + 13 * PeriodSeconds()) ;
      datetime labelTime1  = (Time[0] - 10 * PeriodSeconds()); 
   
         ManageLine("TWOpn_Line", currStartTime, TWOpn, currEndTime ,clrDarkGoldenrod,STYLE_DOT,1);
         ManageLabel("TWOpnLabel",("WOpen: ")+ DoubleToStr(TWOpn,2),labelTime1, TWOpn, clrDarkGoldenrod); //(Time[0]-5* PeriodSeconds())
        
   }  
}
//==============================================================
void DoMonthlyLines(void)  
{
   mopen=iTime(Symbol(),PERIOD_MN1,0);
   if (Monthly==true)
   {
      datetime currStartTime =iTime(Symbol(),PERIOD_MN1,0); 
      datetime currEndTime = (Time[0] + 21 * PeriodSeconds());
   
      datetime labelTime1  = (Time[0] - 15 * PeriodSeconds());  //(Time[0]+7* PeriodSeconds()) 
      
        ManageLine("TMOpn_Line", currStartTime, TMOpn, currEndTime ,clrDarkGoldenrod,STYLE_DOT,1);
        ManageLabel("TMOpnLabel",("MOpen : ")+ DoubleToStr(TMOpn,2),labelTime1, TMOpn, clrDarkGoldenrod); 
      
 }
}