/**
 * Gus makes Labels now.
 */
#property copyright "tener"
#property link      "www.google.com" // not my domain.

#property indicator_chart_window
#define PREFIX "Gus_LabelMod"

/**
 * Argus may have had as many as one hundred eyes, which were located
 * all over his body. Hera employed him as a guard. He was killed by
 * Hermes. Afterward, Hera put Argus's eyes in the tail of the peacock,
 * her favorite bird.
 */

// settings
extern int timeframe            = PERIOD_D1;
extern double alert_distance    = 10;   // pips. zero to use the spread as the alert distance

// toggles
extern bool show_spreads        = true;
extern bool show_inactive_pairs = true;

// formatting
extern color up_alert_label_color  = Green;
extern color down_alert_label_color = Red;
extern color normal_label_color = Black;
extern int y_offset             = 50;
int fontsize             = 10;
string fontname          = "Courier New";

// symbols to consider
string symbols[]= {
	"AUDCAD",
	"AUDUSD",
	"AUDJPY",
	"AUDSGD",
	"AUDNZD",
	"CADJPY",
	"CADCHF",
	"CHFJPY",
	"EURGBP",
	"EURUSD",
	"EURAUD",
	"EURCAD",
	"EURJPY",
	"EURCHF",
	"EURNZD",
	"GBPAUD",
	"GBPCAD",
	"GBPJPY",
	"GBPCHF",
	"GBPUSD",
	"GBPNZD",
	"USDCHF",
	"USDJPY",
	"USDCAD",
	"USDSGD",
	"NZDCAD",
	"NZDJPY",
	"NZDUSD",
//	"XAUUSD",
//	"XAUJPY",
//	"XAGUSD",
//	"XAGJPY",
	"EOL" //EOL
	};

int items_;
int gus_uniq_symbols(int& dups)
{
	int count=0,i;
	double b;
	string sym;
	while (true) {
		sym = symbols[count];
		if (StringLen(sym)<6)
			break;
		for (i=0;StringLen(symbols[i])>5;i++)
			if ((sym == symbols[i])&&(count != i))
				dups++;
		b=MarketInfo(sym,MODE_BID);
		if (GetLastError() == 4106)
			Print("gus_uniq_symbols: Unknown symbol ",sym);
		count++;
	}
	return (count);
}

double gus_get_ema_dist(string sym, int tf, bool &outside)
{
/*
	double fast = iMA(sym,tf,fast_ema,0,MODE_EMA,PRICE_CLOSE,0);
	double slow = iMA(sym,tf,slow_ema,0,MODE_EMA,PRICE_CLOSE,0);
	double dig  = MarketInfo(sym,MODE_DIGITS)-1;
	double dist = (fast-slow)*MathPow(10,dig);
	return (dist);
*/

	double prev_high= iHigh(sym,tf,1);
	double prev_low = iLow(sym,tf,1);
	double price    = (MarketInfo(sym,MODE_BID)+MarketInfo(sym,MODE_ASK))/2;
	double dig      = MarketInfo(sym,MODE_DIGITS)-1;
	double modifier = 1;
	
	if (price > prev_high || price < prev_low) { modifier *= -1; outside = true; }
	
	if (((prev_low+prev_high)/2) > price){ // closer to low
		return ( (prev_low - price) * MathPow(10,dig) * modifier );
	}
	else{                                  // closer to high
		return ( (prev_high - price)* MathPow(10,dig) * modifier );
	}
	
}

void remove_grid()
{
	int i;
	for (i=0;StringLen(symbols[i])>5;i++)
	{
		ObjectDelete(PREFIX+"-"+symbols[i]);
		ObjectDelete(PREFIX+"-"+symbols[i]+"-arrow");
		if (show_spreads)
			ObjectDelete(PREFIX+"-s"+symbols[i]);
	}
}

string format_time()
{
	string t="";
	int n;
	if (timeframe>0) n=timeframe;
	else n=Period();
	switch (n) {
		case 1: t=StringConcatenate(t,"M1"); break;
		case 5: t=StringConcatenate(t,"M5"); break;
		case 15: t=StringConcatenate(t,"M15"); break;
		case 30: t=StringConcatenate(t,"M30"); break;
		case 60: t=StringConcatenate(t,"H1"); break;
		case 240: t=StringConcatenate(t,"H4"); break;
		case 1440: t=StringConcatenate(t,"D1"); break;
		case 10080: t=StringConcatenate(t,"W1"); break;
		case 43200: t=StringConcatenate(t,"MN"); break;
		default: t=StringConcatenate(t,"M"+n); break; // ?
	}
	return (t);
}

int start()
{
	int i,y_=(fontsize*3)+y_offset+11;
	string msg,n,na;
	double d,adist;
	bool outside;
	if (!show_inactive_pairs) remove_grid();
	for (i=0;StringLen(symbols[i])>5;i++){
		MarketInfo(symbols[i],MODE_BID);
		if (GetLastError() == 4106) continue;
		outside = false;
		d=gus_get_ema_dist(symbols[i],timeframe,outside);
		if (alert_distance == 0) adist=MarketInfo(symbols[i],MODE_SPREAD)*0.1;
		else adist=MathAbs(alert_distance);
		if (!show_inactive_pairs)
			if (MathAbs(d)>adist)
				continue;
		msg=DoubleToStr(MathAbs(d),1)+"  "+symbols[i];
		n=PREFIX+"-"+symbols[i];
		na=n+"-arrow";
		
		ObjectCreate(n,OBJ_LABEL,0,0,0);
		ObjectSetText(n,msg,fontsize,fontname,normal_label_color);
		ObjectSet(n,OBJPROP_CORNER,1);
		ObjectSet(n,OBJPROP_XDISTANCE,10);
		ObjectSet(n,OBJPROP_YDISTANCE,y_);
		
		ObjectCreate(na,OBJ_LABEL,0,0,0);
		ObjectSet(na,OBJPROP_CORNER,1);
		ObjectSet(na,OBJPROP_XDISTANCE,98+fontsize+17);
		ObjectSet(na,OBJPROP_YDISTANCE,y_);
		if (d<0) ObjectSetText(na,"\xDA",7,"Wingdings",down_alert_label_color);
		else ObjectSetText(na,"\xD9",7,"Wingdings",up_alert_label_color);
		
		if (MathAbs(d)<=adist)
			ObjectSet(n,OBJPROP_COLOR,ObjectGet(na,OBJPROP_COLOR));
		
		if (show_spreads){
			ObjectCreate(PREFIX+"-s"+symbols[i],OBJ_LABEL,0,0,0);
			ObjectSetText(PREFIX+"-s"+symbols[i],DoubleToStr(MarketInfo(symbols[i],MODE_SPREAD)*0.1,1),fontsize,fontname,ObjectGet(n,OBJPROP_COLOR));
			ObjectSet(PREFIX+"-s"+symbols[i],OBJPROP_CORNER,1);
			ObjectSet(PREFIX+"-s"+symbols[i],OBJPROP_XDISTANCE,118+fontsize+20);
			ObjectSet(PREFIX+"-s"+symbols[i],OBJPROP_YDISTANCE,y_);
		}
		y_ = y_+fontsize+2;
	}
	return (0);
}

int init()
{

// DUE TO REQUESTED MOD, nameLabel ONLY EXISTS TO WARN OF DUPS
// IN SYMBOL LIST
////////////////////////////////////////////////////////////////////
	int d=0;
	items_=gus_uniq_symbols(d);
	ObjectCreate(PREFIX+"-nameLabel",OBJ_LABEL,0,0,0);
	//ObjectSetText(PREFIX+"-nameLabel","EMA("+fast_ema+")/EMA("+slow_ema+")",fontsize,fontname,normal_label_color);
	ObjectSetText(PREFIX+"-nameLabel"," ",fontsize,fontname,normal_label_color);
	if (d>0)
		ObjectSetText(PREFIX+"-nameLabel","Duplicates exist in symbols[] list.",fontsize,fontname,down_alert_label_color);
	ObjectSet(PREFIX+"-nameLabel",OBJPROP_CORNER,1);
	ObjectSet(PREFIX+"-nameLabel",OBJPROP_XDISTANCE,10);
	ObjectSet(PREFIX+"-nameLabel",OBJPROP_YDISTANCE,y_offset+3);
/////////////////////////////////////////////////////////////////////
	
	ObjectCreate(PREFIX+"-tf",OBJ_LABEL,0,0,0);
	ObjectSetText(PREFIX+"-tf","WATCHING PREVIOUS "+format_time(),8,"Courier New",normal_label_color);
	ObjectSet(PREFIX+"-tf",OBJPROP_CORNER,1);
	ObjectSet(PREFIX+"-tf",OBJPROP_XDISTANCE,10);
	ObjectSet(PREFIX+"-tf",OBJPROP_YDISTANCE,y_offset+fontsize+6);
	
	ObjectCreate(PREFIX+"-col",OBJ_LABEL,0,0,0);
	ObjectSetText(PREFIX+"-col","DIST    PAIR",fontsize,fontname,normal_label_color);
	if (show_spreads)
		ObjectSetText(PREFIX+"-col","SPRD     DIST    PAIR",fontsize,fontname,normal_label_color);
	ObjectSet(PREFIX+"-col",OBJPROP_CORNER,1);
	ObjectSet(PREFIX+"-col",OBJPROP_XDISTANCE,10);
	ObjectSet(PREFIX+"-col",OBJPROP_YDISTANCE,y_offset+9+(fontsize*2));
	return (0);
}

int deinit()
{
	ObjectDelete(PREFIX+"-nameLabel");
	ObjectDelete(PREFIX+"-tf");
	ObjectDelete(PREFIX+"-col");
	remove_grid();
	return (0);
}

