Un minuto e mezzo di differenza tra l'ora locale e l'ora fresca di zecca. Cosa fare. - pagina 5

 
pivomoe:
Lo so. Dove vuoi arrivare?

A cosa:

pivomoe:

Nella panoramica del mercato ci sono ancora le colonne "Volume" "Ultimo scambio" C'è il sospetto che questa funzione restituisca semplicemente l'ora dell'ultimo tick.

La funzioneSymbolInfoInteger(_Symbol,SYMBOL_TIME) restituisce solo il tempo dell'ultimo tick. Perché il cambiamento di una citazione provoca l'apparizione di un nuovo tick informativo.

Si vuole misurare il tempo tra l'arrivo dell'ultima citazione e il tempo dell'ultimo tick. In secondi, sembra essere sempre 0. Quindi, il terminale restituisce tutto prontamente.

 
Alexey Kozitsyn:

A:

La funzioneSymbolInfoInteger(_Symbol,SYMBOL_TIME) restituisce solo il tempo dell'ultimo tick. Perché il cambiamento di una citazione porta a un nuovo tick informativo.

Si vuole misurare il tempo tra l'arrivo dell'ultima citazione e il tempo dell'ultimo tick. In secondi, sembra essere sempre 0. Quindi, il terminale restituisce tutto prontamente.

Ancora una volta quello che vedo come il problema.

Dato:

L'ora locale e l'ora del server sono più o meno in sincronia, cioè la differenza tra .time_msc dei nuovi tick e l'ora locale è di pochi secondi.

Alle 18:00:00 ora locale stai cercando di ottenere un nuovo tick dal simbolo SBER con SymbolInfoTick, ottieni un tick con tempo 17:57:00

Alle 18:00:01 la volta che cerchiamo di ottenere un nuovo tick con SymbolInfoTick, otteniamo un tick con il tempo 17 :58:30

Non credo che questo possa essere definito operativo.

Ora mi sono allontanato dall'ora locale del computer e uso invece il tempo massimo dell'ultimo tick tra tutti i simboli dalla panoramica del mercato.

 
pivomoe:

Ancora una volta, quello che vedo come il problema.

Dato:

L'ora locale e l'ora del server sono più o meno sincronizzate, cioè la differenza tra .time_msc del nuovo tick e l'ora locale è di pochi secondi.

Alle 18:00:00 ora locale stai cercando di ottenere un nuovo tick dal simbolo SBER con SymbolInfoTick, ottieni un tick con tempo 17:57:00

Alle 18:00:01 la volta che cerchiamo di ottenere un nuovo tick con SymbolInfoTick, otteniamo un tick con il tempo 17 :58:30

Non credo che questo possa essere definito operativo.

Ora mi sono allontanato dall'ora locale del computer e uso invece il tempo massimo dell'ultimo tick tra tutti i simboli dalla panoramica del mercato.

Capite che potete impostare qualsiasi orario del computer? Non potete usarlo. Questo vi è già stato detto. Questa è la prima cosa.

In secondo luogo, il tempo massimo dell'ultimo tick tra tutti i simboli della panoramica del mercato non può essere utilizzato. Si vuole trovare il ritardo del tempo dell'ultimo tick del simbolo SBER (SymbolInfoTick) dal tempo dell'ultima quotazione del simbolo SBER (SymbolInfoInteger). Cioè devi farlo all'incirca come ho scritto (all'incirca perché devi usare un buratto per una maggiore precisione, come ti è stato consigliato).

In terzo luogo, questo:

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

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

Si afferma senza prove. Se consideri il tuo codice come una prova, vedi "secondo".

 
Alexey Kozitsyn:

Vi rendete conto che potete impostare il tempo del computer su qualsiasi cosa? Non si può essere legati ad esso. Te l'hanno già detto. Prima di tutto.


Non si può impostare su un tempo qualsiasi se si parla di millisecondi o addirittura di secondi. Parlare di ritardi di minuti è abbastanza possibile. Non sto misurando la differenza con esso ora, ma con il tempo massimo .time_msc dell'ultimo tick per tutti i simboli dalla panoramica del mercato.

Alexey Kozitsyn:

Si vuole trovare il ritardo del tempo dell'ultimo tick del simbolo SBER (SymbolInfoTick) dal tempo dell'ultima quotazione del simbolo SBER (SymbolInfoInteger).

Io no.

Alexey Kozitsyn:

In secondo luogo, non puoi nemmeno usare il tempo massimo dell'ultimo tick tra tutti i simboli della panoramica del mercato.

Perché? Non sto confrontando il tempo dell'ultimo tick (per computer), sto confrontando il time_msc.

Alexey Kozitsyn:

Non posso usare il tuo codice senza prove. Se consideri il tuo codice come una prova - vedi "secondo".

Di solito gli sviluppatori chiedono del codice per riprodurre il problema. Ecco un ritardo di 2 secondi catturato di recente.

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:

(più o meno perché è necessario utilizzare un tumbler per una maggiore precisione, come ti è stato consigliato).

Mi è stato consigliato di usare OnBookEvent invece di OnTimer. Ho implementato questo. Potete scegliere nelle impostazioni dove ricevere i tick: OnTimer o OnBookEvent. È ancora peggio con OnBookEvent, cattura solo il 70% dei nuovi eventi tick.
 

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

Solo da queste righe, sembra chiaro quello che vuoi. Lei è interessato a qualcosa come la sincronizzazione intersimbolo. Cioè, la rilevanza generale dei dati sugli strumenti che volete.

Non posso aiutarti in questo momento, non sono stato coinvolto in questa domanda. Chiedete agli sviluppatori.

 
Alexey Kozitsyn:

Solo da queste righe, sembra chiaro quello che vuoi. Lei è interessato a qualcosa come la sincronizzazione intersimbolo. Cioè, la rilevanza generale dei dati sugli strumenti che volete.

Non posso aiutarti in questo momento, non sono stato coinvolto in questa domanda. Indirizzo agli sviluppatori.

Alexey (non voleva partecipare, ma...).

Non è il codice "rilevanza" (NEW_TICK) della pagina 2 di questo thread?

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

Aggiunto

Con CUR_TICK, potete ancora fare dei controlli che sia lo stesso tick che era o

il nuovo pacchetto di tick contiene un tick che non era nel precedente.

 
prostotrader:

Alexey (non voleva essere coinvolto, ma...).

Non è il codice "rilevanza" (NEW_TICK) della pagina 2 di questo thread?

A quanto pare no. Da quando:

TimeTradeServer

Restituisce l'ora corrente stimata del server commerciale. A differenza diTimeCurrent(), il valore del tempo è calcolato nel terminale client e dipende dalle impostazioni del tempo sul computer dell'utente.

Cioè dipende dal tempo del computer (non dovrebbe essere così per la precisione della misurazione).

La cosa buona qui, naturalmente, è controllarela correttezza del codicepivomoe, e se c'è davvero un bug - contattare gli sviluppatori.

 
prostotrader:

Il controllo sembra dover essere fatto tramite TimeGMTOffset. Più tardi farò un esempio.

 
Alexey Kozitsyn:

A quanto pare no. Perché:


Guardate attentamente il codice!

TimeTradeServer() è preso solo per determinare il giorno e basta (questo controllo è fatto "per sicurezza")!

TimeTradeServer() potrebbe non essere fatto affatto!

Aggiunto da

Ripeto

"Con CUR_TICK, potete ancora controllare che sia lo stesso tick che era, o

il nuovo pacchetto di tick contiene un tick non passato nel pacchetto precedente, e il pacchetto contiene 1 tick("vecchio")".

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

La cosa buona qui, naturalmente, è controllarela correttezza del codicepivomoe e, se c'è davvero un bug, contattare gli sviluppatori.

Il bug appare sia se ci sono decine di caratteri nella recensione del mercato o se ci sono diversi caratteri aperti nella recensione, ma ci sono diverse decine di schede nel browser dell'opera. Ho scritto agli sviluppatori via messaggio privato.

Come ho scritto prima, il problema si risolve con uno Sleep abbastanza grande tra le chiamate, per 40 caratteri sleep(10) è sufficiente. Man mano che il numero di personaggi cresce, è necessario dormire sempre di più.