[SERVICE DESK] Errore nell'ottenere il tempo del TF senior nel timer! - pagina 10

 
Alexey Kozitsyn:

Provate voi stessi. Avviare l'indicatore, spegnere il terminale e riaccenderlo quando arriva la nuova ora.

Quindi se si ottiene TimeCurrent

Restituisce l'ultima ora conosciuta del server, l'ora di arrivo dell'ultima quotazione di uno dei simboli selezionati in Market Watch.

Questo è corretto.
 
Konstantin Nikitin:

Quindi se si ottiene TimeCurrent

Restituisce l'ultima ora conosciuta del server, l'ora di arrivo dell'ultima quotazione per uno dei simboli selezionati in Market Watch.

Proprio così.

Puoi dirmi dove si trova la chiamata a TimeCurrent in questo codice?

 
Alexey Kozitsyn:

Puoi dirmi dove in questo codice viene fatta la chiamata a TimeCurrent?

Quindi l'orario di apertura del bar è ancora lo stesso di prima della chiusura del terminale. Si forma una nuova barra e si aggiorna l'ora. Qual è il problema.

 
Konstantin Nikitin:

L'orario di apertura del bar è lo stesso che abbiamo ricevuto prima della chiusura del terminale. Si forma una nuova barra e si aggiorna l'ora. Qual è il problema.

Questo è il punto, il terminale si spegne quando l'ultima barra dell'ora sul grafico è alle 22:00. Si spegne alle 22:45, per esempio. Si accende alle 23:01 - richiesta di tempo per l'ultima ora dopo che la connessione al server è stata stabilita e dopo la pre-richiesta a OnInit() senza alcun timer - è ancora 22 ore. Questo è normale, secondo voi?

 

Controlla il tempo della candela, non il calcolo delle barre.
In questo modo si aggiornerà correttamente (controllato).

//--- Проверяем первый запуск индикатора
   if(prev_calculated<=0 || 
      _weekOpenTime!=iTime(_Symbol,PERIOD_W1,0)+SEC_PER_DAY ||
      _dayOpenTime!=iTime(_Symbol,PERIOD_D1,0) ||
      _hourOpenTime!=iTime(_Symbol,PERIOD_H1,0) )
     {
     
      _weekOpenTime= 0;
      _dayOpenTime = 0;
      _hourOpenTime= 0;
        
      //--- Проверяем, записано ли время открытия текущей недели
      if(!CheckCurrentWeekOpenTime())                              // Если время не записано
         return(0);                                                // Выходим
      //--- Проверяем, записано ли время открытия текущего дня
      if(!CheckCurrentDayOpenTime())                              // Если время не записано
         return(0);                                                // Выходим
      //--- Проверяем, записано ли время открытия текущего часа
      if(!CheckCurrentHourOpenTime())                              // Если время не записано
         return(0);                                                // Выходим
      //--- Устанавливаем флаг соединения с сервером для запуска таймера
      _isConnected=true;
      //---
      Print(__FUNCTION__,": Данные старших ТФ загружены!");
     }
 
Da quanto ho capito, il terminale, per la prima volta, dà l'ultimo dato che ha nella storia, e poi viene scaricato dal server.
 
Taras Slobodyanik:

Controlla il tempo delle candele, non il calcolo delle barre.
È così che si aggiornerà correttamente (controllato).

Di che tipo di calcolo della barra stiamo parlando?

Controllerò la tua variante, ma in realtà hai appena aggiunto una richiesta di dati "inattiva" in OnCalculate() e questo è tutto. E per logica, non arriverà nemmeno alla richiesta "inattiva", perché prev_calculated <= 0 sarà già eseguito e il primo blocco di esecuzione sarà eseguito.

Comunque, questa è una stampella, non ci devono essere queste situazioni nella lingua. La connessione è stabilita, la funzione di acquisizione dei dati è controllata per gli errori e la correttezza dei dati ottenuti. Ma alla fine cosa otteniamo? I dati sono ancora sbagliati.

In realtà, se vogliamo essere sicuri, possiamo semplicemente richiedere l'ora attuale nell'inite e poi richiedere l'ora attuale in OnCalculate() e confrontarli finché non sono diversi. Ma questa è la stessa stampella e non dovrebbe essere il caso.

 
Alexey Kozitsyn:

Questo è il punto, il terminale si spegne quando l'ultima barra dell'ora sul grafico ha l'ora 22:00. Si spegne alle 22:45, per esempio. Si accende alle 23:01 - richiesta di tempo per l'ultima ora dopo che la connessione al server è stata stabilita e dopo la pre-richiesta a OnInit() senza alcun timer - sono ancora 22 ore. È normale secondo voi?

Il tempo di chiusura di ogni ultima barra sarà TimeCurrent (cioè corrente). Sembra essere quello di cui hai bisogno, a giudicare dalla tua domanda.

 
Taras Slobodyanik:
Da quanto ho capito, il terminale, per la prima volta, emette gli ultimi dati che ha nella storia, e poi avviene il caricamento dal server.

Domanda! Perché emette i dati precedenti dopo che la connessione al server è già stata stabilita, c'era una pre-richiesta di dati in OnInit(), un controllo del caricamento dei dati in ciascuna delle funzioni CheckCurren...(). Quanti maledetti controlli devo fare perché tutto funzioni correttamente...

 
Konstantin Nikitin:

Il tempo di chiusura di ogni ultima barra sarà TimeCurrent (cioè il tempo corrente). Questo sembra essere ciò di cui hai bisogno, a giudicare dalla tua domanda.

Quale orario di chiusura? Ho bisogno di un orario di apertura...

Motivazione: