Errori, bug, domande - pagina 239

 

Il grafico è stato appena "aggiornato". Ed è di nuovo lo stesso:

 
Yedelkin:

Il grafico è stato appena "aggiornato". Ed è di nuovo lo stesso:

Scrivere urgentemente a servicedesk e non chiudere il terminale
 
AlexSTAL:
Scrivere urgentemente a servicedesk e tenere il terminale aperto
OK, copierò senza mezzi termini il link a questo thread.
 

Ho appena controllato nel terminale - il grafico EURUSD M1 è completamente presente nella posizione specificata senza lacune.

Prova a dare il comando "Refresh" dal menu contestuale del grafico.

 
Renat:

Ho appena controllato nel terminale - il grafico EURUSD M1 è completamente presente nella posizione specificata senza lacune.

Prova a dare il comando "Refresh" dal menu contestuale del grafico.

Rinfrescato manualmente, grazie. Dato che praticamente non lavoro con i grafici, ho una domanda: come posso aggiornare la base delle minitabelle a livello di Expert Advisor in una tale situazione? Il terminale funziona solo con il database che ha. Devo integrare la funzione per controllare la sincronizzazione?
 
Renat:

Ho appena controllato nel terminale - il grafico EURUSD M1 è completamente presente nella posizione specificata senza lacune.

Prova a dare il comando "Refresh" dal menu contestuale del grafico.


Penso che ci sia un bug galleggiante da qualche parte.... Visto che non sono l'unico che ha circa la stessa situazione in corso....
 
Yedelkin:
È stato aggiornato manualmente, grazie. Dato che praticamente non lavoro con i grafici, ho una domanda: come aggiornare la base dei minuti in una situazione del genere? Il terminale funziona solo con la base che ha. Devo integrare la funzione di controllo della sincronizzazione?

Ho memorizzato il tempo della perdita e della ripresa della comunicazione in un timer.

Avendo queste informazioni, puoi provare a scaricare la cronologia per il periodo (puoi anche controllare la sincronizzazione con il server, se ha senso).

 

Signori sviluppatori, sono senza parole. Ho affrontato un problema con le variabili locali che si "puliscono" nel metodo dell'oggetto dopo la chiamata interna dello stesso metodo da un altro oggetto. Forse è legato a qualche ottimizzazione nelle chiamate a funzioni annidate di oggetti, ma almeno non ci sono errori nel log e nessuna perdita di memoria. Non posso citare un grande codice, ma il significato sarà chiaro dagli esempi di principio:

variante 1

bool operate(CAlgoBlockLogic* s1, CAlgoBlockLogic* s2) {
 bool d1 = s1.process();
 bool d2 = s2.process();
 return (d2 && d1);
}

variante 2

bool operate(CAlgoBlockLogic* s1, CAlgoBlockLogic* s2) {
 return (s2.process() && s1.process());
}

Inteoria, il codice dovrebbe funzionare esattamente allostesso modo. Ma... le varianti funzionano in modo diverso.

Così. La variante 1 non funziona correttamente. Ho eseguito una registrazione nel file di debug e ho scoperto che la variabile d1 definita nella funzione operate viene sovrascritta con il valore della variabile d1 in una chiamata interna della stessa funzione operate ma in un altro oggetto dello stesso tipo. Cioè, in breve, dopo aver chiamato
 bool d2 = s2.process();

La variabile d1 cambia il suo valore in quello che si è verificato nella chiamata operativa interna a s2.process. Questo comportamento è lo stesso di quando si cambia il valore di una variabile statica per oggetti dello stesso tipo. Ma qui la variabile ha chiaramente uno scopo locale.

La questione delle variabili statiche è stata sollevata in questo thread e tutto è chiaro. Ma cosa fare con l'incertezza dei valori delle variabili locali?

Документация по MQL5: Основы языка / Переменные / Область видимости и время жизни переменных
Документация по MQL5: Основы языка / Переменные / Область видимости и время жизни переменных
  • www.mql5.com
Основы языка / Переменные / Область видимости и время жизни переменных - Документация по MQL5
 

"...la variabile d1 definita nella funzione operate viene sovrascritta dal valore della variabile d1 nella chiamata interna della stessa funzione operate, ma in un altro oggetto dello stesso tipo. Cioè, in breve, dopo aver chiamato
bool d2 = s2.process();
lavariabile d1 cambia il suo valore in quello che si è verificato nella chiamata operativa interna a s2.process".

Suona come una ricorsione nascosta, con la solita serie di effetti collaterali, o ...

 
Vigor:

In teoria, il codice dovrebbe funzionare esattamente allostesso modo. Ma... le varianti funzionano in modo diverso.


No, non è identico.

Nel primo caso s1.process e s2.process sono chiamati incondizionatamente

Nella seconda variante, s1.process sarà chiamato solo se s2.process restituisce true. Questo si chiama "valutazione abbreviata delle condizioni".