Тики в реальном времени - страница 17

 
Yuriy Zaytsev:

ВЫ В ЭТОМ УВЕРЕНЫ ?


4 секунды ????  , да нееет!  Реально полагаете процессор завис на 4 секунды  или  память выделялась освобождалась 4 секунды ?   Вы шутите.

Более вероятно  это очередь записи на диск.

Диск устройство более медленное чем память и процессор.

А потом flush() , есть такая команда в языке Си, наверняка знаете, она выполняется когда ей удобно и комфортно и может выполнятся с некоторой задержкой чаще связанной с загрузкой диска.

Именно  ее вызывают когда нужно сбросить буфера на диск.

Ну я не то чтобы уверен, т.к. экспериментально именно в МТ не проверял. Но это вроде как стандарт - зачем в логе время записи на диск, если важнее время события которое эту запись в лог вызвало, логично же?

Да и если предположить что в лог пишется время записи на диск, и если диск загружен, всё равно же у вас задержка будет в физической записи, а время будет стоять отправки команды на запись в буфер записи. 

т.е. флаш не изменяет буфер - он просто его сбрасывает чуть позже если есть задержки.

з.ы. верно подметили что писать надо и время, т.к. в любом случае лишь на то время которое формирует сам терминал при записи в лог, ориентироваться нет смысла.

 
Aleksey Mavrin:

Ну я не то чтобы уверен, т.к. экспериментально именно в МТ не проверял. Но это вроде как стандарт - зачем в логе время записи на диск, если важнее время события которое эту запись в лог вызвало, логично же?

Да и если предположить что в лог пишется время записи на диск, и если диск загружен, всё равно же у вас задержка будет в физической записи, а время будет стоять отправки команды на запись в буфер записи. 

т.е. флаш не изменяет буфер - он просто его сбрасывает чуть позже если есть задержки.

з.ы. верно подметили что писать надо и время, т.к. в любом случае лишь на то время которое формирует сам терминал при записи в лог, ориентироваться нет смысла.


я предположил -  что время вставляется непосредственно перед записью на диск, тогда все срастается.

давайте попробуем расписать сценарий по шагам - что бы было понятней


1-пришел тик ( попал в OnTick ) - надо бы распечатать

2-в OnTick стоит принт лога - он успешно записался

3-В ОнБок тоже ЭТОТ тик приходит -  и его тоже надо бы распечатать.

4-и тут начинается КОШМАР  Виндовс вдруг ВЫЛИВАЕТ 20 потоков данных  на диск от разных программ  в этот момент и временно блокирует диск -

   так как драйвер переместил магнитную головку  для записи своих данных в другое место -) и что то там пишет свое.

5-В этот момент метатрейдер пытается что то отправить на  ДИСК 

    НО ДИСК УЖАСНО ЗАНЯТ ОПЕРАЦИОННОЙ СИТСТЕМОЙ Виндовс -  Операционка говорит метатрейдеру извините MQ у меня тут более важные задачи - потерпи

6- Проходит 4 секунды винда за 4 секунды сделала свое дело

7- и тут виндовс после 4 секунд - освободила очередь к диску - и говорит метатредеру - уважаемый терминал торговый - ты там что то хотел записать на диск ? - ладно пиши!

8-метатрейдер пишет на диск с задержкой в 4 секунды и фиксирует ВРЕМЯ В ЛОГЕ не тогда КОГДА ОН ХОТЕЛ  записать  данные на диск - а ПО ФАКТУ.

вот отсюда 4 секунды и берутся



---

Вот любой другой сценарий, типа терминал время поместил в буфер локальное время - но запись отложилась на 4 секунды - НЕ КАТИТ ТАКОЙ СЦЕНАРИЙ

иначе время бы совпало!

 
Aleksey Mavrin:

Ну я не то чтобы уверен, т.к. экспериментально именно в МТ не проверял. Но это вроде как стандарт - зачем в логе время записи на диск, если важнее время события которое эту запись в лог вызвало, логично же?

Да и если предположить что в лог пишется время записи на диск, и если диск загружен, всё равно же у вас задержка будет в физической записи, а время будет стоять отправки команды на запись в буфер записи. 

т.е. флаш не изменяет буфер - он просто его сбрасывает чуть позже если есть задержки.

з.ы. верно подметили что писать надо и время, т.к. в любом случае лишь на то время которое формирует сам терминал при записи в лог, ориентироваться нет смысла.

А если не проверял, то и не хрен трындеть.

Вы хоть понимаете о чем речь в этой ветке?

Покажи тест, иначе кыш отсюда

 
Aleksey Mavrin:

Ну я не то чтобы уверен, т.к. экспериментально именно в МТ не проверял. Но это вроде как стандарт - зачем в логе время записи на диск, если важнее время события которое эту запись в лог вызвало, логично же?

Да и если предположить что в лог пишется время записи на диск, и если диск загружен, всё равно же у вас задержка будет в физической записи, а время будет стоять отправки команды на запись в буфер записи. 

т.е. флаш не изменяет буфер - он просто его сбрасывает чуть позже если есть задержки.

з.ы. верно подметили что писать надо и время, т.к. в любом случае лишь на то время которое формирует сам терминал при записи в лог, ориентироваться нет смысла.

как раз в нашем случае получается время записи на диск!

А вот время события  можно организовать в процедуре  GetTickDescription ,  чуть выше я автору ветки писал об этом.

И если бы он его туда поместил , то мы бы сейчас точно не обсуждали возможную причину задержку в 4 секунды. В логе скорее всего локальное время  приехало  бы одинаково для  ОнБок и ОнТик , а вот время записи на диск кук раз отличалось бы на 4 секунды.

//+------------------------------------------------------------------+ 
//| возвращает строковое описание тика                               | 
//+------------------------------------------------------------------+ 
string GetTickDescription(MqlTick &tick)
{
..
..
Sergey Chalyshev:

А если не проверял, то и не хрен трындеть.

Вы хоть понимаете о чем речь в этой ветке?

Покажи тест, иначе кыш отсюда

ну зачем так жестко.

 

По идее можно доработать эту ловлю тиков,  поставить на недельку - другую, и может быть получится еще раз поймать момент когда дата записи в лог  расползется с датой события.

можно конечно ускорить этот процесс периодически нагружая диск на запись.

Другой вопрос,  самый важный . а нахрена тратить время на это исследование  :-))) , какой от этого практический выхлоп.

---

На текущий момент ясно то что тики сначала прилетают в OnTick и только затем прилетают в OnБук , что приятно OnBuk вызывается не только при тиках а например при изменении объемов на бирже, иными словами кто то открыл ордер закрыл или удалил изменились объемы.  И для биржи это достаточно важная информация.

И конечно следуя логике торговые решения на рынке АКЦИЙ / ФЬЮ логичней принимать именно в ОнБок а не в ОнТик.

 
Sergey Chalyshev:

А если не проверял, то и не хрен трындеть.

Вы хоть понимаете о чем речь в этой ветке?

Покажи тест, иначе кыш отсюда

Это вы тут трындите, хрен, 16 страниц не додумались время срабатывания события перед Print-ом запоминать и писать, скорость они измеряют, специалисты блин)

То о чём вы мне с такой горделивостью указали мол я не проверял а говорю, вы сами толком не поняли про что речь, готов поспорить. Но вам этого скорее всего не понять.

А то что это время точно не время записи на диск, это проверено.

 
Sergey Chalyshev:

А если не проверял, то и не хрен трындеть.

Вы хоть понимаете о чем речь в этой ветке?

Покажи тест, иначе кыш отсюда

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

А именно - хоть один достоверный на 100% способ экспериментально проверить, какое именно время пишет терминал в лог, а именно основные варианты:

1. время получения терминалом команды Print в очередь.

2. время начала выполнения команды Print.

3. время завершения печати в буфер, а вдруг)

Этот вариант может додумаетесь что точно нет:

4. время выполнения печати на диск.

 
Aleksey Mavrin:

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

А именно - хоть один достоверный на 100% способ экспериментально проверить, какое именно время пишет терминал в лог, а именно основные варианты:

1. время получения терминалом команды Print в очередь.

2. время начала выполнения команды Print.

3. время завершения печати в буфер, а вдруг)

Этот вариант может додумаетесь что точно нет:

4. время выполнения печати на диск.

Ну так за чем же дело?

Ждем Ваш код... 

 
prostotrader:

Ну так за чем же дело?

Ждем Ваш код... 

Какой код вы ждёте? Я вам что-то обещал накодить? На какой цене договорились напомните?)

p/s/ вы тоже не поняли, как и ваш друг, о чем я говорю.
 

Пока споры спорятся, провел еще 1 эксперимент.

//+------------------------------------------------------------------+
//|                                                   Ticks_test.mq5 |
//|                                      Copyright 2019 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019 prostotrader"
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
bool is_book;
ulong st_time, func_time;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
  is_book = MarketBookAdd(Symbol());
  st_time = GetMicrosecondCount();
  func_time = GetMicrosecondCount();
  Print(__FUNCTION__, "; Time: ", MathAbs((func_time - st_time)/1000), " ms");
  return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
  if(is_book == true) MarketBookRelease(Symbol());
}
//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
{
  if(Symbol() == symbol)
  {
    func_time = GetMicrosecondCount();
    Print(__FUNCTION__, "; Time: ", MathAbs((func_time - st_time)/1000), " ms");
  }
}
void OnTick()
{
  func_time = GetMicrosecondCount();
  Print(__FUNCTION__, "; Time: ", MathAbs((func_time - st_time)/1000), " ms");
}
//+------------------------------------------------------------------+

Т.е при инициализации засекаю микросекундное время,

и перед каждым принтом вновь буру время

В идеале должно быть так

2020.02.04 21:28:01.316	Ticks_test_2 (GOLD-3.20,M1)	OnTick; Time: 1395 ms
2020.02.04 21:28:01.316	Ticks_test_2 (GOLD-3.20,M1)	OnBookEvent; Time: 1395 ms

 Но очень часто получается так (выдержки лога):

2020.02.04 21:28:11.133 Ticks_test_2 (GOLD-3.20,M1)     OnTick; Time: 11212 ms
2020.02.04 21:28:11.139 Ticks_test_2 (GOLD-3.20,M1)     OnBookEvent; Time: 11218 ms

2020.02.04 21:28:15.603 Ticks_test_2 (GOLD-3.20,M1)     OnTick; Time: 15682 ms
2020.02.04 21:28:15.609 Ticks_test_2 (GOLD-3.20,M1)     OnBookEvent; Time: 15688 ms

2020.02.04 21:28:29.521 Ticks_test_2 (GOLD-3.20,M1)     OnTick; Time: 29599 ms
2020.02.04 21:28:29.790 Ticks_test_2 (GOLD-3.20,M1)     OnTick; Time: 29868 ms
2020.02.04 21:28:29.790 Ticks_test_2 (GOLD-3.20,M1)     OnBookEvent; Time: 29868 ms

2020.02.04 21:28:33.109 Ticks_test_2 (GOLD-3.20,M1)     OnTick; Time: 33188 ms
2020.02.04 21:28:33.115 Ticks_test_2 (GOLD-3.20,M1)     OnBookEvent; Time: 33194 ms

2020.02.04 21:28:40.800 Ticks_test_2 (GOLD-3.20,M1)     OnTick; Time: 40878 ms
2020.02.04 21:28:40.807 Ticks_test_2 (GOLD-3.20,M1)     OnBookEvent; Time: 40885 ms

2020.02.04 21:28:41.891 Ticks_test_2 (GOLD-3.20,M1)     OnTick; Time: 41969 ms
2020.02.04 21:28:41.896 Ticks_test_2 (GOLD-3.20,M1)     OnBookEvent; Time: 41974 ms

2020.02.04 21:28:52.984 Ticks_test_2 (GOLD-3.20,M1)     OnTick; Time: 53063 ms
2020.02.04 21:28:52.991 Ticks_test_2 (GOLD-3.20,M1)     OnBookEvent; Time: 53070 ms

2020.02.04 21:28:54.457 Ticks_test_2 (GOLD-3.20,M1)     OnTick; Time: 54536 ms
2020.02.04 21:28:55.276 Ticks_test_2 (GOLD-3.20,M1)     OnBookEvent; Time: 55355 ms

2020.02.04 21:29:10.643 Ticks_test_2 (GOLD-3.20,M1)     OnTick; Time: 70722 ms
2020.02.04 21:29:10.650 Ticks_test_2 (GOLD-3.20,M1)     OnBookEvent; Time: 70729 ms

2020.02.04 21:29:14.674 Ticks_test_2 (GOLD-3.20,M1)     OnTick; Time: 74752 ms
2020.02.04 21:29:14.681 Ticks_test_2 (GOLD-3.20,M1)     OnBookEvent; Time: 74759 ms

2020.02.04 21:29:25.306 Ticks_test_2 (GOLD-3.20,M1)     OnTick; Time: 85384 ms
2020.02.04 21:29:25.313 Ticks_test_2 (GOLD-3.20,M1)     OnBookEvent; Time: 85390 ms

2020.02.04 21:29:30.468 Ticks_test_2 (GOLD-3.20,M1)     OnTick; Time: 90546 ms
2020.02.04 21:29:30.481 Ticks_test_2 (GOLD-3.20,M1)     OnBookEvent; Time: 90559 ms

2020.02.04 21:29:30.866 Ticks_test_2 (GOLD-3.20,M1)     OnTick; Time: 90944 ms
2020.02.04 21:29:30.874 Ticks_test_2 (GOLD-3.20,M1)     OnBookEvent; Time: 90951 ms

2020.02.04 21:29:36.680 Ticks_test_2 (GOLD-3.20,M1)     OnTick; Time: 96758 ms
2020.02.04 21:29:36.688 Ticks_test_2 (GOLD-3.20,M1)     OnBookEvent; Time: 96766 ms

2020.02.04 21:29:37.891 Ticks_test_2 (GOLD-3.20,M1)     OnTick; Time: 97968 ms
2020.02.04 21:29:37.910 Ticks_test_2 (GOLD-3.20,M1)     OnBookEvent; Time: 97987 ms

Так что локальное время записывается в принт, когда принт вызывается.

Но это не как не вяжется с 4 секндами...

Причина обращения: