#SpudFibo_006





//+------------------------------------------------------------------+
//|   #SpudFibo.mq4
//+------------------------------------------------------------------+
#property link "http://www.forexfactory.com/showthread.php?t=30109"
#property indicator_chart_window

//+==================================================================+
//| input parameters																	|
//+==================================================================+
extern string	ColorNote		= "--- Fibonacci colors ---";
extern color	UpperFiboColor	= Navy;
extern color	MainFiboColor	= RoyalBlue;
extern color	LowerFiboColor = DodgerBlue;
extern string	TimeFrameNote	= "--- Timeframe for the high and low ---";
extern string	TimeFrameNot2	= "{1=M1, 5=M5, 15=M15, ..., 1440=D1, 10080=W1, 43200=MN1}";
extern int		TimeFrame		= PERIOD_D1;
extern string	OpenTimeNote2	= "--- Open hour for daily timeframe ---";
extern int		OpenTime			= 0;
extern string	TimeZoneNote	= "{0=ServerTime, 1=GMT, 2=LocalTime}";
extern int		TimeZone			= 0;

//+------------------------------------------------------------------+
//| state variables that are used for drawing the fibs.					|
//+------------------------------------------------------------------+
double HiPrice, LoPrice, Range;
datetime StartTime, EndTime;

//+------------------------------------------------------------------+
//| global constants; get initialized in the init function				|
//+------------------------------------------------------------------+
string	TimeFrameStr;						// Used to label High and Low
int		FirstHour,							// First hour that is used for the range calculation in server time
			LastHour;							// Last hour that is included in the range calculation in server time
//+------------------------------------------------------------------+
#import "kernel32.dll"
int		GetTimeZoneInformation(int& TZInfoArray[]);
#import
//+------------------------------------------------------------------+
int init()
{
//---- name for DataWindow and indicator subwindow label
	switch(TimeFrame)
	{
		case 1:		TimeFrameStr="Minute";		break;
		case 5:		TimeFrameStr="5 Minute";	break;
		case 15:		TimeFrameStr="15 Minute";	break;
		case 30:		TimeFrameStr="30 Minute";	break;
		case 60:		TimeFrameStr="Hourly";		break;
		case 240:	TimeFrameStr="4 Hourly";	break;
		case 1440:	TimeFrameStr="Daily";		break;
		case 10080:	TimeFrameStr="Weekly";		break;
		case 43200:	TimeFrameStr="Monthly";		break;
		default:		TimeFrameStr="Unknown Timeframe";
	}

//---- Calculate timeshift
	int timeShift = 0;
	int ServerLocalOffset = RoundClosest(TimeCurrent()-TimeLocal(),3600) / 60;

	if(TimeZone==2)
		timeShift = ServerLocalOffset/60;						// local time -> server time

	if(TimeZone==1)
	{
		if(IsDllsAllowed())
		{
			int GmtLocalOffset,
			 	ServerGmtOffset,
			 	TZInfoArray[43],
			 	result = GetTimeZoneInformation(TZInfoArray);
			if(result!=0) GmtLocalOffset=TZInfoArray[0];		//	Difference between your local time and GMT in minutes (winter time)
			if(result==2) GmtLocalOffset+=TZInfoArray[42];	//	Current difference between your local time and GMT in minutes
			ServerGmtOffset = ServerLocalOffset-GmtLocalOffset;
			timeShift = ServerGmtOffset/60;						// GMT -> server time
		}
		else Alert("For GMT to work, DLLs must be enabled.");
	}

//----
	FirstHour = OpenTime%24;
	if(FirstHour>0)	LastHour = FirstHour-1;
	else					LastHour = 23;
	LastHour += 24+timeShift;	LastHour %=24;
	FirstHour+= 24+timeShift;	FirstHour%=24;
	Print("FirstHour (server time) = "+FirstHour);
	Print("LastHour (server time) = "+LastHour);
	return(0);
}

//+------------------------------------------------------------------+
int RoundClosest(int n, int step)
{
	if(n > 0)	n += step/2;
	else			n -= step/2;
	return(n - n%step);
}

//+------------------------------------------------------------------+
int deinit()
{
   ObjectDelete("FiboUp");
   ObjectDelete("FiboDn");
   ObjectDelete("FiboIn");
   return(0);
}


//+------------------------------------------------------------------+
//| Draw Fibo
//+------------------------------------------------------------------+
int DrawFibo()
{
//----
	if(ObjectFind("FiboUp") == -1)
		ObjectCreate("FiboUp",OBJ_FIBO,0,StartTime,HiPrice+Range,StartTime,HiPrice);
	else
	{
		ObjectSet("FiboUp",OBJPROP_TIME2, StartTime);
		ObjectSet("FiboUp",OBJPROP_TIME1, StartTime);
		ObjectSet("FiboUp",OBJPROP_PRICE1,HiPrice+Range);
		ObjectSet("FiboUp",OBJPROP_PRICE2,HiPrice);
	}
   ObjectSet("FiboUp",OBJPROP_LEVELCOLOR,UpperFiboColor);
   ObjectSet("FiboUp",OBJPROP_FIBOLEVELS,7);
   ObjectSet("FiboUp",OBJPROP_FIRSTLEVEL+0,0.0);	ObjectSetFiboDescription("FiboUp",0,TimeFrameStr+" HIGH (100.0%) -  %$"); 
   ObjectSet("FiboUp",OBJPROP_FIRSTLEVEL+1,0.236);	ObjectSetFiboDescription("FiboUp",1,"(123.6%) -  %$"); 
   ObjectSet("FiboUp",OBJPROP_FIRSTLEVEL+2,0.382);	ObjectSetFiboDescription("FiboUp",2,"(138.2%) -  %$"); 
   ObjectSet("FiboUp",OBJPROP_FIRSTLEVEL+3,0.500);	ObjectSetFiboDescription("FiboUp",3,"(150.0%) -  %$"); 
   ObjectSet("FiboUp",OBJPROP_FIRSTLEVEL+4,0.618);	ObjectSetFiboDescription("FiboUp",4,"(161.8%) -  %$"); 
   ObjectSet("FiboUp",OBJPROP_FIRSTLEVEL+5,0.764);	ObjectSetFiboDescription("FiboUp",5,"(176.4%) -  %$"); 
   ObjectSet("FiboUp",OBJPROP_FIRSTLEVEL+6,1.000);	ObjectSetFiboDescription("FiboUp",6,"(200.0%) -  %$"); 
   ObjectSet("FiboUp",OBJPROP_RAY,true);
   ObjectSet("FiboUp",OBJPROP_BACK,true);

//----
	if(ObjectFind("FiboDn") == -1)
		ObjectCreate("FiboDn",OBJ_FIBO,0,StartTime,LoPrice-Range,StartTime,LoPrice);
	else
	{
		ObjectSet("FiboDn",OBJPROP_TIME2, StartTime);
		ObjectSet("FiboDn",OBJPROP_TIME1, StartTime);
		ObjectSet("FiboDn",OBJPROP_PRICE1,LoPrice-Range);
		ObjectSet("FiboDn",OBJPROP_PRICE2,LoPrice);
	}
   ObjectSet("FiboDn",OBJPROP_LEVELCOLOR,LowerFiboColor); 
   ObjectSet("FiboDn",OBJPROP_FIBOLEVELS,7);
   ObjectSet("FiboDn",OBJPROP_FIRSTLEVEL+0,0.0);	ObjectSetFiboDescription("FiboDn",0,TimeFrameStr+" LOW (0.0%) -  %$"); 
   ObjectSet("FiboDn",OBJPROP_FIRSTLEVEL+1,0.236);	ObjectSetFiboDescription("FiboDn",1,"(-23.6%) -  %$"); 
   ObjectSet("FiboDn",OBJPROP_FIRSTLEVEL+2,0.382);	ObjectSetFiboDescription("FiboDn",2,"(-38.2%) -  %$"); 
   ObjectSet("FiboDn",OBJPROP_FIRSTLEVEL+3,0.500);	ObjectSetFiboDescription("FiboDn",3,"(-50.0%) -  %$"); 
   ObjectSet("FiboDn",OBJPROP_FIRSTLEVEL+4,0.618);	ObjectSetFiboDescription("FiboDn",4,"(-61.8%) -  %$"); 
   ObjectSet("FiboDn",OBJPROP_FIRSTLEVEL+5,0.764);	ObjectSetFiboDescription("FiboDn",5,"(-76.4%) -  %$"); 
   ObjectSet("FiboDn",OBJPROP_FIRSTLEVEL+6,1.000);	ObjectSetFiboDescription("FiboDn",6,"(-100.0%) -  %$"); 
   ObjectSet("FiboDn",OBJPROP_RAY,true);
   ObjectSet("FiboDn",OBJPROP_BACK,true);

//----
	if(ObjectFind("FiboIn") == -1)
		ObjectCreate("FiboIn",OBJ_FIBO,0,StartTime,HiPrice,EndTime,LoPrice);
	else
	{
		ObjectSet("FiboIn",OBJPROP_TIME1, StartTime);
		ObjectSet("FiboIn",OBJPROP_TIME2, StartTime+TimeFrame*60);
		ObjectSet("FiboIn",OBJPROP_PRICE1,HiPrice);
		ObjectSet("FiboIn",OBJPROP_PRICE2,LoPrice);
	}
  	ObjectSet("FiboIn",OBJPROP_LEVELCOLOR,MainFiboColor); 
  	ObjectSet("FiboIn",OBJPROP_FIBOLEVELS,5);
  	ObjectSet("FiboIn",OBJPROP_FIRSTLEVEL+0,0.236);	ObjectSetFiboDescription("FiboIn",0,"(23.6"+"\x25"+") -  %$"); 
  	ObjectSet("FiboIn",OBJPROP_FIRSTLEVEL+1,0.382);	ObjectSetFiboDescription("FiboIn",1,"(38.2) -  %$"); 
  	ObjectSet("FiboIn",OBJPROP_FIRSTLEVEL+2,0.500);	ObjectSetFiboDescription("FiboIn",2,"(50.0) -  %$"); 
  	ObjectSet("FiboIn",OBJPROP_FIRSTLEVEL+3,0.618);	ObjectSetFiboDescription("FiboIn",3,"(61.8) -  %$"); 
  	ObjectSet("FiboIn",OBJPROP_FIRSTLEVEL+4,0.764);	ObjectSetFiboDescription("FiboIn",4,"(76.4) -  %$"); 
  	ObjectSet("FiboIn",OBJPROP_RAY,true);
  	ObjectSet("FiboIn",OBJPROP_BACK,true);
}

//+------------------------------------------------------------------+
//| Indicator start function
//+------------------------------------------------------------------+

int start()
{
	if(TimeFrame!=PERIOD_D1 || (OpenTime==0 && TimeZone==0))
//	Use daily, weekly, whatever candles
	{
		int shift	= iBarShift(NULL,TimeFrame,Time[0]) + 1;	// yesterday
		HiPrice		= iHigh(NULL,TimeFrame,shift);
		LoPrice		= iLow (NULL,TimeFrame,shift);
		StartTime	= iTime(NULL,TimeFrame,shift);
		EndTime		= StartTime+TimeFrame*60;

		if(TimeFrame==PERIOD_D1 && TimeDayOfWeek(StartTime)==0/*Sunday*/)
		{//Add fridays high and low
			HiPrice = MathMax(HiPrice,iHigh(NULL,PERIOD_D1,shift+1));
			LoPrice = MathMin(LoPrice,iLow(NULL,PERIOD_D1,shift+1));
			StartTime = iTime(NULL,PERIOD_D1,shift+1);
		}
	}
	else
//	Use hourly candles
	{
	//----
	//	find last candle of the period
		shift = 1;
		while(TimeHour(iTime(NULL,PERIOD_H1,shift)) != LastHour)
			shift++;
	//----
	//	find first candle of the period
		int startShift = shift;
		while(TimeHour(iTime(NULL,PERIOD_H1,startShift)) != FirstHour
		||TimeDayOfWeek(iTime(NULL,PERIOD_H1,startShift))==0/*Sunday*/)
			startShift++;
		while(TimeHour(iTime(NULL,PERIOD_H1,startShift)) == FirstHour)
			startShift++;
		startShift--;

	//----
	//	get the highest high and lowest low of the period
		HiPrice		= iHigh(NULL,PERIOD_H1,iHighest(NULL,PERIOD_H1,MODE_HIGH,startShift-shift+1,shift));
		LoPrice		= iLow (NULL,PERIOD_H1,iLowest (NULL,PERIOD_H1,MODE_LOW, startShift-shift+1,shift));
		StartTime	= iTime(NULL,PERIOD_H1,startShift);
		EndTime		= iTime(NULL,PERIOD_H1,shift);
	}

	Range = HiPrice-LoPrice;
	DrawFibo();

	return(0);
}
//+------------------------------------------------------------------+





Sample





Analysis



Market Information Used:

Series array that contains open time of each bar
Series array that contains the highest prices of each bar
Series array that contains the lowest prices of each bar


Indicator Curves created:


Indicators Used:



Custom Indicators Used:
kernel32

Order Management characteristics:

Other Features:

It issuies visual alerts to the screen