#property copyright "Copyright"
#property link      ""

#property indicator_chart_window

extern int LocalTimeZone = 2;
extern int DestTimeZone = 0;
extern int LineStyle = 1;
extern int LineThickness = 1;
extern bool ShowPivots = TRUE;
extern color PivotColor = Fuchsia;
extern color SuportColor = Blue;
extern color ResistanceColor = Red;
extern bool ShowMidPivot = TRUE;
extern color MidPivotColor = Teal;
extern int LineStyleMidP = 1;
extern int LineThicknessMidP = 1;
extern color LabelColor = Gray;
extern bool ShowComment = FALSE;
extern bool ShowHighLowOpen = FALSE;
extern color HighLowOpenColor = Orange;
extern bool ShowSweetSpots = FALSE;
extern color SweetSpotsColor = DeepSkyBlue;
extern bool ShowFibos = FALSE;
extern color FibosColor = Goldenrod;
extern bool ShowCamarilla = FALSE;
extern color CamarillaColor = DimGray;
extern bool ShowLevelPrices = TRUE;
extern color DaySeparator = DarkGray;
extern color DayLabel = DarkGray;
extern int BarForLabels = 10;
extern bool DebugLogger = FALSE;
int gi_184 = 0;
int gi_188 = 24;
int gi_192;
int gi_196 = 0;
int gi_200 = 0;

int init() {
   deinit();
   if (Ask > 10.0) gi_192 = 2;
   else gi_192 = 4;
   Print("Period= ", Period());
   return (0);
}

int deinit() {
   string ls_16;
   int li_0 = ObjectsTotal();
   for (int li_12 = li_0; li_12 >= 0; li_12--) {
      ls_16 = ObjectName(li_12);
      if (StringSubstr(ls_16, 0, 7) == "[PIVOT]") ObjectDelete(ls_16);
   }
   string ls_4 = Symbol() + "st";
   GlobalVariableDel(ls_4);
   ls_4 = Symbol() + "p";
   GlobalVariableDel(ls_4);
   ls_4 = Symbol() + "r1";
   GlobalVariableDel(ls_4);
   ls_4 = Symbol() + "r2";
   GlobalVariableDel(ls_4);
   ls_4 = Symbol() + "r3";
   GlobalVariableDel(ls_4);
   ls_4 = Symbol() + "s1";
   GlobalVariableDel(ls_4);
   ls_4 = Symbol() + "s2";
   GlobalVariableDel(ls_4);
   ls_4 = Symbol() + "s3";
   GlobalVariableDel(ls_4);
   ls_4 = Symbol() + "yh";
   GlobalVariableDel(ls_4);
   ls_4 = Symbol() + "to";
   GlobalVariableDel(ls_4);
   ls_4 = Symbol() + "yl";
   GlobalVariableDel(ls_4);
   ls_4 = Symbol() + "ds1";
   GlobalVariableDel(ls_4);
   ls_4 = Symbol() + "ds2";
   GlobalVariableDel(ls_4);
   ls_4 = Symbol() + "flm618";
   GlobalVariableDel(ls_4);
   ls_4 = Symbol() + "flm382";
   GlobalVariableDel(ls_4);
   ls_4 = Symbol() + "flp382";
   GlobalVariableDel(ls_4);
   ls_4 = Symbol() + "flp5";
   GlobalVariableDel(ls_4);
   ls_4 = Symbol() + "fhm382";
   GlobalVariableDel(ls_4);
   ls_4 = Symbol() + "fhp382";
   GlobalVariableDel(ls_4);
   ls_4 = Symbol() + "fhp618";
   GlobalVariableDel(ls_4);
   ls_4 = Symbol() + "h3";
   GlobalVariableDel(ls_4);
   ls_4 = Symbol() + "h4";
   GlobalVariableDel(ls_4);
   ls_4 = Symbol() + "l3";
   GlobalVariableDel(ls_4);
   ls_4 = Symbol() + "l4";
   GlobalVariableDel(ls_4);
   ls_4 = Symbol() + "mr3";
   GlobalVariableDel(ls_4);
   ls_4 = Symbol() + "mr2";
   GlobalVariableDel(ls_4);
   ls_4 = Symbol() + "mr1";
   GlobalVariableDel(ls_4);
   ls_4 = Symbol() + "ms1";
   GlobalVariableDel(ls_4);
   ls_4 = Symbol() + "ms2";
   GlobalVariableDel(ls_4);
   ls_4 = Symbol() + "ms3";
   GlobalVariableDel(ls_4);
   return (0);
}

int start() {
   int li_180;
   int li_184;
   double ld_188;
   double ld_196;
   double ld_204;
   double ld_212;
   double ld_220;
   double ld_228;
   string ls_236;
   bool li_0 = FALSE;
   datetime lt_4 = 0;
   double ld_8 = 0;
   double ld_16 = 0;
   double ld_24 = 0;
   double ld_32 = 0;
   double ld_40 = 0;
   double ld_48 = 0;
   double ld_56 = 0;
   int li_64 = 0;
   int li_68 = 0;
   int li_72 = 0;
   if (TimeCurrent() - gi_196 < 60 && Period() == gi_200) return (0);
   gi_200 = Period();
   gi_196 = TimeCurrent();
   if (Period() > PERIOD_D1) {
      Alert("Error - Chart period is greater than 1 day.");
      return (-1);
   }
   if (DebugLogger) {
      Print("Local time current bar:", TimeToStr(Time[0]));
      Print("Dest  time current bar: ", TimeToStr(Time[0] - 3600 * (LocalTimeZone - DestTimeZone)), ", tzdiff= ", LocalTimeZone - DestTimeZone);
   }
   f0_0(LocalTimeZone, DestTimeZone, li_64, li_68, li_72);
   li_0 = Time[li_64];
   string ls_76 = Symbol() + "st";
   double ld_84 = li_0;
   GlobalVariableSet(ls_76, ld_84);
   lt_4 = Time[li_68];
   ld_32 = -99999;
   ld_48 = 99999;
   for (int li_92 = li_68; li_92 >= li_72; li_92--) {
      if (ld_40 == 0.0) ld_40 = Open[li_92];
      ld_32 = MathMax(High[li_92], ld_32);
      ld_48 = MathMin(Low[li_92], ld_48);
      ld_56 = Close[li_92];
   }
   ld_24 = Open[li_64];
   ld_8 = -99999;
   ld_16 = 99999;
   for (int li_96 = li_64; li_96 >= 0; li_96--) {
      ld_8 = MathMax(ld_8, High[li_96]);
      ld_16 = MathMin(ld_16, Low[li_96]);
   }
   double ld_100 = (ld_32 + ld_48 + ld_56) / 3.0;
   f0_1("YesterdayStart", "yesterday", li_68, DayLabel, ld_100 - 4.0 * Point);
   f0_1("YesterdayEnd", "today", li_64, DayLabel, ld_100 - 4.0 * Point);
   if (DebugLogger) Print("Timezoned values: yo= ", ld_40, ", yc =", ld_56, ", yhigh= ", ld_32, ", ylow= ", ld_48, ", to= ", ld_24);
   double ld_124 = ld_8 - ld_16;
   double ld_116 = ld_32 - ld_48;
   double ld_108 = (ld_32 + ld_48 + ld_56) / 3.0;
   ld_108 = NormalizeDouble(ld_108, gi_192);
   ls_76 = Symbol() + "p";
   ld_84 = ld_108;
   GlobalVariableSet(ls_76, ld_84);
   double ld_132 = 2.0 * ld_108 - ld_48;
   ld_132 = NormalizeDouble(ld_132, gi_192);
   ls_76 = Symbol() + "r1";
   ld_84 = ld_132;
   GlobalVariableSet(ls_76, ld_84);
   double ld_140 = ld_108 + (ld_32 - ld_48);
   ld_140 = NormalizeDouble(ld_140, gi_192);
   ls_76 = Symbol() + "r2";
   ld_84 = ld_140;
   GlobalVariableSet(ls_76, ld_84);
   double ld_148 = 2.0 * ld_108 + (ld_32 - 2.0 * ld_48);
   ld_148 = NormalizeDouble(ld_148, gi_192);
   ls_76 = Symbol() + "r3";
   ld_84 = ld_148;
   GlobalVariableSet(ls_76, ld_84);
   double ld_156 = 2.0 * ld_108 - ld_32;
   ld_156 = NormalizeDouble(ld_156, gi_192);
   ls_76 = Symbol() + "s1";
   ld_84 = ld_156;
   GlobalVariableSet(ls_76, ld_84);
   double ld_164 = ld_108 - (ld_32 - ld_48);
   ld_164 = NormalizeDouble(ld_164, gi_192);
   ls_76 = Symbol() + "s2";
   ld_84 = ld_164;
   GlobalVariableSet(ls_76, ld_84);
   double ld_172 = 2.0 * ld_108 - (2.0 * ld_32 - ld_48);
   ld_172 = NormalizeDouble(ld_172, gi_192);
   ls_76 = Symbol() + "s3";
   ld_84 = ld_172;
   GlobalVariableSet(ls_76, ld_84);
   if (ShowHighLowOpen) {
      f0_2("Y\'s High", ld_32, HighLowOpenColor, LineStyle, LineThickness, lt_4);
      f0_2("T\'s Open", ld_24, HighLowOpenColor, LineStyle, LineThickness, li_0);
      f0_2("Y\'s Low", ld_48, HighLowOpenColor, LineStyle, LineThickness, lt_4);
      ls_76 = Symbol() + "yh";
      ld_84 = ld_32;
      GlobalVariableSet(ls_76, ld_84);
      ls_76 = Symbol() + "to";
      ld_84 = ld_24;
      GlobalVariableSet(ls_76, ld_84);
      ls_76 = Symbol() + "yl";
      ld_84 = ld_48;
      GlobalVariableSet(ls_76, ld_84);
   }
   if (ShowSweetSpots) {
      li_180 = Bid / Point;
      li_180 -= li_180 % 50;
      li_184 = li_180 + 50;
      ld_188 = li_180 * Point;
      ld_196 = li_184 * Point;
      f0_2(DoubleToStr(ld_188, Digits), ld_188, SweetSpotsColor, LineStyle, LineThickness, Time[10]);
      f0_2(DoubleToStr(ld_196, Digits), ld_196, SweetSpotsColor, LineStyle, LineThickness, Time[10]);
      ls_76 = Symbol() + "ds1";
      ld_84 = ld_188;
      GlobalVariableSet(ls_76, ld_84);
      ls_76 = Symbol() + "ds2";
      ld_84 = ld_196;
      GlobalVariableSet(ls_76, ld_84);
   }
   if (ShowPivots == TRUE) {
      f0_2("R1", ld_132, ResistanceColor, LineStyle, LineThickness, li_0);
      f0_2("R2", ld_140, ResistanceColor, LineStyle, LineThickness, li_0);
      f0_2("R3", ld_148, ResistanceColor, LineStyle, LineThickness, li_0);
      f0_2("Pivot", ld_108, PivotColor, LineStyle, LineThickness, li_0);
      f0_2("S1", ld_156, SuportColor, LineStyle, LineThickness, li_0);
      f0_2("S2", ld_164, SuportColor, LineStyle, LineThickness, li_0);
      f0_2("S3", ld_172, SuportColor, LineStyle, LineThickness, li_0);
   }
   if (ShowFibos) {
      f0_2("Low - 61.8%", ld_48 - 0.618 * ld_116, FibosColor, LineStyle, LineThickness, li_0);
      f0_2("Low - 38.2%", ld_48 - ld_116 / 2.0, FibosColor, LineStyle, LineThickness, li_0);
      f0_2("Low + 38.2%", ld_48 + ld_116 / 2.0, FibosColor, LineStyle, LineThickness, li_0);
      f0_2("LowHigh 50%", ld_48 + ld_116 / 2.0, FibosColor, LineStyle, LineThickness, li_0);
      f0_2("High - 38.2%", ld_32 - ld_116 / 2.0, FibosColor, LineStyle, LineThickness, li_0);
      f0_2("High + 38.2%", ld_32 + ld_116 / 2.0, FibosColor, LineStyle, LineThickness, li_0);
      f0_2("High + 61.8%", ld_32 + 0.618 * ld_116, FibosColor, LineStyle, LineThickness, li_0);
      ls_76 = Symbol() + "flm618";
      ld_84 = ld_48 - 0.618 * ld_116;
      ld_84 = NormalizeDouble(ld_84, gi_192);
      GlobalVariableSet(ls_76, ld_84);
      ls_76 = Symbol() + "flm382";
      ld_84 = ld_48 - ld_116 / 2.0;
      ld_84 = NormalizeDouble(ld_84, gi_192);
      GlobalVariableSet(ls_76, ld_84);
      ls_76 = Symbol() + "flp382";
      ld_84 = ld_48 + ld_116 / 2.0;
      ld_84 = NormalizeDouble(ld_84, gi_192);
      GlobalVariableSet(ls_76, ld_84);
      ls_76 = Symbol() + "flp5";
      ld_84 = ld_48 + ld_116 / 2.0;
      ld_84 = NormalizeDouble(ld_84, gi_192);
      GlobalVariableSet(ls_76, ld_84);
      ls_76 = Symbol() + "fhm382";
      ld_84 = ld_32 - ld_116 / 2.0;
      ld_84 = NormalizeDouble(ld_84, gi_192);
      GlobalVariableSet(ls_76, ld_84);
      ls_76 = Symbol() + "fhp382";
      ld_84 = ld_32 + ld_116 / 2.0;
      ld_84 = NormalizeDouble(ld_84, gi_192);
      GlobalVariableSet(ls_76, ld_84);
      ls_76 = Symbol() + "fhp618";
      ld_84 = ld_32 + 0.618 * ld_116;
      ld_84 = NormalizeDouble(ld_84, gi_192);
      GlobalVariableSet(ls_76, ld_84);
   }
   if (ShowCamarilla == TRUE) {
      ld_204 = 0.55 * ld_116 + ld_56;
      ld_212 = 0.27 * ld_116 + ld_56;
      ld_228 = ld_56 - 0.27 * ld_116;
      ld_220 = ld_56 - 0.55 * ld_116;
      f0_2("H3", ld_212, CamarillaColor, LineStyle, LineThickness, li_0);
      f0_2("H4", ld_204, CamarillaColor, LineStyle, LineThickness, li_0);
      f0_2("L3", ld_228, CamarillaColor, LineStyle, LineThickness, li_0);
      f0_2("L4", ld_220, CamarillaColor, LineStyle, LineThickness, li_0);
      ls_76 = Symbol() + "h3";
      ld_84 = ld_212;
      ld_84 = NormalizeDouble(ld_84, gi_192);
      GlobalVariableSet(ls_76, ld_84);
      ls_76 = Symbol() + "h4";
      ld_84 = ld_204;
      ld_84 = NormalizeDouble(ld_84, gi_192);
      GlobalVariableSet(ls_76, ld_84);
      ls_76 = Symbol() + "l3";
      ld_84 = ld_228;
      ld_84 = NormalizeDouble(ld_84, gi_192);
      GlobalVariableSet(ls_76, ld_84);
      ls_76 = Symbol() + "l4";
      ld_84 = ld_220;
      ld_84 = NormalizeDouble(ld_84, gi_192);
      GlobalVariableSet(ls_76, ld_84);
   }
   if (ShowMidPivot == TRUE) {
      f0_2("MR3", (ld_140 + ld_148) / 2.0, MidPivotColor, LineStyleMidP, LineThicknessMidP, li_0);
      f0_2("MR2", (ld_132 + ld_140) / 2.0, MidPivotColor, LineStyleMidP, LineThicknessMidP, li_0);
      f0_2("MR1", (ld_108 + ld_132) / 2.0, MidPivotColor, LineStyleMidP, LineThicknessMidP, li_0);
      f0_2("MS1", (ld_108 + ld_156) / 2.0, MidPivotColor, LineStyleMidP, LineThicknessMidP, li_0);
      f0_2("MS2", (ld_156 + ld_164) / 2.0, MidPivotColor, LineStyleMidP, LineThicknessMidP, li_0);
      f0_2("MS3", (ld_164 + ld_172) / 2.0, MidPivotColor, LineStyleMidP, LineThicknessMidP, li_0);
      ls_76 = Symbol() + "mr3";
      ld_84 = (ld_140 + ld_148) / 2.0;
      ld_84 = NormalizeDouble(ld_84, gi_192);
      GlobalVariableSet(ls_76, ld_84);
      ls_76 = Symbol() + "mr2";
      ld_84 = (ld_132 + ld_140) / 2.0;
      ld_84 = NormalizeDouble(ld_84, gi_192);
      GlobalVariableSet(ls_76, ld_84);
      ls_76 = Symbol() + "mr1";
      ld_84 = (ld_108 + ld_132) / 2.0;
      ld_84 = NormalizeDouble(ld_84, gi_192);
      GlobalVariableSet(ls_76, ld_84);
      ls_76 = Symbol() + "ms1";
      ld_84 = (ld_108 + ld_156) / 2.0;
      ld_84 = NormalizeDouble(ld_84, gi_192);
      GlobalVariableSet(ls_76, ld_84);
      ls_76 = Symbol() + "ms2";
      ld_84 = (ld_108 + ld_164) / 2.0;
      ld_84 = NormalizeDouble(ld_84, gi_192);
      GlobalVariableSet(ls_76, ld_84);
      ls_76 = Symbol() + "ms3";
      ld_84 = (ld_108 + ld_172) / 2.0;
      ld_84 = NormalizeDouble(ld_84, gi_192);
      GlobalVariableSet(ls_76, ld_84);
   }
   if (ShowComment) {
      ls_236 = "";
      ls_236 = ls_236 + "-- Good luck with your trading! ---\n";
      ls_236 = ls_236 + "Range: Yesterday " + DoubleToStr(MathRound(ld_116 / Point), 0) + " pips, Today " + DoubleToStr(MathRound(ld_124 / Point), 0) + " pips" 
      + "\n";
      ls_236 = ls_236 + "Highs: Yesterday " + DoubleToStr(ld_32, Digits) + ", Today " + DoubleToStr(ld_8, Digits) 
      + "\n";
      ls_236 = ls_236 + "Lows:  Yesterday " + DoubleToStr(ld_48, Digits) + ", Today " + DoubleToStr(ld_16, Digits) 
      + "\n";
      ls_236 = ls_236 + "Close: Yesterday " + DoubleToStr(ld_56, Digits) 
      + "\n";
      Comment(ls_236);
   }
   return (0);
}

void f0_0(int ai_0, int ai_4, int &ai_8, int &ai_12, int &ai_16) {
   int li_52;
   int li_60;
   int li_64;
   int li_20 = ai_0 - ai_4;
   int li_24 = 3600 * li_20;
   int li_28 = 1440;
   int li_32 = li_28 / Period();
   int li_36 = TimeDayOfWeek(Time[0] - li_24);
   int li_40 = -1;
   ai_8 = 0;
   ai_12 = 0;
   ai_16 = 0;
   switch (li_36) {
   case 6:
   case 0:
   case 1:
      li_40 = 5;
      break;
   default:
      li_40 = li_36 - 1;
   }
   if (DebugLogger) {
      Print("Dayofweektoday= ", li_36);
      Print("Dayofweekyesterday= ", li_40);
   }
   for (int li_48 = 1; li_48 <= li_32 + 1; li_48++) {
      li_52 = Time[li_48] - li_24;
      if (TimeDayOfWeek(li_52) != li_36) {
         ai_8 = li_48 - 1;
         break;
      }
   }
   for (int li_56 = 0; li_56 <= li_32 * 2 + 1; li_56++) {
      li_60 = Time[li_48 + li_56] - li_24;
      if (TimeDayOfWeek(li_60) == li_40) {
         ai_16 = li_48 + li_56;
         break;
      }
   }
   for (li_56 = 1; li_56 <= li_32; li_56++) {
      li_64 = Time[ai_16 + li_56] - li_24;
      if (TimeDayOfWeek(li_64) != li_40) {
         ai_12 = ai_16 + li_56 - 1;
         break;
      }
   }
   if (DebugLogger) {
      Print("Dest time zone\'s current day starts:", TimeToStr(Time[ai_8]), " (local time), idxbar= ", ai_8);
      Print("Dest time zone\'s previous day starts:", TimeToStr(Time[ai_12]), " (local time), idxbar= ", ai_12);
      Print("Dest time zone\'s previous day ends:", TimeToStr(Time[ai_16]), " (local time), idxbar= ", ai_16);
   }
}

void f0_2(string as_0, double ad_8, color ai_16, int ai_20, int ai_24, int ai_28) {
   int li_32 = Digits;
   string ls_36 = "[PIVOT] " + as_0 + " Label";
   string ls_44 = "[PIVOT] " + as_0 + " Line";
   if (ObjectFind(ls_44) != 0) {
      ObjectCreate(ls_44, OBJ_TREND, 0, ai_28, ad_8, Time[0], ad_8);
      ObjectSet(ls_44, OBJPROP_STYLE, ai_20);
      ObjectSet(ls_44, OBJPROP_COLOR, ai_16);
      ObjectSet(ls_44, OBJPROP_WIDTH, ai_24);
   } else {
      ObjectMove(ls_44, 1, Time[0], ad_8);
      ObjectMove(ls_44, 0, ai_28, ad_8);
   }
   if (ObjectFind(ls_36) != 0) ObjectCreate(ls_36, OBJ_TEXT, 0, MathMin(Time[BarForLabels], ai_28 + 60 * (Period() * 2)), ad_8);
   else ObjectMove(ls_36, 0, MathMin(Time[BarForLabels], ai_28 + 60 * (Period() * 2)), ad_8);
   string ls_52 = " " + as_0;
   if (ShowLevelPrices && StrToInteger(as_0) == 0) ls_52 = ls_52 + ": " + DoubleToStr(ad_8, Digits);
   ObjectSetText(ls_36, ls_52, 8, "Arial", LabelColor);
}

void f0_1(string as_0, string as_8, int ai_16, color ai_20, double ad_24) {
   string ls_32 = "[PIVOT] " + as_0;
   int li_40 = Time[ai_16];
   if (ObjectFind(ls_32) != 0) ObjectCreate(ls_32, OBJ_TREND, 0, li_40, 0, li_40, 100);
   else {
      ObjectMove(ls_32, 0, li_40, 0);
      ObjectMove(ls_32, 1, li_40, 100);
   }
   ObjectSet(ls_32, OBJPROP_STYLE, STYLE_DOT);
   ObjectSet(ls_32, OBJPROP_COLOR, DaySeparator);
   if (ObjectFind(ls_32 + " Label") != 0) ObjectCreate(ls_32 + " Label", OBJ_TEXT, 0, li_40, ad_24);
   else ObjectMove(ls_32 + " Label", 0, li_40, ad_24);
   ObjectSetText(ls_32 + " Label", as_8, 8, "Arial", ai_20);
}