//+------------------------------------------------------------------+
//|                                          Period_Converter_Opt.mq4|
//|                      Copyright ?2005, MetaQuotes Software Corp.  |
//|                                        http://www.metaquotes.net |
//|             Modified by wfy05@talkforex based on Period_Converter|
//|                                        http://www.talkforex.com  |
//+------------------------------------------------------------------+

#property copyright "wfy05@talkforex.com"
#property link      "http://www.mql4.com/codebase/indicators/277/"
#property show_inputs

#property indicator_chart_window

#include <WinUser32.mqh>

extern double Version = 1.4;
extern string BuildInfo = "2005.12.24 by wfy05@talkforex.com";
extern int PeriodMultiplier = 2;
extern int OutputCSVFile = 0;
extern int UpdateInterval = 0;
extern bool Enabled = TRUE;
extern bool Debug = FALSE;
int G_file_112 = -1;
int G_file_116 = -1;
int Gi_120 = 0;
double Gd_124;
double Gd_132;
double Gd_140;
double Gd_148;
double Gd_156;
int Gi_164;
int Gi_168;
int Gi_172;
int Gi_176 = 0;
int G_time_180 = 0;
int G_time_184 = 0;
int G_bars_188 = 0;
int G_bars_192 = 0;
int G_time_196 = 0;
int G_volume_200 = 0;
string Gs_204 = "";
int Gi_212 = 0;

// D8DF3B29045CDAAA359E2E125ED5D993
void f0_8(string As_0) {
   if (Debug) Alert(As_0);
}

// E37F0136AA3FFAF149B351F6A4C948E9
int init() {
   if (PeriodMultiplier <= 1) {
      PeriodMultiplier = 1;
      OutputCSVFile = 2;
   }
   Gi_120 = Period() * PeriodMultiplier;
   if (f0_2() < 0) return (-1);
   f0_4();
   f0_3(Bars - 1, 1);
   f0_7();
   return (0);
}

// 52D46093050F38C27267BCE42543EF60
void deinit() {
   if (G_file_112 >= 0) {
      FileClose(G_file_112);
      G_file_112 = -1;
   }
   if (G_file_116 >= 0) {
      FileClose(G_file_116);
      G_file_116 = -1;
   }
}

// 3A9D90077F5E6F4710401B2E46A7E6F9
int f0_2() {
   string Ls_0 = Symbol() + Gi_120;
   if (OutputCSVFile != 2) {
      G_file_112 = FileOpenHistory(Ls_0 + ".hst", FILE_BIN|FILE_WRITE);
      if (G_file_112 < 0) return (-1);
   }
   if (OutputCSVFile != 0) {
      G_file_116 = FileOpen(Ls_0 + ".csv", FILE_CSV|FILE_WRITE, ',');
      if (G_file_116 < 0) return (-1);
   }
   return (0);
}

// 7544179684C090D4DB0745D50F801B2E
int f0_4() {
   int digits_8 = Digits;
   int Lia_12[13] = {0};
   int Li_16 = 400;
   if (G_file_112 < 0) return (-1);
   string Ls_0 = "(C)opyright 2003, MetaQuotes Software Corp.";
   FileWriteInteger(G_file_112, Li_16, LONG_VALUE);
   FileWriteString(G_file_112, Ls_0, 64);
   FileWriteString(G_file_112, Symbol(), 12);
   FileWriteInteger(G_file_112, Gi_120, LONG_VALUE);
   FileWriteInteger(G_file_112, digits_8, LONG_VALUE);
   FileWriteInteger(G_file_112, 0, LONG_VALUE);
   FileWriteInteger(G_file_112, 0, LONG_VALUE);
   FileWriteArray(G_file_112, Lia_12, 0, ArraySize(Lia_12));
   return (0);
}

// 2A8ACE0AAFB0FA38E9C268C1E5D1C4FC
void f0_1() {
   int digits_0;
   if (G_file_112 >= 0) {
      FileWriteInteger(G_file_112, Gi_164, LONG_VALUE);
      FileWriteDouble(G_file_112, Gd_124, DOUBLE_VALUE);
      FileWriteDouble(G_file_112, Gd_132, DOUBLE_VALUE);
      FileWriteDouble(G_file_112, Gd_140, DOUBLE_VALUE);
      FileWriteDouble(G_file_112, Gd_148, DOUBLE_VALUE);
      FileWriteDouble(G_file_112, Gd_156, DOUBLE_VALUE);
   }
   if (G_file_116 >= 0) {
      digits_0 = Digits;
      FileWrite(G_file_116, TimeToStr(Gi_164, TIME_DATE), TimeToStr(Gi_164, TIME_MINUTES), DoubleToStr(Gd_124, digits_0), DoubleToStr(Gd_140, digits_0), DoubleToStr(Gd_132,
         digits_0), DoubleToStr(Gd_148, digits_0), Gd_156);
   }
}

// 5C8F05985A1778B980119CB3D158D9C8
int f0_3(int Ai_0, bool Ai_4 = FALSE) {
   int Li_8;
   datetime time_20;
   int Li_12 = 60 * Gi_120;
   Gi_164 = Time[Ai_0] / Li_12;
   Gi_164 *= Li_12;
   if (Ai_4) {
      Gd_124 = Open[Ai_0];
      Gd_132 = Low[Ai_0];
      Gd_140 = High[Ai_0];
      Gd_148 = Close[Ai_0];
      Gd_156 = Volume[Ai_0];
      Li_8 = Ai_0 - 1;
      if (G_file_112 >= 0) Gi_168 = FileTell(G_file_112);
      if (G_file_116 >= 0) Gi_172 = FileTell(G_file_116);
   } else {
      Li_8 = Ai_0;
      if (G_file_112 >= 0) FileSeek(G_file_112, Gi_168, SEEK_SET);
      if (G_file_116 >= 0) FileSeek(G_file_116, Gi_172, SEEK_SET);
   }
   if (Li_8 < 0) return (-1);
   int count_16 = 0;
   while (Li_8 >= 0) {
      time_20 = Time[Li_8];
      if (time_20 >= Gi_164 + Li_12) {
         f0_1();
         count_16++;
         Gi_164 = time_20 / Li_12;
         Gi_164 *= Li_12;
         Gd_124 = Open[Li_8];
         Gd_132 = Low[Li_8];
         Gd_140 = High[Li_8];
         Gd_148 = Close[Li_8];
         Gd_156 = Volume[Li_8];
      } else {
         Gd_156 += Volume[Li_8];
         if (Low[Li_8] < Gd_132) Gd_132 = Low[Li_8];
         if (High[Li_8] > Gd_140) Gd_140 = High[Li_8];
         Gd_148 = Close[Li_8];
      }
      Li_8--;
   }
   if (G_file_112 >= 0) Gi_168 = FileTell(G_file_112);
   if (G_file_116 >= 0) Gi_172 = FileTell(G_file_116);
   f0_1();
   count_16++;
   Gd_156 -= Volume[0];
   if (G_file_112 >= 0) FileFlush(G_file_112);
   if (G_file_116 >= 0) FileFlush(G_file_116);
   return (count_16);
}

// D27976E8A89302260DF2848BFF6FEBFC
int f0_7() {
   if (G_file_112 < 0) return (-1);
   if (Gi_176 == 0) Gi_176 = WindowHandle(Symbol(), Gi_120);
   if (Gi_176 != 0) {
      if (IsDllsAllowed() == FALSE) {
         f0_8("Dll calls must be allowed");
         return (-1);
      }
      if (PostMessageA(Gi_176, WM_COMMAND, 33324, 0) == 0) Gi_176 = 0;
      else return (0);
   }
   return (-1);
}

// A959EB478B2A954E344E721CBFA6C15C
int f0_6() {
   deinit();
   init();
   G_time_180 = Time[Bars - 1];
   G_time_184 = Time[0];
   G_bars_188 = Bars;
   return (0);
}

// 948571D2A12F6B1A1ACC4F5A7B06EE78
int f0_5() {
   bool Li_ret_0 = FALSE;
   if (G_volume_200 != Volume[0]) {
      G_volume_200 = Volume[0];
      Li_ret_0 = TRUE;
   }
   if (G_time_196 != Time[0]) {
      G_time_196 = Time[0];
      Li_ret_0 = TRUE;
   }
   if (G_bars_192 != Bars) {
      G_bars_192 = Bars;
      Li_ret_0 = TRUE;
   }
   return (Li_ret_0);
}

// 109A6D70969BFFFF2E06805924C468DE
int f0_0() {
   if (Bars < 2) {
      f0_8("Data not loaded, only " + Bars + " Bars");
      return (-1);
   }
   string Ls_0 = AccountServer();
   if (Ls_0 == "") {
      f0_8("No server connected");
      return (-1);
   }
   if (Gs_204 != Ls_0) {
      f0_8("Server changed from " + Gs_204 + " to " + Ls_0);
      Gs_204 = Ls_0;
      f0_6();
      return (-1);
   }
   if (!f0_5()) return (-1);
   if (Time[Bars - 1] != G_time_180) {
      f0_8("Start time changed, new history loaded or server changed");
      f0_6();
      return (-1);
   }
   for (int index_8 = 0; index_8 < Bars; index_8++)
      if (Time[index_8] <= G_time_184) break;
   if (index_8 >= Bars || Time[index_8] != G_time_184) {
      f0_8("End time " + TimeToStr(G_time_184) + " not found");
      f0_6();
      return (-1);
   }
   int Li_12 = Bars - index_8;
   if (Li_12 != G_bars_188) {
      f0_8("Data loaded, cnt is " + Li_12 + " LastBarCount is " + G_bars_188);
      f0_6();
      return (-1);
   }
   G_bars_188 = Bars;
   G_time_184 = Time[0];
   return (index_8);
}

// EA2B2676C28C0DB26D39331A336C6B92
int start() {
   int Li_0;
   if (!Enabled) return (0);
   if (UpdateInterval != 0) {
      Li_0 = GetTickCount();
      if (MathAbs(Li_0 - Gi_212) < UpdateInterval) return (0);
      Gi_212 = Li_0;
   }
   int Li_4 = f0_0();
   if (Li_4 < 0) return (0);
   f0_3(Li_4);
   f0_7();
   return (0);
}
