Errori, bug, domande - pagina 2723

 
Aleksey Mavrin:

Puoi dirmi cosa c'è che non va e come accelerare l'aggiornamento del grafico? La funzione ChartRedraw è chiamata dall'Expert Advisor, ma c'è ancora un paio di minuti di ritardo.

ChartRedraw è necessario solo per il disegno (aggiornamento) di oggetti grafici, non abbiamo bisogno di ChartRedraw per un normale indicatore che disegna da buffer di indicatori

Penso che dovresti cercare il problema nell'indicatore, forse il calcolo dei buffer su ogni tick non è corretto, ci sono "autori" che calcolano l'intera storia ogni tick

ZZY: non posso confermare, ma forse ChartRedraw aggiorna l'intero grafico con la storia sincronizzata, se è così, si riavvia effettivamente l'indicatore con un calcolo completo di tutta la storia ogni volta

UPD: prova a limitare la cronologia sul grafico a un numero minore di barre 10 000 è sufficiente, in MT4 c'è stato un caso in cui un indicatore pesante "ingoiava" tutta la memoria e poi cercava il motivo per cui l'EA non funzionava correttamente (funzionava poi non). Anche se in MT5 è improbabile che tutta la memoria sia stata utilizzata.... ma succede

 
Igor Makanu:

ChartRedraw è necessario solo per il disegno (aggiornamento) di oggetti grafici, non avete bisogno di ChartRedraw per un normale indicatore che disegna da buffer di indicatori

Penso che dovresti cercare il problema nell'indicatore, forse il calcolo dei buffer su ogni tick non è corretto, ci sono "autori" che calcolano l'intera storia ogni tick

ZZY: non posso confermare, ma forse ChartRedraw aggiorna l'intero grafico con la storia sincronizzata, se è così, si riavvia effettivamente l'indicatore con un calcolo completo di tutta la storia ogni volta

UPD: prova a limitare la cronologia sul grafico a un numero minore di barre 10 000 è sufficiente, in MT4 c'è stato un caso in cui un indicatore pesante "ingoiava" tutta la memoria e poi cercava il motivo per cui l'EA non funzionava correttamente (funzionava poi non). Anche se in MT5 è improbabile che tutta la memoria sia usata.... ma può succedere.

Ho cercato di ottimizzare il calcolo e ho testato la versione precedente dell'indicatore. Ho calcolato ogni 1000 barre prima e ora sto aspettando che si apra una nuova barra.

Se questa è la ragione, dovrei essere ancora molto sorpreso. 1k barre di calcoli non molto forti rallentano il disegno del grafico per 2 minuti?

 
Aleksey Mavrin:

Se questa è la ragione, vale comunque la pena di fare una grande sorpresa. 1 barra di calcoli non molto forte rallenta il disegno del grafico per 2 minuti?

non può essere, a mio parere, il terminale scaricherà tale indicatore con un messaggio che dice " calcolo troppo lungo in xxx indicatore ".

il tempo di esecuzione di MT (4/5) è molto veloce, naturalmente è possibile calcolare gli stessi dati più volte, ma imho, bisogna provarlo duramente

Penso che l'autore dell'indicatore non ha familiarità con il calcolo economico dei buffer degli indicatori, e si dimentica di calcolare correttamente le ultime barre... vai su QB a studiare come sono scritti gli indicatori ;)

 
Slava :

Questi due programmi sono nello stesso terminale o in due terminali diversi?

Il codice per riprodurre il problema è postato qui. https://www.mql5.com/en/forum/332849

Per riprodurlo, è necessario eseguire il codice almeno 2 volte.

File-Sharing ... my next "Sometimes-Bug" in MT5?
File-Sharing ... my next "Sometimes-Bug" in MT5?
  • 2020.02.16
  • www.mql5.com
FILE_SHARE_READ and FILE_SHARE_WRITE do not work proper. MQL creates buffers with different contents for the same file. Please watch the example...
 
Alexey Navoykov:

Non è affatto necessario. Perché C? E C#? - È più vicino a C# in termini di significato.

Probabilmente perché µl c++ è simile, e le strutture sono arrivate lì da c.

Tutti i discorsi sulle strutture passive sono tutte nozioni arcaiche, imho.

Se avete bisogno di costruttori, usate le classi o andate su Sharp. Perché dovremmo privare le strutture di questa connotazione? Questo renderà i programmi più espressivi. Posso prendere il codice di qualcuno e vedere che ha una struttura invece di una classe e ottenere molte informazioni da una sola parola. Non otterrete nulla, studierete diligentemente il codice sorgente per ottenere lo stesso risultato, che ho ottenuto in un batter d'occhio. Nella mia esperienza - questa convenzione di strutture è rispettata, bene forse una specie di marginalità nichilista a vento.

Credo che, come minimo, ogni tipo dovrebbe avere un costruttore. I campi non inizializzati sono malvagi e dovrebbero essere evitati.

Non c'è male, ti sembra. Vaughn ha anche trascinato nello standard: la lettura di unsigned char non inizializzati e std::byte non è un comportamento indefinito. Potete usare l'inizializzazione aggregata per POD. E non dimenticate - tutta questa inizializzazione non è gratuita, è un vero consumo di risorse (CPU, memoria, dimensione di un eseguibile). Se non ve ne frega un cazzo con il vostro scribacchino di numeri, nel caso di qualche microcontrollore può essere importante. Dopotutto, il C/C++ non è solo un rimescolamento di Windows come Sharp.

unsigned char fn() {unsigned char q; return q + 2;}
int main() {
    fn();
}
0000000000001119 <fn>:
    1119:       55                      push   %rbp
    111 a:       48 89 e5                mov    %rsp,%rbp
    111 d:       0 f b6 45 ff             movzbl -0x1(%rbp),%eax
    1121:       83 c0 02                add    $0x2,%eax
    1124:       5 d                      pop    %rbp
    1125:       c3                      retq           

unsigned char fn2() {unsigned char q = 5; return q + 2;}
int main() {
    fn();
}
0000000000001119 <fn2>:
    1119:       55                      push   %rbp
    111 a:       48 89 e5                mov    %rsp,%rbp
    111 d:       c6 45 ff 05             movb   $0x5,-0x1(%rbp)
    1121:       0 f b6 45 ff             movzbl -0x1(%rbp),%eax
    1125:       83 c0 02                add    $0x2,%eax
    1128:       5 d                      pop    %rbp
    1129:       c3                      retq
L'inizializzazione di una sola variabile ha aumentato la dimensione delle istruzioni del 30%.
 
Stanislav Korotky:

In un terminale. L'esperto scrive i dati, l'indicatore legge i dati. Appesi a grafici diversi, ma ovviamente potrebbero essere sullo stesso (se questo conta). Costruire 2380.

L'Expert Advisor che legge il file deve tenere questo file chiuso.

La particolarità dell'implementazione dei file in MQL5 è che mantengono i dati dei file nei propri buffer al massimo. Se la quantità di informazioni è così grande che non entra nel buffer, allora il tuo trucco di spostare il puntatore all'inizio e poi alla fine del file può funzionare.

Quindi, a questo punto, aprite il file, controllate il contenuto, poi chiudetelo di nuovo

 
Slava :

Un Expert Advisor che legge un file deve tenere questo file chiuso.

La particolarità dell'implementazione dei file in MQL5 è che mantengono i dati dei file nei propri buffer il più possibile. Se la quantità di informazioni è così grande che non entra nel buffer, allora il tuo trucco di spostare il puntatore all'inizio e poi alla fine del file può funzionare.

Quindi, a questo punto, aprite il file, controllate il contenuto, poi chiudetelo di nuovo

Quindi FileFlush () è inutile?
 
Alain Verleyen:
Quindi FileFlush () è inutile?

No. FileFlush deve essere fatto se si vuole che qualcun altro possa leggere il file modificato

Il problema è che il programma MQL5 legge il file nel proprio buffer quando lo apre. Non saprà nulla dei cambiamenti nel file finché non lo leggerà di nuovo. Il file può essere letto di nuovo solo chiudendo e poi aprendo il file

 
Slava:
No. FileFlush deve essere fatto se si vuole che qualcun altro possa leggere il file modificato

Anche se si chiude il file?

 
Andrey Barinov:

Anche se si chiude il file?

È esattamente quello di cui sto parlando. Chiudere, poi riaprire

O intendete FileFlush prima di chiudere il file?