Korr_yrovni

Author: Copyright � 2010, sever11
Price Data Components
Series array that contains close prices for each bar
0 Views
0 Downloads
0 Favorites
Korr_yrovni
//+------------------------------------------------------------------+
//|                                         Êîððåêöèîííûå óðîâíè.mq4 |
//|                                      Copyright © 2010,   sever11 |
//| Realisation :                            http://www.komposter.me |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010,   sever11"
#property link      "http://www.komposter.me"
//îòðèñîâûâàåò òîëüêî ïîñëåäíèå äàííûå íà ãðàôèêå
#define NO_DECISION 0
#define MOVE_UP 1
#define MOVE_UP_REVERSE 10
#define MOVE_DN 2
#define MOVE_DN_REVERSE 20

#property indicator_separate_window
#property indicator_maximum 100
#property indicator_minimum 0

extern string	Message1		= "Ïîêàçàòü â ãëóáü èñòîðèè:";
extern int		ShowLast		= 0;

extern string	Message2		= "TRUE - áóäóò ïîêàçàíû";
extern bool		_Year			= false;
extern bool		_Quarter		= false;
extern bool		_Month		= false;
extern bool		_Week			= false;
extern bool		_Day			= false;
extern bool		_Hour4		= false;
extern bool		_Hour1		= false;
extern bool		_Minute30	= false;
extern bool		_Minute15	= false;
extern bool		_Minute5		= false;
extern bool		_Minute1		= false;

extern string	Settings		= "----Íàñòðîéêè îòîáðàæåíèÿ----";
extern int		K				= 8;
extern int		FontSize 	= 9;
extern color	FontColor	= White;

bool		GlobalError = false;
double	D5				= 1.0;
string	prefix		= "!@@#_";

int		shiftX		= 0;
int		shiftY		= 0;

datetime counted_bar	= 0;

datetime	TQ[];
double	CQ[];

int init()
{
	if ( Digits == 5 || Digits == 3 ) { D5 = 10.0; }	
	IndicatorShortName( "Êîððåêöèîííûå óðîâíè" );
	
	return(0);
}

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

int start()
{
	//--------------------------------------------------------------------------------------Ïðîâåðêà êîððåêòíîñòè çàïóñêà
	if ( GlobalError ) { return(0); }
	
	//--------------------------------------------------------------------------------------Ïðîâåðêà íåîáõîäèìîñòè ïåðåðèñîâêè
	if ( iTime( Symbol(), PERIOD_M1, 0 ) <= counted_bar ) { return(0); }
	counted_bar = iTime( Symbol(), PERIOD_M1, 0 );
	
	//--------------------------------------------------------------------------------------Èíèöèàëèçàöèÿ ñòàðòîâûõ äàííûõ
	int win = WindowFind( "Êîððåêöèîííûå óðîâíè" );
	
	shiftX = 5;
	shiftY = 15 + (FontSize + 5);
	CreateCaptions(win);
	InitQuarter();
	
	double	price_close = 0;
	int		timer			= 0;
	int		index			= 0;
	
	//--------------------------------------------------------------------------------------Íà÷àëî öèêëà îòîáðàæåíèÿ
	//--ïîêàçûâàåì ïîñëåäíèå ShowLast çàêðûòûõ ïåðèîäîâ
	for ( int i = 1; i <= ShowLast + 1; i ++ )
	{
		price_close = 0;
		timer			= 0;
		index			= 0;
		
		//ÃÎÄ
		timer = TimeYear(TimeCurrent()) + 1 - i;	//--îïðåäåëÿåì ãîä, ïîñëåäíþþ öåíó êîòîðîãî íàì íóæíî îòûñêàòü
		while( TimeYear(iTime( Symbol(), PERIOD_MN1, index )) >= timer ) //--äî òåõ ïîð, ïîêà ãîä àíàëèçèðóåìîãî áàðà >= íóæíîãî ãîäà
		{
			index ++; //--óãëóáëÿåìñÿ
			
			//--åñëè êîïàòü äàëüøå íåêóäà, îòìå÷àåì, ÷òî äàííûõ ó íàñ íåò è âûõîäèì
			if ( index >= iBars( Symbol(), PERIOD_MN1 ) - 1 )
			{
				index = -1;
				break;
			}
		}
		
		//--åñëè äàííûå åñòü - ïóñêàåì èõ íà àíàëèç
		if ( index >= 0 ) { AnalyzeLastPeriod( iClose( Symbol(), PERIOD_MN1, index ), _Year, "Y1", i ); }
		else { shiftX += (FontSize*8 + 5); } //--èíà÷å ïðîñòî íè÷åãî íå ðèñóåì
	
		//ÊÂÀÐÒÀË
		timer = ArraySize( CQ ) - 1;
		//--åñëè ó íàñ åñòü íóæíûå äàííûå - àíàëèçèðóåì
		if ( i <= timer ) { AnalyzeLastPeriod( CQ[timer - i], _Quarter, "Q1", i ); }
		else { shiftX += (FontSize*8 + 5); } //--èíà÷å ïðîñòî íè÷åãî íå ðèñóåì

		//ÑÒÀÍÄÀÐÒÍÛÅ ÏÅÐÈÎÄÛ
		AnalyzeLastPeriod( iClose( Symbol(), PERIOD_MN1, i ), _Month,		"MN1",	i );
		AnalyzeLastPeriod( iClose( Symbol(), PERIOD_W1,  i ), _Week,		"W1",		i );
		AnalyzeLastPeriod( iClose( Symbol(), PERIOD_D1,  i ), _Day,			"D1",		i );
		AnalyzeLastPeriod( iClose( Symbol(), PERIOD_H4,  i ), _Hour4,		"H4",		i );
		AnalyzeLastPeriod( iClose( Symbol(), PERIOD_H1,  i ), _Hour1,		"H1",		i );
		AnalyzeLastPeriod( iClose( Symbol(), PERIOD_M30, i ), _Minute30,	"M30",	i );
		AnalyzeLastPeriod( iClose( Symbol(), PERIOD_M15, i ), _Minute15,	"M15",	i );
		AnalyzeLastPeriod( iClose( Symbol(), PERIOD_M5,  i ), _Minute5,	"M5",		i );
		AnalyzeLastPeriod( iClose( Symbol(), PERIOD_M1,  i ), _Minute1,	"M1",		i );
		
		shiftX = 5;
		shiftY += (FontSize + 5);
	}
	
	return(0);
}

void AnalyzeLastPeriod( double close, bool draw, string period, int start_bar )
{
	double	upper		= 0;		//--âåðõíÿÿ ãðàíèöà êàíàëà
	double	lower		= 0;		//--íèæíÿÿ ãðàíèöà êàíàëà
	
	double	divide	= 100.0;	//--êîððåêöèîííàÿ äåëüòà
	double	subdiv	= 50.0;	//--ïîëóïåðèîä
	
	double	level		= 0;		//--óðîâåíü ê êîòîðîìó ìû ñòðåìèìñÿ
	double	lfilter	= 0;		//--íèæíÿÿ ãðàíü ôèëüòðà
	double	hfilter	= 0;		//--âåðõíÿÿ ãðàíü ôèëüòðà
	
	int		decision	= NO_DECISION;
	
	if ( Digits < 4 ) { divide = 1.0; }
	
	//--îáðàáàòûâàåì öåíó çàêðûòèÿ ïîñëåäíåãî ïåðèîäà, ÷òîáû óçíàòü ê êàêîìó êîððåêöèîííîìó óðîâíþ îíà ñòðåìèëàñü
	upper = NormalizeDouble( close*divide, 0 );
	upper = NormalizeDouble( upper/divide, Digits );
	
	//--åñëè öåíà âûøå ïîëó÷åííîãî óðîâíÿ
	if ( close - upper > Point/2.0 )
	{
		//--óâåëè÷èì óðîâåíü íà 50 ïóíêòîâ è ñðàâíèì îïÿòü
		upper = upper + subdiv*D5*Point;
		
		//--åñëè âñå åùå âûøå, çíà÷èò ó íàñ åñòü íèæíèé óðîâåíü
		if ( close - upper > Point/2.0 )
		{
			lower = upper;
			//--à âåðõíèé áóäåò åùå âûøå
			upper = upper + subdiv*D5*Point;
		}
		//--åñëè óæå íèæå, çíà÷èò íèæíèé óðîâåíü áûë íàéäåí èçíà÷àëüíî - âîçâðàùàåì åãî
		else { lower = upper - subdiv*D5*Point; }
	}
	//--åñëè öåíà íèæå ïîëó÷åííîãî óðîâíÿ
	else
	{
		//--ïîïûòàåìñÿ íàéòè íèæíèé óðîâåíü
		lower = upper - subdiv*D5*Point;
		
		//--åñëè öåíà âñå åùå âûøå, îïóñêàåìñÿ åùå íà 50 ïóíêòîâ, à òåêóùèé óðîâåíü çàïîìèíàåì êàê âåðõíèé ôèëüòð
		if ( lower - close > Point/2.0 )
		{
			upper = lower;
			lower = lower - subdiv*D5*Point;
		}
	}

	if ( draw && start_bar < 2 )
	{
		DrawLine( start_bar + "_close_" + period, close, iTime( Symbol(), Period(), start_bar ), iTime( Symbol(), Period(), start_bar - 1 ) + Period()*(K/2)*60, STYLE_SOLID, 1, DodgerBlue );
		DrawTextLabel( start_bar + "_close_" + period, iTime( Symbol(), Period(), start_bar - 1 ) + Period()*(K/2)*60, close, DodgerBlue, false );
	}
	
	double toUpper = NormalizeDouble( MathAbs( close - upper ), Digits );
	double toLower = NormalizeDouble( MathAbs( close - lower ), Digits );
	
	divide = 100.0;
	
	//--åñëè öåíà áëèæå ê íèæíåìó óðîâíþ
	if ( toUpper - toLower > Point/2.0 )
	{
		level = lower;
		//--êðóãëûé óðîâåíü
		if ( MathMod( NormalizeDouble(level/Point, 0), divide*D5 ) < Point )
		{
			lfilter	= lower + 12.0*D5*Point;
			hfilter	= lower + 31.0*D5*Point;
		}
		else
		{
			lfilter	= upper - 31.0*D5*Point;
			hfilter	= upper - 12.0*D5*Point;
		}
		
		if ( close - hfilter > -Point/2.0 ) { decision = MOVE_UP_REVERSE; }
		else { decision = MOVE_DN; }
	}
	//--åñëè áëèæå ê âåðõíåìó óðîâíþ
	else
	{
		level = upper;
		
		//--êðóãëûé óðîâåíü
		if ( MathMod( NormalizeDouble(level/Point, 0), divide*D5 ) < Point )
		{
			lfilter	= upper - 31.0*D5*Point;
			hfilter	= upper - 12.0*D5*Point;
		}
		else
		{
			lfilter	= lower + 12.0*D5*Point;
			hfilter	= lower + 31.0*D5*Point;
		}
		
		if ( lfilter - close > -Point/2.0 ) { decision = MOVE_DN_REVERSE; }
		else { decision = MOVE_UP; }
	}
	
	if ( draw && start_bar < 2 )
	{
		datetime time_one = iTime( Symbol(), Period(), K + start_bar );
		datetime time_two = iTime( Symbol(), Period(), start_bar - 1 );
		
		DrawLine( start_bar + "_level_" + period, level, time_one, time_two + Period()*K*60, STYLE_SOLID, 2, Red );
		DrawText( start_bar + "_level_" + period, DoubleToStr( level, Digits ), time_two + Period()*(K-K/8)*60, level, 15, Red );
	
		DrawLine( start_bar + "_lfilter_" + period, lfilter, time_one, time_two, STYLE_DOT, 1, Orange );
		DrawTextLabel( start_bar + "_lfilter_" + period, time_one, lfilter, Orange, true );
	
		DrawLine( start_bar + "_hfilter_" + period, hfilter, time_one, time_two, STYLE_DOT, 1, Orange );
		DrawTextLabel( start_bar + "_hfilter_" + period, time_two, hfilter, Orange, false );
	}
	
	//--âûâîäèì ñîîáùåíèå î íàøåì ðåøåíèè
	int win = WindowFind( "Êîððåêöèîííûå óðîâíè" );
	DrawLabel( start_bar + "_label_" + period, decision, period, win, level );
}

void DrawLabel( string name, int decision, string caption, int window, double level )
{
	bool success = false;
	name = prefix + name + "_arrow";
	
	color		clr = FontColor;
	string	str = "";
	
	//233 - upward
	//234 - downward
	switch( decision )
	{
		case MOVE_UP:				caption = CharToStr(233); clr = Lime;	str = DoubleToStr( level, Digits ); break;
		case MOVE_UP_REVERSE:	caption = CharToStr(233); clr = Lime;	str = DoubleToStr( level + 50.0*D5*Point, Digits ); break;
		case MOVE_DN:				caption = CharToStr(234); clr = Red;	str = DoubleToStr( level, Digits ); break;
		case MOVE_DN_REVERSE:	caption = CharToStr(234); clr = Red;	str = DoubleToStr( level - 50.0*D5*Point, Digits ); break;
		
		default: caption = CharToStr(76); clr = Orange; str = "Unknown"; break;
	}
	
	if ( ObjectFind(name) < 0 ) { success = ObjectCreate( name, OBJ_LABEL, window, 0, 0 ); }
	else { success = true; }
	
	if ( success )
	{
		ObjectSetText( name, caption, FontSize, "Wingdings", clr );
		ObjectSet( name, OBJPROP_XDISTANCE, shiftX );
		ObjectSet( name, OBJPROP_YDISTANCE, shiftY );
		ObjectSet( name, OBJPROP_CORNER, 0 );
		
		WindowRedraw();
	}
	
	shiftX += (FontSize + 5);
	name = name + "_digit";
	
	if ( ObjectFind(name) < 0 ) { success = ObjectCreate( name, OBJ_LABEL, window, 0, 0 ); }
	else { success = true; }
	
	if ( success )
	{
		ObjectSetText( name, str, FontSize, "Arial", clr );
		ObjectSet( name, OBJPROP_XDISTANCE, shiftX );
		ObjectSet( name, OBJPROP_YDISTANCE, shiftY );
		ObjectSet( name, OBJPROP_CORNER, 0 );
		
		WindowRedraw();
	}
	
	shiftX += (FontSize*7);
}

void DrawLine( string name, double level, datetime start, datetime finit, int STL, int WDT, color CLR )
{
	bool success = false;
	name = prefix + name;
	
	if ( ObjectFind(name) < 0 ) { success = ObjectCreate( name, OBJ_TREND, 0, start, level, finit, level ); }
	else { success = true; }
	
	if ( success )
	{
		ObjectSet( name, OBJPROP_RAY,		false );
		ObjectSet( name, OBJPROP_COLOR,	CLR );
		ObjectSet( name, OBJPROP_STYLE,	STL );
		ObjectSet( name, OBJPROP_WIDTH,	WDT );
		
		ObjectSet( name, OBJPROP_TIME1,	start );
		ObjectSet( name, OBJPROP_TIME2,	finit );
		ObjectSet( name, OBJPROP_PRICE1,	level );
		ObjectSet( name, OBJPROP_PRICE2,	level );

		WindowRedraw();
	}
}

void DrawText( string name, string text, datetime t1, double p1, int FNT, color CLR )
{
	bool success = false;
	name = prefix + name + "_text";
	
	if ( ObjectFind(name) < 0 ) { success = ObjectCreate( name, OBJ_TEXT, 0, t1, p1 ); }
	else { success = true; }
	
	if ( success )
	{
		ObjectSet( name, OBJPROP_TIME1,	t1 );
		ObjectSet( name, OBJPROP_PRICE1,	p1 );
		ObjectSetText( name, text, FNT, "Arial", CLR );
		
		WindowRedraw();
	}
}

void DrawTextLabel( string name, datetime t1, double p1, color clr, bool left )
{
	bool success = false;
	name = prefix + name + "_label";
	
	if ( ObjectFind(name) < 0 ) { success = ObjectCreate( name, OBJ_ARROW, 0, t1, p1 ); }
	else { success = true; }
	
	if ( success )
	{
		ObjectSet( name, OBJPROP_TIME1,		t1 );
		ObjectSet( name, OBJPROP_PRICE1,		p1 );
		ObjectSet( name, OBJPROP_COLOR,		clr );

		if ( !left ) { ObjectSet( name, OBJPROP_ARROWCODE, SYMBOL_RIGHTPRICE ); }
		else { ObjectSet( name, OBJPROP_ARROWCODE, SYMBOL_LEFTPRICE ); }

		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); }
	}
}

void CreateCaptions( int win )
{
	string caps[11] = { "Y1", "Q1", "MN1", "W1", "D1", "H4", "H1", "M30", "M15", "M5", "M1" };
	
	int shftX = 5;
	string name = "";
	
	for ( int i = 0; i < 11; i ++ )
	{
		name = prefix + caps[i];
		if ( ObjectFind(name) < 0 ) { ObjectCreate( name, OBJ_LABEL, win, 0, 0 ); }
		
		ObjectSet( name, OBJPROP_XDISTANCE, shftX );
		ObjectSet( name, OBJPROP_YDISTANCE, 15 );
		
		ObjectSetText( name, caps[i], FontSize, "Arial", FontColor );
		
		shftX += (FontSize*8 + 5);
	}
	
	WindowRedraw();
}

void InitQuarter()
{
	ArrayResize( TQ,	0 );
	ArrayResize( CQ,  0 );
	
	datetime TC = iTime( Symbol(), PERIOD_MN1, 0 );

	datetime start = iTime( Symbol(), PERIOD_MN1, iBars( Symbol(), PERIOD_MN1 ) - 1 );
	if ( start < D'1971.06.01 00:00' ) { start = D'1990.01.01 00:00'; }
	
	int MC = 3;
	datetime search = StrToTime( DoubleToStr(TimeYear(start), 0) + ".03.01 00:00" );
	
	if ( search < start ) { search = StrToTime( DoubleToStr(TimeYear(search), 0) + ".06.01 00:00" ); MC =  6; }
	if ( search < start ) { search = StrToTime( DoubleToStr(TimeYear(search), 0) + ".09.01 00:00" ); MC =  9; }
	if ( search < start ) { search = StrToTime( DoubleToStr(TimeYear(search), 0) + ".12.01 00:00" ); MC = 12; }
	if ( search < start ) { search = StrToTime( DoubleToStr(TimeYear(search)+1, 0) + ".03.01 00:00" ); }
	if ( search > TC	  ) { search = TC; }
	
	int sbar		= 0;
	int limit	= 12;
	int HUGE_DIGIT = 9999999;
	
	for ( int i = 0; i < HUGE_DIGIT; i ++ )
	{
		ArrayResize( TQ, i+1 );
		ArrayResize( CQ, i+1 );
		
		sbar	= iBarShift	( Symbol(), PERIOD_MN1, search	);
		TQ[i]	= iTime		( Symbol(), PERIOD_MN1, sbar		);
		CQ[i] = iClose		( Symbol(), PERIOD_MN1, sbar		);
		
		limit = 12;
		if ( TimeMonth(TQ[i]) > MC )
		{
			sbar ++;
			TQ[i] = iTime	( Symbol(), PERIOD_MN1, sbar );
			CQ[i] = iClose	( Symbol(), PERIOD_MN1, sbar );
		}
		
		while ( TimeMonth(TQ[i]) < MC && limit > 0 )
		{
			limit	--;		
			TQ[i] = iTime	( Symbol(), PERIOD_MN1, sbar );
			CQ[i] = iClose	( Symbol(), PERIOD_MN1, sbar );
			sbar	--;
		}
		
		if ( search == TC ) { break; }
		
		if			( MC ==  3 ) { search = StrToTime( DoubleToStr ( TimeYear(search),		0 ) + ".06.01 00:00" ); MC =  6; }
		else if	( MC ==  6 ) { search = StrToTime( DoubleToStr ( TimeYear(search),		0 ) + ".09.01 00:00" ); MC =  9; }
		else if	( MC ==  9 ) { search = StrToTime( DoubleToStr ( TimeYear(search),		0 ) + ".12.01 00:00" ); MC = 12; }
		else if 	( MC == 12 ) { search = StrToTime( DoubleToStr ( TimeYear(search) + 1,	0 ) + ".03.01 00:00" ); MC =  3; }
		
		if ( search > TC ) { search = TC; MC = TimeMonth(TC); }
	}
}

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 ---