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

 
Taras Slobodyanik:

Non vedo il problema: se appare una nuova candela, ricalcoliamo l'ultima candela nell'indicatore/advisor.
C'è più di una nuova candela - facciamo un ricalcolo completo dell'indicatore/consigliere.
Questo è lo stesso - appare una nuova candela.

Un'altra cosa - i periodi richiesti dovrebbero essere costantemente "tirati" per aggiornarli.
Se non c'è nessuno che lavora sul simbolo-periodo (le virgolette non sono controllate, l'indicatore non è in esecuzione), allora "dorme" perché è considerato non necessario.

Stiamo tirando, stiamo tirando. Facciamo una richiesta, otteniamo un errore, usciamo. Ma qui, vedete, viene fuori un'altra "particolarità" - l'errore non si azzera dopo il reset. Se fosse così, non ci sarebbero problemi. Ma il problema è restituire dati errati. E lo vedo molto chiaramente.

Tutto il sistema di controllo degli errori va in malora in questo esempio.

 

Come fa il terminale a sapere che gli ultimi dati non sono aggiornati?
Perché la storia è lì - è lì.
La richiesta viene inviata al broker... il più presto possibile.

Appare una nuova barra - i dati sono aggiornati.

 
Taras Slobodyanik:

Come fa il terminale a sapere che gli ultimi dati non sono aggiornati?
Dopo tutto, c'è una storia - c'è.
La richiesta al broker viene inviata... Non appena è così.

Appare una nuova barra - i dati sono aggiornati.

La comunicazione con il server è stabilita. Quando si richiedono i dati senior TF, se i dati non sono pronti - errore o ritorno 0. Se i dati sono pronti - restituisce SOLO i dati effettivi. Questo è tutto. Se i dati non sono pronti per molto tempo - lascia che restituisca errore o 0.

 
Taras Slobodyanik:

A proposito, non hai risposto alla tua domanda sulla versione del terminale.

 
Alexey Kozitsyn:

A proposito, non hai risposto alla domanda sulla versione del terminale.

Cosa c'entra la versione del terminale? Nuovi dati, ci sono o non ci sono. E nessuna versione li salverà se non provengono dal server.
L'indicatore inizia semplicemente prima dell'arrivo dei nuovi dati. In alternativa, spostate i controlli su OnCalculate, che si attiva quando viene ricevuto un nuovo tick.

 
Konstantin Nikitin:

In alternativa, spostate i controlli su OnCalculate, che si attiva quando viene ricevuto un nuovo tick.

è stato suggerito più volte, e anche l'amministratore

nell'indicatoreOnCalculate() sarà avviato all'inizio dell'indicatore, ma la seconda volta OnCalculate() sarà avviato alla ricezione del tick - qui è necessario avviare il timer e scaricare nuovi dati OHLC

 
Igor Makanu:

gli è stato offerto diverse volte, e lo stesso vale per l'amministratore

l'indicatore avvierà OnCalculate() all'inizio dell'indicatore, ma la seconda volta OnCalculate() sarà avviato alla ricezione del tick - qui è necessario avviare il timer e scaricare i nuovi dati OHLC

Date un'occhiata al mio ultimo codice pubblicato. Non si tratta di timer, tutto è già stato spostato in OnCalculate(). Ancora non funziona quando si avvia il terminale.

 
//--- Проверяем связь с сервером
if(firstrun)
{
 firstrun=false;                // первый запуск индикатора
 return(0);
}   
if(!IsConnected())                              // Если не удалось установить связь с сервером
     {
      //--- Сбрасываем флаг соединения с сервером
      _isConnected=false;
      //--- Выходим
      return( 0 );
     }
Controllerei anche GetTickCount() per dare tempo al terminale di caricare, generare i grafici e stabilire la comunicazione con il server; dovete anche tracciare il riavvio del terminale, non so come tracciarlo, ma dovete dare tempo
 
Alexey Kozitsyn:

Date un'occhiata all'ultimo codice che ho pubblicato. Non si tratta più del timer, tutto è già stato spostato in OnCalculate(). Ancora non funziona quando si avvia il terminale.

Beh, salta il primo passaggio all'avvio

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   static bool res = false;
   if( !res )
     {
      res = true;
      return( rates_total );
     }
   /* работаем */
   return( rates_total );
  }
 
Konstantin Nikitin:

Beh, salta il primo passaggio all'avvio

Leggere il punto 1.

Motivazione: