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

 
prostotrader:

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

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

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

Посмотрел. Согласен, написал я несколько не корректно, но функция, на мой взгляд, все равно не решает поставленной задачи. Если честно, не совсем понятно зачем она нужна. Похоже, что Вы:

1. Получаете количество миллисекунд из тика;

2. Разбиваете тик на составляющие;

3. Затем снова собираете тик!? Вот тут мне не ясно зачем это надо? Вы ведь всегда получите то же самое значение, что было изначально передано в функцию. Или я чего-то не вижу?

4. А дальше Вы сравниваете время тика с предыдущим;


Нам же обязательно нужно знать время сервера. Без времени сервера мы не можем определить запаздывает ли поток одного символа относительно потоков других символов.

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

 
Alexey Kozitsyn:

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

Просто смешно, Вы опытный человек (не новичёк).

Вообще не нужно никакое время, кроме времени приходящих тиков!

Запомнили время (при инициализации) последнего тика, а потом все сравнения идут с этим временем!

 
Alexey Kozitsyn:

Посмотрел. Согласен, написал я несколько не корректно, но функция, на мой взгляд, все равно не решает поставленной задачи. Если честно, не совсем понятно зачем она нужна. Похоже, что Вы:

3. Затем снова собираете тик!? Вот тут мне не ясно зачем это надо? Вы ведь всегда получите то же самое значение, что было изначально передано в функцию. Или я чего-то не вижу?


Этот код "выдернут" из моего советника, где я проверяю актуальность тика и время, что тик находится в рамках

торговых сессий

Добавлено

"Разбивка" тика нужна для определения точного (миллисекунды) времени (без даты), т.к в настройках сессий моего советника

я указываю только время

input string          TimeStMon    = "10:00:00";               //Время начала утренней сессии
input string          TimeStDay    = "14:05:00";               //Время начала дневной сессии
input string          TimeStEvn    = "19:05:00";               //Время начала вечерней сессии
 
prostotrader:

Просто смешно, Вы опытный человек (не новичёк).

Вообще не нужно никакое время, кроме времени приходящих тиков!

Запомнили время (при инициализации) последнего тика, а потом все сравнения идут с этим временем!

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

 
prostotrader:

Этот код "выдернут" из моего советника, где я проверяю актуальность тика и время, что тик находится в рамках

торговых сессий

Добавлено

"Разбивка" тика нужна для определения точного времени (без даты), т.к в настройках сессий моего советника

я указываю только время

Точно, мой косяк, недосмотрел. 

 
Alexey Kozitsyn:

Точно, мой косяк, недосмотрел. 

Да просто ТС изначально не определился что он хочет получить (а может не правильно поняли)

Вот, запустите и проверьте:

//+------------------------------------------------------------------+
//|                                                         Time.mq5 |
//|                                                   Copyright 2019 |
//|                                                                  |
//+------------------------------------------------------------------+
enum FRESH_TICK
{
  UNKNOWN_TICK,
  NEW_TICK,
  CUR_TICK,
  OLD_TICK
};
//
MqlTick stored_ticks[];
bool is_book;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
  int result = CopyTicks(Symbol(), stored_ticks, COPY_TICKS_ALL, 0, 1);
  if(result > 0)
  {
    is_book = MarketBookAdd(Symbol());
    if(is_book == false) return(INIT_FAILED);
  } else 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: Print(EnumToString(UNKNOWN_TICK), " - Тик не определен."); //Тик не определен
       break;
       case NEW_TICK: Print(EnumToString(NEW_TICK), " - Новый тик");     //Торговое время, можно отсылать ордера;
       break;
       case CUR_TICK: Print(EnumToString(CUR_TICK), " - Текущий тик");    //По усмотрению разработчика;
       break;
       case OLD_TICK: Print(EnumToString(OLD_TICK), " - Старый тик");     //По усмотрению разработчика;
       break;
      }
    }  
  }
}
//+------------------------------------------------------------------+
//| Expert Check Market Time function                                |
//+------------------------------------------------------------------+
FRESH_TICK CheckTickTime(MqlTick &a_tick)
{
  if(a_tick.time_msc > stored_ticks[0].time_msc)
  {
    stored_ticks[0] = a_tick;
    return(NEW_TICK);
  }
  else
  {
    if(stored_ticks[0].time_msc == a_tick.time_msc)
    {
      if((stored_ticks[0].ask == a_tick.ask) && (stored_ticks[0].bid == a_tick.bid) &&
         (stored_ticks[0].flags == a_tick.flags) && (stored_ticks[0].last == a_tick.last) &&
         (stored_ticks[0].time == a_tick.time) && (stored_ticks[0].volume == a_tick.volume) &&
         (stored_ticks[0].volume_real == a_tick.volume_real))
        {
          return(CUR_TICK);
        }
        else return(OLD_TICK);
        
    }
    else return(OLD_TICK);
  }
  return(UNKNOWN_TICK);
} 
      
 
prostotrader:

Да просто ТС изначально не определился что он хочет получить

Вот, запучтите и проверьте:

Михаил, к приходу нового тика/проверки на старый тик вопросов нет. К Вашему коду - тоже. Вопрос в другом. Нужно проверить вот такую ситуацию:

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
 
Alexey Kozitsyn:

Михаил, к приходу нового тика/проверки на старый тик вопросов нет. К Вашему коду - тоже. Вопрос в другом. Нужно проверить вот такую ситуацию:

Я подправил код (см. выше) появилось (OLD_TICK). 

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

 
prostotrader:

Я подправил код (см. выше) появилось (OLD_TICK). 

Это не важно... потоки РАЗНЫХ символов.

 
Alexey Kozitsyn:

Это не важно... потоки РАЗНЫХ символов.

Тогда я вообще не понимаю ЧТО НУЖНО????

Если текущее время СЕРВЕРА - то про это забыть надо, пока не будут его транслировать! 
или использовать то, что есть TimeTradeServer()

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