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

 
prostotrader:

Olhe o código com cuidado!

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

TimeTradeServer() pode ser omitido por completo!

Eu já dei uma olhada. Concordo, escrevi-o incorretamente, mas a função, em minha opinião, ainda não resolve o problema. Para ser honesto, não sei bem por que é necessário. Parece que você:

1. Obtenha o número de milissegundos de um tick;

2. Você quebra o carrapato em seus componentes;

3. Então você remonta o tique de novo!? É aqui que não está claro para mim para que serve isto? Você sempre terá o mesmo valor que foi originalmente passado para a função. Ou talvez esteja me faltando algo?

E então você compara o tempo do tick com o anterior;


Nós precisamos saber o tempo do servidor, não é mesmo? Sem tempo de servidor, não podemos determinar se o fio de um personagem está atrasado em relação aos fios de outros caracteres.

Ou seja, seu código não vincula ao tempo do servidor e não compara o tempo do servidor com o tempo do tópico, o que precisamos fazer. Compreender não o atraso da pilha a partir dos carrapatos de um único símbolo (como eu pensava originalmente ao entrar nesta discussão), mas o atraso da transferência de dados sobre um conjunto de símbolos do servidor para o terminal.

 
Alexey Kozitsyn:

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

Engraçado, você é uma pessoa experiente (não um iniciante).

Você não precisa de tempo algum, exceto o tempo de chegada dos carrapatos!

Lembre-se do tempo (na inicialização) do último tick, e então todas as comparações vão com este tempo!

 
Alexey Kozitsyn:

Eu já dei uma olhada. Concordo, escrevi um pouco incorretamente, mas a função, em minha opinião, ainda não resolve a tarefa em questão. Para ser honesto, não sei bem por que é necessário. Parece que você está:

3. Então remonte o tique de novo!? É aqui que não está claro para mim para que serve? Você sempre terá o mesmo valor que foi originalmente passado para a função. Ou está me faltando algo?


Este código é "puxado" de meu Conselheiro Especialista, onde verifico se o carrapato é atual e se está dentro

sessões de negociação

Adicionado por

A "quebra" do tick é necessária para determinar o tempo exato (milissegundos) (sem data), uma vez que nas configurações da sessão do meu EA

Eu só defino o tempo

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

É simplesmente ridículo, você é uma pessoa experiente (não uma noviça).

Você não precisa de tempo algum, exceto para o tempo de recebimento de carrapatos!

Lembre-se do tempo (na inicialização) do último tick, e então todas as comparações vão com este tempo!

Escreverei meu exemplo mais tarde, entrarei na questão com mais detalhes. Eu não excluo que talvez eu esteja errado (assim como o pivô) e você esteja certo.

 
prostotrader:

Este código é "puxado" da minha EA onde verifico a relevância do carrapato e o tempo que o carrapato está dentro

sessões de negociação

Adicionado

A "quebra" do tick é necessária para determinar a hora exata (sem data), uma vez que nas configurações da sessão da minha EA

Eu só defino o tempo

Exatamente, por minha culpa, falhei.

 
Alexey Kozitsyn:

Exatamente, culpa minha, eu não vi dessa maneira.

É que o TC não estava inicialmente claro sobre o que ele queria obter (ou talvez tenha sido mal compreendido).

Aqui, execute-o e verifique:

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

É que o TC não tinha certeza do que queria obter em primeiro lugar.

Aqui, execute-o e confira-o:

Michael, não há dúvidas quanto à chegada do novo tick/check no tick antigo. Também não há dúvidas em relação ao seu código. A questão é diferente. Você precisa verificar esta situação:

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:

Michael, não há dúvidas quanto à chegada do novo tick/check no tick antigo. Também não há nenhuma dúvida sobre seu código. A questão é diferente. Preciso verificar a seguinte situação:

Eu ajustei o código (ver acima) o (OLD_TICK) apareceu.

E sabendo que o novo pacote pode conter um "velho" tick, o desenvolvedor deve usá-lo a seu critério.

 
prostotrader:

Eu ajustei o código (ver acima) e (OLD_TICK) apareceu.

Não importa... fluxos de caracteres DIFERENTES.

 
Alexey Kozitsyn:

Não importa... fluxos de caracteres DIFERENTES.

Então eu não entendo o que eu preciso de ????.

Se a hora atual é o SERVIDOR - você precisa esquecê-lo até que eles o transmitam!
ou usar o que é o TimeTradeServer()