//+------------------------------------------------------------------+
//|                                                      TimeOut.mq4 |
//|                              Доброжелатель, thanks to: komposter |
//|                                      mailto:komposterius@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Доброжелатель, thanks to: komposter"
#property link      "mailto:komposterius@mail.ru"


#property indicator_separate_window
#property indicator_minimum -1
#property  indicator_buffers 2
#property  indicator_color1  Red
#property  indicator_color2  Lime

string name = "TimeOut";
bool first = true;
int Max_TimeOut;
datetime Max_TimeOut_Time;
double buf0[];
double buf1[];
double SummTimeOut, Average_TimeOut;
int Counted;

// Часовой пояс ( для Москвы  GMT_shift = 3 )
extern int GMT_shift = 3;
// Кол-во отрисовываемых баров индикатора
extern int DrawBars = 333;

extern color OKColor				= Lime;
extern color StandartColor		= White;
extern color AttentionColor	= Yellow;
extern color WarningColor		= Red;

int init()
{
	IndicatorShortName( name );
	IndicatorDigits ( 3 );
	SetIndexBuffer ( 0 , buf0 );
	SetIndexStyle ( 0 , DRAW_HISTOGRAM  );
	SetIndexLabel ( 0 , "TimeOut" );
	SetIndexBuffer ( 1 , buf1 );
	SetIndexStyle ( 1 , DRAW_LINE  );
	SetIndexLabel ( 1 , "Average TimeOut" );
	SetIndexEmptyValue ( 1, 0 );
	for ( int i = MathMax( Bars, DrawBars ); i >= 0; i -- )
	{ buf0[i] = 0;  buf1[i] = 0; }
	first = true;
return(0);
}

int start()
{
	if ( DrawBars > Bars && Bars > 0 ) { DrawBars = Bars - 1; }
// инициализация переменных
// цвет выводимой информации при значении индикатора <= 2
	color _color = OKColor;
// размер шрифта выводимой информации при значении индикатора <= 2
	double size = 13;

//при первом запуске в окне индикатора создаём "текстовые метки", в которые будут выводиться результаты.
	if ( first == true )
	{
//поиск окна индикатора по имени
		int window = WindowFind(name);
//если окно не найдено - "текстовые метки" будут созданы в окне графика
      if( window < 0) { window = 0; }
		ObjectCreate( name + "_1", OBJ_LABEL, window,0,0,0,0,0,0);
		ObjectSet( name + "_1", OBJPROP_CORNER, 0);
		ObjectSet( name + "_1", OBJPROP_XDISTANCE, 0);
		ObjectSet( name + "_1", OBJPROP_YDISTANCE, 20);
		ObjectSetText(  name + "_1", "Last tick: ", 13, "Arial", StandartColor);

		ObjectCreate( name + "_2", OBJ_LABEL, window,0,0,0,0,0,0);
		ObjectSet( name + "_2", OBJPROP_XDISTANCE, 0);
		ObjectSet( name + "_2", OBJPROP_YDISTANCE, 40);
		ObjectSetText(  name + "_2", "Last TimeOut: ", 13, "Arial", StandartColor);

		ObjectCreate( name + "_3", OBJ_LABEL, window,0,0,0,0,0,0);
		ObjectSet( name + "_3", OBJPROP_XDISTANCE, 0);
		ObjectSet( name + "_3", OBJPROP_YDISTANCE, 60);
		ObjectSetText(  name + "_3", "Max TimeOut: ", 13, "Arial", StandartColor);

		ObjectCreate( name + "_4", OBJ_LABEL, window,0,0,0,0,0,0);
		ObjectSet( name + "_4", OBJPROP_XDISTANCE, 0);
		ObjectSet( name + "_4", OBJPROP_YDISTANCE, 80);
		ObjectSetText(  name + "_4", "Ave TimeOut: ", 13, "Arial", StandartColor);

		ObjectCreate( name + "_1_1", OBJ_LABEL, window,0,0,0,0,0,0);
		ObjectSet( name + "_1_1", OBJPROP_XDISTANCE, 100);
		ObjectSet( name + "_1_1", OBJPROP_YDISTANCE, 20);
		ObjectSetText(  name + "_1_1", "", 13, "Arial", WarningColor);

		ObjectCreate( name + "_2_1", OBJ_LABEL, window,0,0,0,0,0,0);
		ObjectSet( name + "_2_1", OBJPROP_XDISTANCE, 100);
		ObjectSet( name + "_2_1", OBJPROP_YDISTANCE, 40);
		ObjectSetText(  name + "_2_1", "", size, "Arial", _color);

		ObjectCreate( name + "_3_1", OBJ_LABEL, window,0,0,0,0,0,0);
		ObjectSet( name + "_3_1", OBJPROP_XDISTANCE, 100);
		ObjectSet( name + "_3_1", OBJPROP_YDISTANCE, 60);
		ObjectSetText(  name + "_3_1", "", 13, "Arial", WarningColor);

		ObjectCreate( name + "_4_1", OBJ_LABEL, window,0,0,0,0,0,0);
		ObjectSet( name + "_4_1", OBJPROP_XDISTANCE, 100);
		ObjectSet( name + "_4_1", OBJPROP_YDISTANCE, 80);
		ObjectSetText(  name + "_4_1", "", 13, "Arial", WarningColor);
		for ( int u = Bars-1; u >= 0; u -- )
		{ buf0[u] = 0;  buf1[u] = 0; }

		first = false;
		return(0);
	}
//производим подсчёты
// - задержка котировки
	int luft = ( LocalTime() - GMT_shift*3600 ) - ( CurTime() - 3600 );
// - время и значение максимальной задержки
	if ( Max_TimeOut <= luft || Max_TimeOut == 0 ) { Max_TimeOut = luft; Max_TimeOut_Time = CurTime(); }
// - общая задержка
	SummTimeOut += luft;
// - кол-во тиков
	Counted ++;
// - средняя задержка
	Average_TimeOut = SummTimeOut / Counted;
	if ( luft > 2 )
	{
		if ( luft < 5 )
// цвет и размер шрифта выводимой информации при значении индикатора от 2 до 5
		{ _color = AttentionColor; /*size = 15;*/ }
		else
// цвет и размер шрифта выводимой информации при значении индикатора >= 5
		{ _color = WarningColor; /*size = 20;*/ }
	}
// изображение на графике - одна свеча соответствует одному тику
// хранятся последние DrawBars тиков
	for ( int i = DrawBars; i >= 0; i -- )
	{ buf0[i+1] = buf0[i]; buf1[i+1] = buf1[i]; }
	buf0[0] = luft;
	buf1[0] = Average_TimeOut;

// вывод информации в "текстовые метки"
	ObjectSetText(  name + "_1_1", TimeToStr( CurTime(), TIME_SECONDS ), 13, "Arial", OKColor);
	ObjectSetText(  name + "_2_1", luft + " сек", size, "Arial", _color);
	ObjectSetText(  name + "_3_1", Max_TimeOut + " сек" + "  ( " + TimeToStr( Max_TimeOut_Time, TIME_SECONDS ) + " )", 13, "Arial", OKColor);
	ObjectSetText(  name + "_4_1", DoubleToStr( Average_TimeOut, 3 ) + " сек" + "  ( за " + Counted + " тик(-а, -ов)  )", 13, "Arial", OKColor);

return(0);
}
int deinit()
{
// при деинициализации - удаляем созданные "текстовые метки"
	ObjectDelete ( name );
	ObjectDelete ( name + "_1" );
	ObjectDelete ( name + "_2" );
	ObjectDelete ( name + "_3" );
	ObjectDelete ( name + "_4" );
	ObjectDelete ( name + "_1_1" );
	ObjectDelete ( name + "_2_1" );
	ObjectDelete ( name + "_3_1" );
	ObjectDelete ( name + "_4_1" );
	return(0);
}

