//+------------------------------------------------------------------+
//|                                             Daily LinesBoxes.mq4 |
//+------------------------------------------------------------------+

#property indicator_chart_window

#include <hanover --- function header (np).mqh>

extern string   ParameterFile       = "NONE";
extern int      LookbackDays        = 20;
extern double   StartHours          = 0;
extern double   EndHours            = 23;
extern double   ExtendHours         = 23;
extern color    BoxColor            = C'0,64,0';
extern color    LineColor           = Green;
extern string   Properties          = "FTZ2";
extern string   HorizLineLevels     = "0";
extern string   TextProperties      = "Verdana,9,Silver,4,HL,w: ,T3.5'; ',0";
//extern string   TextProperties      = "";
extern string   SymbolProperties    = "2,White,108,10";
extern string   DaysOfWeek          = "Mon,Tue,Wed,Thu,Fri";
extern string   DaysOfMonth         = "01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31";
extern string   Visibility          = "M1,M5,M15,M30,H1,H4";
extern string   TimeFrame           = "";
extern bool     CandlesMustExist    = false;
extern double   ClearancePips       = 0;
extern string   RefreshPeriod       = "M1";
extern bool     SecondaryPipCount   = false;
extern string   UniqueID            = "DLB-000000";

datetime prev_time;
string   sym, arr[10], HLL[100];
double   pnt;
int      tscale, dig, vis, RefreshEveryXMins;

//+------------------------------------------------------------------+
int init()  {
//+------------------------------------------------------------------+
//  UniqueID = NumberToStr(GetUniqueInt(),"'DLB-'Z6'-'");
  CheckPresets();
  vis = GetVisibility(Visibility);
  RefreshEveryXMins = StrToTF(RefreshPeriod);
  prev_time = -9999;
  del_obj();
  plot_obj();
  return(0);
}

//+------------------------------------------------------------------+
int deinit()  {
//+------------------------------------------------------------------+
  del_obj();
  return(0);
}


//+------------------------------------------------------------------+
int start()  {
//+------------------------------------------------------------------+
  sym = Symbol();
  if (RefreshEveryXMins < 0)
    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(UniqueID)) == UniqueID)  
      ObjectDelete(objname);
    else
      k++;
  }    
  return(0);
}

//+------------------------------------------------------------------+
void plot_obj()  {
//+------------------------------------------------------------------+
  CheckPresets();
  if (TimeFrame == "")
    tscale = Period();
  else  
    tscale = StrToTF(TimeFrame);
  sym = Symbol();
  pnt = MarketInfo(sym,MODE_POINT);
  dig = MarketInfo(sym,MODE_DIGITS);
  if (dig == 3 || dig == 5) {
    pnt *= 10;
  }  

  DaysOfWeek = StringUpper(DaysOfWeek) + ",";
  DaysOfMonth = DaysOfMonth + ",";

  int levels = StrToStringArray(HorizLineLevels,HLL);

  string prop = StringUpper(Properties); 
  int width = StrToNumber(Properties);  
  int style = STYLE_SOLID;             
  if (StringFind(prop,"-..",0) >= 0)   style = STYLE_DASHDOTDOT;   else
  if (StringFind(prop,"-.",0) >= 0)    style = STYLE_DASHDOT;      else
  if (StringFind(prop,".",0) >= 0)     style = STYLE_DOT;          else
  if (StringFind(prop,"--",0) >= 0)    style = STYLE_DASH;

  datetime tc  = TimeCurrent();
  for (int i=0; i<LookbackDays; i++)   {
    int shifted = tc-i*86400;      
    if (shifted < Time[Bars-1])    break;
    if (StringFind(DaysOfWeek,StringUpper(DateToStr(shifted,"w"))+",") < 0)  continue;
    if (StringFind(DaysOfMonth,DateToStr(shifted,"D")+",")             < 0)  continue;
    datetime dt1  = StrToTime(DateToStr(shifted,"Y.M.D")) + 3600 * StartHours;
    datetime dt2  = StrToTime(DateToStr(shifted,"Y.M.D")) + 3600 * EndHours;
    datetime dt3  = StrToTime(DateToStr(shifted,"Y.M.D")) + 3600 * ExtendHours;

    int exist1 = iBarShift(NULL,tscale,dt1,true);
//    if (exist1 >= 0 && Time[exist1] != dt1)   exist1 = -1;
    int exist2 = iBarShift(NULL,tscale,dt2,true);
//    if (exist2 >= 0 && Time[exist2] != dt1)   exist2 = -1;
    int exist3 = iBarShift(NULL,tscale,dt3,true);
//    if (exist3 >= 0 && Time[exist3] != dt1)   exist3 = -1;

    double   hi = 0, lo = 999999; 
    double   hivol = 0, lovol = 999999, vol = 0;
    double   hirng = 0, lorng = 999999, rng = 0;
    double   hivtr = 0, lovtr = 999999, vtr = 0;
    double   hivdr = 0, lovdr = 999999, vdr = 0;
    int      bar1 = iBarShift(NULL,tscale,dt1,false);
    int      bar2 = iBarShift(NULL,tscale,dt2,false);
    int      bar3 = iBarShift(NULL,tscale,dt3,false);
    if (bar2 == 0)   bar2 = -1;
    for (int j=bar1; j>bar2; j--)  {
      hi = MathMax(hi,iHigh(NULL,tscale,j));
      lo = MathMin(lo,iLow(NULL,tscale,j));
      double range    = iHigh(NULL,tscale,j) - iLow(NULL,tscale,j);
      double vtrtmp   = range * iVolume(NULL,tscale,j);
      double vdrtmp   = DivZero(iVolume(NULL,tscale,j), range);
      if (range > rng)    { rng = range;    hirng = iHigh(NULL,tscale,j);    lorng = iLow(NULL,tscale,j);  }  
      if (vtrtmp > vtr)   { vtr = vtrtmp;   hivtr = iHigh(NULL,tscale,j);    lovtr = iLow(NULL,tscale,j);  }  
      if (vdrtmp > vdr)   { vdr = vdrtmp;   hivdr = iHigh(NULL,tscale,j);    lovdr = iLow(NULL,tscale,j);  }
      if (iVolume(NULL,tscale,j) > vol)  {  vol = iVolume(NULL,tscale,j);    hivol = iHigh(NULL,tscale,j);    lovol = iLow(NULL,tscale,j);  } 
    }
    if (StringFind(prop,"E",0) >= 0)  { hi = hivol;   lo = lovol;  }  else
    if (StringFind(prop,"R",0) >= 0)  { hi = hirng;   lo = lorng;  }  else
    if (StringFind(prop,"M",0) >= 0)  { hi = hivtr;   lo = lovtr;  }  else
    if (StringFind(prop,"D",0) >= 0)  { hi = hivdr;   lo = lovdr;  }  
    hi += ClearancePips * pnt;  
    lo -= ClearancePips * pnt;

    if (StringFind(prop,"<",0) >= 0)     hi = iOpen(NULL,tscale,bar1);
    if (StringFind(prop,">",0) >= 0)     lo = iOpen(NULL,tscale,bar1);
    
    // Plot box.......
    if (StringFind(prop,"F",0) >= 0  ||  StringFind(prop,"B",0) >= 0  ||  StringFind(prop,"T",0) >= 0)  {
      string objname = UniqueID+"-"+i+"-r";
      datetime dt4 = ifint(StringFind(prop,"T",0)>=0, dt2, dt3);
      int exist4   = ifint(StringFind(prop,"T",0)>=0, exist2, exist3);
      if (!CandlesMustExist  ||  (exist1 >= 0 && exist4 >= 0))   {
        PlotBox (objname, true, 0, dt1, hi, dt4, lo, BoxColor, width, style, false, vis);      // Plot rectangle
        if (StringFind(prop,"F",0) >= 0)    ObjectSet(objname,OBJPROP_BACK,true);
        if (StringFind(prop,"P",0) >= 0)    ObjectSetText(objname,DoubleToStr((hi-lo)/pnt,0));
    } }  

    // Plot horizontal lines..........
    if (StringFind(prop,"Z",0) >= 0)  {
      if (!CandlesMustExist  ||  (exist1 >= 0 && exist3 >= 0))   {
        int ray = ifint(StringFind(prop,"X",0)>=0, 1, 0);
        objname = UniqueID+"-"+i+"-hi";
        PlotTL (objname, true, 0, dt1, hi, dt3, hi, LineColor, width, style, ray, false, vis);      // Plot trendline
        objname = UniqueID+"-"+i+"-lo";
        PlotTL (objname, true, 0, dt1, lo, dt3, lo, LineColor, width, style, ray, false, vis);      // Plot trendline
    } } 
    
    if (StringFind(prop,"C",0) >= 0)  {
      if (!CandlesMustExist  ||  (exist1 >= 0 && exist3 >= 0))   {
        double price = iClose(NULL,tscale,bar1);
        ray = ifint(StringFind(prop,"X",0)>=0, 1, 0);
        for (j=0; j<100; j++)  {
          if (HLL[j] == "")   break;
          objname = UniqueID+"-"+i+"-"+j+"-cl";
          PlotTL (objname, true, 0, dt1, price+StrToNumber(HLL[j])*pnt, dt3, price+StrToNumber(HLL[j])*pnt, LineColor, width, style, ray, false, vis);      // Plot trendline
    } } }

    if (StringFind(prop,"O",0) >= 0)  {
      if (!CandlesMustExist  ||  (exist1 >= 0 && exist3 >= 0))   {
        price = iOpen(NULL,tscale,bar1);
        ray   = ifint(StringFind(prop,"X",0)>=0, 1, 0);
        for (j=0; j<100; j++)  {
          if (HLL[j] == "")   break;
          objname = UniqueID+"-"+i+"-"+j+"-op";
          PlotTL (objname, true, 0, dt1, price+StrToNumber(HLL[j])*pnt, dt3, price+StrToNumber(HLL[j])*pnt, LineColor, width, style, ray, false, vis);      // Plot trendline
    } } }

    if (StringFind(prop,"H",0) >= 0)  {
      if (!CandlesMustExist  ||  (exist1 >= 0 && exist3 >= 0))   {
        price = iHigh(NULL,tscale,bar1);
        ray   = ifint(StringFind(prop,"X",0)>=0, 1, 0);
        for (j=0; j<100; j++)  {
          if (HLL[j] == "")   break;
          objname = UniqueID+"-"+i+"-"+j+"-hi";
          PlotTL (objname, true, 0, dt1, price+StrToNumber(HLL[j])*pnt, dt3, price+StrToNumber(HLL[j])*pnt, LineColor, width, style, ray, false, vis);      // Plot trendline
    } } }

    if (StringFind(prop,"L",0) >= 0)  {
      if (!CandlesMustExist  ||  (exist1 >= 0 && exist3 >= 0))   {
        price = iLow(NULL,tscale,bar1);
        ray   = ifint(StringFind(prop,"X",0)>=0, 1, 0);
        for (j=0; j<100; j++)  {
          if (HLL[j] == "")   break;
          objname = UniqueID+"-"+i+"-"+j+"-lo";
          PlotTL (objname, true, 0, dt1, price+StrToNumber(HLL[j])*pnt, dt3, price+StrToNumber(HLL[j])*pnt, LineColor, width, style, ray, false, vis);      // Plot trendline
    } } }

    if (StringFind(prop,"A",0) >= 0)  {
      if (!CandlesMustExist  ||  (exist1 >= 0 && exist3 >= 0))   {
        price = (iHigh(NULL,tscale,bar1)+iLow(NULL,tscale,bar1))/2;
        ray   = ifint(StringFind(prop,"X",0)>=0, 1, 0);
        for (j=0; j<100; j++)  {
          if (HLL[j] == "")   break;
          objname = UniqueID+"-"+i+"-"+j+"-op";
          PlotTL (objname, true, 0, dt1, price+StrToNumber(HLL[j])*pnt, dt3, price+StrToNumber(HLL[j])*pnt, LineColor, width, style, ray, false, vis);      // Plot trendline
    } } }

    // Plot vertical lines.......
    if (StringFind(prop,"V",0) >= 0)  { 
      if (!CandlesMustExist  ||  exist1 >= 0)   {
        objname = UniqueID+"-"+i+"-va";
        if (StringFind(prop,"^",0) >= 0)  
//          PlotTL (objname, true, 0, dt1, 0.001, dt1, 1000, LineColor, width, style, true, false, vis);      // Plot trendline
          PlotVL (objname, true, 0, dt1, LineColor, width, style, true, vis);       // Plot vertical line
        else
          PlotVL (objname, true, 0, dt1, LineColor, width, style, false, vis);      // Plot vertical line
      }  
      if (StringFind(prop,"VV",0) >= 0)  {
        if (!CandlesMustExist  ||  exist3 >= 0)   {
          objname = UniqueID+"-"+i+"-vb";
          if (StringFind(prop,"^",0) >= 0)
//            PlotTL (objname, true, 0, dt3, 0.001, dt3, 1000, LineColor, width, style, true, false, vis);      // Plot trendline
            PlotVL (objname, true, 0, dt3, LineColor, width, style, true, vis);       // Plot vertical line
          else
            PlotVL (objname, true, 0, dt3, LineColor, width, style, false, vis);      // Plot vertical line
    } } }

    // Display box height......
    if (TextProperties > "")    {
      StrToStringArray(TextProperties,arr);
      double prc = StrToNumber(arr[3]);
      double hip = hi;
      double lop = lo;
      if (StringFind(StringUpper(arr[4]),"S") >= 0)    { hip=price; lop=price; }
      if (StringFind(StringUpper(arr[4]),"E") >= 0)    { hip=price; lop=price; } 
      if (StringFind(StringUpper(arr[4]),"X") >= 0)    { hip=price; lop=price; }
      prc = (hip+(prc+5)*pnt)*(prc>=0) + (lop+prc*pnt)*(prc<0);
      objname = UniqueID+"-"+i+"-t";
      string objtext = "";
      if (arr[5] > "") 
        objtext = objtext + DateToStr(dt1,arr[5]) + " ";
      if (StringFind(StringUpper(arr[4]),"P") >= 0)     objtext = objtext + NumberToStr((hi-lo)/pnt,arr[6]) + " ";
      if (StringFind(StringUpper(arr[4]),"H") >= 0)     objtext = objtext + NumberToStr(hi,"'High='"+arr[6]) + " ";
      if (StringFind(StringUpper(arr[4]),"L") >= 0)     objtext = objtext + NumberToStr(lo,"'Low='"+arr[6]) + " ";
      if (StringFind(StringUpper(arr[4]),"S") >= 0)     objtext = objtext + NumberToStr(iOpen(NULL,tscale,bar1),"'Start='"+arr[6]) + " ";
      if (StringFind(StringUpper(arr[4]),"E") >= 0)     objtext = objtext + NumberToStr(iClose(NULL,tscale,bar2),"'End='"+arr[6]) + " ";
      if (StringFind(StringUpper(arr[4]),"X") >= 0)     objtext = objtext + NumberToStr(iClose(NULL,tscale,bar3),"'Extend='"+arr[6]) + " ";
//      objtext = StringRepeat(" ",StringLen(objtext)/2) + objtext;
      PlotText (objname, true, 0, dt1+StrToNumber(arr[7])*Period()*60, prc, objtext, StrToColor(arr[2]), StrToInteger(arr[1]), arr[0], 0.0, false, vis);      // Plot text
    }

    // Display Wingdings symbol......
    if (StringFind(prop,"W",0) >= 0 && SymbolProperties > "")  {
      if (!CandlesMustExist  ||  exist1 >= 0)   {
        int bar     = iBarShift(NULL,0,dt1,true); 
        double high = iHigh(NULL,0,bar); 
        double low  = iLow(NULL,0,bar); 
        StrToStringArray(SymbolProperties,arr);
        prc = StrToNumber(arr[3]);
        prc = (high+(5+prc)*pnt)*(prc>=0) + (low+prc*pnt)*(prc<0);
        objname = UniqueID+"-"+i+"-wa";
        PlotArrow (objname, true, 0, dt1, prc, StrToColor(arr[1]), StrToInteger(arr[0]), StrToInteger(arr[2]), false, vis);      // Plot arrow
      }
      if (StringFind(prop,"WW",0) >= 0 && SymbolProperties > "")  { 
        if (!CandlesMustExist  ||  exist3 >= 0)   {
          bar  = iBarShift(NULL,0,dt3,true); 
          high = iHigh(NULL,0,bar); 
          low  = iLow(NULL,0,bar); 
          prc  = StrToNumber(arr[3]);
          prc  = (high+(5+prc)*pnt)*(prc>=0) + (low+prc*pnt)*(prc<0);
          objname = UniqueID+"-"+i+"-wb";
          PlotArrow (objname, true, 0, dt3, prc, StrToColor(arr[1]), StrToInteger(arr[0]), StrToInteger(arr[2]), false, vis);      // Plot arrow
    } } }

    if (SecondaryPipCount)   {
      double   sec_hi = 0, sec_lo = 999999; 
      int      sbar2 = iBarShift(NULL,tscale,dt2,false);
      int      sbar3 = iBarShift(NULL,tscale,dt3,false);
      if (sbar3 == 0)   sbar3 = -1;
      for (j=sbar2; j>sbar3; j--)  {
        sec_hi = MathMax(sec_hi,iHigh(NULL,tscale,j));
        sec_lo = MathMin(sec_lo,iLow(NULL,tscale,j));
      }
      if (!CandlesMustExist  ||  (exist1 >= 0 && exist3 >= 0))   {
        objname = UniqueID+"-sec-"+i+"-hi";
        string name_hi = objname;
        if (sec_hi > hi)  {
          ray = ifint(StringFind(prop,"X",0)>=0, 1, 0);
          PlotTL (objname, true, 0, dt2, sec_hi, dt3, sec_hi, LineColor, width, style, ray, false, vis);      // Plot trendline
        }  
        objname = UniqueID+"-sec-"+i+"-lo";
        string name_lo = objname;
        if (sec_lo < lo)  {
          PlotTL (objname, true, 0, dt2, sec_lo, dt3, sec_lo, LineColor, width, style, ray, false, vis);      // Plot trendline
          ObjectCreate(objname,OBJ_TREND,0,dt2,sec_lo,dt3,sec_lo); 
      } }
      if (TextProperties > "")    {
        if (sec_hi > hi)  {
          StrToStringArray(TextProperties,arr);
          prc = sec_hi + (5 + StrToNumber(arr[3])) * pnt;
          objname = UniqueID+"-sec-"+i+"-hi-t";
          PlotText (objname, true, 0, dt2, prc, NumberToStr(MathMax(sec_hi-hi,0)/pnt,arr[4]), StrToColor(arr[2]), StrToInteger(arr[1]), arr[0], 0.0, false, vis);      // Plot text
          ObjectSet(name_hi,OBJPROP_COLOR,StrToColor(arr[2]));
        }
        if (sec_lo < lo)  {
          StrToStringArray(TextProperties,arr);
          prc = sec_lo - StrToNumber(arr[3]) * pnt;
          objname = UniqueID+"-sec-"+i+"-lo-t";
          PlotText (objname, true, 0, dt2, prc, NumberToStr(MathMax(lo-sec_lo,0)/pnt,arr[4]), StrToColor(arr[2]), StrToInteger(arr[1]), arr[0], 0.0, false, vis);      // Plot text
          ObjectSet(name_lo,OBJPROP_COLOR,StrToColor(arr[2]));
    } } }
  }
  return(0);
}

//+------------------------------------------------------------------+
int CheckPresets()    {
//+------------------------------------------------------------------+
//---------------------------------------------------------------------------------------------------------------
//    Enter the file name in here
//---------------------------------------------------------------------------------------------------------------
  ParameterFile = StringUpper(ParameterFile);
  string FileName = "Presets---DailyLinesBoxes.TXT";
  if (ParameterFile > "")  FileName = "Presets---DailyLinesBoxes." + ParameterFile;
//---------------------------------------------------------------------------------------------------------------
  int handle = FileOpen(FileName, FILE_CSV|FILE_READ,';');
  if (handle > 0)  {
    while(!FileIsEnding(handle))  {
      string text  = FileReadString(handle);
      int t0 = StringFind(text,"//",0);
      if (t0 == 0)       text = "";    
      else if (t0 > 0)   text = StringSubstr(text,0,t0);
      string temp  = "";
      int    quote = 0;
      for (int i=0; i<StringLen(text); i++)   {
        string char = StringSubstr(text,i,1);
        if (char == "\x22")    quote = 1 - quote;  
        else if (quote == 1)    temp  = temp + char;
        else if (char != " " && char != "_") temp  = temp + StringLower(char);  
      }
      if (StringLen(temp) > 0) {
        int equal = StringFind(temp,"=",0);
        int semic = StringFind(temp,";",0);
        string pname = "";
        pname   = StringSubstr(temp,0,equal);
        string pvalue = StringSubstr(temp,equal+1,semic-equal+1);
        if (pvalue != "*")  {
//---------------------------------------------------------------------------------------------------------------
//    Parameter assignment statements go in here
//---------------------------------------------------------------------------------------------------------------
          if (pname == "lookbackdays")                    LookbackDays                   = StrToInteger(pvalue);   else 
          if (pname == "starthours")                      StartHours                     = StrToNumber(pvalue);    else 
          if (pname == "endhours")                        EndHours                       = StrToNumber(pvalue);    else 
          if (pname == "extendhours")                     ExtendHours                    = StrToNumber(pvalue);    else 
          if (pname == "boxcolor")                        BoxColor                       = StrToColor(pvalue);     else 
          if (pname == "linecolor")                       LineColor                      = StrToColor(pvalue);     else 
          if (pname == "properties")                      Properties                     = pvalue;                 else 
          if (pname == "horizlinelevels")                 HorizLineLevels                = pvalue;                 else 
          if (pname == "textproperties")                  TextProperties                 = pvalue;                 else 
          if (pname == "symbolproperties")                SymbolProperties               = pvalue;                 else 
          if (pname == "daysofweek")                      DaysOfWeek                     = pvalue;                 else 
          if (pname == "daysofmonth")                     DaysOfMonth                    = pvalue;                 else 
          if (pname == "visibility")                      Visibility                     = pvalue;                 else 
          if (pname == "timeframe")                       TimeFrame                      = pvalue;                 else 
          if (pname == "candlesmustexist")                CandlesMustExist               = StrToBool(pvalue);      else 
          if (pname == "clearancepips")                   ClearancePips                  = StrToNumber(pvalue);    else 
          if (pname == "refreshperiod")                   RefreshPeriod                  = pvalue;                 else 
          if (pname == "secondarypipcount")               SecondaryPipCount              = StrToBool(pvalue);      else 
          if (pname == "uniqueid")                        UniqueID                       = pvalue;

//          Debug("pname  = " + pname);
//          Debug("pvalue = " + pvalue);
//---------------------------------------------------------------------------------------------------------------
        }
      }  
      temp = FileReadString(handle);
    }
    FileClose(handle);
  }  
  return(0);
}  

//+------------------------------------------------------------------+
#include <hanover --- extensible functions (np).mqh>


