
#property indicator_chart_window
#property indicator_buffers 5

#property indicator_color1 RoyalBlue
#property indicator_color2 LimeGreen
#property indicator_color3 LimeGreen
#property indicator_color4 Goldenrod
#property indicator_color5 Goldenrod

extern bool SoundAlert = false;

extern string SoundFile1 = "ahooga.wav";
extern string SoundFile2 = "Corkpop.wav";
extern string SoundFile3 = "siren.wav";

extern bool ShowPriceBox = true;

extern int myBoxWidth = 1;
extern int bars_back = 120;
extern int m = 2;
extern int i = 0;

extern double kstd = 2.0;
extern int sName = 1102;

double Var01[],Var02[],Var03[],Var04[],Var05[],Var06[10][10],Var07[10],Var08[10],Var09[20],Var10,Var14,Var15,Var16,Var22,Var23;
int Var11,Var12,Var13,Var17,Var18,Var19,Var20,Var21,Var27,Var28,Var34;
string Var24,Var25,Var26;
int Var29=-1,Var30=65535,Var31=16777215;

int init() {
   Var28 = Period();
   Var25 = TimeFrameToString(Var28);
   Var24 = Symbol();
   Var27 = Digits;
   Var26 = "shict" + Var24 + Var25;
   IndicatorShortName("Center of Gravity");
   SetIndexStyle(0, DRAW_LINE);
   SetIndexBuffer(0, Var01);
   SetIndexBuffer(1, Var02);
   SetIndexBuffer(2, Var03);
   SetIndexBuffer(3, Var04);
   SetIndexBuffer(4, Var05);
   Var12 = MathRound(bars_back);
   Var21 = m + 1;
   ObjectCreate("pr" + sName, OBJ_ARROW, 0, Time[Var12], Var01[Var12]);
   ObjectSet("pr" + sName, OBJPROP_ARROWCODE, 159);
   return (0);
}

int deinit() {
   ObjectDelete("pr" + sName);
   ObjectDelete(Var26 + "01");
   ObjectDelete(Var26 + "02");
   ObjectDelete(Var26 + "03");
   ObjectDelete(Var26 + "04");
   ObjectDelete(Var26 + "05");
   return (0);
}

int start() {
   Var11 = iBarShift(Symbol(), Period(), ObjectGet("pr" + sName, OBJPROP_TIME1));
   Var12 = bars_back;
   Var09[1] = Var12 + 1;
   SetIndexDrawBegin(0, Bars - Var12 - 1);
   SetIndexDrawBegin(1, Bars - Var12 - 1);
   SetIndexDrawBegin(2, Bars - Var12 - 1);
   SetIndexDrawBegin(3, Bars - Var12 - 1);
   SetIndexDrawBegin(4, Bars - Var12 - 1);
   for (int li_0 = 1; li_0 <= Var21 * 2 - 2; li_0++) {
      Var10 = 0;
      for (Var13 = i; Var13 <= i + Var12; Var13++) Var10 += MathPow(Var13, li_0);
      Var09[li_0 + 1] = Var10;
   }
   for (li_0 = 1; li_0 <= Var21; li_0++) {
      Var10 = 0.0;
      for (Var13 = i; Var13 <= i + Var12; Var13++) {
         if (li_0 == 1) Var10 += Close[Var13];
         else Var10 += Close[Var13] * MathPow(Var13, li_0 - 1);
      }
      Var07[li_0] = Var10;
   }
   for (Var18 = 1; Var18 <= Var21; Var18++) {
      for (Var17 = 1; Var17 <= Var21; Var17++) {
         Var19 = Var17 + Var18 - 1;
         Var06[Var17][Var18] = Var09[Var19];
      }
   }
   for (Var19 = 1; Var19 <= Var21 - 1; Var19++) {
      Var20 = 0;
      Var15 = 0;
      for (Var17 = Var19; Var17 <= Var21; Var17++) {
         if (MathAbs(Var06[Var17][Var19]) > Var15) {
            Var15 = MathAbs(Var06[Var17][Var19]);
            Var20 = Var17;
         }
      }
      if (Var20 == 0) return (0);
      if (Var20 != Var19) {
         for (Var18 = 1; Var18 <= Var21; Var18++) {
            Var16 = Var06[Var19][Var18];
            Var06[Var19][Var18] = Var06[Var20][Var18];
            Var06[Var20][Var18] = Var16;
         }
         Var16 = Var07[Var19];
         Var07[Var19] = Var07[Var20];
         Var07[Var20] = Var16;
      }
      for (Var17 = Var19 + 1; Var17 <= Var21; Var17++) {
         Var14 = Var06[Var17][Var19] / Var06[Var19][Var19];
         for (Var18 = 1; Var18 <= Var21; Var18++) {
            if (Var18 == Var19) Var06[Var17][Var18] = 0;
            else Var06[Var17][Var18] = Var06[Var17][Var18] - Var14 * Var06[Var19][Var18];
         }
         Var07[Var17] = Var07[Var17] - Var14 * Var07[Var19];
      }
   }
   Var08[Var21] = Var07[Var21] / Var06[Var21][Var21];
   for (Var17 = Var21 - 1; Var17 >= 1; Var17--) {
      Var16 = 0;
      for (Var18 = 1; Var18 <= Var21 - Var17; Var18++) {
         Var16 += (Var06[Var17][Var17 + Var18]) * (Var08[Var17 + Var18]);
         Var08[Var17] = 1 / Var06[Var17][Var17] * (Var07[Var17] - Var16);
      }
   }
   for (Var13 = i; Var13 <= i + Var12; Var13++) {
      Var10 = 0;
      for (Var19 = 1; Var19 <= m; Var19++) Var10 += (Var08[Var19 + 1]) * MathPow(Var13, Var19);
      Var01[Var13] = Var08[1] + Var10;
   }
   Var22 = 0.0;
   for (Var13 = i; Var13 <= i + Var12; Var13++) Var22 += MathPow(Close[Var13] - Var01[Var13], 2);
   Var22 = MathSqrt(Var22 / (Var12 + 1)) * kstd;
   Var23 = iStdDev(NULL, 0, Var12, 0, MODE_SMA, PRICE_CLOSE, i) * kstd;
   for (Var13 = i; Var13 <= i + Var12; Var13++) {
      Var02[Var13] = Var01[Var13] + Var22;
      Var03[Var13] = Var01[Var13] - Var22;
      Var04[Var13] = Var01[Var13] + Var23;
      Var05[Var13] = Var01[Var13] - Var23;
   }
   ObjectMove("pr" + sName, 0, Time[Var12], Var01[Var12]);
   Var01[0] = NormalizeDouble(Var01[0], Var27);
   Var03[0] = NormalizeDouble(Var03[0], Var27);
   Var02[0] = NormalizeDouble(Var02[0], Var27);
   Var04[0] = NormalizeDouble(Var04[0], Var27);
   Var05[0] = NormalizeDouble(Var05[0], Var27);
   if (Var34 != Time[0] && SoundAlert) {
      if (Close[0] == Var01[0]) {
         Var34 = Time[0];
         PlaySound(SoundFile1);
      }
      if (Close[0] == Var02[0]) {
         Var34 = Time[0];
         PlaySound(SoundFile2);
      }
      if (Close[0] == Var03[0]) {
         Var34 = Time[0];
         PlaySound(SoundFile2);
      }
      if (Close[0] == Var04[0]) {
         Var34 = Time[0];
         PlaySound(SoundFile3);
      }
      if (Close[0] == Var05[0]) {
         Var34 = Time[0];
         PlaySound(SoundFile3);
      }
   }
   if (ShowPriceBox) DoBox();
   return (0);
}

void DoBox() {
   if (ObjectFind(Var26 + "01") != 0) {
      ObjectCreate(Var26 + "01", OBJ_ARROW, 0, Time[0], Var01[0]);
      ObjectSet(Var26 + "01", OBJPROP_ARROWCODE, SYMBOL_RIGHTPRICE);
      ObjectSet(Var26 + "01", OBJPROP_COLOR, RoyalBlue);
      ObjectSet(Var26 + "01", OBJPROP_WIDTH, myBoxWidth);
   } else {
      ObjectMove(Var26 + "01", 0, Time[0], Var01[0]);
      ObjectSet(Var26 + "01", OBJPROP_COLOR, RoyalBlue);
   }
   if (ObjectFind(Var26 + "02") != 0) {
      ObjectCreate(Var26 + "02", OBJ_ARROW, 0, Time[0], Var02[0]);
      ObjectSet(Var26 + "02", OBJPROP_ARROWCODE, SYMBOL_RIGHTPRICE);
      ObjectSet(Var26 + "02", OBJPROP_COLOR, LimeGreen);
      ObjectSet(Var26 + "02", OBJPROP_WIDTH, myBoxWidth);
   } else {
      ObjectMove(Var26 + "02", 0, Time[0], Var02[0]);
      ObjectSet(Var26 + "02", OBJPROP_COLOR, LimeGreen);
   }
   if (ObjectFind(Var26 + "03") != 0) {
      ObjectCreate(Var26 + "03", OBJ_ARROW, 0, Time[0], Var03[0]);
      ObjectSet(Var26 + "03", OBJPROP_ARROWCODE, SYMBOL_RIGHTPRICE);
      ObjectSet(Var26 + "03", OBJPROP_COLOR, LimeGreen);
      ObjectSet(Var26 + "03", OBJPROP_WIDTH, myBoxWidth);
   } else {
      ObjectMove(Var26 + "03", 0, Time[0], Var03[0]);
      ObjectSet(Var26 + "03", OBJPROP_COLOR, LimeGreen);
   }
   if (ObjectFind(Var26 + "04") != 0) {
      ObjectCreate(Var26 + "04", OBJ_ARROW, 0, Time[0], Var04[0]);
      ObjectSet(Var26 + "04", OBJPROP_ARROWCODE, SYMBOL_RIGHTPRICE);
      ObjectSet(Var26 + "04", OBJPROP_COLOR, Goldenrod);
      ObjectSet(Var26 + "04", OBJPROP_WIDTH, myBoxWidth);
   } else {
      ObjectMove(Var26 + "04", 0, Time[0], Var04[0]);
      ObjectSet(Var26 + "04", OBJPROP_COLOR, Goldenrod);
   }
   if (ObjectFind(Var26 + "05") != 0) {
      ObjectCreate(Var26 + "05", OBJ_ARROW, 0, Time[0], Var05[0]);
      ObjectSet(Var26 + "05", OBJPROP_ARROWCODE, SYMBOL_RIGHTPRICE);
      ObjectSet(Var26 + "05", OBJPROP_COLOR, Goldenrod);
      ObjectSet(Var26 + "05", OBJPROP_WIDTH, myBoxWidth);
      return;
   }
   ObjectMove(Var26 + "05", 0, Time[0], Var05[0]);
   ObjectSet(Var26 + "05", OBJPROP_COLOR, Goldenrod);
}

string TimeFrameToString(int Var33) {
   string Var32;
   switch (Var33) {
   case 1:
      Var32 = "M1";
      break;
   case 5:
      Var32 = "M5";
      break;
   case 15:
      Var32 = "M15";
      break;
   case 30:
      Var32 = "M30";
      break;
   case 60:
      Var32 = "H1";
      break;
   case 240:
      Var32 = "H4";
      break;
   case 1440:
      Var32 = "D1";
      break;
   case 10080:
      Var32 = "W1";
      break;
   case 43200:
      Var32 = "MN";
   }
   return (Var32);
}