Um minuto e meio de diferença entre a hora local e a hora do novo tick. O que fazer. - página 5

 
pivomoe:
Eu sei, qual é o seu objetivo?

A que:

pivomoe:

Na visão geral do mercado ainda há colunas "Volume" "Último comércio" Há uma suspeita de que esta função simplesmente retorna o tempo do último tick.

A funçãoSymbolInfoInteger(_Symbol,SYMBOL_TIME) retorna apenas o momento do último tick. Porque a mudança de uma citação provoca o aparecimento de um novo tique informativo.

Você quer medir o tempo entre a chegada da última cotação e a hora do último tick. Em segundos, parece ser sempre 0. Por isso, o terminal devolve tudo prontamente.

 
Alexey Kozitsyn:

Para:

A funçãoSymbolInfoInteger(_Symbol,SYMBOL_TIME) retorna apenas o momento do último tick. Porque a mudança de uma cotação leva a um novo tique informativo.

Você quer medir o tempo entre a chegada da última cotação e a hora do último tick. Em segundos, parece ser sempre 0. Por isso, o terminal devolve tudo prontamente.

Mais uma vez, o que eu vejo como o problema.

Dado:

A hora local e a hora do servidor estão mais ou menos sincronizadas, ou seja, a diferença entre .time_msc de novos ticks e a hora local é de alguns segundos.

Às 18:00: 00, horário local, você está tentando obter um novo tick por símbolo da SBER com SymbolInfoTick, você obtém um tick com o horário 17:57:00

Às 18:00:01, tentamos fazer um novo tique com o SymbolInfoTick, conseguimos um tique com o horário 17 :58:30.

Eu não acho que isto possa ser chamado de operacional.

Agora eu me afastei do tempo do computador local e uso em vez disso o tempo máximo do último tick entre todos os símbolos da visão geral do mercado.

 
pivomoe:

Mais uma vez, o que eu vejo como o problema.

Dado:

A hora local e a hora do servidor estão mais ou menos sincronizadas, ou seja, a diferença entre .time_msc do novo tick e a hora local é de poucos segundos.

Às 18:00: 00, horário local, você está tentando obter um novo tick por símbolo da SBER com SymbolInfoTick, você obtém um tick com o horário 17:57:00

Às 18:00:01, tentamos fazer um novo tique com o SymbolInfoTick, conseguimos um tique com o horário 17 :58:30.

Eu não acho que isto possa ser chamado de operacional.

Agora eu me afastei do tempo do computador local e utilizo o tempo máximo do último tick entre todos os símbolos da visão geral do mercado.

Você entende que você pode definir qualquer hora no computador? Você não pode usá-lo. Isso já lhe foi dito. Esta é a primeira coisa.

Em segundo lugar, o tempo máximo do último tick entre todos os símbolos da visão geral do mercado não pode ser usado. Você quer encontrar a defasagem do tempo da última citação do símbolo da SBER (SymbolInfoTick) a partir do tempo da última citação do símbolo da SBER (SymbolInfoInteger). Isto é, você tem que fazê-lo mais ou menos como eu escrevi (mais ou menos porque você precisa usar um secador para maior precisão, como você foi aconselhado).

Em terceiro lugar, isto:

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

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

É reivindicado sem provas. Se você considerar seu código como prova, veja "segundo".

 
Alexey Kozitsyn:

Você percebe que pode definir o tempo do computador para qualquer coisa? Você não pode estar vinculado a ela. Isso já lhe foi dito. Antes de mais nada.


Você não pode definir a qualquer momento se estiver falando de milissegundos ou mesmo de segundos. Falar de atrasos de minutos é bem possível. Não estou medindo a diferença com ele agora, mas com o tempo máximo .time_msc do último tick para todos os símbolos da visão geral do mercado.

Alexey Kozitsyn:

Você quer encontrar a defasagem do tempo da última citação do símbolo da SBER (SymbolInfoTick) a partir do tempo da última citação do símbolo da SBER (SymbolInfoInteger).

Eu não tenho.

Alexey Kozitsyn:

Segundo, você também não pode usar o tempo máximo do último tick entre todos os símbolos da visão geral do mercado.

Por que ? Não estou comparando o tempo do último tick ( por computador ) , estou comparando o tempo_msc .

Alexey Kozitsyn:

Eu não posso usar seu código sem prova. Se você considerar seu código como prova - veja "segundo".

Normalmente, os desenvolvedores pedem código para reproduzir o problema. Aqui está um atraso de 2 segundos recentemente capturado.

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
AlexeyKozitsyn:

(aproximadamente porque você precisa usar um secador para maior precisão, como você foi aconselhado).

Fui aconselhado a usar o OnBookEvent em vez do OnTimer. Eu já implementei isto. Você pode escolher em configurações onde receber carrapatos OnTimer ou OnBookEvent. É ainda pior com o OnBookEvent, ele só captura 70% dos novos eventos de tick.
Arquivos anexados:
 

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

Somente por estas linhas, parece claro o que você quer. Você está interessado em algo como a sincronização entre símbolos. Ou seja, a relevância geral dos dados sobre os instrumentos que você deseja.

Não posso ajudá-lo com isto no momento, eu não estava envolvido nesta questão. Pergunte aos desenvolvedores.

 
Alexey Kozitsyn:

Somente por estas linhas, parece claro o que você quer. Você está interessado em algo como a sincronização entre símbolos. Ou seja, a relevância geral dos dados sobre os instrumentos que você deseja.

Não posso ajudá-lo com isto no momento, eu não estava envolvido nesta questão. Endereço para desenvolvedores.

Alexey (não queria participar, mas...).

Não é o código de "relevância" (NEW_TICK) da página 2 deste tópico?

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

Adicionado

Com CUR_TICK, você ainda pode fazer verificações de que é o mesmo carrapato que era ou

o novo pacote de carrapatos contém um carrapato que não estava no pacote anterior.

 
prostotrader:

Alexey (não queria se envolver, mas...).

Este não é o código de "relevância" (NEW_TICK) da página 2 deste tópico?

Aparentemente, não. Desde então:

TimeTradeServer

Retorna o tempo atual estimado do servidor comercial. Ao contrário doTimeCurrent(), o valor de tempo é calculado no terminal do cliente e depende das configurações de tempo no computador do usuário.

Isto é, depende do tempo do computador (não deve ser assim para a exatidão da medição).

O bom aqui, é claro, é verificarse o códigopivomoe está correto, e se realmente houver um bug - entre em contato com os desenvolvedores.

 
prostotrader:

A verificação parece precisar ser feita via TimeGMTOffset. Mais tarde vou esboçar um exemplo.

 
Alexey Kozitsyn:

Aparentemente, não. Porque:


Você olha o código com cuidado!

TimeTradeServer() só é tomado para determinar o dia e pronto (esta verificação é feita "só por precaução")!

TimeTradeServer() não pode ser feito de forma alguma!

Adicionado por

Repito

"Com CUR_TICK, você ainda pode verificar se é o mesmo carrapato que era, ou

o novo pacote de carrapato contém um carrapato não passado no pacote anterior, e o pacote contém 1 carrapato ("antigo")".

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

O bom aqui, naturalmente, é verificarse o códigopivomoe está correto e, se de fato houver um bug, contatar os desenvolvedores.

O bug aparece ou se há dezenas de caracteres na revisão do mercado ou se há vários caracteres abertos na revisão, mas há várias dezenas de abas no navegador da ópera. Escrevi para os desenvolvedores através de uma mensagem privada.

Como escrevi anteriormente, o problema é resolvido com um sono suficientemente grande entre chamadas, para 40 caracteres o sono(10) é suficiente. À medida que o número de personagens cresce, mais e mais sono é necessário.