//+------------------------------------------------------------------+
//|                                                 Weekly lines.mq4 |
//+------------------------------------------------------------------+

#property indicator_chart_window

#include <hanover --- function header.mqh>

extern int        NumberOfWeeks              = 10;
extern color      LineColor                  = Gray;
extern int        LineWidth                  = 1;
extern int        LineStyle                  = 0;
extern string     Visibility                 = "M1,M5,M15,M30,H1,H4,D1,W1,MN";
extern string     RefreshPeriod              = "D1";

string   ccy, sym, IndiName;
int      dig, tf, tmf, vis, wno, RefreshEveryXMins;
double   spr, pnt, tickval, bidp, askp, minlot, lswap, sswap, NewSL;
datetime prev_time;
bool     FirstTime;

//+------------------------------------------------------------------+
int init()  {
//+------------------------------------------------------------------+
  IndiName = "WeeklyLines-";
  IndicatorShortName(IndiName);

  sym     = Symbol();
  ccy     = Symbol();
  tmf     = Period();
  bidp    = MarketInfo(ccy,MODE_BID);
  askp    = MarketInfo(ccy,MODE_ASK);
  pnt     = MarketInfo(ccy,MODE_POINT);
  dig     = MarketInfo(ccy,MODE_DIGITS);
  spr     = MarketInfo(ccy,MODE_SPREAD);
  tickval = MarketInfo(ccy,MODE_TICKVALUE);
  minlot  = MarketInfo(ccy,MODE_MINLOT);
  lswap   = MarketInfo(ccy,MODE_SWAPLONG);
  sswap   = MarketInfo(ccy,MODE_SWAPSHORT);
  if (dig == 3 || dig == 5) {
    pnt     *= 10;
    spr     /= 10;
    tickval *= 10;
  } 
  RefreshEveryXMins = StrToTF(RefreshPeriod);
  prev_time = -9999;
  vis = GetVisibility(Visibility);

  return(0);
}

//+------------------------------------------------------------------+
int deinit()  {
//+------------------------------------------------------------------+
  del_obj();
  return(0);
}

//+------------------------------------------------------------------+
int start()  {
//+------------------------------------------------------------------+
  if (RefreshEveryXMins < 0)  {
    if (FirstTime)  {
      del_obj();
      plot_obj();
    }
    FirstTime = false;      
    return(0);
  }  
  if (RefreshEveryXMins == 0) {
    del_obj();
    plot_obj();    
  } else {
    if (prev_time != iTime(sym,RefreshEveryXMins,0))  {
      del_obj();
      plot_obj();
      prev_time = iTime(sym,RefreshEveryXMins,0);
  } }      
  return(0);
}

//+------------------------------------------------------------------+
void del_obj()  {
//+------------------------------------------------------------------+
  int k=0;
  while (k<ObjectsTotal())   {
    string objname = ObjectName(k);
    if (StringSubstr(objname,0,StringLen(IndiName)) == IndiName)  
      ObjectDelete(objname);
    else
      k++;
  }    
  return(0);
}

//+------------------------------------------------------------------+
void plot_obj()   {
//+------------------------------------------------------------------+
  int c=0;
  for (int i=0; i<Bars; i++)   {
    int week1 = WeekNumber(Time[i+1]);
    int week0 = WeekNumber(Time[i]);
    if (week0 != week1)  {
      double prc = Open[i];
      string objname = IndiName + NumberToStr(i,"Z6");
      if (ObjectFind(objname) < 0)
        ObjectCreate(objname,OBJ_TREND,0,Time[i],prc,Time[0],prc);
      string objtext = DateToStr(Time[i],"w D n Y") + NumberToStr(Open[i],"'  Open='T3.5");  
      ObjectSetText(objname,objtext,10,"Arial",Gray);
      ObjectSet(objname,OBJPROP_COLOR,LineColor);
      ObjectSet(objname,OBJPROP_WIDTH,LineWidth);
      ObjectSet(objname,OBJPROP_STYLE,LineStyle);
      ObjectSet(objname,OBJPROP_RAY,false);
      ObjectSet(objname,OBJPROP_BACK,false);
      ObjectSet(objname,OBJPROP_TIMEFRAMES,vis);
      c++;
      if (c>=NumberOfWeeks)  break;
    }
  }
  return(0);
}

//+------------------------------------------------------------------+
#include <hanover --- extensible functions.mqh>