//+------------------------------------------------------------------+
//|                                           MickeyMouse.mq4        |
//|                                           Copyright 2017, Sakis  |
//|                                                                  |
//+------------------------------------------------------------------+

// Version History
// ---------------
// v1.0 Main
// v1.1 Changed division
// v1.2 Added volume for comparison

#property strict
#property indicator_separate_window
#define Name WindowExpertName()
#property indicator_buffers 4
#property indicator_color1 clrBlack
#property indicator_color2 clrBlack
#property indicator_color3 clrBlue
#property indicator_color4 clrRed

extern int d = 200; //Periods
//extern double p = 0.07; //Exclude % (0.01-0.10)
extern int levels = 1; //Level Line
extern double volamp = 0.2; // Volume amplitude (0.1-1);
double HIG[],LIG[];
double HHIG[],LLIG[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{	
	IndicatorDigits(2);
	if(d<100) d=100;
	if(d>2000) d=2000;
	
	if(volamp<0.1) volamp=0.1;
	if(volamp>1) volamp=1;
	
	IndicatorShortName("MickeyMouse " + IntegerToString(d)+ " " + DoubleToStr(volamp,2));
	SetLevelValue(0,-levels);
	SetLevelValue(1,levels);
	SetLevelStyle(0,0,clrGreen);
	
	SetIndexStyle(0, DRAW_LINE, 1, 2);
	SetIndexBuffer(0, HIG);
	SetIndexLabel(0, NULL);
	SetIndexStyle(1, DRAW_LINE, 1, 2);
	SetIndexBuffer(1, LIG);
	SetIndexLabel(1, NULL);
	SetIndexStyle(2, DRAW_LINE, 1, 3);
	SetIndexBuffer(2, HHIG);
	SetIndexLabel(2, NULL);
	SetIndexStyle(3, DRAW_LINE, 1, 3);
	SetIndexBuffer(3, LLIG);
	SetIndexLabel(3, NULL);

	//---
	return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Custom indicator de-init function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
	Comment(""); // Cleanup
	Print(__FUNCTION__, "_Uninitalization reason code = ", getUninitReasonText(_UninitReason));
	return;
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
	const int prev_calculated,
	const datetime &time[],
	const double &open[],
	const double &high[],
	const double &low[],
	const double &close[],
	const long &tick_volume[],
	const long &volume[],
	const int &spread[])
{
	//---
	NewDig();
	//--- return value of prev_calculated for next call
	return(rates_total);
}
//+------------------------------------------------------------------+

//+MAIN--------------------------------------------------------------+
void NewDig(){	
	if(d>Bars-1) d=Bars-1;
	
	int pp;
	
	if(StringLen(IntegerToString(d))>=3) pp=MathAbs(d/100); else pp=1;
	
	int newdiv=(int)(d/(pp*4.165));
	
	double highest, lowest;
	double div[];
	ArrayResize(div,d+newdiv+1);
	for (int i=0; i<=d+newdiv; i++){
		highest=iHigh(Symbol(),PERIOD_CURRENT,iHighest(Symbol(),PERIOD_CURRENT,MODE_HIGH,newdiv,i));
		lowest=iLow(Symbol(),PERIOD_CURRENT,iLowest(Symbol(),PERIOD_CURRENT,MODE_LOW,newdiv,i));
		div[i]=(highest-lowest)/(newdiv);
	}
	
	double viv[];
	ArrayResize(viv,d+newdiv+1);
	for (int i=0; i<=d+newdiv; i++){
		viv[i]=double(iVolume(Symbol(),PERIOD_CURRENT,i));
	}
	
	double vimax=viv[ArrayMaximum(viv,0,0)];
	
	double viva[];
	ArrayResize(viva,d+newdiv+1);
	for(int i=0; i<=d+newdiv; i++){
		if ((viv[i]/vimax)>=volamp) viva[i]=12*(viv[i]/vimax);
		else viva[i]=0;
	}
	
	ArrayResize(HIG,d+1);
	ArrayResize(LIG,d+1);
	for (int i=d; i>=0; i--){		
		if( ((iClose(Symbol(),PERIOD_CURRENT,i+1) > iClose(Symbol(),PERIOD_CURRENT,i+2)) && (iClose(Symbol(),PERIOD_CURRENT,i) > iClose(Symbol(),PERIOD_CURRENT,i+1))) || ((iHigh(Symbol(),PERIOD_CURRENT,i)-iLow(Symbol(),PERIOD_CURRENT,i))>div[i]) )
		HIG[i] = ((iClose(Symbol(),PERIOD_CURRENT,i) - iOpen(Symbol(),PERIOD_CURRENT,i))/div[i])+viva[i];
		else HIG[i]=0;
		//Print(HIG[i]+" " +viva[i]);
		if( ((iClose(Symbol(),PERIOD_CURRENT,i+1) < iClose(Symbol(),PERIOD_CURRENT,i+2)) && (iClose(Symbol(),PERIOD_CURRENT,i) < iClose(Symbol(),PERIOD_CURRENT,i+1))) || ((iHigh(Symbol(),PERIOD_CURRENT,i)-iLow(Symbol(),PERIOD_CURRENT,i))>div[i]) )
		LIG[i] = ((iClose(Symbol(),PERIOD_CURRENT,i) - iOpen(Symbol(),PERIOD_CURRENT,i))/div[i])-viva[i];
		else LIG[i]=0;
		
		if(HIG[i]>levels) LIG[i]=-HIG[i];
		if(LIG[i]<-levels) HIG[i]=-LIG[i];
}
	for(int i=d; i>=0; i--){
		if(HIG[i]>levels) HHIG[i]=HIG[i];
		else HHIG[i]=EMPTY_VALUE;
		if(LIG[i]<-levels) LLIG[i]=LIG[i];
		else LLIG[i]=EMPTY_VALUE;
	}
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Custom functions                                                 |
//+------------------------------------------------------------------+
string getUninitReasonText(int reasonCode) // Return reason for De-init function 
{
	string text = "";

	switch (reasonCode)
	{
	case REASON_ACCOUNT:
		text = "Account was changed"; break;
	case REASON_CHARTCHANGE:
		text = "Symbol or timeframe was changed"; break;
	case REASON_CHARTCLOSE:
		text = "Chart was closed"; break;
	case REASON_PARAMETERS:
		text = "Input-parameter was changed"; break;
	case REASON_RECOMPILE:
		text = "Program " + __FILE__ + " was recompiled"; break;
	case REASON_REMOVE:
		text = "Program " + __FILE__ + " was removed from chart"; break;
	case REASON_TEMPLATE:
		text = "New template was applied to chart"; break;
	default:text = "Another reason";
	}

	return text;
}
//+------------------------------------------------------------------+