/*
   G e n e r a t e d  by ex4-to-mq4 decompiler FREEWARE 4.0.509.5
   Website: Http: // W wW. M e t aQUoTeS. n Et
   E-mail :  SU ppOrt @ m etAq U o te s. ne t
*/
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"

#include <WinUser32.mqh>
//#include <stdlib.mqh>
#import "stdlib.ex4"
   string ErrorDescription(int a0); // DA69CBAFF4D38B87377667EEC549DE5A
   bool CompareDoubles(double a0, double a1); // 3AD21CD8C006FF1571E191BE69ADAC49
#import "user32.dll"
   int RegisterWindowMessageA(string a0);
#import

extern int RenkoBoxSize = 10;
extern int RenkoBoxOffset = 0;
extern int RenkoTimeFrame = 2;
extern bool ShowWicks = TRUE;
extern bool EmulateOnLineChart = TRUE;
extern bool StrangeSymbolName = FALSE;
int G_file_100 = -1;
int Gi_104 = 0;
int Gi_108 = WM_NULL;
string Gs_112;
int Gi_120 = 0;
double Gd_124;
double Gd_132;
double Gd_140;
double Gd_148;
double Gd_156;
double Gd_164;
double Gd_172;
double Gd_180;
double Gd_188;
double Gd_196;
double G_close_204;
double G_close_212;
int G_time_220;

// D27976E8A89302260DF2848BFF6FEBFC
void f0_0() {
   if (Gi_120 == 0) {
      Gi_120 = WindowHandle(Gs_112, RenkoTimeFrame);
      if (Gi_120 != 0) Print("Chart window detected");
   }
   if (EmulateOnLineChart && Gi_108 == 0) Gi_108 = RegisterWindowMessageA("MetaTrader4_Internal_Message");
   if (Gi_120 != 0)
      if (PostMessageA(Gi_120, WM_COMMAND, 33324, 0) == 0) Gi_120 = 0;
   if (Gi_120 != 0 && Gi_108 != 0) PostMessageA(Gi_120, Gi_108, 2, 1);
}

// EA2B2676C28C0DB26D39331A336C6B92
int start() {
   int Li_4;
   int Li_8;
   int Lia_12[13];
   int Li_20;
   if (G_file_100 < 0) {
      if (!IsConnected()) {
         Print("Waiting for connection...");
         return (0);
      }
      if (!IsDllsAllowed()) {
         Print("Error: Dll calls must be allowed!");
         return (-1);
      }
      if (MathAbs(RenkoBoxOffset) >= RenkoBoxSize) {
         Print("Error: |RenkoBoxOffset| should be less then RenkoBoxSize!");
         return (-1);
      }
      switch (RenkoTimeFrame) {
      case PERIOD_M1:
      case PERIOD_M5:
      case PERIOD_M15:
      case PERIOD_M30:
      case PERIOD_H1:
      case PERIOD_H4:
      case PERIOD_D1:
      case PERIOD_W1:
      case PERIOD_MN1:
      case 0:
         Print("Error: Invald time frame used for offline renko chart (RenkoTimeFrame)!");
         return (-1);
      }
      Li_4 = RenkoBoxSize;
      Li_8 = RenkoBoxOffset;
      if (Digits == 5 || (Digits == 3 && StringFind(Symbol(), "JPY") != -1)) {
         Li_4 = 10 * Li_4;
         Li_8 = 10 * Li_8;
      }
      if (Digits == 6 || (Digits == 4 && StringFind(Symbol(), "JPY") != -1)) {
         Li_4 = 100 * Li_4;
         Li_8 = 100 * Li_8;
      }
      if (StrangeSymbolName) Gs_112 = StringSubstr(Symbol(), 0, 6);
      else Gs_112 = Symbol();
      Gd_124 = NormalizeDouble(Li_4 * Point, Digits);
      Gd_148 = NormalizeDouble(Li_8 * Point + MathFloor((Close[Bars - 1]) / Gd_124) * Gd_124, Digits);
      Gd_140 = Gd_148;
      Gd_156 = Gd_148 + Gd_124;
      Gd_132 = Gd_156;
      Gd_164 = Gd_148;
      Gd_172 = Gd_156;
      Gd_180 = 1;
      G_time_220 = Time[Bars - 1];
      G_file_100 = FileOpenHistory(Gs_112 + RenkoTimeFrame + ".hst", FILE_BIN|FILE_WRITE);
      if (G_file_100 < 0) {
         Print("Error: can\'t create / open history file: " + ErrorDescription(GetLastError()) + ": " + Gs_112 + RenkoTimeFrame + ".hst");
         return (-1);
      }
      FileWriteInteger(G_file_100, 400, LONG_VALUE);
      FileWriteString(G_file_100, "", 64);
      FileWriteString(G_file_100, Gs_112, 12);
      FileWriteInteger(G_file_100, RenkoTimeFrame, LONG_VALUE);
      FileWriteInteger(G_file_100, Digits, LONG_VALUE);
      FileWriteInteger(G_file_100, 0, LONG_VALUE);
      FileWriteInteger(G_file_100, 0, LONG_VALUE);
      FileWriteArray(G_file_100, Lia_12, 0, 13);
      for (int Li_16 = Bars - 2; Li_16 >= 0; Li_16--) {
         Gd_180 += Volume[Li_16];
         Gd_132 = MathMax(Gd_132, High[Li_16]);
         Gd_140 = MathMin(Gd_140, Low[Li_16]);
         Li_20 = High[Li_16] + Low[Li_16] > High[Li_16 + 1] + (Low[Li_16 + 1]);
         while (Li_20 && Low[Li_16] < Gd_148 - Gd_124 || CompareDoubles(Low[Li_16], Gd_148 - Gd_124)) {
            Gd_156 -= Gd_124;
            Gd_148 -= Gd_124;
            Gd_164 = Gd_156;
            Gd_172 = Gd_148;
            FileWriteInteger(G_file_100, G_time_220, LONG_VALUE);
            FileWriteDouble(G_file_100, Gd_164, DOUBLE_VALUE);
            FileWriteDouble(G_file_100, Gd_148, DOUBLE_VALUE);
            if (ShowWicks && Gd_132 > Gd_156) FileWriteDouble(G_file_100, Gd_132, DOUBLE_VALUE);
            else FileWriteDouble(G_file_100, Gd_156, DOUBLE_VALUE);
            FileWriteDouble(G_file_100, Gd_172, DOUBLE_VALUE);
            FileWriteDouble(G_file_100, Gd_180, DOUBLE_VALUE);
            Gd_132 = 0;
            Gd_140 = EMPTY_VALUE;
            Gd_180 = 0;
            Gd_196 = Gd_148;
            Gd_188 = Gd_148;
            if (G_time_220 < Time[Li_16]) G_time_220 = Time[Li_16];
            else G_time_220++;
         }
         if (High[Li_16] > Gd_156 + Gd_124 || CompareDoubles(High[Li_16], Gd_156 + Gd_124)) {
            while (true) {
               Gd_156 += Gd_124;
               Gd_148 += Gd_124;
               Gd_164 = Gd_148;
               Gd_172 = Gd_156;
               FileWriteInteger(G_file_100, G_time_220, LONG_VALUE);
               FileWriteDouble(G_file_100, Gd_164, DOUBLE_VALUE);
               if (ShowWicks && Gd_140 < Gd_148) FileWriteDouble(G_file_100, Gd_140, DOUBLE_VALUE);
               else FileWriteDouble(G_file_100, Gd_148, DOUBLE_VALUE);
               FileWriteDouble(G_file_100, Gd_156, DOUBLE_VALUE);
               FileWriteDouble(G_file_100, Gd_172, DOUBLE_VALUE);
               FileWriteDouble(G_file_100, Gd_180, DOUBLE_VALUE);
               Gd_132 = 0;
               Gd_140 = EMPTY_VALUE;
               Gd_180 = 0;
               Gd_196 = Gd_156;
               Gd_188 = Gd_156;
               if (G_time_220 < Time[Li_16]) G_time_220 = Time[Li_16];
               else G_time_220++;
               if (High[Li_16] > Gd_156 + Gd_124 || CompareDoubles(High[Li_16], Gd_156 + Gd_124)) continue;
               break;
            }
         }
         while (!Li_20 && Low[Li_16] < Gd_148 - Gd_124 || CompareDoubles(Low[Li_16], Gd_148 - Gd_124)) {
            Gd_156 -= Gd_124;
            Gd_148 -= Gd_124;
            Gd_164 = Gd_156;
            Gd_172 = Gd_148;
            FileWriteInteger(G_file_100, G_time_220, LONG_VALUE);
            FileWriteDouble(G_file_100, Gd_164, DOUBLE_VALUE);
            FileWriteDouble(G_file_100, Gd_148, DOUBLE_VALUE);
            if (ShowWicks && Gd_132 > Gd_156) FileWriteDouble(G_file_100, Gd_132, DOUBLE_VALUE);
            else FileWriteDouble(G_file_100, Gd_156, DOUBLE_VALUE);
            FileWriteDouble(G_file_100, Gd_172, DOUBLE_VALUE);
            FileWriteDouble(G_file_100, Gd_180, DOUBLE_VALUE);
            Gd_132 = 0;
            Gd_140 = EMPTY_VALUE;
            Gd_180 = 0;
            Gd_196 = Gd_148;
            Gd_188 = Gd_148;
            if (G_time_220 < Time[Li_16]) G_time_220 = Time[Li_16];
            else G_time_220++;
         }
      }
      Gi_104 = FileTell(G_file_100);
      Comment("RenkoLiveChart(" + RenkoBoxSize + "): Open Offline ", Gs_112, ",M", RenkoTimeFrame, " to view chart");
      if (Close[0] > MathMax(Gd_172, Gd_164)) G_close_204 = MathMax(Gd_172, Gd_164);
      else {
         if (Close[0] < MathMin(Gd_172, Gd_164)) G_close_204 = MathMin(Gd_172, Gd_164);
         else G_close_204 = Close[0];
      }
      G_close_212 = Close[0];
      if (Gd_132 > Gd_156) Gd_196 = Gd_132;
      if (Gd_140 < Gd_148) Gd_188 = Gd_140;
      FileWriteInteger(G_file_100, G_time_220, LONG_VALUE);
      FileWriteDouble(G_file_100, G_close_204, DOUBLE_VALUE);
      FileWriteDouble(G_file_100, Gd_188, DOUBLE_VALUE);
      FileWriteDouble(G_file_100, Gd_196, DOUBLE_VALUE);
      FileWriteDouble(G_file_100, G_close_212, DOUBLE_VALUE);
      FileWriteDouble(G_file_100, Gd_180, DOUBLE_VALUE);
      FileFlush(G_file_100);
      f0_0();
      return (0);
   }
   Gd_132 = MathMax(Gd_132, Bid);
   Gd_140 = MathMin(Gd_140, Bid);
   Gd_180++;
   FileSeek(G_file_100, Gi_104, SEEK_SET);
   if (Bid > Gd_156 + Gd_124 || CompareDoubles(Bid, Gd_156 + Gd_124)) {
      Gd_156 += Gd_124;
      Gd_148 += Gd_124;
      Gd_164 = Gd_148;
      Gd_172 = Gd_156;
      FileWriteInteger(G_file_100, G_time_220, LONG_VALUE);
      FileWriteDouble(G_file_100, Gd_164, DOUBLE_VALUE);
      if (ShowWicks && Gd_140 < Gd_148) FileWriteDouble(G_file_100, Gd_140, DOUBLE_VALUE);
      else FileWriteDouble(G_file_100, Gd_148, DOUBLE_VALUE);
      FileWriteDouble(G_file_100, Gd_156, DOUBLE_VALUE);
      FileWriteDouble(G_file_100, Gd_172, DOUBLE_VALUE);
      FileWriteDouble(G_file_100, Gd_180, DOUBLE_VALUE);
      FileFlush(G_file_100);
      Gi_104 = FileTell(G_file_100);
      if (G_time_220 < TimeCurrent()) G_time_220 = TimeCurrent();
      else G_time_220++;
      Gd_180 = 0;
      Gd_196 = Gd_156;
      Gd_188 = Gd_156;
      Gd_132 = 0;
      Gd_140 = EMPTY_VALUE;
      f0_0();
   } else {
      if (Bid < Gd_148 - Gd_124 || CompareDoubles(Bid, Gd_148 - Gd_124)) {
         Gd_156 -= Gd_124;
         Gd_148 -= Gd_124;
         Gd_164 = Gd_156;
         Gd_172 = Gd_148;
         FileWriteInteger(G_file_100, G_time_220, LONG_VALUE);
         FileWriteDouble(G_file_100, Gd_164, DOUBLE_VALUE);
         FileWriteDouble(G_file_100, Gd_148, DOUBLE_VALUE);
         if (ShowWicks && Gd_132 > Gd_156) FileWriteDouble(G_file_100, Gd_132, DOUBLE_VALUE);
         else FileWriteDouble(G_file_100, Gd_156, DOUBLE_VALUE);
         FileWriteDouble(G_file_100, Gd_172, DOUBLE_VALUE);
         FileWriteDouble(G_file_100, Gd_180, DOUBLE_VALUE);
         FileFlush(G_file_100);
         Gi_104 = FileTell(G_file_100);
         if (G_time_220 < TimeCurrent()) G_time_220 = TimeCurrent();
         else G_time_220++;
         Gd_180 = 0;
         Gd_196 = Gd_148;
         Gd_188 = Gd_148;
         Gd_132 = 0;
         Gd_140 = EMPTY_VALUE;
         f0_0();
      } else {
         if (Bid > Gd_196) Gd_196 = Bid;
         if (Bid < Gd_188) Gd_188 = Bid;
         if (Gd_156 <= Bid) G_close_204 = Gd_156;
         else {
            if (Gd_148 >= Bid) G_close_204 = Gd_148;
            else G_close_204 = Bid;
         }
         G_close_212 = Bid;
         FileWriteInteger(G_file_100, G_time_220, LONG_VALUE);
         FileWriteDouble(G_file_100, G_close_204, DOUBLE_VALUE);
         FileWriteDouble(G_file_100, Gd_188, DOUBLE_VALUE);
         FileWriteDouble(G_file_100, Gd_196, DOUBLE_VALUE);
         FileWriteDouble(G_file_100, G_close_212, DOUBLE_VALUE);
         FileWriteDouble(G_file_100, Gd_180, DOUBLE_VALUE);
         FileFlush(G_file_100);
         f0_0();
      }
   }
   return (0);
}

// 52D46093050F38C27267BCE42543EF60
int deinit() {
   if (G_file_100 >= 0) {
      FileClose(G_file_100);
      G_file_100 = -1;
   }
   Comment("");
   return (0);
}
