iPeriodClose_

Author: Copyright � 2010, komposter
Price Data Components
Series array that contains close prices for each barSeries array that contains open prices of each barSeries array that contains the highest prices of each bar
Miscellaneous
It issuies visual alerts to the screen
0 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

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---