//+------------------------------------------------------------------+
//|   #SpudFibo.mq4 - downloaded from ultimaforex.com
//+------------------------------------------------------------------+
#property  indicator_chart_window
#property  strict
#define PERIOD_Y 999999
extern string note1          = "Monthly Fibonacci colors";
extern color  UpperFiboColor = clrDarkGreen;
extern color  MainFiboColor  = clrDarkOliveGreen;
extern color  LowerFiboColor = clrForestGreen;
extern string note2          = "Draw main Fibonacci lines?";
extern bool   InnerFibs      = true;
extern int    BN             = 1;                // Monthly Bar Index (>=0) e.g.,(current=0,previous=1,...etc) 
extern string UID            = "SpudFibo-1";     // Indicator Unique ID

double HiPrice, LoPrice, Range;
datetime StartTime;

int init()
{
if(BN<0)BN=0;
return(0);
}
int deinit()
{
   ObjectDelete(UID+"FiboUp2");
   ObjectDelete(UID+"FiboDn2");
   ObjectDelete(UID+"FiboIn2");
   return(0);
}


//+------------------------------------------------------------------+
//| Draw Fibo
//+------------------------------------------------------------------+

int DrawFibo()
{
	if(ObjectFind(UID+"FiboUp2") == -1)
		ObjectCreate(UID+"FiboUp2",OBJ_FIBO,0,StartTime,HiPrice+Range,StartTime,HiPrice);
	else
	{
		ObjectSet(UID+"FiboUp2",OBJPROP_TIME2, StartTime);
		ObjectSet(UID+"FiboUp2",OBJPROP_TIME1, StartTime);
		ObjectSet(UID+"FiboUp2",OBJPROP_PRICE1,HiPrice+Range);
		ObjectSet(UID+"FiboUp2",OBJPROP_PRICE2,HiPrice);
	}
   ObjectSet(UID+"FiboUp2",OBJPROP_LEVELCOLOR,UpperFiboColor);
   ObjectSet(UID+"FiboUp2",OBJPROP_FIBOLEVELS,13);
   ObjectSet(UID+"FiboUp2",OBJPROP_FIRSTLEVEL+0,0.0);	  ObjectSetFiboDescription(UID+"FiboUp2",0,"(100.0%) -  %$"); 
   ObjectSet(UID+"FiboUp2",OBJPROP_FIRSTLEVEL+1,0.236);	ObjectSetFiboDescription(UID+"FiboUp2",1,"(123.6%) -  %$"); 
   ObjectSet(UID+"FiboUp2",OBJPROP_FIRSTLEVEL+2,0.382);	ObjectSetFiboDescription(UID+"FiboUp2",2,"(138.2%) -  %$"); 
   ObjectSet(UID+"FiboUp2",OBJPROP_FIRSTLEVEL+3,0.500);	ObjectSetFiboDescription(UID+"FiboUp2",3,"(150.0%) -  %$"); 
   ObjectSet(UID+"FiboUp2",OBJPROP_FIRSTLEVEL+4,0.618);	ObjectSetFiboDescription(UID+"FiboUp2",4,"(161.8%) -  %$"); 
   ObjectSet(UID+"FiboUp2",OBJPROP_FIRSTLEVEL+5,0.764);	ObjectSetFiboDescription(UID+"FiboUp2",5,"(176.4%) -  %$"); 
   ObjectSet(UID+"FiboUp2",OBJPROP_FIRSTLEVEL+6,1.000);	ObjectSetFiboDescription(UID+"FiboUp2",6,"(200.0%) -  %$"); 
   ObjectSet(UID+"FiboUp2",OBJPROP_FIRSTLEVEL+7,1.236);	ObjectSetFiboDescription(UID+"FiboUp2",7,"(223.6%) -  %$"); 
   ObjectSet(UID+"FiboUp2",OBJPROP_FIRSTLEVEL+8,1.500);	ObjectSetFiboDescription(UID+"FiboUp2",8,"(250.0%) -  %$"); 
   ObjectSet(UID+"FiboUp2",OBJPROP_FIRSTLEVEL+9,1.618);	ObjectSetFiboDescription(UID+"FiboUp2",9,"(261.8%) -  %$"); 
   ObjectSet(UID+"FiboUp2",OBJPROP_FIRSTLEVEL+10,2.000);	ObjectSetFiboDescription(UID+"FiboUp2",10,"(300.0%) -  %$"); 
   ObjectSet(UID+"FiboUp2",OBJPROP_FIRSTLEVEL+11,2.500);	ObjectSetFiboDescription(UID+"FiboUp2",11,"(350.0%) -  %$"); 
   ObjectSet(UID+"FiboUp2",OBJPROP_FIRSTLEVEL+12,3.000);	ObjectSetFiboDescription(UID+"FiboUp2",12,"(400.0%) -  %$"); 
   ObjectSet(UID+"FiboUp2",OBJPROP_FIRSTLEVEL+13,3.500);	ObjectSetFiboDescription(UID+"FiboUp2",13,"(450.0%) -  %$"); 
   ObjectSet(UID+"FiboUp2",OBJPROP_FIRSTLEVEL+14,4.000);	ObjectSetFiboDescription(UID+"FiboUp2",14,"(500.0%) -  %$"); 
   ObjectSet(UID+"FiboUp2",OBJPROP_RAY,true);
   ObjectSet(UID+"FiboUp2",OBJPROP_BACK,true);

	if(ObjectFind(UID+"FiboDn2") == -1)
		ObjectCreate(UID+"FiboDn2",OBJ_FIBO,0,StartTime,LoPrice-Range,StartTime,LoPrice);
	else
	{
		ObjectSet(UID+"FiboDn2",OBJPROP_TIME2, StartTime);
		ObjectSet(UID+"FiboDn2",OBJPROP_TIME1, StartTime);
		ObjectSet(UID+"FiboDn2",OBJPROP_PRICE1,LoPrice-Range);
		ObjectSet(UID+"FiboDn2",OBJPROP_PRICE2,LoPrice);
	}
   ObjectSet(UID+"FiboDn2",OBJPROP_LEVELCOLOR,LowerFiboColor); 
   ObjectSet(UID+"FiboDn2",OBJPROP_FIBOLEVELS,19);
   ObjectSet(UID+"FiboDn2",OBJPROP_FIRSTLEVEL+0,0.0);	ObjectSetFiboDescription(UID+"FiboDn2",0,"(0.0%) -  %$"); 
   ObjectSet(UID+"FiboDn2",OBJPROP_FIRSTLEVEL+1,0.236);	ObjectSetFiboDescription(UID+"FiboDn2",1,"(-23.6%) -  %$"); 
   ObjectSet(UID+"FiboDn2",OBJPROP_FIRSTLEVEL+2,0.382);	ObjectSetFiboDescription(UID+"FiboDn2",2,"(-38.2%) -  %$"); 
   ObjectSet(UID+"FiboDn2",OBJPROP_FIRSTLEVEL+3,0.500);	ObjectSetFiboDescription(UID+"FiboDn2",3,"(-50.0%) -  %$"); 
   ObjectSet(UID+"FiboDn2",OBJPROP_FIRSTLEVEL+4,0.618);	ObjectSetFiboDescription(UID+"FiboDn2",4,"(-61.8%) -  %$"); 
   ObjectSet(UID+"FiboDn2",OBJPROP_FIRSTLEVEL+5,0.764);	ObjectSetFiboDescription(UID+"FiboDn2",5,"(-76.4%) -  %$"); 
   ObjectSet(UID+"FiboDn2",OBJPROP_FIRSTLEVEL+6,1.000);	ObjectSetFiboDescription(UID+"FiboDn2",6,"(-100.0%) -  %$"); 
   ObjectSet(UID+"FiboDn2",OBJPROP_FIRSTLEVEL+7,1.236);	ObjectSetFiboDescription(UID+"FiboDn2",7,"(-123.6%) -  %$"); 
   ObjectSet(UID+"FiboDn2",OBJPROP_FIRSTLEVEL+8,1.382);	ObjectSetFiboDescription(UID+"FiboDn2",8,"(-138.2%) -  %$"); 
   ObjectSet(UID+"FiboDn2",OBJPROP_FIRSTLEVEL+9,1.500);	ObjectSetFiboDescription(UID+"FiboDn2",9,"(-150.0%) -  %$"); 
   ObjectSet(UID+"FiboDn2",OBJPROP_FIRSTLEVEL+10,1.618);	ObjectSetFiboDescription(UID+"FiboDn2",10,"(-161.8%) -  %$"); 
   ObjectSet(UID+"FiboDn2",OBJPROP_FIRSTLEVEL+11,1.764);	ObjectSetFiboDescription(UID+"FiboDn2",11,"(-176.4%) -  %$"); 
   ObjectSet(UID+"FiboDn2",OBJPROP_FIRSTLEVEL+12,2.000);	ObjectSetFiboDescription(UID+"FiboDn2",12,"(-200.0%) -  %$"); 
   ObjectSet(UID+"FiboDn2",OBJPROP_FIRSTLEVEL+13,2.500);	ObjectSetFiboDescription(UID+"FiboDn2",13,"(-250.0%) -  %$"); 
   ObjectSet(UID+"FiboDn2",OBJPROP_FIRSTLEVEL+14,3.000);	ObjectSetFiboDescription(UID+"FiboDn2",14,"(-300.0%) -  %$"); 
   ObjectSet(UID+"FiboDn2",OBJPROP_FIRSTLEVEL+15,3.500);	ObjectSetFiboDescription(UID+"FiboDn2",15,"(-350.0%) -  %$"); 
   ObjectSet(UID+"FiboDn2",OBJPROP_FIRSTLEVEL+16,4.000);	ObjectSetFiboDescription(UID+"FiboDn2",16,"(-400.0%) -  %$"); 
   ObjectSet(UID+"FiboDn2",OBJPROP_FIRSTLEVEL+17,4.500);	ObjectSetFiboDescription(UID+"FiboDn2",17,"(-450.0%) -  %$"); 
   ObjectSet(UID+"FiboDn2",OBJPROP_FIRSTLEVEL+18,5.000);	ObjectSetFiboDescription(UID+"FiboDn2",18,"(-500.0%) -  %$"); 
   ObjectSet(UID+"FiboDn2",OBJPROP_RAY,true);
   ObjectSet(UID+"FiboDn2",OBJPROP_BACK,true);

	if(InnerFibs)
	{
		if(ObjectFind(UID+"FiboIn2") == -1)
			ObjectCreate(UID+"FiboIn2",OBJ_FIBO,0,StartTime,HiPrice,StartTime+PERIOD_MN1*60,LoPrice);
		else
		{
			ObjectSet(UID+"FiboIn2",OBJPROP_TIME2, StartTime);
			ObjectSet(UID+"FiboIn2",OBJPROP_TIME1, StartTime+PERIOD_MN1*60);
			ObjectSet(UID+"FiboIn2",OBJPROP_PRICE1,HiPrice);
			ObjectSet(UID+"FiboIn2",OBJPROP_PRICE2,LoPrice);
		}
   	ObjectSet(UID+"FiboIn2",OBJPROP_LEVELCOLOR,MainFiboColor); 
   	ObjectSet(UID+"FiboIn2",OBJPROP_FIBOLEVELS,7);
   	ObjectSet(UID+"FiboIn2",OBJPROP_FIRSTLEVEL+0,0.0);	ObjectSetFiboDescription(UID+"FiboIn2",0,"Monthly LOW (0.0) -  %$"); 
   	ObjectSet(UID+"FiboIn2",OBJPROP_FIRSTLEVEL+1,0.236);	ObjectSetFiboDescription(UID+"FiboIn2",1,"(23.6) -  %$"); 
   	ObjectSet(UID+"FiboIn2",OBJPROP_FIRSTLEVEL+2,0.382);	ObjectSetFiboDescription(UID+"FiboIn2",2,"(38.2) -  %$"); 
   	ObjectSet(UID+"FiboIn2",OBJPROP_FIRSTLEVEL+3,0.500);	ObjectSetFiboDescription(UID+"FiboIn2",3,"(50.0) -  %$"); 
   	ObjectSet(UID+"FiboIn2",OBJPROP_FIRSTLEVEL+4,0.618);	ObjectSetFiboDescription(UID+"FiboIn2",4,"(61.8) -  %$"); 
   	ObjectSet(UID+"FiboIn2",OBJPROP_FIRSTLEVEL+5,0.764);	ObjectSetFiboDescription(UID+"FiboIn2",5,"(76.4) -  %$"); 
   	ObjectSet(UID+"FiboIn2",OBJPROP_FIRSTLEVEL+6,1.000);	ObjectSetFiboDescription(UID+"FiboIn2",6,"Monthly HIGH (100.0) -  %$"); 
   	ObjectSet(UID+"FiboIn2",OBJPROP_RAY,true);
   	ObjectSet(UID+"FiboIn2",OBJPROP_BACK,true);
   }
   else
	  ObjectDelete(UID+"FiboIn2");
   return(0);  
}

//+------------------------------------------------------------------+
//| Indicator start function
//+------------------------------------------------------------------+

int start()
{
	int shift	= iBarShift(NULL,PERIOD_MN1 ,Time[0]) + BN;	// yesterday
	HiPrice		= iHigh(NULL,PERIOD_MN1,shift);
	LoPrice		= iLow (NULL,PERIOD_MN1,shift);
	StartTime	= iTime(NULL,PERIOD_MN1,shift);

	if(TimeDayOfWeek(StartTime)==0/*Sunday*/)
	{//Add fridays high and low
		HiPrice = MathMax(HiPrice,iHigh(NULL,PERIOD_MN1,shift+1));
		LoPrice = MathMin(LoPrice,iLow(NULL,PERIOD_MN1,shift+1));
	}

	Range = HiPrice-LoPrice;

	DrawFibo();

	return(0);
}
//+------------------------------------------------------------------+

