iPeriodClose_

Author: Copyright � 2010, komposter
3 Views
0 Downloads
0 Favorites
iPeriodClose_
//+------------------------------------------------------------------+
//|                                               	 iPeriodClose.mq4 |
//|                                      Copyright © 2010, komposter |
//|                                          http://www.komposter.me |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, komposter"
#property link      "SEVER11"
//Äëÿ êîððåêòíîé ðàáîòû èíäèêàòîðà ïàðàìåòðû êîíöà ïðîìåæóòêîâ íåîáõîäèìî óêàçûâàòü â àìåðèêàíñêîì ôîðìàòå:
//"	ãîä, êâàðòàë - ÌÌ.ÄÄ ××:00 (íàïðèìåð, 12.31 23:00, òî åñòü 31 äåêàáðÿ 23:00);
//"	÷àñ - ××:00;
//"	åñëè îãðàíè÷åíèÿ íå óêàçûâàòü (îñòàâèòü ïîëå ïóñòûì), ñîâåòíèê áóäåò ðàáîòàòü êàê ðàíüøå.
//Ó÷òèòå, ÷òî äëÿ óêàçàííîãî âðåìåíè, ñêàæåì 31 äåêàáðÿ 23:00, ñ÷èòàåòñÿ, ÷òî çàêðûòèå ïåðèîäà íàñòóïàåò 31 äåêàáðÿ â 22:59:59.
//Ñðàçó îãîâîðþñü íàñ÷åò îãðàíè÷åíèé íîâîé âåðñèè.
//Ïðåäûäóùàÿ âåðñèÿ èíäèêàòîðà èñïîëüçîâàëà ïîñëåäíåå èçâåñòíîå âðåìÿ ïåðèîäà âíå çàâèñèìîñòè îò òîãî, íà êàêîì òô îíà áûëà çàïóùåíà, òåêóùàÿ âåðñèÿ íàõîäèò êîíåö ïåðèîäà àíàëîãè÷íûì îáðàçîì, íî îáðåçàåò åãî ïî óêàçàííîìó â íàñòðîéêàõ âðåìåíè, èñïîëüçóÿ äàííûå ÷àñîâûõ ñâå÷åé. Ýòî ñäåëàíî äëÿ òîãî, ÷òîáû ïîëó÷èòü òî÷íîå âðåìÿ çàêðûòèÿ.
//Ïðîáëåìà çàêëþ÷àåòñÿ â òîì, ÷òî ÷àñîâîé èñòîðèè ìîæåò áûòü íåäîñòàòî÷íî. Äëÿ ãîäà åå ñêîðåå âñåãî âîîáùå íå õâàòèò (òàêèì îáðàçîì ãîä íå áóäåò îòîáðàæåí) èëè æå õâàòèò ìàêñèìóì íà ïåðåõîä 2008-2009, 2009-2010. Àíàëîãè÷íàÿ ïðîáëåìà âîçíèêàåò è ñ äàííûìè ïî êâàðòàëàì. Íà äíåâíûõ áàðàõ èñòîðèè îùóòèìî áîëüøå, íî ãðàôèê òîæå ìîæåò áûòü îãðàíè÷åí.

#property indicator_chart_window

#property indicator_buffers 6

#property indicator_color1 Red
#property indicator_color2 Magenta
#property indicator_color3 Yellow
#property indicator_color4 Lime
#property indicator_color5 LemonChiffon
#property indicator_color6 DodgerBlue

#property indicator_style1 STYLE_SOLID
#property indicator_style2 STYLE_SOLID
#property indicator_style3 STYLE_SOLID
#property indicator_style4 STYLE_SOLID
#property indicator_style5 STYLE_SOLID
#property indicator_style6 STYLE_SOLID

#property indicator_width1 2
#property indicator_width2 2
#property indicator_width3 2
#property indicator_width4 2
#property indicator_width5 2
#property indicator_width6 2

//--íàñòðîéêè èíäèêàòîðà.
extern bool AllowAlert	= true;
extern int	IndexSize	= 8;

extern string	YEAR		= "----YEAR----";
extern bool		_Year		= false;				//--true - ðèñîâàòü ëèíèþ íà ãðàôèêå, false - íåò.
extern string	_YEnds	= "12.31 18:00";	//--óêàçûâàòü â ôîðìàòå MM.YY HH:00
extern color	YColor	= Red;
extern int		YWidth	= 2;
extern int		YStyle	= STYLE_SOLID;

extern string	QUARTER	= "----QUARTER----";
extern bool		_Quarter	= false;
extern string	_QI		= "03.30 23:00";	//--óêàçûâàòü â ôîðìàòå MM.YY HH:00
extern string	_QII		= "06.29 23:00";	//--óêàçûâàòü â ôîðìàòå MM.YY HH:00
extern string	_QIII		= "09.29 23:00";	//--óêàçûâàòü â ôîðìàòå MM.YY HH:00
extern string	_QIV		= "12.30 23:00";	//--óêàçûâàòü â ôîðìàòå MM.YY HH:00
extern color	QColor	= Magenta;
extern int		QWidth	= 2;
extern int		QStyle	= STYLE_SOLID;

extern string	MONTH		= "----MONTH----";
extern bool		_Month	= false;
extern color	MColor	= Yellow;
extern int		MWidth	= 2;
extern int		MStyle	= STYLE_SOLID;

extern string	WEEK		= "----WEEK----";
extern bool		_Week		= false;
extern color	WColor	= Lime;
extern int		WWidth	= 2;
extern int		WStyle	= STYLE_SOLID;

extern string	DAY		= "----DAY----";
extern bool		_Day		= true;
extern string	_DEnds	= "24:00";			//--óêàçûâàòü â ôîðìàòå HH:00
extern color	DColor	= LemonChiffon;
extern int		DWidth	= 2;
extern int		DStyle	= STYLE_SOLID;

extern string	HOUR		= "----HOUR----";
extern bool		_Hour		= false;
extern color	HColor	= DodgerBlue;
extern int		HWidth	= 2;
extern int		HStyle	= STYLE_SOLID;

//--îáùèå ïåðåìåííûå
string	symbol = "";
int		period = 0;

datetime counted_bar = 0;
string	prefix		= "!!#@_";

datetime YLS, QLS, MLS, WLS, DLS, HLS;

//--áóôåðû èíäèêàòîðà äëÿ îòîáðàæåíèÿ
double	Y	[];	//--ãîä.
double	Q	[];	//--êâàðòàë.
double	M	[];	//--ìåñÿö.
double	W	[];	//--íåäåëÿ.
double	D	[];	//--äåíü.
double	H	[];	//--÷àñ.

int init()
{
	symbol = Symbol();	//--òåêóùàÿ âàëþòíàÿ ïàðà (ñèìâîë ãðàôèêà).
	period = Period();	//--ðàáî÷èé ïåðèîä.
	
	//--êàê ñóäíî íàçîâåòå, òàê îíî è ïîïëûâåò.
	IndicatorShortName( "iPeriodClose" );

	SetIndexBuffer		( 0, Y			);
   SetIndexEmptyValue( 0, 0.0			);
	SetIndexLabel		( 0, "Ãîä"		);
	SetIndexEmptyValue( 0, 0.0			);
	SetIndexStyle		( 0, DRAW_SECTION, YStyle, YWidth, YColor );

   SetIndexBuffer		( 1, Q			);
   SetIndexEmptyValue( 1, 0.0			);
	SetIndexLabel		( 1, "Êâàðòàë" );
	SetIndexEmptyValue( 1, 0.0			);
	SetIndexStyle		( 1, DRAW_SECTION, QStyle, QWidth, QColor );

   SetIndexBuffer		( 2, M			);
   SetIndexEmptyValue( 2, 0.0			);
	SetIndexLabel		( 2, "Ìåñÿö" );
	SetIndexEmptyValue( 2, 0.0			);
	SetIndexStyle		( 2, DRAW_SECTION, MStyle, MWidth, MColor );

   SetIndexBuffer		( 3, W			);
   SetIndexEmptyValue( 3, 0.0			);
	SetIndexLabel		( 3, "Íåäåëÿ" );
	SetIndexEmptyValue( 3, 0.0			);
	SetIndexStyle		( 3, DRAW_SECTION, WStyle, WWidth, WColor );

   SetIndexBuffer		( 4, D			);
   SetIndexEmptyValue( 4, 0.0			);
	SetIndexLabel		( 4, "Äåíü" );
	SetIndexEmptyValue( 4, 0.0			);
	SetIndexStyle		( 4, DRAW_SECTION, DStyle, DWidth, DColor );

   SetIndexBuffer		( 5, H			);
   SetIndexEmptyValue( 5, 0.0			);
	SetIndexLabel		( 5, "×àñ" );
	SetIndexEmptyValue( 5, 0.0			);
	SetIndexStyle		( 5, DRAW_SECTION, HStyle, HWidth, HColor );
	
	counted_bar = 0;
	return(0);
}

int deinit()
{
	obj_delete();
	return(0);
}

int start()
{
	if ( AllowAlert )
	{
		//--ïðîâåðÿåì ïðîáèòèå íà êàæäîì òèêå
		if ( _Year		&& Y[0] > Point ) { YLS = CheckCross( Y, YLS, "ãîäîâîé"		); }
		if ( _Quarter	&& Q[0] > Point ) { QLS = CheckCross( Q, QLS, "êâàðòàëüíûé"	); }
		if ( _Month		&& M[0] > Point ) { MLS = CheckCross( M, MLS, "ìåñÿ÷íûé"		); }
		if ( _Week		&& W[0] > Point ) { WLS = CheckCross( W, WLS, "íåäåëüíûé"	); }
		if ( _Day		&& D[0] > Point ) { DLS = CheckCross( D, DLS, "äíåâíîé"		); }
		if ( _Hour		&& H[0] > Point ) { HLS = CheckCross( H, HLS, "÷àñîâîé"		); }
	}
	
	//--èíäèêàòîð ðàáîòàåò îäèí ðàç â áàð
	if ( iTime( symbol, period, 0 ) <= counted_bar ) { return(0); }
	counted_bar = iTime( symbol, period, 0 );
	
	//--íà âñåõ áàðàõ â òåêóùåì îêíå
	int bars = iBars( symbol, period ) - 1;
	
	//--ïåðåìåííûå âðåìåíè
	datetime	time_prev,
				time_next;
	
	//--öåíà çàêðûòèÿ ïåðèîäà
	double	close_price, changed_close_price;
	int		indx;
	
	//--ñáðîñèì ìàññèâû
	ArrayInitialize( Y, 0.0 );
	ArrayInitialize( Q, 0.0 );
	ArrayInitialize( M, 0.0 );
	ArrayInitialize( W, 0.0 );
	ArrayInitialize( D, 0.0 );
	ArrayInitialize( H, 0.0 );
	
	//--ïðîñìîòðèì âñå áàðû è îòìåòèì ÷òî?/ãäå?/êîãäà?
	for ( int i = 0; i < bars; i ++ )
	{
		indx = 0;
		
		time_prev	= iTime ( symbol, period, i );		//--âðåìÿ áàðà, êîòîðûé àíàëèçèðóåì
		time_next	= iTime ( symbol, period, i + 1 );	//--âðåìÿ áàðà íà îäèí äàëüøå â èñòîðèè
		close_price = iClose( symbol, period, i + 1 );	//--öåíà çàêðûòèÿ
		changed_close_price = 0;
		
		//--Ãîä.
		//--Åñëè ãîä òåêóùåé ñâå÷è íå ðàâåí ãîäó ïðåäûäóùåé,
		//--çíà÷èò íàñòàë íîâûé ãîä è íîâûé êâàðòàë.
		if ( TimeYear(time_prev) != TimeYear(time_next) )
		{
			if ( _Year )
			{
				//--åñëè âðåìÿ íå óêàçàíî, ðàáîòàåì ïî ñòàðîé ñõåìå
				if ( _YEnds == "" ) { Y[i+1] = close_price; }
				else
				{
					indx = ReturnCandleIndex( PERIOD_H1, StrToTime( DoubleToStr( TimeYear(time_next), 0 ) + "." + _YEnds ) );
					if ( indx >= 0 )
					{
						changed_close_price = iClose( symbol, PERIOD_H1, indx );
						indx = ReturnCandleIndex( period, StrToTime( DoubleToStr( TimeYear(time_next), 0 ) + "." + _YEnds ) );
						if ( indx >= 0 ) { Y[indx] = changed_close_price; }
					}
				}
			}
			
			if ( _Quarter )
			{
				if ( _QI == "" || _QII == "" || _QIII == "" || _QIV == "" ) { Q[i+1] = close_price; }
				else
				{
					indx = ReturnCandleIndex( PERIOD_H1, StrToTime( DoubleToStr( TimeYear(time_next), 0 ) + "." + _QIV ) );
					if ( indx >= 0 )
					{
						changed_close_price = iClose( symbol, PERIOD_H1, indx );
						indx = ReturnCandleIndex( period, StrToTime( DoubleToStr( TimeYear(time_next), 0 ) + "." + _QIV ) );
						if ( indx >= 0 ) { Q[indx] = changed_close_price; }
					}
				}
			}
		}
		
		//--Êâàðòàë.
		if ( _Quarter )
		{
			if ( TimeMonth(time_prev) > 3 && TimeMonth(time_next) <= 3 )
			{
				if ( _QI == "" || _QII == "" || _QIII == "" || _QIV == "" ) { Q[i+1] = close_price; }
				else
				{
					indx = ReturnCandleIndex( PERIOD_H1, StrToTime( DoubleToStr( TimeYear(time_next), 0 ) + "." + _QI ) );
					if ( indx >= 0 )
					{
						changed_close_price = iClose( symbol, PERIOD_H1, indx );
						indx = ReturnCandleIndex( period, StrToTime( DoubleToStr( TimeYear(time_next), 0 ) + "." + _QI ) );
						if ( indx >= 0 ) { Q[indx] = changed_close_price; }
					}
				}
			}
			
			if ( TimeMonth(time_prev) > 6 && TimeMonth(time_next) <= 6 )
			{
				if ( _QI == "" || _QII == "" || _QIII == "" || _QIV == "" ) { Q[i+1] = close_price; }
				else
				{
					indx = ReturnCandleIndex( PERIOD_H1, StrToTime( DoubleToStr( TimeYear(time_next), 0 ) + "." + _QII ) );
					if ( indx >= 0 )
					{
						changed_close_price = iClose( symbol, PERIOD_H1, indx );
						indx = ReturnCandleIndex( period, StrToTime( DoubleToStr( TimeYear(time_next), 0 ) + "." + _QII ) );
						if ( indx >= 0 ) { Q[indx] = changed_close_price; }
					}
				}
			}
			
			if ( TimeMonth(time_prev) > 9 && TimeMonth(time_next) <= 9 )
			{
				if ( _QI == "" || _QII == "" || _QIII == "" || _QIV == "" ) { Q[i+1] = close_price; }
				else
				{
					indx = ReturnCandleIndex( PERIOD_H1, StrToTime( DoubleToStr( TimeYear(time_next), 0 ) + "." + _QIII ) );
					if ( indx >= 0 )
					{
						changed_close_price = iClose( symbol, PERIOD_H1, indx );
						indx = ReturnCandleIndex( period, StrToTime( DoubleToStr( TimeYear(time_next), 0 ) + "." + _QIII ) );
						if ( indx >= 0 ) { Q[indx] = changed_close_price; }
					}
				}
			}
		}
		
		//--Ìåñÿö.
		if ( _Month ) { if ( TimeMonth(time_prev) != TimeMonth(time_next) ) { M[i+1] = close_price; } }
		
		//--Íåäåëÿ.
		if ( _Week && period <= PERIOD_W1 )
		{
			if ( TimeDayOfWeek(time_prev) < TimeDayOfWeek(time_next) ) { W[i+1] = close_price; }
			else { if ( time_prev - time_next >= PERIOD_D1*420 ) { W[i+1] = close_price; } }
		}
		
		//--Äåíü.
		if ( _Day && period <= PERIOD_D1 )
		{
			if ( TimeDay(time_prev) != TimeDay(time_next) )
			{
				//--åñëè êîíåö äíÿ íå óêàçàí èëè óêàçàí êàê ïîëíî÷ü, ðàáîòàåì ïî ñòàðîé ñõåìå
				if ( _DEnds == "" || _DEnds == "00:00" ) { D[i+1] = close_price; }
				else
				{
					//--èíà÷å íàõîäèì èíäåêñ ÷àñîâîãî áàðà ñ íóæíûì âðåìåíåì
					indx = ReturnCandleIndex( PERIOD_H1, StrToTime( TimeToStr( time_prev, TIME_DATE ) + " " + _DEnds ) );
					
					//--åñëè òàêîé ñóùåñòâóåò
					if ( indx >= 0 )
					{
						//--çàïîìèíàåì åãî öåíó çàêðûòèÿ
						changed_close_price = iClose( symbol, PERIOD_H1, indx );
						
						//--íàõîäèì èíäåêñ áàðà íà òåêùåì ãðàôèêå ñ íóæíûì âðåìåíåì
						indx = ReturnCandleIndex( period, StrToTime( TimeToStr( time_prev, TIME_DATE ) + " " + _DEnds ) );
						
						//--åñëè ýòîò áàð âèäèìûé, ðèñóåì
						if ( indx >= 0 ) { D[indx] = changed_close_price; }
					}
				}
			}
		}
		
		//--×àñ.
		if ( _Hour && period <= PERIOD_H1 ) { if ( TimeHour(time_prev) != TimeHour(time_next) ) { H[i+1] = close_price; } }
	}
	
	//--ðèñóåì ïðîãíîçû
	if ( _Year )
	{
		Y[0] = getPrice( Y );
		if ( Y[0] > Point ) { DrawLineIndex( "Y1", "Y1", Y[0], iTime( symbol, period, 0 ) + period*60, YColor ); }
	}
	
	if ( _Quarter )
	{
		Q[0] = getPrice( Q );
		if ( Q[0] > Point ) { DrawLineIndex( "Q1", "Q1", Q[0], iTime( symbol, period, 0 ) + period*60, QColor ); }
	}
	
	if ( _Month )
	{
		M[0] = getPrice( M );
		if ( M[0] > Point ) { DrawLineIndex( "MN1", "MN1", M[0], iTime( symbol, period, 0 ) + period*60, MColor ); }
	}
	
	if ( _Week && period <= PERIOD_W1 )
	{
		W[0] = getPrice( W );
		if ( W[0] > Point ) { DrawLineIndex( "W1", "W1", W[0], iTime( symbol, period, 0 ) + period*60, WColor ); }
	}
	
	if ( _Day && period <= PERIOD_D1 )
	{
		D[0] = getPrice( D );
		if ( D[0] > Point ) { DrawLineIndex( "D1", "D1", D[0], iTime( symbol, period, 0 ) + period*60, DColor ); }
	}
	
	if ( _Hour && period <= PERIOD_H1 )
	{
		H[0] = getPrice( H );
		if ( H[0] > Point ) { DrawLineIndex( "H1", "H1", H[0], iTime( symbol, period, 0 ) + period*60, HColor ); }
	}
	
	return(0);
}

double getPrice( double array[], datetime time = 0 )
{
	double	X[2];
	datetime	Y[2];
	
	double res = 0;
	double k, b;
	
	X[0] = 0;
	X[1] = 0;
	Y[0] = 0;
	Y[1] = 0;
	
	int index = 1;
	while ( array[index] < Point/2.0 )
	{
		index ++;
		if ( index > Bars - 1 ) { return(0); }
	}
	
	X[0] = array[index];
	Y[0] = iTime( symbol, period, index );
	index ++;
	
	while ( array[index] < Point/2.0 )
	{
		index ++;
		if ( index > Bars - 1 ) { return(0); }
	}
	
	X[1] = array[index];
	Y[1] = iTime( symbol, period, index );
	
	if ( time < 1 ) { time = iTime( symbol, period, 0 ); }
	
	//y = kx + b
	k = X[0] - X[1];
	k = k / (Y[0] - Y[1]);
	
	b = NormalizeDouble( k*Y[0], 8 );
	b = X[0] - b;
	
	res = k*time + b;
	return(NormalizeDouble(res, Digits));
}

datetime CheckCross( double array[], datetime last_signal, string str )
{
	double curO = iOpen( symbol, period, 0 );
	double curH = iHigh( symbol, period, 0 );
	double curL = iLow ( symbol, period, 0 );
	
	if ( curO - array[0] > Point/2.0 && array[0] - curL > Point/2.0 )
	{
		if ( last_signal < iTime( symbol, period, 0 ) )
		{
			Alert( Symbol(), ": öåíà ïåðåñåêëà ", str, " òðåíä âíèç!" );
			return( iTime( symbol, period, 0 ) );
		}
		
		return(last_signal);
	}
	
	if ( array[0] - curO > Point/2.0 && curH - array[0] > Point/2.0 )
	{
		if ( last_signal < iTime( symbol, period, 0 ) )
		{
			Alert( Symbol(), ": öåíà ïåðåñåêëà ", str, " òðåíä ââåðõ!" );
			return( iTime( symbol, period, 0 ) );
		}
		
		return(last_signal);
	}
}

void DrawLineIndex( string name, string text, double price, datetime time, color clr )
{
	if ( IndexSize < 1 )
	{
		obj_delete();
		return;
	}
	
	name = prefix + name + "_indxlabel";
	
	bool success = false;
	if ( ObjectFind(name) < 0 ) { success = ObjectCreate( name, OBJ_TEXT, 0, time, price ); }
	else { success = true; }
	
	if ( success )
	{
		ObjectSet( name, OBJPROP_TIME1, time );
		ObjectSet( name, OBJPROP_PRICE1, price );
		ObjectSetText( name, text, IndexSize, "Arial", clr );
		
		WindowRedraw();
	}
}

void obj_delete()
{
	int		total = ObjectsTotal() - 1;
	string	name	= "";
	
	for ( int i = total; i >= 0; i -- )
	{
		name = ObjectName(i);
		if ( ObjectFind(name) < 0 ) { continue; }
		
		if ( StringFind( name, prefix ) >= 0 ) { ObjectDelete(name); }
	}
}

int ReturnCandleIndex( int PERIOD, datetime date )
{
	int bar_index	= iBarShift( symbol, PERIOD, date );
	int total_bars	= iBars( symbol, PERIOD ) - 1;
	
	if ( bar_index >= total_bars || bar_index < 0 ) { return(-1); }
	
	while ( iTime( symbol, PERIOD, bar_index ) >= date )
	{
		bar_index ++;
		if ( bar_index >= total_bars ) { return(-1); }
	}
	
	return(bar_index);
}

Comments