Полторы минуты разницы между локальным временем и временем свежего тика. Что делать. - страница 5

 
pivomoe:
Знаю. К чему вы это ? 

К тому, что:

pivomoe:

В обзоре рынке ещё есть столбцы "Объем" "Последняя сделка " Есть подозрения, что эта функция просто возвращает .time последнего тика. 

Функция SymbolInfoInteger(_Symbol,SYMBOL_TIME) возвращает как раз время последнего тика. Потому что изменение котировки влечет за собой появление нового информационного тика.

Вы хотите замерить время между приходом последней котировки и временем последнего тика. В секундах, похоже, это всегда будет 0. Следовательно, терминал все возвращает оперативно.

 
Alexey Kozitsyn:

К тому, что:

Функция SymbolInfoInteger(_Symbol,SYMBOL_TIME) возвращает как раз время последнего тика. Потому что изменение котировки влечет за собой появление нового информационного тика.

Вы хотите замерить время между приходом последней котировки и временем последнего тика. В секундах, похоже, это всегда будет 0. Следовательно, терминал все возвращает оперативно.

Еще раз в чем я вижу проблему.

Дано:

Локальное время и время сервера более менее синхронизированы т.е разница между .time_msc новых тиков и локальным временем несколько секунд.

В 18:00:00 по времени компа  пытаемся получить новый тик по символу SBER с помощью SymbolInfoTick, нам отдают тик со временем 17:57:00

В 18:00:01 по времени компа опять пытаемся получить новый тик по символу SBER с помощью SymbolInfoTick, нам отдают тик со временем 17:58:30

Мне кажется это нельзя назвать оперативным.

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

 
pivomoe:

Еще раз в чем я вижу проблему.

Дано:

Локальное время и время сервера более менее синхронизированы т.е разница между .time_msc новых тиков и локальным временем несколько секунд.

В 18:00:00 по времени компа  пытаемся получить новый тик по символу SBER с помощью SymbolInfoTick, нам отдают тик со временем 17:57:00

В 18:00:01 по времени компа опять пытаемся получить новый тик по символу SBER с помощью SymbolInfoTick, нам отдают тик со временем 17:58:30

Мне кажется это нельзя назвать оперативным.

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

Вы понимаете, что время компа можно выставить любым? К нему нельзя привязываться. Это Вам уже говорили. Это во-первых.

Во-вторых, максимальное время последнего тика среди всех символов из обзора рынка тоже нельзя использовать. Вы хотите найти отставание времени последнего тика символа SBER (SymbolInfoTick) от времени последней котировки символа SBER (SymbolInfoInteger). Т.е. делать нужно примерно так, как написал я (примерно потому, что для большей точности нужно использовать стакан, как Вам и советовали).

В-третьих, вот это:

В 18:00:00 по времени компа  пытаемся получить новый тик по символу SBER с помощью SymbolInfoTick, нам отдают тик со временем 17:57:00

В 18:00:01 по времени компа опять пытаемся получить новый тик по символу SBER с помощью SymbolInfoTick, нам отдают тик со временем 17:58:30

заявляется без доказательств. Если Вы считаете Ваш код доказательством - смотрите "во-вторых".

 
Alexey Kozitsyn:

Вы понимаете, что время компа можно выставить любым? К нему нельзя привязываться. Это Вам уже говорили. Это во-первых.


  К нему нельзя привязывать если вести разговоры о миллисекундах или даже секундах. Говоря о задержках в минуты вполне возможно. Я сейчас замеряю разницу не с ним, а с максимальным временем .time_msc последнего тика по всем символам из обзора рынка.

Alexey Kozitsyn:

 Вы хотите найти отставание времени последнего тика символа SBER (SymbolInfoTick) от времени последней котировки символа SBER (SymbolInfoInteger). 

  Не хочу. 

Alexey Kozitsyn:

Во-вторых, максимальное время последнего тика среди всех символов из обзора рынка тоже нельзя использовать. 

  Почему ? Я же не время ПОЛУчения последнего тик ( по компьютера ) , а именно .time_msc сравниваю. 

Alexey Kozitsyn:

заявляется без доказательств. Если Вы считаете Ваш код доказательством - смотрите "во-вторых".

Обычно разработчики просят код для воспроизведения проблемы. Вот недавно пойманная задержка в 2 секунды.

14:53:10.277    ProverkaAktyalnostiTikov (RTS-3.19,H1)  РЕКОРДная  Разница между временем последенго тика по ВСЕМ символам Минус только, что полученный новый тик по символу 2057 милесекундa.
14:53:10.277    ProverkaAktyalnostiTikov (RTS-3.19,H1)   Получен НОВЫЙ тик по символу                     GAZR-3.19 time_msc= 2019.03.20 14:53:11.638
14:53:10.277    ProverkaAktyalnostiTikov (RTS-3.19,H1)   ХОТЯ до этого был получeн тик                        RTS-3.19 time_msc 2019.03.20 14:53:13.695
14:53:10.277    ProverkaAktyalnostiTikov (RTS-3.19,H1)   Локальное время получения нового тика по символу.                                   2019.03.20 14:53:10.277
14:53:10.277    ProverkaAktyalnostiTikov (RTS-3.19,H1)   Предпоследние Локальное время попытки получить новый тик по символу    2019.03.20 14:53:10.259
Alexey Kozitsyn:

 (примерно потому, что для большей точности нужно использовать стакан, как Вам и советовали).

 

   Мне советовали вместо OnTimer использовать OnBookEvent. Я это реализовал. Можно в настройках выбрать место получения тиков или OnTimer или OnBookEvent. С OnBookEvent все ещё хуже он только процентов 70% событий новых тик отлавливает.  
Файлы:
 

pivomoe:

14:53:10.277    ProverkaAktyalnostiTikov (RTS-3.19,H1)  РЕКОРДная  Разница между временем последенго тика по ВСЕМ символам Минус только, что полученный новый тик по символу 2057 милесекундa.
14:53:10.277    ProverkaAktyalnostiTikov (RTS-3.19,H1)   Получен НОВЫЙ тик по символу                     GAZR-3.19 time_msc= 2019.03.20 14:53:11.638
14:53:10.277    ProverkaAktyalnostiTikov (RTS-3.19,H1)   ХОТЯ до этого был получeн тик                        RTS-3.19 time_msc 2019.03.20 14:53:13.695
14:53:10.277    ProverkaAktyalnostiTikov (RTS-3.19,H1)   Локальное время получения нового тика по символу.                                   2019.03.20 14:53:10.277
14:53:10.277    ProverkaAktyalnostiTikov (RTS-3.19,H1)   Предпоследние Локальное время попытки получить новый тик по символу    2019.03.20 14:53:10.259

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

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

 
Alexey Kozitsyn:

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

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

Алексей (не хотел участвовать, но...).

А разве это не "актуальность" (NEW_TICK) код со 2 страницы этого топика?

//+------------------------------------------------------------------+
//|                                                         Time.mq5 |
//|                                                   Copyright 2019 |
//|                                                                  |
//+------------------------------------------------------------------+
enum FRESH_TICK
{
  UNKNOWN_TICK,
  NEW_TICK,
  CUR_TICK
};
//
int is_book;
ulong last_tick_time; //Время последнего тика
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
  last_tick_time = 0;
  is_book = MarketBookAdd(Symbol());
  if(is_book == false) return(INIT_FAILED);
  return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
  if(is_book == true) MarketBookRelease(Symbol()); 
}
//+------------------------------------------------------------------+
// Expert Book event function                                        |
//+------------------------------------------------------------------+  
void OnBookEvent(const string &symbol)
{
  if(symbol == Symbol())
  {
    MqlTick a_ticks[];
    int result = CopyTicks(symbol, a_ticks, COPY_TICKS_ALL, 0, 1);
    if(result > 0)
    {
      FRESH_TICK tick_state = CheckTickTime(a_ticks[0]);
      switch(tick_state)
      {
       case UNKNOWN_TICK:; //Тик не определен
       break;
       case NEW_TICK:;     //Торговое время, можно отсылать ордера;
       break;
       case CUR_TICK:;     //По усмотрению разработчика;
       break;
      }
    }  
  }
}
//+------------------------------------------------------------------+
//| Expert Check Market Time function                                |
//+------------------------------------------------------------------+
FRESH_TICK CheckTickTime(MqlTick &a_tick)
{
  MqlDateTime cur_time, tick_time;
  cur_time.year = 0;
  TimeTradeServer(cur_time); //Возвращает расчетное текущее время торгового сервера.
  if(cur_time.year > 0)
  {
    if(TimeToStruct(a_tick.time, tick_time) == true)
    {
      if(tick_time.day_of_year == cur_time.day_of_year)      //Проверка, что это сегодняшний тик
      {
        double t_msc = double(a_tick.time_msc - ulong(a_tick.time) * 1000)/1000;
        double tr_time = double(tick_time.hour * 3600 + tick_time.min * 60 + tick_time.sec) + t_msc;
        if(((tr_time >= 36000) && (tr_time < 50370)) ||   //10:00:00 - 13:59:30
           ((tr_time >= 50700) && (tr_time < 67470)) ||   //14:05:00 - 19:44:30 
           ((tr_time >= 68700) && (tr_time < 85770)))     //19:05:00 - 23:49:30
        {
          if(ulong(a_tick.time_msc) > last_tick_time)
          {
            last_tick_time = ulong(a_tick.time_msc);
            return(NEW_TICK);
          } else return(CUR_TICK);  
        }
      }
    }
  }   
  return(UNKNOWN_TICK);
} 

Добавлено

При CUR_TICK можно еще сделать проверки, что это тот же тик, что и был или

в новом пакете тиков оказался не переданный в предыдущем пакете тик.

 
prostotrader:

Алексей (не хотел участвовать, но...).

А разве это не "актуальность" (NEW_TICK) код со 2 страницы этого топика?

Похоже, что нет. Т.к.:

TimeTradeServer

Возвращает расчетное текущее время торгового сервера. В отличие от функции TimeCurrent(), расчет значения времени производится в клиентском терминале и зависит от настроек времени на компьютере пользователя. 

Т.е. опять таки зависит от времени компьютера (чего для точности замера быть не должно).

Тут, по хорошему, конечно нужно проверить код pivomoe на корректность, и, если действительно есть косяк - обратиться к разработчикам.

 
prostotrader:

Проверку, похоже, нужно через TimeGMTOffset делать. Позже набросаю пример.

 
Alexey Kozitsyn:

Похоже, что нет. Т.к.:


Вы посмотрите внимательно код!

TimeTradeServer() берётся только для определения дня и ВСЁ (эта проверка сделана "на всякий случай")!

TimeTradeServer()  можно вообще не делать!

Добавлено

Повторюсь

"При CUR_TICK можно еще сделать проверки, что это тот же тик, что и был или

в новом пакете тиков оказался не переданный в предыдущем пакете тик, и пакет состоит из 1 тика("старого")"

if(ulong(a_tick.time_msc) > last_tick_time)
{
  last_tick_time = ulong(a_tick.time_msc);
  return(NEW_TICK);
}
 else
{
   //Дополнительные проверки 
}
 
Alexey Kozitsyn:

Тут, по хорошему, конечно нужно проверить код pivomoe на корректность, и, если действительно есть косяк - обратиться к разработчикам.

Косяк появляется либо если в обзоре рынка десятки символов либо, если открыто несколько символов в обзоре, но есть несколько десятков вкладов в браузере opera. Разработчикам написал через личное сообщение

Как я писал ранее проблема лечиться, достаточно большим Sleep между вызовами , для 40 символов хватает sleep(10) . Правда с ростом количества символов перекур требуется все больший. 
Причина обращения: