
#property indicator_separate_window
#property indicator_minimum 0.0
#property indicator_maximum 1.0

string gs_76 = "Zoomer Pro ©";
int g_color_84 = Orange;
string g_fontname_88 = "Arial Bold";
int g_fontsize_96 = 15;
bool gi_100 = FALSE;
string gs_104 = "M1;M5;M15;M30;H1;H4;D1;W1;MN";
string gs_112 = "1Min;5Min;15Min;30Min;1Hour;4Hour;Day;Week;Month";
int gi_unused_120 = 16777215;
string gs_124 = "5;8;13;21;34;55;89;144";
string gs_132 = "...1...;...2...;...3...;...4...;...5...;...6...;...7...;...8...";
int g_color_140 = Gold;
string gs_trend_144 = "Trend";
extern bool AlternateFont = FALSE;
int gi_156 = 65280;
int gi_160 = 65535;
int gi_unused_164 = 65535;
int gi_168 = 65535;
int gi_172 = 255;
string gs_176 = "á";
string gs_184 = "ä";
string gs_unused_192 = "à";
string gs_200 = "æ";
string gs_208 = "â";
string gs_216;
int g_str_len_224;
int gi_228;
bool gi_232 = FALSE;
string gs_unused_236;
string gs_244;
int g_arr_size_252;
int g_arr_size_256;
int g_arr_size_260;
int g_arr_size_264;
int g_arr_size_268;
string gsa_272[];
string gsa_276[];
string gsa_280[];
string gsa_284[];
string gsa_288[];
string gsa_unused_292[];
string gs_unused_296 = "";
string gs_terminal_304 = "Terminal";
color g_color_312;
int gi_316 = 3;
int g_ma_method_320;
string g_text_324;
string gs_unused_332;
string g_text_340;
color g_color_348;
int gi_unused_356 = 255;
string gs_unused_360 = "Font Size";
int gi_unused_368 = 40;
string gs_unused_372 = "Font Type";
string gs_unused_380 = "Verdana";
string gs_zoom01_388 = "ZOOM01";
string gs_zoom02_396 = "ZOOM02";

int init() {
   string ls_0;
   gs_244 = Symbol();
   if (AlternateFont) gs_terminal_304 = "MS LineDraw";
   gs_104 = StringUpperCase(StringTrimLeft(StringTrimRight(gs_104)));
   if (StringSubstr(gs_104, StringLen(gs_104), 1) != ";") gs_104 = StringConcatenate(gs_104, ";");
   int li_8 = 0;
   for (int li_12 = StringFind(gs_104, ";", li_8); li_12 > 0; li_12 = StringFind(gs_104, ";", li_8)) {
      ls_0 = StringSubstr(gs_104, li_8, li_12 - li_8);
      ArrayResize(gsa_276, ArraySize(gsa_276) + 1);
      gsa_276[ArraySize(gsa_276) - 1] = ls_0;
      li_8 = li_12 + 1;
   }
   g_arr_size_256 = ArraySize(gsa_276);
   gs_112 = StringUpperCase(StringTrimLeft(StringTrimRight(gs_112)));
   if (StringSubstr(gs_112, StringLen(gs_112), 1) != ";") gs_112 = StringConcatenate(gs_112, ";");
   li_8 = 0;
   for (li_12 = StringFind(gs_112, ";", li_8); li_12 > 0; li_12 = StringFind(gs_112, ";", li_8)) {
      ls_0 = StringSubstr(gs_112, li_8, li_12 - li_8);
      ArrayResize(gsa_288, ArraySize(gsa_288) + 1);
      gsa_288[ArraySize(gsa_288) - 1] = ls_0;
      li_8 = li_12 + 1;
   }
   g_arr_size_268 = ArraySize(gsa_288);
   gs_124 = StringUpperCase(StringTrimLeft(StringTrimRight(gs_124)));
   if (StringSubstr(gs_124, StringLen(gs_124), 1) != ";") gs_124 = StringConcatenate(gs_124, ";");
   li_8 = 0;
   for (li_12 = StringFind(gs_124, ";", li_8); li_12 > 0; li_12 = StringFind(gs_124, ";", li_8)) {
      ls_0 = StringSubstr(gs_124, li_8, li_12 - li_8);
      ArrayResize(gsa_272, ArraySize(gsa_272) + 1);
      gsa_272[ArraySize(gsa_272) - 1] = ls_0;
      li_8 = li_12 + 1;
   }
   g_arr_size_252 = ArraySize(gsa_272);
   gs_132 = StringUpperCase(StringTrimLeft(StringTrimRight(gs_132)));
   if (StringSubstr(gs_132, StringLen(gs_132), 1) != ";") gs_132 = StringConcatenate(gs_132, ";");
   li_8 = 0;
   for (li_12 = StringFind(gs_132, ";", li_8); li_12 > 0; li_12 = StringFind(gs_132, ";", li_8)) {
      ls_0 = StringSubstr(gs_132, li_8, li_12 - li_8);
      ArrayResize(gsa_284, ArraySize(gsa_284) + 1);
      gsa_284[ArraySize(gsa_284) - 1] = ls_0;
      li_8 = li_12 + 1;
   }
   g_arr_size_264 = ArraySize(gsa_284);
   gs_trend_144 = StringUpperCase(StringTrimLeft(StringTrimRight(gs_trend_144)));
   if (StringSubstr(gs_trend_144, StringLen(gs_trend_144), 1) != ";") gs_trend_144 = StringConcatenate(gs_trend_144, ";");
   li_8 = 0;
   for (li_12 = StringFind(gs_trend_144, ";", li_8); li_12 > 0; li_12 = StringFind(gs_trend_144, ";", li_8)) {
      ls_0 = StringSubstr(gs_trend_144, li_8, li_12 - li_8);
      ArrayResize(gsa_280, ArraySize(gsa_280) + 1);
      gsa_280[ArraySize(gsa_280) - 1] = ls_0;
      li_8 = li_12 + 1;
   }
   g_arr_size_260 = ArraySize(gsa_280);
   if (IsMini()) gs_unused_296 = "m";
   gs_216 = MakeUniqueName("ZOO ", "");
   g_str_len_224 = StringLen(gs_216);
   IndicatorShortName(gs_216);
   switch (gi_316) {
   case 1:
      gs_unused_332 = "EMA";
      g_ma_method_320 = 1;
      break;
   case 2:
      gs_unused_332 = "SMMA";
      g_ma_method_320 = 2;
      break;
   case 3:
      gs_unused_332 = "LWMA";
      g_ma_method_320 = 3;
      break;
   case 4:
      gs_unused_332 = "LSMA";
      break;
   default:
      gs_unused_332 = "SMA";
      g_ma_method_320 = 0;
   }
   return (0);
}

int deinit() {
   ObjectsDeleteAll(gi_228);
   return (0);
}

int start() {
   string l_name_0;
   int li_unused_8 = 183179428;
   ObjectDelete(gs_zoom01_388);
   ObjectDelete(gs_zoom02_396);
   int li_12 = 40;
   int li_16 = 10;
   int li_20 = 20;
   int li_24 = 15;
   int li_28 = 20;
   int li_32 = 20;
   int li_36 = g_arr_size_252 * li_12 + li_16;
   int li_40 = g_arr_size_256 * li_24 + li_28;
   gi_228 = WindowFind(gs_216);
   if (!gi_232) {
      if (g_arr_size_256 != g_arr_size_268) {
         Comment("ERROR: missing row or row label");
         return (-1);
      }
      if (g_arr_size_252 != g_arr_size_264) {
         Comment("ERROR: missing column or column label");
         return (-1);
      }
      l_name_0 = gs_216 + "head" + gs_244;
      if (ObjectFind(l_name_0) == -1) {
         ObjectCreate(l_name_0, OBJ_LABEL, gi_228, 0, 0, 0, 0);
         ObjectSet(l_name_0, OBJPROP_XDISTANCE, 60);
         ObjectSet(l_name_0, OBJPROP_YDISTANCE, 1);
         ObjectSetText(l_name_0, gs_76 + "     " + gs_244, 10, g_fontname_88, g_color_84);
      }
      for (int l_index_44 = 0; l_index_44 < g_arr_size_260; l_index_44++) {
         for (int l_index_48 = 0; l_index_48 < g_arr_size_252; l_index_48++) {
            l_name_0 = gs_216 + "h" + l_index_44 + l_index_48;
            if (ObjectFind(l_name_0) == -1) ObjectCreate(l_name_0, OBJ_LABEL, gi_228, 0, 0, 0, 0);
            ObjectSet(l_name_0, OBJPROP_XDISTANCE, l_index_48 * li_12 + li_32 + li_36 * l_index_44 % 2);
            ObjectSet(l_name_0, OBJPROP_YDISTANCE, li_20 + li_40 * (l_index_44 / 2));
            ObjectSetText(l_name_0, gsa_284[l_index_48], 10, g_fontname_88, g_color_140);
         }
      }
   }
   for (l_index_44 = 0; l_index_44 < g_arr_size_260; l_index_44++) {
      for (l_index_48 = 0; l_index_48 < g_arr_size_252; l_index_48++) {
         for (int l_index_52 = 0; l_index_52 < g_arr_size_256; l_index_52++) {
            DoWork(gsa_276[l_index_52], gsa_272[l_index_48], gsa_280[l_index_44]);
            l_name_0 = gs_216 + "R" + l_index_52 + "C" + l_index_48 + "T" + l_index_44;
            if (ObjectFind(l_name_0) == -1) ObjectCreate(l_name_0, OBJ_LABEL, gi_228, 0, 0, 0, 0);
            ObjectSet(l_name_0, OBJPROP_XDISTANCE, l_index_48 * li_12 + li_32 + li_36 * l_index_44 % 2);
            ObjectSet(l_name_0, OBJPROP_YDISTANCE, l_index_52 * li_24 + li_20 + li_28 + li_40 * (l_index_44 / 2));
            if (gi_100) ObjectSetText(l_name_0, g_text_324, g_fontsize_96, "Wingdings", g_color_312);
            else ObjectSetText(l_name_0, "ÛÛÛÛ", 10, gs_terminal_304, g_color_312);
         }
      }
   }
   DoBias();
   ObjectsRedraw();
   return (0);
}

bool IsMini() {
   return (StringFind(Symbol(), "m") > -1);
}

string MakeUniqueName(string as_0, string as_8) {
   for (string ls_ret_16 = as_0 + (MathRand() % 1001) + as_8; WindowFind(ls_ret_16) > 0; ls_ret_16 = as_0 + (MathRand() % 1001) + as_8) {
   }
   return (ls_ret_16);
}

int stringToTimeFrame(string as_0) {
   int li_ret_8 = 0;
   as_0 = StringTrimLeft(StringTrimRight(StringUpperCase(as_0)));
   if (as_0 == "M1" || as_0 == "1") li_ret_8 = 1;
   if (as_0 == "M5" || as_0 == "5") li_ret_8 = 5;
   if (as_0 == "M15" || as_0 == "15") li_ret_8 = 15;
   if (as_0 == "M30" || as_0 == "30") li_ret_8 = 30;
   if (as_0 == "H1" || as_0 == "60") li_ret_8 = 60;
   if (as_0 == "H4" || as_0 == "240") li_ret_8 = 240;
   if (as_0 == "D1" || as_0 == "1440") li_ret_8 = 1440;
   if (as_0 == "W1" || as_0 == "10080") li_ret_8 = 10080;
   if (as_0 == "MN" || as_0 == "43200") li_ret_8 = 43200;
   return (li_ret_8);
}

string StringUpperCase(string as_0) {
   int li_8;
   string ls_ret_12 = as_0;
   for (int li_20 = StringLen(as_0) - 1; li_20 >= 0; li_20--) {
      li_8 = StringGetChar(ls_ret_12, li_20);
      if ((li_8 > '`' && li_8 < '{') || (li_8 > 'ß' && li_8 < 256)) ls_ret_12 = StringSetChar(ls_ret_12, li_20, li_8 - 32);
      else
         if (li_8 > -33 && li_8 < 0) ls_ret_12 = StringSetChar(ls_ret_12, li_20, li_8 + 224);
   }
   return (ls_ret_12);
}

void DoWork(string as_0, string as_8, string as_unused_16) {
   int l_timeframe_24 = stringToTimeFrame(as_0);
   int l_str2int_28 = StrToInteger(as_8);
   double l_iclose_32 = iClose(NULL, l_timeframe_24, 0);
   double l_iclose_40 = iClose(NULL, l_timeframe_24, 1);
   double l_ima_48 = iMA(NULL, l_timeframe_24, l_str2int_28, 0, g_ma_method_320, PRICE_CLOSE, 0);
   double l_ima_56 = iMA(NULL, l_timeframe_24, l_str2int_28, 0, g_ma_method_320, PRICE_CLOSE, 1);
   if (l_ima_48 > l_ima_56 && l_iclose_32 > l_ima_48) {
      gs_unused_236 = "+";
      g_text_324 = gs_176;
      g_color_312 = gi_156;
      return;
   }
   if (l_ima_48 <= l_ima_56 && l_iclose_32 > l_ima_48) {
      gs_unused_236 = "x";
      g_text_324 = gs_184;
      g_color_312 = gi_160;
      return;
   }
   if (l_ima_48 >= l_ima_56 && l_iclose_32 < l_ima_48) {
      gs_unused_236 = "x";
      g_text_324 = gs_200;
      g_color_312 = gi_168;
      return;
   }
   if (l_ima_48 < l_ima_56 && l_iclose_32 < l_ima_48) {
      gs_unused_236 = "-";
      g_text_324 = gs_208;
      g_color_312 = gi_172;
   }
}

void DoBias() {
   double l_iclose_0 = iClose(NULL, 0, 0);
   double l_ima_8 = iMA(NULL, PERIOD_M15, 89, 0, MODE_LWMA, PRICE_CLOSE, 0);
   if (l_iclose_0 >= l_ima_8) {
      g_text_340 = "LONG";
      g_color_348 = Lime;
   } else {
      g_text_340 = "SHORT";
      g_color_348 = Red;
   }
   string l_name_16 = gs_216 + "bias" + gs_244;
   if (ObjectFind(l_name_16) == -1) {
      ObjectCreate(l_name_16, OBJ_LABEL, gi_228, 0, 0, 0, 0);
      ObjectSet(l_name_16, OBJPROP_XDISTANCE, 290);
      ObjectSet(l_name_16, OBJPROP_YDISTANCE, 1);
      ObjectSetText(l_name_16, g_text_340, 10, g_fontname_88, g_color_348);
   }
}