//+------------------------------------------------------------------+
//|                                           MickeyMouse.mq4        |
//|                                           Copyright 2017, Sakis  |
//|                                                                  |
//+------------------------------------------------------------------+

// Version History
// ---------------
// v1.0 Main
// v1.1 Changed division
// v1.2 Added volume for comparison
// v1.3 Changed to basket meter

#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

enum CURR{
	EUR=0,
	CHF=1,
	GBP=2,
	JPY=3,
	AUD=4,
	NZD=5,
	CAD=6,
	USD=7
};

#define aa "EURUSD"
#define ab "EURCHF"
#define ac "EURGBP"
#define ad "EURJPY"
#define ae "EURAUD"
#define af "EURNZD"
#define ag "EURCAD"
#define bb "USDCHF"
#define bc "GBPCHF"
#define bd "CHFJPY"
#define be "AUDCHF"
#define bf "NZDCHF"
#define bg "CADCHF"
#define cc "GBPUSD"
#define cd "GBPJPY"
#define ce "GBPAUD"
#define cf "GBPNZD"
#define cg "GBPCAD"
#define dd "USDJPY"
#define de "AUDJPY"
#define df "NZDJPY"
#define dg "CADJPY"
#define ee "AUDUSD"
#define ef "AUDNZD"
#define eg "AUDCAD"
#define ff "NZDUSD"
#define fg "NZDCAD"
#define gg "USDCAD"

extern CURR curr=7; // Pick currency
extern int d = 200; //Periods
extern int levels = 1; //Level Line
extern double volamp = 0.2; // Volume amplitude (0-1) - 1=bypass
double HIG[],LIG[];
double HHIG[],LLIG[];
string eurcur[7]={ aa,ab,ac,ad,ae,af,ag };
string gbpcur[7]={ ac,bc,cc,cd,ce,cf,cg };
string chfcur[7]={ ab,bb,bc,bd,be,bf,bg };
string jpycur[7]={ ad,bd,cd,dd,de,df,dg };
string audcur[7]={ ae,be,ce,de,ee,ef,eg };
string nzdcur[7]={ af,bf,cf,df,ef,ff,fg };
string cadcur[7]={ ag,bg,cg,dg,eg,fg,gg };
string usdcur[7]={ aa,bb,cc,dd,ee,ff,gg };
string eurocur[7];
string maint;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{	
	IndicatorDigits(2);
	if(d<100) d=100;
	if(d>2000) d=2000;
	if(curr==0){maint="EUR";} else if(curr==1){maint="CHF";} else if(curr==2){maint="GBP";} else if(curr==3){maint="JPY";} else if(curr==4){maint="AUD";} else if(curr==5){maint="NZD";} else if(curr==6){maint="CAD";} else if(curr==7){maint="USD";}
	
	if(volamp<0) volamp=0;
	if(volamp>1) volamp=1;
	
	IndicatorShortName("MickeyMouse " + IntegerToString(d)+ " " + DoubleToStr(volamp,2) + " " + maint);
	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;

	if (curr==0) { ArrayCopy(eurocur,eurcur,0,0,0); }
	
	else if (curr==2) { ArrayCopy(eurocur,gbpcur,0,0,0); }
	
	else if (curr==1) { ArrayCopy(eurocur,chfcur,0,0,0); }
	
	else if (curr==3) { ArrayCopy(eurocur,jpycur,0,0,0); }
	
	else if (curr==4) { ArrayCopy(eurocur,audcur,0,0,0); }
	
	else if (curr==5) { ArrayCopy(eurocur,nzdcur,0,0,0); }
	
	else if (curr==6) { ArrayCopy(eurocur,cadcur,0,0,0); }
	
	else if (curr==7) { ArrayCopy(eurocur,usdcur,0,0,0); }
	
	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[][7];
	ArrayResize(div,d+newdiv+1);
	
	double bigdiv[];
	ArrayResize(bigdiv,d+newdiv+1);

	if(curr!=3){
	for(int x=0; x<=6; x++){
	for (int i=0; i<=d+newdiv; i++){
		highest=iHigh(eurocur[x],PERIOD_CURRENT,iHighest(eurocur[x],PERIOD_CURRENT,MODE_HIGH,newdiv,i));
		lowest=iLow(eurocur[x],PERIOD_CURRENT,iLowest(eurocur[x],PERIOD_CURRENT,MODE_LOW,newdiv,i));
		if(x!=3)
		div[i][x]=(highest-lowest)/(newdiv);
		else if(x==3)
		div[i][x]=(highest-lowest)/(newdiv*100);
	}
	}
	}
	
	if(curr==3){
	for(int x=0; x<=6; x++){
	for (int i=0; i<=d+newdiv; i++){
		highest=iHigh(eurocur[x],PERIOD_CURRENT,iHighest(eurocur[x],PERIOD_CURRENT,MODE_HIGH,newdiv,i));
		lowest=iLow(eurocur[x],PERIOD_CURRENT,iLowest(eurocur[x],PERIOD_CURRENT,MODE_LOW,newdiv,i));
		div[i][x]=(highest-lowest)/(newdiv);
	}
	}
	}
	
	for (int i=0; i<=d+newdiv; i++){
		bigdiv[i] = (div[i][0]+div[i][1]+div[i][2]+div[i][3]+div[i][4]+div[i][5]+div[i][6])/7;
	}
			
	double viv[][7];
	ArrayResize(viv,d+newdiv+1);
	for (int x=0; x<=6; x++){
	for (int i=0; i<=d+newdiv; i++){
		viv[i][x]=double(iVolume(eurocur[x],PERIOD_CURRENT,i));
	}
	}

	double viv1[],viv2[],viv3[],viv4[],viv5[],viv6[],viv7[];
	ArrayResize(viv1,d+newdiv+1); ArrayResize(viv2,d+newdiv+1); ArrayResize(viv3,d+newdiv+1); ArrayResize(viv4,d+newdiv+1); ArrayResize(viv5,d+newdiv+1); ArrayResize(viv6,d+newdiv+1); ArrayResize(viv7,d+newdiv+1);
	{
		for(int i=0; i<=d+newdiv; i++){
			viv1[i]=viv[i][0];
			viv2[i]=viv[i][1];
			viv3[i]=viv[i][2];
			viv4[i]=viv[i][3];
			viv5[i]=viv[i][4];
			viv6[i]=viv[i][5];
			viv7[i]=viv[i][6];
		}
	}
	
	double vimax=(viv1[ArrayMaximum(viv1,0,0)]+viv2[ArrayMaximum(viv2,0,0)]+viv3[ArrayMaximum(viv3,0,0)]+viv4[ArrayMaximum(viv4,0,0)]+viv5[ArrayMaximum(viv5,0,0)]+viv6[ArrayMaximum(viv6,0,0)]+viv7[ArrayMaximum(viv7,0,0)]);
		
	double viva[];
	ArrayResize(viva,d+newdiv+1);
	for(int i=0; i<=d+newdiv; i++){
		if (((viv1[i]+viv2[i]+viv3[i]+viv4[i]+viv5[i]+viv6[i]+viv7[i])/vimax)>=volamp) viva[i]=1.714*((viv1[i]+viv2[i]+viv3[i]+viv4[i]+viv5[i]+viv6[i]+viv7[i])/vimax);
		else viva[i]=0;
	}
	
	double close[],open[],high[],low[];
	ArrayResize(close,d+newdiv+1); ArrayResize(open,d+newdiv+1); ArrayResize(high,d+newdiv+1); ArrayResize(low,d+newdiv+1);
	
	if(curr==0){
		for(int i=0;i<=d+newdiv;i++){
		double n1=100;
			close[i]=(cdi(aa,1,i)+cdi(ab,1,i)+cdi(ac,1,i)+cdi(ad,n1,i)+cdi(ae,1,i)+cdi(af,1,i)+cdi(ag,1,i))/7;
			open[i]=(od(aa,1,i)+od(ab,1,i)+od(ac,1,i)+od(ad,n1,i)+od(ae,1,i)+od(af,1,i)+od(ag,1,i))/7;
			high[i]=(hd(aa,1,i)+hd(ab,1,i)+hd(ac,1,i)+hd(ad,n1,i)+hd(ae,1,i)+hd(af,1,i)+hd(ag,1,i))/7;
			low[i]=(ld(aa,1,i)+ld(ab,1,i)+ld(ac,1,i)+ld(ad,n1,i)+ld(ae,1,i)+ld(af,1,i)+ld(ag,1,i))/7;
		}
	}
	
	if(curr==2){
		for(int i=0;i<=d+newdiv;i++){
		double n1=100;
			close[i]=(cdi(ac,1,i)+cdi(bc,1,i)+cdi(cc,1,i)+cdi(cd,n1,i)+cdi(ce,1,i)+cdi(cf,1,i)+cdi(cg,1,i))/7;
			open[i]=(od(ac,1,i)+od(bc,1,i)+od(cc,1,i)+od(cd,n1,i)+od(ce,1,i)+od(cf,1,i)+od(cg,1,i))/7;
			high[i]=(hd(ac,1,i)+hd(bc,1,i)+hd(cc,1,i)+hd(cd,n1,i)+hd(ce,1,i)+hd(cf,1,i)+hd(cg,1,i))/7;
			low[i]=(ld(ac,1,i)+ld(bc,1,i)+ld(cc,1,i)+ld(cd,n1,i)+ld(ce,1,i)+ld(cf,1,i)+ld(cg,1,i))/7;
		}
	}
	
	if(curr==1){
		for(int i=0;i<=d+newdiv;i++){
		double n1=100;
			close[i]=(cdi(ab,1,i)+cdi(bb,1,i)+cdi(bc,1,i)+cdi(bd,n1,i)+cdi(be,1,i)+cdi(bf,1,i)+cdi(bg,1,i))/7;
			open[i]=(od(ab,1,i)+od(bb,1,i)+od(bc,1,i)+od(bd,n1,i)+od(be,1,i)+od(bf,1,i)+od(bg,1,i))/7;
			high[i]=(hd(ab,1,i)+hd(bb,1,i)+hd(bc,1,i)+hd(bd,n1,i)+hd(be,1,i)+hd(bf,1,i)+hd(bg,1,i))/7;
			low[i]=(ld(ab,1,i)+ld(bb,1,i)+ld(bc,1,i)+ld(bd,n1,i)+ld(be,1,i)+ld(bf,1,i)+ld(bg,1,i))/7;
		}
	}
	
	if(curr==3){
		for(int i=0;i<=d+newdiv;i++){
		double n1=100;
			close[i]=(cdi(ad,1,i)+cdi(cd,1,i)+cdi(dd,1,i)+cdi(bd,1,i)+cdi(de,1,i)+cdi(df,1,i)+cdi(dg,1,i))/7;
			open[i]=(od(ad,1,i)+od(cd,1,i)+od(dd,1,i)+od(bd,1,i)+od(de,1,i)+od(df,1,i)+od(dg,1,i))/7;
			high[i]=(hd(ad,1,i)+hd(cd,1,i)+hd(dd,1,i)+hd(bd,1,i)+hd(de,1,i)+hd(df,1,i)+hd(dg,1,i))/7;
			low[i]=(ld(ad,1,i)+ld(cd,1,i)+ld(dd,1,i)+ld(bd,1,i)+ld(de,1,i)+ld(df,1,i)+ld(dg,1,i))/7;
		}
	}
	
	if(curr==4){
		for(int i=0;i<=d+newdiv;i++){
		double n1=100;
			close[i]=(cdi(ae,1,i)+cdi(be,1,i)+cdi(ce,1,i)+cdi(de,n1,i)+cdi(ee,1,i)+cdi(ef,1,i)+cdi(eg,1,i))/7;
			open[i]=(od(ae,1,i)+od(be,1,i)+od(ce,1,i)+od(de,n1,i)+od(ee,1,i)+od(ef,1,i)+od(eg,1,i))/7;
			high[i]=(hd(ae,1,i)+hd(be,1,i)+hd(ce,1,i)+hd(de,n1,i)+hd(ee,1,i)+hd(ef,1,i)+hd(eg,1,i))/7;
			low[i]=(ld(ae,1,i)+ld(be,1,i)+ld(ce,1,i)+ld(de,n1,i)+ld(ee,1,i)+ld(ef,1,i)+ld(eg,1,i))/7;
		}
	}
	
	if(curr==5){
		for(int i=0;i<=d+newdiv;i++){
		double n1=100;
			close[i]=(cdi(af,1,i)+cdi(bf,1,i)+cdi(cf,1,i)+cdi(df,n1,i)+cdi(ef,1,i)+cdi(ff,1,i)+cdi(fg,1,i))/7;
			open[i]=(od(af,1,i)+od(bf,1,i)+od(cf,1,i)+od(df,n1,i)+od(ef,1,i)+od(ff,1,i)+od(fg,1,i))/7;
			high[i]=(hd(af,1,i)+hd(bf,1,i)+hd(cf,1,i)+hd(df,n1,i)+hd(ef,1,i)+hd(ff,1,i)+hd(fg,1,i))/7;
			low[i]=(ld(af,1,i)+ld(bf,1,i)+ld(cf,1,i)+ld(df,n1,i)+ld(ef,1,i)+ld(ff,1,i)+ld(fg,1,i))/7;
		}
	}
	
	if(curr==6){
		for(int i=0;i<=d+newdiv;i++){
		double n1=100;
			close[i]=(cdi(ag,1,i)+cdi(bg,1,i)+cdi(cg,1,i)+cdi(dg,n1,i)+cdi(eg,1,i)+cdi(fg,1,i)+cdi(gg,1,i))/7;
			open[i]=(od(ag,1,i)+od(bg,1,i)+od(cg,1,i)+od(dg,n1,i)+od(eg,1,i)+od(fg,1,i)+od(gg,1,i))/7;
			high[i]=(hd(ag,1,i)+hd(bg,1,i)+hd(cg,1,i)+hd(dg,n1,i)+hd(eg,1,i)+hd(fg,1,i)+hd(gg,1,i))/7;
			low[i]=(ld(ag,1,i)+ld(bg,1,i)+ld(cg,1,i)+ld(dg,n1,i)+ld(eg,1,i)+ld(fg,1,i)+ld(gg,1,i))/7;
		}
	}
	
	if(curr==7){
		for(int i=0;i<=d+newdiv;i++){
		double n1=100;
			close[i]=(cdi(aa,1,i)+cdi(bb,1,i)+cdi(cc,1,i)+cdi(dd,n1,i)+cdi(ee,1,i)+cdi(ff,1,i)+cdi(gg,1,i))/7;
			open[i]=(od(aa,1,i)+od(bb,1,i)+od(cc,1,i)+od(dd,n1,i)+od(ee,1,i)+od(ff,1,i)+od(gg,1,i))/7;
			high[i]=(hd(aa,1,i)+hd(bb,1,i)+hd(cc,1,i)+hd(dd,n1,i)+hd(ee,1,i)+hd(ff,1,i)+hd(gg,1,i))/7;
			low[i]=(ld(aa,1,i)+ld(bb,1,i)+ld(cc,1,i)+ld(dd,n1,i)+ld(ee,1,i)+ld(ff,1,i)+ld(gg,1,i))/7;
		}
	}
	
	ArrayResize(HIG,d+1);
	ArrayResize(LIG,d+1);
	for (int i=d; i>=0; i--){		
		if( ((close[i+1] > close[i+2]) && (close[i] > close[i+1])) || ((high[i]-low[i])>bigdiv[i]) )
		HIG[i] = ((close[i] - open[i])/bigdiv[i])+viva[i];
		else HIG[i]=0;
		if( ((close[i+1] < close[i+2]) && (close[i] < close[i+1])) || ((high[i]-low[i])>bigdiv[i]) )
		LIG[i] = ((close[i] - open[i])/bigdiv[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;
}
//+------------------------------------------------------------------+

//+iCLOSE D----------------------------------------------------------+
double cdi(const string a1,
	const double r1,
	const int t1)
{

	return(iClose(a1, PERIOD_CURRENT, t1)/r1);
}
//+------------------------------------------------------------------+

//+iCLOSE D----------------------------------------------------------+
double od(const string a1,
	const double r1,
	const int t1)
{

	return(iOpen(a1, PERIOD_CURRENT, t1)/r1);
}
//+------------------------------------------------------------------+

//+iCLOSE D----------------------------------------------------------+
double hd(const string a1,
	const double r1,
	const int t1)
{

	return(iHigh(a1, PERIOD_CURRENT, t1)/r1);
}
//+------------------------------------------------------------------+

//+iCLOSE D----------------------------------------------------------+
double ld(const string a1,
	const double r1,
	const int t1)
{

	return(iLow(a1, PERIOD_CURRENT, t1)/r1);
}
//+------------------------------------------------------------------+