//+------------------------------------------------------------------+
//| Ibuk's Bread'nButter Dashboard.mq4
//| Copyright � 2011, Squalou
//+------------------------------------------------------------------+

#property copyright "Copyright � 2011, Squalou"
#property link      "http://www.forexfactory.com/showthread.php?t=305246"

#define VERSION "1.0"
#define DATE    "2011.07.28"

/* Dashboard for EMA10
 * Displays the distance from the 24EMA on mutliple pairs (option) and multiple timeframes (H1,H4,D1 defaults)
 */
 
#property indicator_chart_window

extern bool		ShowCurrentPairOnly  = false; //	Dispaly only chart Pair
extern string	PairsToTrade = "AUDCAD,AUDCHF,AUDJPY,AUDNZD,AUDUSD,CADCHF,CADJPY,CHFJPY,EURAUD,EURCAD,EURGBP,EURJPY,EURUSD,EURNZD,GBPAUD,GBPCAD,GBPJPY,GBPUSD,NZDUSD,NZDJPY,USDCAD,USDCHF,USDJPY,XAGUSD,XAUUSD";
extern string	PeriodsToTrade = "M15,H4,D1";//,W1,MN"; // Time Frames to display are user defined

extern int     MaPeriod=10;
extern int     BufferPips =10;

extern int     MaMethod=MODE_EMA;
extern int     MaShift=0;
extern int     MaAppliedPrice=0;
extern string  mame="Method: 0=sma; 1=ema; 2=smma;  3=lwma";
extern string  maap="Applied price: 0=Close; 1=Open; 2=High";
extern string  maap1="3=Low; 4=Median; 5=Typical; 6=Weighted";

extern color	colorCodeAboveBand=DodgerBlue;
extern color	colorCodeBelowBand=Red;
extern color	colorCodeAboveMA=Aqua;
extern color	colorCodeBelowMA=Gold;
extern color	colorCodeNoSignal=Gray;


extern string	pdi="----Pair display inputs----";
extern int		FontSize=14;
extern color	FontColour=Yellow;
extern string	Font_Font = "Arial";
extern string	Font_Bold = "Arial Black";
extern double	DisplayStarts_X=5;	//from top right corner
extern double	DisplayStarts_Y=15;

//Pair extraction
int		NoOfPairs;				// Holds the number of pairs passed by the user via the inputs screen
int		NoOfPeriods;			// Holds the number of periods passed by the user via the inputs screen
string	TradePair[];			//Array to hold the pairs traded by the user
string	TradePeriod[];			//Array to hold the periods traded by the user
int		TradePeriodTF[];		//Array to hold the periods traded by the user
double TradeTrendDiffs[][5];	//Array to hold the pairs diffs from MA
color 	Trend[][5];	//Array to hold the pairs trend color
color 	TrendColor[5];	//Array to hold the trend colors
bool  	AlertSent[];

#define NOSIGNAL  0
#define ABOVEMA   1
#define BELOWMA   2
#define ABOVEBAND 3
#define BELOWBAND 4

int WindowNo = 0;

string objPrefix ;	// all objects drawn by this indicator will be prefixed with this
string buff_str ;	// all objects drawn by this indicator will be prefixed with this


//double pip;
int pipMult,pipMultTab[]={1,10,1,10,1,10,100}; // multiplier to convert pips to Points;

string _type[]= {"SMA","EMA","SMMA","LWMA"};


//+------------------------------------------------------------------+
int init()
//+------------------------------------------------------------------+
{
	int i, j;
	objPrefix = WindowExpertName();

//  pipMult = pipMultTab[Digits];
//  pip = Point * pipMult;

  TrendColor[NOSIGNAL] = colorCodeNoSignal;
  TrendColor[ABOVEBAND]= colorCodeAboveBand;
  TrendColor[BELOWBAND]= colorCodeBelowBand;
  TrendColor[ABOVEMA]  = colorCodeAboveMA;
  TrendColor[BELOWMA]  = colorCodeBelowMA;


	if(!ShowCurrentPairOnly)
	{
		//Extract the pairs traded by the user
		NoOfPairs = StringFindCount(PairsToTrade,",")+1;
		ArrayResize(TradePair, NoOfPairs);
		string AddChar = StringSubstr(Symbol(),6,4);
		StrPairToStringArray(PairsToTrade, TradePair, AddChar);
	}
	else
	{
		//Fill the array with only chart pair
		NoOfPairs = 1;
		ArrayResize(TradePair, NoOfPairs);
		TradePair[0] = Symbol();
	}
	
	NoOfPeriods = StringFindCount(PeriodsToTrade, ",")+1;
	ArrayResize(TradePeriod, NoOfPeriods);
	ArrayResize(TradePeriodTF, NoOfPeriods);
	StrToStringArray(PeriodsToTrade, TradePeriod);
	
	for(j=0; j<NoOfPeriods; j++)
	{
		TradePeriodTF[j] = StrToTF(TradePeriod[j]);	//this is for display Periods from topleft corner
		//TradePeriodTF[NoOfPeriods-j] = StrToTF(TradePeriod[j]);	//this is for display Periods from topright corner
	}
//----	
	ArrayResize(Trend, NoOfPairs);
	ArrayInitialize(Trend, NOSIGNAL);
	ArrayResize(TradeTrendDiffs, NoOfPairs);
	ArrayInitialize(TradeTrendDiffs, 0);
//----
	return(0);
}// End init()

//+------------------------------------------------------------------+
int deinit()
//+------------------------------------------------------------------+
{
//----
	Comment("");   
	RemoveObjects(objPrefix);
	return(0);
}

//+------------------------------------------------------------------+
int start()
//+------------------------------------------------------------------+
{
   GetPairTrends(TradeTrendDiffs, Trend);
   PrintPairTrends();

}

//-------------------------------------------------------------------+
void RemoveObjects(string Pref)
//+------------------------------------------------------------------+
{   
	int i;
	string objname = "";

	for (i = ObjectsTotal(); i >= 0; i--)
	{
		objname = ObjectName(i);
		if (StringFind(objname, Pref, 0) > -1) ObjectDelete(objname);
	}
	return(0);
} // End void RemoveObjects(string Pref)

//+------------------------------------------------------------------+
int StringFindCount(string str, string str2)
//+------------------------------------------------------------------+
// Returns the number of occurrences of STR2 in STR
// Usage:   int x = StringFindCount("ABCDEFGHIJKABACABB","AB")   returns x = 3
{
  int c = 0;
  for (int i=0; i<StringLen(str); i++)
    if (StringSubstr(str,i,StringLen(str2)) == str2)  c++;
  return(c);
} // End int StringFindCount(string str, string str2)

//+------------------------------------------------------------------+
void StrPairToStringArray(string str, string &a[], string p_suffix, string delim=",")
//+------------------------------------------------------------------+
{
	int z1=-1, z2=0;
	for (int i=0; i<ArraySize(a); i++)
	{
		z2 = StringFind(str,delim,z1+1);
		a[i] = StringSubstr(str,z1+1,z2-z1-1) + p_suffix;
		if (z2 >= StringLen(str)-1)   break;
		z1 = z2;
	}
	return(0);
}

//+------------------------------------------------------------------+
void StrToStringArray(string str, string &a[], string delim=",")
//+------------------------------------------------------------------+
{
	int z1=-1, z2=0;
	for (int i=0; i<ArraySize(a); i++)
	{
		z2 = StringFind(str,delim,z1+1);
		a[i] = StringSubstr(str,z1+1,z2-z1-1);
		if (z2 >= StringLen(str)-1)   break;
		z1 = z2;
	}
	return(0);
}

//+------------------------------------------------------------------+
// Converts a timeframe string to its MT4-numeric value
// Usage:   int x=StrToTF("M15")   returns x=15
int StrToTF(string str)
//+------------------------------------------------------------------+
{
  str = StringUpper(str);
  str = StringTrimLeft(str);
  str = StringTrimRight(str);
  
  if (str == "M1")   return(1);
  if (str == "M5")   return(5);
  if (str == "M15")  return(15);
  if (str == "M30")  return(30);
  if (str == "H1")   return(60);
  if (str == "H4")   return(240);
  if (str == "D1")   return(1440);
  if (str == "W1")   return(10080);
  if (str == "MN")   return(43200);
  return(0);
}  

//+------------------------------------------------------------------+
// Converts any lowercase characters in a string to uppercase
// Usage:    string x=StringUpper("The Quick Brown Fox")  returns x = "THE QUICK BROWN FOX"
string StringUpper(string str)
//+------------------------------------------------------------------+
{
  string outstr = "";
  string lower  = "abcdefghijklmnopqrstuvwxyz";
  string upper  = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  for(int i=0; i<StringLen(str); i++)  {
    int t1 = StringFind(lower,StringSubstr(str,i,1),0);
    if (t1 >=0)  
      outstr = outstr + StringSubstr(upper,t1,1);
    else
      outstr = outstr + StringSubstr(str,i,1);
  }
  return(outstr);
}  

//+------------------------------------------------------------------+
void GetPairTrends(double &diffs[][], int &trend[][])
//+------------------------------------------------------------------+
{
	int i, j;
	double diff;
	
	for(i=0; i<NoOfPairs; i++)
	{
		for(j=0; j<NoOfPeriods; j++)
		{
			trend[i][j] = NOSIGNAL;

      int digits=MarketInfo(TradePair[i],MODE_DIGITS);
      double point = MarketInfo(TradePair[i],MODE_POINT);
      double pip = point * pipMultTab[digits];
			diff = (iClose(TradePair[i], TradePeriodTF[j], 0) - iMA(TradePair[i], TradePeriodTF[j], MaPeriod, MaShift, MaMethod, MaAppliedPrice, 0))/pip;
  		diffs[i][j] = diff;

			if(diff > 0)
			{
				if(diff > BufferPips)
				{
					trend[i][j] = ABOVEBAND;
				}
				else
				{
					trend[i][j] = ABOVEMA;
				}
			}
			else
			{
				if(diff < -BufferPips)
				{
					trend[i][j] = BELOWBAND;
				}
				else
				{
					trend[i][j] = BELOWMA;
				}
			}
		} //End for(j=0; j<NoOfPeriods; j++)
	} //End for(i=0; i<NoOfPairs; i++)
	return(0);

}

//+------------------------------------------------------------------+
void PrintPairTrends()
//+------------------------------------------------------------------+
{
	RemoveObjects(objPrefix);
	
	int i, j;
	
	buff_str = StringConcatenate(objPrefix, "title");
	ObjectDelete(buff_str);
	ObjectCreate(buff_str,OBJ_LABEL,WindowNo,0,0,0,0);
	ObjectSet(buff_str,OBJPROP_CORNER,1);
	ObjectSet(buff_str,OBJPROP_XDISTANCE,DisplayStarts_X + FontSize*(NoOfPeriods*3));
	ObjectSet(buff_str,OBJPROP_YDISTANCE,DisplayStarts_Y);
	ObjectSetText(buff_str,MaPeriod+_type[MaMethod]+"Distance",FontSize-2,Font_Font,FontColour);

	//Set Trade Pair
	for(i=0; i<NoOfPairs; i++)
	{
		buff_str = StringConcatenate(objPrefix, TradePair[i]);
		ObjectDelete(buff_str);
		ObjectCreate(buff_str,OBJ_LABEL,WindowNo,0,0,0,0);
		ObjectSet(buff_str,OBJPROP_CORNER,1);
		ObjectSet(buff_str,OBJPROP_XDISTANCE,DisplayStarts_X + FontSize*(NoOfPeriods*3));
		ObjectSet(buff_str,OBJPROP_YDISTANCE,DisplayStarts_Y + (i+1)*(FontSize+FontSize/2));
		ObjectSetText(buff_str,TradePair[i],FontSize-2,Font_Font,FontColour);
	}
	//Set Trade Period
	for(j=0; j<NoOfPeriods; j++)
	{
		buff_str = StringConcatenate(objPrefix, TradePeriod[j]);
		ObjectDelete(buff_str);
		ObjectCreate(buff_str,OBJ_LABEL,WindowNo,0,0,0,0);
		ObjectSet(buff_str,OBJPROP_CORNER,1);
		ObjectSet(buff_str,OBJPROP_XDISTANCE,DisplayStarts_X + 1.5*(NoOfPeriods-1-j)*(FontSize*2));
		ObjectSet(buff_str,OBJPROP_YDISTANCE,DisplayStarts_Y);
		ObjectSetText(buff_str,TradePeriod[j],FontSize-2,Font_Font,FontColour);      
	}
	//Set Trade Trend
	for(i=0; i<NoOfPairs; i++)
	{
		for(j=0; j<NoOfPeriods; j++)
		{
			buff_str = StringConcatenate(objPrefix, TradePair[i], TradePeriod[j]);
			ObjectDelete(buff_str);
			ObjectCreate(buff_str,OBJ_LABEL,WindowNo,0,0,0,0);
 			ObjectSet(buff_str,OBJPROP_CORNER,1);
			ObjectSet(buff_str,OBJPROP_XDISTANCE,DisplayStarts_X + 1.5*(NoOfPeriods-1-j)*(FontSize*2));
			ObjectSet(buff_str,OBJPROP_YDISTANCE,DisplayStarts_Y + (i+1)*(FontSize+FontSize/2));
      if (Trend[i][j]>=ABOVEBAND)	
        ObjectSetText(buff_str,DoubleToStr(TradeTrendDiffs[i][j],0),FontSize-2,Font_Font,TrendColor[Trend[i][j]]);
      else
        ObjectSetText(buff_str,DoubleToStr(TradeTrendDiffs[i][j],0),FontSize-2,Font_Bold,TrendColor[Trend[i][j]]);
		}
	}

	return(0);

}

//+------------------------------------------------------------------+