//+------------------------------------------------------------------+
//|                                       DoubleMeanRenkoBuilder.mq4 |
//|                                                        mth depok |
//|                                         do your homework mate... |
//+------------------------------------------------------------------+
#property copyright "mth depok"
#property link      "do your homework mate..."

#property indicator_chart_window
#include <WinUser32.mqh>
#include <stdlib.mqh>
//+------------------------------------------------------------------+
#import "user32.dll"
	int RegisterWindowMessageW(string lpString); 
   int GetWindowTextW(int hWnd,string lpString,int nMaxCount);
   int PostMessageW(int hWnd,int Msg,int wParam,int lParam);
#import
//+------------------------------------------------------------------+

extern double  RenkoBoxSize1     = 10.0;
extern double  BoxShiftPercent1  = 45;
extern int     RenkoTimeFrame1   = 10;      // What time frame to use for the offline renko chart
extern int     RenkoBoxOffset1   = 0;
extern bool    ShowWicks1        = true;
extern int     MaxBars1          = 10000;

extern bool    Use2ndRenkoChart  = false;
extern double  RenkoBoxSize2     = 8.0;
extern double  BoxShiftPercent2  = 50;
extern int     RenkoTimeFrame2   = 8;      // What time frame to use for the offline renko chart
extern int     RenkoBoxOffset2   = 0;
extern bool    ShowWicks2        = true;
extern int     MaxBars2          = 10000;
extern bool    EmulateOnLineChart= true;
bool           StrangeSymbolName = false;
double         StartingPrice     = 190.001;  //161.001;
//+------------------------------------------------------------------+
int HstHandle1 = -1, LastFPos1 = 0, MT4InternalMsg1 = 0;
int HstHandle2 = -1, LastFPos2 = 0, MT4InternalMsg2 = 0;
string SymbolName;
//+------------------------------------------------------------------+
void UpdateChartWindow() {
	static int hwnd1 = 0;
	if(hwnd1 == 0) {
		hwnd1 = WindowHandle(SymbolName, RenkoTimeFrame1);
		if(hwnd1 != 0) Print("Chart window detected");
	}

	if(EmulateOnLineChart && MT4InternalMsg1 == 0) 
		MT4InternalMsg1 = RegisterWindowMessageW("MetaTrader4_Internal_Message");

	if(hwnd1 != 0) if(PostMessageW(hwnd1, WM_COMMAND, 0x822c, 0) == 0) hwnd1 = 0;
	if(hwnd1 != 0 && MT4InternalMsg1 != 0) PostMessageW(hwnd1, MT4InternalMsg1, 2, 1);

// drugi
	static int hwnd2 = 0;
	if(hwnd2 == 0) {
		hwnd2 = WindowHandle(SymbolName, RenkoTimeFrame2);
		if(hwnd2 != 0) Print("Chart window detected");
	}

	if(EmulateOnLineChart && MT4InternalMsg2 == 0) 
		MT4InternalMsg2 = RegisterWindowMessageW("MetaTrader4_Internal_Message");

	if(hwnd2 != 0) if(PostMessageW(hwnd2, WM_COMMAND, 0x822c, 0) == 0) hwnd2 = 0;
	if(hwnd2 != 0 && MT4InternalMsg2 != 0) PostMessageW(hwnd2, MT4InternalMsg2, 2, 1);
	return;
}
//+------------------------------------------------------------------+
int start() {
//PRVIXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
	static double BoxPoints1, UpWick1, DnWick1;
	static double PrevLow1, PrevHigh1, PrevOpen1, PrevClose1, CurVolume1, CurLow1, CurHigh1, CurOpen1, CurClose1;
	static datetime PrevTime1;
  		MqlRates rates;
   	
	//+------------------------------------------------------------------+
	// This is only executed ones, then the first tick arives.
	if(HstHandle1 < 0) {
		// Init
		if(!IsDllsAllowed()) {
			Print("Error: Dll calls must be allowed!");
			return(-1);
		}		
		if(MathAbs(RenkoBoxOffset1) >= RenkoBoxSize1) {
			Print("Error: |RenkoBoxOffset| should be less then RenkoBoxSize1!");
			return(-1);
		}
		//
		int BoxSize1 = RenkoBoxSize1;
		int BoxOffset1 = RenkoBoxOffset1;
		if(Digits == 5 || (Digits == 3 && StringFind(Symbol(), "JPY") != -1)) {
			BoxSize1 = BoxSize1*10;
			BoxOffset1 = BoxOffset1*10;
		}
		if(Digits == 6 || (Digits == 4 && StringFind(Symbol(), "JPY") != -1)) {
			BoxSize1 = BoxSize1*100;		
			BoxOffset1 = BoxOffset1*100;
		}
		
		if(StrangeSymbolName) SymbolName = StringSubstr(Symbol(), 0, 6);
		else SymbolName = Symbol();
		BoxPoints1 = NormalizeDouble(BoxSize1*Point, Digits);

		//Add starting price for Renko Chart 1

      if (Close[Bars-1]>= StartingPrice)
         {
		   PrevLow1 = NormalizeDouble(BoxOffset1*Point + MathFloor((Close[Bars-1]-StartingPrice)/BoxPoints1)*BoxPoints1 + StartingPrice, Digits);
		   }
		
      if (Close[Bars-1]< StartingPrice)
         {
		   PrevLow1 = NormalizeDouble(BoxOffset1*Point +  StartingPrice - MathCeil((StartingPrice-Close[Bars-1])/BoxPoints1)*BoxPoints1 - Point, Digits);
		   }
		
		DnWick1 = PrevLow1;
		PrevHigh1 = PrevLow1 + BoxPoints1;
		UpWick1 = PrevHigh1;
		PrevOpen1 = PrevLow1;
		PrevClose1 = PrevHigh1;
		CurVolume1 = 1;
		PrevTime1 = Time[Bars-1];
	
		// create / open hst file		
		HstHandle1 = FileOpenHistory(SymbolName + (string)RenkoTimeFrame1 + ".hst", FILE_BIN|FILE_WRITE|FILE_ANSI);
		FileClose(HstHandle1); HstHandle1 = -1;
		HstHandle1 = FileOpenHistory(SymbolName + (string)RenkoTimeFrame1 + ".hst", FILE_BIN|FILE_READ|FILE_WRITE|FILE_SHARE_WRITE|FILE_SHARE_READ|FILE_ANSI);
		
		//HstHandle1 = FileOpenHistory(SymbolName + RenkoTimeFrame1 + ".hst", FILE_BIN|FILE_WRITE);
		if(HstHandle1< 0) {
			Print("Error: can\'t create / open history file: " + ErrorDescription(GetLastError()) + ": " + SymbolName + RenkoTimeFrame1 + ".hst");
			return(-1);
		}
		//
   	
		// write hst file header
		int HstUnused1[13];
		FileWriteInteger(HstHandle1, 401, LONG_VALUE); 			// Version
		FileWriteString(HstHandle1, "", 64);					// Copyright
		FileWriteString(HstHandle1, SymbolName, 12);			// Symbol
		FileWriteInteger(HstHandle1, RenkoTimeFrame1, LONG_VALUE);	// Period
		FileWriteInteger(HstHandle1, Digits, LONG_VALUE);		// Digits
		FileWriteInteger(HstHandle1, 0, LONG_VALUE);			// Time Sign
		FileWriteInteger(HstHandle1, 0, LONG_VALUE);			// Last Sync
		FileWriteArray(HstHandle1, HstUnused1, 0, 13);			// Unused
		//
   	
 		// process historical data
  		int i1 = Bars-2;
  			if (i1>MaxBars1) i1=MaxBars1; 
		//Print(Symbol() + " " + High[i] + " " + Low[i] + " " + Open[i] + " " + Close[i]);
		//---------------------------------------------------------------------------
  		while(i1 >= 0) {
  		
			CurVolume1 = CurVolume1 + Volume[i1];
		
			UpWick1 = MathMax(UpWick1, High[i1]);
			DnWick1 = MathMin(DnWick1, Low[i1]);

			// update low before high or the reverse depending on previous bar
			bool UpTrend1 = High[i1]+Low[i1] > High[i1+1]+Low[i1+1];
		
			while(!UpTrend1 && (Low[i1] < PrevLow1-(BoxShiftPercent1/100)*BoxPoints1 || CompareDoubles(Low[i1], PrevLow1-(BoxShiftPercent1/100)*BoxPoints1))) {
  				PrevHigh1   =  PrevHigh1   -  (BoxShiftPercent1/100)* BoxPoints1;
  				PrevLow1    =  PrevLow1    -  (BoxShiftPercent1/100)*BoxPoints1;
  				PrevOpen1   =  PrevHigh1;
  				PrevClose1  =  PrevLow1;

            rates.time = PrevTime1;
            rates.open = PrevOpen1;
            rates.low  = PrevLow1;
            if(ShowWicks1 && UpWick1 > PrevHigh1)
                  rates.high = UpWick1;
            else  rates.high = PrevHigh1;             
            rates.close = PrevClose1;
            rates.real_volume = (long)CurVolume1;
            rates.tick_volume = (long)CurVolume1;
   				FileWriteStruct(HstHandle1,rates);

				
				UpWick1 = 0;
				DnWick1 = EMPTY_VALUE;
				CurVolume1 = 0;
				CurHigh1 = PrevLow1;
				CurLow1 = PrevLow1;  
				
				if(PrevTime1 < Time[i1]) PrevTime1 = Time[i1];
				else PrevTime1++;
			}
		
			while(High[i1] > PrevHigh1+(BoxShiftPercent1/100)*BoxPoints1 || CompareDoubles(High[i1], PrevHigh1+(BoxShiftPercent1/100)*BoxPoints1)) {
  				PrevHigh1   =  PrevHigh1   +  (BoxShiftPercent1/100)*BoxPoints1;
  				PrevLow1    =  PrevLow1    +  (BoxShiftPercent1/100)*BoxPoints1;
  				PrevOpen1   =  PrevLow1;
  				PrevClose1  =  PrevHigh1;
  			
            rates.time = PrevTime1;
            rates.open = PrevOpen1;
            rates.high = PrevHigh1;
            if(ShowWicks1 && DnWick1 < PrevLow1)
                  rates.low = DnWick1;
            else  rates.low = PrevLow1;             
            rates.close = PrevClose1;
            rates.real_volume = (long)CurVolume1;
            rates.tick_volume = (long)CurVolume1;
   				FileWriteStruct(HstHandle1,rates);
  						
				UpWick1 = 0;
				DnWick1 = EMPTY_VALUE;
				CurVolume1 = 0;
				CurHigh1 = PrevHigh1;
				CurLow1 = PrevHigh1;  
				
				if(PrevTime1 < Time[i1]) PrevTime1 = Time[i1];
				else PrevTime1++;
			}
		
			while(UpTrend1 && (Low[i1] < PrevLow1-(BoxShiftPercent1/100)*BoxPoints1 || CompareDoubles(Low[i1], PrevLow1-(BoxShiftPercent1/100)*BoxPoints1))) {
  				PrevHigh1   =  PrevHigh1   -  (BoxShiftPercent1/100)*BoxPoints1;
  				PrevLow1    =  PrevLow1    -  (BoxShiftPercent1/100)*BoxPoints1;
  				PrevOpen1   =  PrevHigh1;
  				PrevClose1  =  PrevLow1;

            rates.time = PrevTime1;
            rates.open = PrevOpen1;
            rates.low  = PrevLow1;
            if(ShowWicks1 && UpWick1 > PrevHigh1)
                  rates.high = UpWick1;
            else  rates.high = PrevHigh1;             
            rates.close = PrevClose1;
            rates.real_volume = (long)CurVolume1;
            rates.tick_volume = (long)CurVolume1;
   				FileWriteStruct(HstHandle1,rates);

				UpWick1 = 0;
				DnWick1 = EMPTY_VALUE;
				CurVolume1 = 0;
				CurHigh1 = PrevLow1;
				CurLow1 = PrevLow1;  
								
				if(PrevTime1 < Time[i1]) PrevTime1 = Time[i1];
				else PrevTime1++;
			}		
			i1--;
		} 
		LastFPos1 = FileTell(HstHandle1);   // Remember Last pos in file
		//
			
	
		
		if(Close[0] > MathMax(PrevClose1, PrevOpen1)) CurOpen1 = MathMax(PrevClose1, PrevOpen1);
		else if (Close[0] < MathMin(PrevClose1, PrevOpen1)) CurOpen1 = MathMin(PrevClose1, PrevOpen1);
		else CurOpen1 = Close[0];
		
		CurClose1 = Close[0];
				
		if(UpWick1 > PrevHigh1) CurHigh1 = UpWick1;
		if(DnWick1 < PrevLow1) CurLow1 = DnWick1;
      
            rates.time = PrevTime1;
            rates.open = CurOpen1;
            rates.low  = CurLow1;
            rates.high = CurHigh1;             
            rates.close = CurClose1;
            rates.real_volume = (long)CurVolume1;
            rates.tick_volume = (long)CurVolume1;
   				FileWriteStruct(HstHandle1,rates);
      
		
		FileFlush(HstHandle1);
            
		UpdateChartWindow();
		
		return(0);
 		// End historical data / Init		
	} 		
	//----------------------------------------------------------------------------
 	// HstHandle not < 0 so we always enter here after history done
	// Begin live data feed
   			
	UpWick1 = MathMax(UpWick1, Bid);
	DnWick1 = MathMin(DnWick1, Bid);

	CurVolume1++;   			
	FileSeek(HstHandle1, LastFPos1, SEEK_SET);

 	//-------------------------------------------------------------------------	   				
 	// up box	   				
   	if(Bid > PrevHigh1+(BoxShiftPercent1/100)*BoxPoints1 || CompareDoubles(Bid, PrevHigh1+(BoxShiftPercent1/100)*BoxPoints1)) {
		PrevHigh1    =  PrevHigh1   +  (BoxShiftPercent1/100)*BoxPoints1;
		PrevLow1     =  PrevLow1    +  (BoxShiftPercent1/100)*BoxPoints1;
		PrevOpen1    =  PrevLow1;
		PrevClose1   =  PrevHigh1;

            rates.time = PrevTime1;
            rates.open = PrevOpen1;
            rates.high = PrevHigh1;
            if(ShowWicks1 && DnWick1 < PrevLow1)
                  rates.low = DnWick1;
            else  rates.low = PrevLow1;             
            rates.close = PrevClose1;
            rates.real_volume = (long)CurVolume1;
            rates.tick_volume = (long)CurVolume1;
   				FileWriteStruct(HstHandle1,rates);
 
      	FileFlush(HstHandle1);
  	  	LastFPos1 = FileTell(HstHandle1);   // Remember Last pos in file				  							
      	
		if(PrevTime1 < TimeCurrent()) PrevTime1 = TimeCurrent();
		else PrevTime1++;
            		
  		CurVolume1 = 0;
		CurHigh1 = PrevHigh1;
		CurLow1 = PrevHigh1;  
		
		UpWick1 = 0;
		DnWick1 = EMPTY_VALUE;		
		
		UpdateChartWindow();				            		
  	}
 	//-------------------------------------------------------------------------	   				
 	// down box
	else if(Bid < PrevLow1-(BoxShiftPercent1/100)*BoxPoints1 || CompareDoubles(Bid,PrevLow1-(BoxShiftPercent1/100)*BoxPoints1)) {
  		PrevHigh1  =  PrevHigh1   -  (BoxShiftPercent1/100)*BoxPoints1;
  		PrevLow1   =  PrevLow1    -  (BoxShiftPercent1/100)*BoxPoints1;
  		PrevOpen1  =  PrevHigh1;
  		PrevClose1 =  PrevLow1;

            rates.time = PrevTime1;
            rates.open = PrevOpen1;
            rates.low  = PrevLow1;
            if(ShowWicks1 && UpWick1> PrevHigh1)
                  rates.high = UpWick1;
            else  rates.high = PrevHigh1;             
            rates.close = PrevClose1;
            rates.real_volume = (long)CurVolume1;
            rates.tick_volume = (long)CurVolume1;
   				FileWriteStruct(HstHandle1,rates);

      	FileFlush(HstHandle1);
  	  	LastFPos1 = FileTell(HstHandle1);   // Remember Last pos in file				  							
      	
		if(PrevTime1 < TimeCurrent()) PrevTime1 = TimeCurrent();
		else PrevTime1++;      	
            		
  		CurVolume1 = 0;
		CurHigh1 = PrevLow1;
		CurLow1 = PrevLow1;  
		
		UpWick1 = 0;
		DnWick1 = EMPTY_VALUE;		
		
		UpdateChartWindow();						
     	} 
 	//-------------------------------------------------------------------------	   				
   	// no box - high/low not hit				
	else {
		if(Bid > CurHigh1) CurHigh1 = Bid;
		if(Bid < CurLow1) CurLow1 = Bid;
	
      CurOpen1 = PrevClose1;
		CurClose1 = Bid;
		
            rates.time = PrevTime1;
            rates.open = CurOpen1;
            rates.low  = CurLow1;
            rates.high = CurHigh1;             
            rates.close = CurClose1;
            rates.real_volume = (long)CurVolume1;
            rates.tick_volume = (long)CurVolume1;
   				FileWriteStruct(HstHandle1,rates);
			
            FileFlush(HstHandle1);
            
		UpdateChartWindow();            
     	}
if (!Use2ndRenkoChart)
   {Comment("DoubleMeanRenkoBuilder (" +DoubleToStr(RenkoBoxSize1,1)+ ") point: Open Offline ", SymbolName, ",M", RenkoTimeFrame1, " to view chart");}
if (Use2ndRenkoChart)
   {
 //DRUGI-----------------------------------------------------------------------------------------
	static double BoxPoints2, UpWick2, DnWick2;
	static double PrevLow2, PrevHigh2, PrevOpen2, PrevClose2, CurVolume2, CurLow2, CurHigh2, CurOpen2, CurClose2;
	static datetime PrevTime2;
   	
	//+------------------------------------------------------------------+
	// This is only executed ones, then the first tick arives.
	if(HstHandle2 < 0) {
		// Init

		// Error checking	
			
		if(!IsDllsAllowed()) {
			Print("Error: Dll calls must be allowed!");
			return(-1);
		}		
		if(MathAbs(RenkoBoxOffset2) >= RenkoBoxSize2) {
			Print("Error: |RenkoBoxOffset| should be less then RenkoBoxSize2!");
			return(-1);
		}

		//
		
		int BoxSize2 = RenkoBoxSize2;
		int BoxOffset2 = RenkoBoxOffset2;
		if(Digits == 5 || (Digits == 3 && StringFind(Symbol(), "JPY") != -1)) {
			BoxSize2 = BoxSize2*10;
			BoxOffset2 = BoxOffset2*10;
		}
		if(Digits == 6 || (Digits == 4 && StringFind(Symbol(), "JPY") != -1)) {
			BoxSize2 = BoxSize2*100;		
			BoxOffset2 = BoxOffset2*100;
		}
		
		if(StrangeSymbolName) SymbolName = StringSubstr(Symbol(), 0, 6);
		else SymbolName = Symbol();
		
		BoxPoints2 = NormalizeDouble(BoxSize2*Point, Digits);
		
		// Add Starting Price for renko chart 2
		
		if (Close[Bars-1]>= StartingPrice)
         {
		   PrevLow2 = NormalizeDouble(BoxOffset2*Point + MathFloor((Close[Bars-1]-StartingPrice)/BoxPoints2)*BoxPoints2 + StartingPrice, Digits);
		   }
		
      if (Close[Bars-1]< StartingPrice)
         {
		   PrevLow2 = NormalizeDouble(BoxOffset2*Point +  StartingPrice - MathCeil((StartingPrice-Close[Bars-1])/BoxPoints2)*BoxPoints2 - Point, Digits);
		   }
		
		
		DnWick2 = PrevLow2;
		PrevHigh2 = PrevLow2 + BoxPoints2;
		UpWick2 = PrevHigh2;
		PrevOpen2 = PrevLow2;
		PrevClose2 = PrevHigh2;
		CurVolume2 = 1;
		PrevTime2 = Time[Bars-1];
	
		// create / open hst file		
		HstHandle2 = FileOpenHistory(SymbolName + (string)RenkoTimeFrame2 + ".hst", FILE_BIN|FILE_WRITE|FILE_ANSI);
		FileClose(HstHandle2); HstHandle2 = -1;
		HstHandle2 = FileOpenHistory(SymbolName + (string)RenkoTimeFrame2 + ".hst", FILE_BIN|FILE_READ|FILE_WRITE|FILE_SHARE_WRITE|FILE_SHARE_READ|FILE_ANSI);
		//HstHandle2 = FileOpenHistory(SymbolName + RenkoTimeFrame2 + ".hst", FILE_BIN|FILE_WRITE);
		if(HstHandle2< 0) {
			Print("Error: can\'t create / open history file: " + ErrorDescription(GetLastError()) + ": " + SymbolName + RenkoTimeFrame2 + ".hst");
			return(-1);
		}
		//
   	
		// write hst file header
		int HstUnused2[13];
		FileWriteInteger(HstHandle2, 401, LONG_VALUE); 			// Version
		FileWriteString(HstHandle2, "", 64);					// Copyright
		FileWriteString(HstHandle2, SymbolName, 12);			// Symbol
		FileWriteInteger(HstHandle2, RenkoTimeFrame2, LONG_VALUE);	// Period
		FileWriteInteger(HstHandle2, Digits, LONG_VALUE);		// Digits
		FileWriteInteger(HstHandle2, 0, LONG_VALUE);			// Time Sign
		FileWriteInteger(HstHandle2, 0, LONG_VALUE);			// Last Sync
		FileWriteArray(HstHandle2, HstUnused2, 0, 13);			// Unused
		//
   	
 		// process historical data
  		int i2 = Bars-2;
  			if (i2>MaxBars2) i2=MaxBars2;  
		//Print(Symbol() + " " + High[i] + " " + Low[i] + " " + Open[i] + " " + Close[i]);
		//---------------------------------------------------------------------------
  		while(i2 >= 0) {
  		
			CurVolume2 = CurVolume2 + Volume[i2];
		
			UpWick2 = MathMax(UpWick2, High[i2]);
			DnWick2 = MathMin(DnWick2, Low[i2]);

			// update low before high or the reverse depending on previous bar
			bool UpTrend2 = High[i2]+Low[i2] > High[i2+1]+Low[i2+1];
		
			while(!UpTrend2 && (Low[i2] < PrevLow2-(BoxShiftPercent2/100)*BoxPoints2 || CompareDoubles(Low[i2], PrevLow2-(BoxShiftPercent2/100)*BoxPoints2))) {
  				PrevHigh2   =  PrevHigh2   -  (BoxShiftPercent2/100)*BoxPoints2;
  				PrevLow2    =  PrevLow2    -  (BoxShiftPercent2/100)*BoxPoints2;
  				PrevOpen2   =  PrevHigh2;
  				PrevClose2  =  PrevLow2;

            rates.time = PrevTime2;
            rates.open = PrevOpen2;
            rates.low  = PrevLow2;
            if(ShowWicks2 && UpWick2 > PrevHigh2)
                  rates.high = UpWick2;
            else  rates.high = PrevHigh2;             
            rates.close = PrevClose2;
            rates.real_volume = (long)CurVolume2;
            rates.tick_volume = (long)CurVolume2;
   				FileWriteStruct(HstHandle2,rates);
				
				UpWick2 = 0;
				DnWick2 = EMPTY_VALUE;
				CurVolume2 = 0;
				CurHigh2 = PrevLow2;
				CurLow2 = PrevLow2;  
				
				if(PrevTime2 < Time[i2]) PrevTime2 = Time[i2];
				else PrevTime2++;
			}
		
			while(High[i2] > PrevHigh2+(BoxShiftPercent2/100)*BoxPoints2 || CompareDoubles(High[i2], PrevHigh2+(BoxShiftPercent2/100)*BoxPoints2)) {
  				PrevHigh2   =  PrevHigh2   +  (BoxShiftPercent2/100)*BoxPoints2;
  				PrevLow2    =  PrevLow2    +  (BoxShiftPercent2/100)*BoxPoints2;
  				PrevOpen2   =  PrevLow2;
  				PrevClose2  =  PrevHigh2;

            rates.time = PrevTime2;
            rates.open = PrevOpen2;
            rates.high = PrevHigh2;
            if(ShowWicks2 && DnWick2 < PrevLow2)
                  rates.low = DnWick2;
            else  rates.low = PrevLow2;             
            rates.close = PrevClose2;
            rates.real_volume = (long)CurVolume2;
            rates.tick_volume = (long)CurVolume2;
   				FileWriteStruct(HstHandle2,rates);
				
				UpWick2 = 0;
				DnWick2 = EMPTY_VALUE;
				CurVolume2 = 0;
				CurHigh2 = PrevHigh2;
				CurLow2 = PrevHigh2;  
				
				if(PrevTime2 < Time[i2]) PrevTime2 = Time[i2];
				else PrevTime2++;
			}
		
			while(UpTrend2 && (Low[i2] < PrevLow2-(BoxShiftPercent2/100)*BoxPoints2 || CompareDoubles(Low[i2], PrevLow2-(BoxShiftPercent2/100)*BoxPoints2))) {
  				PrevHigh2   =  PrevHigh2   -  (BoxShiftPercent2/100)* BoxPoints2;
  				PrevLow2    =  PrevLow2    -  (BoxShiftPercent2/100)* BoxPoints2;
  				PrevOpen2   =  PrevHigh2;
  				PrevClose2  =  PrevLow2;
  			
            rates.time = PrevTime2;
            rates.open = PrevOpen2;
            rates.low  = PrevLow2;
            if(ShowWicks2 && UpWick2 > PrevHigh2)
                  rates.high = UpWick2;
            else  rates.high = PrevHigh2;             
            rates.close = PrevClose2;
            rates.real_volume = (long)CurVolume2;
            rates.tick_volume = (long)CurVolume2;
   				FileWriteStruct(HstHandle2,rates);

				UpWick2 = 0;
				DnWick2 = EMPTY_VALUE;
				CurVolume2 = 0;
				CurHigh2 = PrevLow2;
				CurLow2 = PrevLow2;  
								
				if(PrevTime2 < Time[i2]) PrevTime2 = Time[i2];
				else PrevTime2++;
			}		
			i2--;
		} 
		LastFPos2 = FileTell(HstHandle2);   // Remember Last pos in file
		//Comment("BUY:",TG_SIGNAL_BUY,"\n","SELL:",TG_SIGNAL_SELL);  	
		Comment("DoubleMeanRenkoBuilder (" + DoubleToStr(RenkoBoxSize1,1) + ") point: Open Offline ", SymbolName, ",M", RenkoTimeFrame1, " to view chart","\n",
		        "DoubleMeanRenkoBuilder (" + DoubleToStr(RenkoBoxSize2,1) + ") point: Open Offline ", SymbolName, ",M", RenkoTimeFrame2, " to view chart");
		
		if(Close[0] > MathMax(PrevClose2, PrevOpen2)) CurOpen2 = MathMax(PrevClose2, PrevOpen2);
		else if (Close[0] < MathMin(PrevClose2, PrevOpen2)) CurOpen2 = MathMin(PrevClose2, PrevOpen2);
		else CurOpen2 = Close[0];
		
		CurClose2 = Close[0];
				
		if(UpWick2 > PrevHigh2) CurHigh2 = UpWick2;
		if(DnWick2 < PrevLow2) CurLow2 = DnWick2;

            rates.time = PrevTime2;
            rates.open = CurOpen2;
            rates.low  = CurLow2;
            rates.high = CurHigh2;             
            rates.close = CurClose2;
            rates.real_volume = (long)CurVolume2;
            rates.tick_volume = (long)CurVolume2;
   				FileWriteStruct(HstHandle2,rates);
			
		FileFlush(HstHandle2);
            
		UpdateChartWindow();
		
		return(0);
 		// End historical data / Init		
	} 		
	//----------------------------------------------------------------------------
 	// HstHandle not < 0 so we always enter here after history done
	// Begin live data feed
   			
	UpWick2 = MathMax(UpWick2, Bid);
	DnWick2 = MathMin(DnWick2, Bid);

	CurVolume2++;   			
	FileSeek(HstHandle2, LastFPos2, SEEK_SET);

 	//-------------------------------------------------------------------------	   				
 	// up box	   				
   	if(Bid > PrevHigh2+(BoxShiftPercent2/100)*BoxPoints2 || CompareDoubles(Bid, PrevHigh2+(BoxShiftPercent2/100)*BoxPoints2)) {
		PrevHigh2    =  PrevHigh2   +  (BoxShiftPercent2/100)* BoxPoints2;
		PrevLow2     =  PrevLow2    +  (BoxShiftPercent2/100)* BoxPoints2;
		PrevOpen2    =  PrevLow2;
		PrevClose2   =  PrevHigh2;
  				
            rates.time = PrevTime2;
            rates.open = PrevOpen2;
            rates.high = PrevHigh2;
            if(ShowWicks2 && DnWick2 < PrevLow2)
                  rates.low = DnWick2;
            else  rates.low = PrevLow2;             
            rates.close = PrevClose2;
            rates.real_volume = (long)CurVolume2;
            rates.tick_volume = (long)CurVolume2;
   				FileWriteStruct(HstHandle2,rates);

      	FileFlush(HstHandle2);
  	  	LastFPos2 = FileTell(HstHandle2);   // Remeber Last pos in file				  							
      	
		if(PrevTime2 < TimeCurrent()) PrevTime2 = TimeCurrent();
		else PrevTime2++;
            		
  		CurVolume2 = 0;
		CurHigh2 = PrevHigh2;
		CurLow2 = PrevHigh2;  
		
		UpWick2 = 0;
		DnWick2 = EMPTY_VALUE;		
		
		UpdateChartWindow();				            		
  	}
 	//-------------------------------------------------------------------------	   				
 	// down box
	else if(Bid < PrevLow2-(BoxShiftPercent2/100)*BoxPoints2 || CompareDoubles(Bid,PrevLow2-(BoxShiftPercent2/100)*BoxPoints2)) {
  		PrevHigh2  =  PrevHigh2   -  (BoxShiftPercent2/100)* BoxPoints2;
  		PrevLow2   =  PrevLow2    -  (BoxShiftPercent2/100)* BoxPoints2;
  		PrevOpen2  =  PrevHigh2;
  		PrevClose2 =  PrevLow2;
  				  			
            rates.time = PrevTime2;
            rates.open = PrevOpen2;
            rates.low  = PrevLow2;
            if(ShowWicks2 && UpWick2 > PrevHigh2)
                  rates.high = UpWick2;
            else  rates.high = PrevHigh2;             
            rates.close = PrevClose2;
            rates.real_volume = (long)CurVolume2;
            rates.tick_volume = (long)CurVolume2;
   				FileWriteStruct(HstHandle2,rates);

      	FileFlush(HstHandle2);
  	  	LastFPos2 = FileTell(HstHandle2);   // Remember Last pos in file				  							
      	
		if(PrevTime2 < TimeCurrent()) PrevTime2 = TimeCurrent();
		else PrevTime2++;      	
            		
  		CurVolume2 = 0;
		CurHigh2 = PrevLow2;
		CurLow2 = PrevLow2;  
		
		UpWick2 = 0;
		DnWick2 = EMPTY_VALUE;		
		
		UpdateChartWindow();						
     	} 
 	//-------------------------------------------------------------------------	   				
   	// no box - high/low not hit				
	else {
		if(Bid > CurHigh2) CurHigh2 = Bid;
		if(Bid < CurLow2) CurLow2 = Bid;
	
      CurOpen2 = PrevClose2;
		CurClose2 = Bid;

            rates.time = PrevTime2;
            rates.open = CurOpen2;
            rates.low  = CurLow2;
            rates.high = CurHigh2;             
            rates.close = CurClose2;
            rates.real_volume = (long)CurVolume2;
            rates.tick_volume = (long)CurVolume2;
   				FileWriteStruct(HstHandle2,rates);
			
            FileFlush(HstHandle2);
            
		UpdateChartWindow();            
     	}

		Comment("DoubleMeanRenkoBuilder (" + DoubleToStr(RenkoBoxSize1,1) + ") point: Open Offline ", SymbolName, ",M", RenkoTimeFrame1, " to view chart","\n",
		        "DoubleMeanRenkoBuilder (" + DoubleToStr(RenkoBoxSize2,1) + ") point: Open Offline ", SymbolName, ",M", RenkoTimeFrame2, " to view chart");
   } // end if(Use2ndRenkoChart)
   
     	return(0);
}
//+------------------------------------------------------------------+
int deinit() {
	if(HstHandle1 >= 0) {
		FileClose(HstHandle1);
		HstHandle1 = -1;
	}
	if(HstHandle2 >= 0) {
		FileClose(HstHandle2);
		HstHandle2 = -1;
	}	
	
	
   	Comment("");
	return(0);
}
//+------------------------------------------------------------------+