TimeOut

 
Редакция от 24.03.2005

//+------------------------------------------------------------------+
//|                                                      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;

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 = Lime;
// размер шрифта выводимой информации при значении индикатора <= 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, 12);
		ObjectSetText(  name + "_1", "Последняя котировка: ", 13, "Arial", White);

		ObjectCreate( name + "_2", OBJ_LABEL, window,0,0,0,0,0,0);
		ObjectSet( name + "_2", OBJPROP_CORNER, 0);
		ObjectSet( name + "_2", OBJPROP_XDISTANCE, 0);
		ObjectSet( name + "_2", OBJPROP_YDISTANCE, 34);
		ObjectSetText(  name + "_2", "Последняя задержка: ", 13, "Arial", White);

		ObjectCreate( name + "_3", OBJ_LABEL, window,0,0,0,0,0,0);
		ObjectSet( name + "_3", OBJPROP_CORNER, 0);
		ObjectSet( name + "_3", OBJPROP_XDISTANCE, 0);
		ObjectSet( name + "_3", OBJPROP_YDISTANCE, 57);
		ObjectSetText(  name + "_3", "Макс. задержка: ", 13, "Arial", White);

		ObjectCreate( name + "_4", OBJ_LABEL, window,0,0,0,0,0,0);
		ObjectSet( name + "_4", OBJPROP_CORNER, 0);
		ObjectSet( name + "_4", OBJPROP_XDISTANCE, 0);
		ObjectSet( name + "_4", OBJPROP_YDISTANCE, 72);
		ObjectSetText(  name + "_4", "Средняя задержка: ", 13, "Arial", White);

		ObjectCreate( name + "_1_1", OBJ_LABEL, window,0,0,0,0,0,0);
		ObjectSet( name + "_1_1", OBJPROP_CORNER, 0);
		ObjectSet( name + "_1_1", OBJPROP_XDISTANCE, 180);
		ObjectSet( name + "_1_1", OBJPROP_YDISTANCE, 12);
		ObjectSetText(  name + "_1_1", "", 13, "Arial", Red);

		ObjectCreate( name + "_2_1", OBJ_LABEL, window,0,0,0,0,0,0);
		ObjectSet( name + "_2_1", OBJPROP_CORNER, 0);
		ObjectSet( name + "_2_1", OBJPROP_XDISTANCE, 180);
		ObjectSet( name + "_2_1", OBJPROP_YDISTANCE, 34);
		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_CORNER, 0);
		ObjectSet( name + "_3_1", OBJPROP_XDISTANCE, 180);
		ObjectSet( name + "_3_1", OBJPROP_YDISTANCE, 57);
		ObjectSetText(  name + "_3_1", "", 13, "Arial", Red);

		ObjectCreate( name + "_4_1", OBJ_LABEL, window,0,0,0,0,0,0);
		ObjectSet( name + "_4_1", OBJPROP_CORNER, 0);
		ObjectSet( name + "_4_1", OBJPROP_XDISTANCE, 180);
		ObjectSet( name + "_4_1", OBJPROP_YDISTANCE, 72);
		ObjectSetText(  name + "_4_1", "", 13, "Arial", Red);
		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 = Yellow; size = 15; }
		else
// цвет и размер шрифта выводимой информации при значении индикатора >= 5
		{ _color = Red; 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", Lime);
	ObjectSetText(  name + "_2_1", luft + " сек", size, "Arial", _color);
	ObjectSetText(  name + "_3_1", Max_TimeOut + " сек" + "  ( " + TimeToStr( Max_TimeOut_Time, TIME_SECONDS ) + " )", 13, "Arial", Lime);
	ObjectSetText(  name + "_4_1", DoubleToStr( Average_TimeOut, 3 ) + " сек" + "  ( за " + Counted + " тик(-а, -ов)  )", 13, "Arial", Lime);

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);
}
 
komposter, для чего нужно вылавливать люфт между локальным и серверным временем?
Какие-то косяки нашел? Объясни, плиз.
 
Slawa, Renat, не совсем понимаю - почему тему переименовали.....
Правила форума вроде бы не нарушал......
Если есть _запрещённые_ слова/символы/словосочетания (и т.д. ) прошу опубликовать их на форуме или выслать мне на komposterius собака mail.ru

с Уважением и _искренним_ непониманием происходящего........
 
Rosh 16.02.05 11:49

"Как узнать, что сервер у брокера РАБОТАЕТ ПОЛНОФУНКЦИОНАЛЬНО?"
это _один_из_вариантов использования....
 
Rosh 16.02.05 11:49

"Как узнать, что сервер у брокера РАБОТАЕТ ПОЛНОФУНКЦИОНАЛЬНО?"
это _один_из_вариантов использования....


Спасибо за идею.
Если нет цивилизованой возможности осуществлять контроль - можно и так. :-)
МКЛ4 еще не смотрел, думаю, рпридется с ним крепко разбираться.
Гда можно взять описание МКЛ4, что бы удобно было рспечатать?
 
Все понятно, komposter, для чего ты это затеял. Но тут есть парадокс - если в МТ4 и появится возможность проверять работу сервера брокера, то ты все равно этого не увидишь - потому что брокер не купит такой МТ4 :)
 
Все понятно, komposter, для чего ты это затеял. Но тут есть парадокс - если в МТ4 и появится возможность проверять работу сервера брокера, то ты все равно этого не увидишь - потому что брокер не купит такой МТ4 :)

Очень интересный и поучительный скрипт. Но очень важно чтобы торговый сервер и клиентский компьютер были реально синхронизированы одинаково. Я у себя запустил на домашнем компьютере и сразу же увидел стабильную разницу в 37 секунд. Пришлось синхронизироваться с тем же сервером что и торговый сервер (clock.psu.edu), после чего все встало на свои места и индикатор начал стабильно показывать 0 секунд разницы. Кстати, индикатор в состоянии также показывать и отрицательные значения когда время на клиенте выставлено впереди паровоза(сервера) или время на сервере отстает.

Какое время на торговом сервере и как часто оно синхронизируется - это зависит от администраторов системы. Если ночью на совершенно спокойном рынке постоянно видите значение 2 сек, то это ни в коем случае не значит что сервер поздно выдает котировку, а лишь говорит о том, что системное время сервера отлично от клиентского ровно на 2 секунды.

Также я должен отметить, что разница, которую показывает этот индикатор, является суммой _только_ двух составляющих (время в котировке выставляет сам сервер при принятии данных извне):
1) сетевые задержки в доставке данных
2) возможные пиковые перегрузки на сервере брокера (когда компьютер не справляется с нагрузкой)

Причем в 99.9% случаев это будут сетевые задержки. Чтобы оценить сетевые задержки, дайте команду ping www.metaquotes.ru и увидите что-то такое:
Обмен пакетами с www.metaquotes.ru [66.235.184.162] по 32 байт:

Ответ от 66.235.184.162: число байт=32 время=172мс TTL=118
Ответ от 66.235.184.162: число байт=32 время=171мс TTL=118
Ответ от 66.235.184.162: число байт=32 время=171мс TTL=118
Ответ от 66.235.184.162: число байт=32 время=187мс TTL=118




Я также несколько переписал индикатор, введя проверки, комментарии и зафиксировав масштаб от -3 до 10 сек.

//+------------------------------------------------------------------+
//|                                                      TimeOut.mq4 |
//|                                                        komposter |
//|                                      mailto:komposterius@mail.ru |
//+------------------------------------------------------------------+
#property copyright "komposter"
#property link      "mailto:komposterius@mail.ru"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_minimum -3
#property indicator_maximum 10
#property indicator_color1  Red
//---- input parameters
extern int ExtTimeZone=3;
double     ExtBuffer[];
string     ExtName="TimeOut";
int        ExtInitialized=false;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
//----
   IndicatorShortName(ExtName);
   IndicatorDigits(0);
   SetIndexBuffer(0,ExtBuffer);
   SetIndexStyle(0,DRAW_HISTOGRAM);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit() { ObjectDelete (ExtName); return(0); }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   color  clr=Green;
   double size=15;
//---- первый запуск?
   if(ExtInitialized==false)
     {
      //---- поищем окно индикатора
      int window=WindowFind(ExtName);
      if(window<0) return(-1);
      //---- сконструируем метку на индикаторе
      ObjectCreate(ExtName, OBJ_LABEL, window,0,0,0,0,0,0);
      ObjectSet(ExtName, OBJPROP_CORNER, 0);
      ObjectSet(ExtName, OBJPROP_XDISTANCE, 0);
      ObjectSet(ExtName, OBJPROP_YDISTANCE, 10);
      ObjectSetText(ExtName,ExtName, 15, "Arial", Green);
      //---- выставим флаг инициализированности только если окно существует
      ExtInitialized=true;
     }
//---- замерим разницу во времени и выставим новые параметры объекта
   int luft = ( LocalTime() - ExtTimeZone*3600 ) - ( CurTime() - 3600 );
   if(luft>2)
     {
      if(luft>5) { clr=Red;    size=30; }
      else       { clr=Yellow; size=20; }
     }
   ObjectSetText(ExtName,luft + " сек", size, "Arial", clr);
//---- прокрутим виртуальный "тиковый" график взад (не более 100 тиков)
   for(int i = 100; i >= 0; i -- ) { ExtBuffer[i+1] = ExtBuffer[i]; }
   ExtBuffer[0]=luft;
//----
   return(0);
  }
//+------------------------------------------------------------------+
 
Rosh 17.02.05 20:10

я тоже так думаю =)
 
в мт-3 сделать тоже самое---------------не вопрос-----------------и он всеравно пользуется спросом у ДЦ

это мне "внутренний голос" по аське шепчет =)))
 
в мт-3 сделать тоже самое---------------не вопрос-----------------и он всеравно пользуется спросом у ДЦ

это мне "внутренний голос" по аське шепчет =)))

Что-то не совсем понял. Вроде никто никогда не запрещал проверять качество котировок брокеров, вон некоторые даже на MTAPI пишут мониторинг котировок нескольких брокеров в поиске возможностей для арбитража.
Причина обращения: