Erreurs, bugs, questions - page 2723

 
Igor Makanu:

ChartRedraw est nécessaire uniquement pour le dessin (mise à jour) des objets graphiques, vous n'avez pas besoin de ChartRedraw pour un indicateur normal qui dessine par des tampons d'indicateur.

Je pense que vous devriez chercher le problème dans l'indicateur, peut-être que le calcul des tampons à chaque tick n'est pas correct, il y a des "auteurs" qui calculent l'historique complet à chaque tick.

ZZY : Je ne peux pas confirmer, mais peut-être que ChartRedraw met à jour le graphique entier avec l'historique synchronisé, si oui, alors chaque fois que vous redémarrez l'indicateur avec un calcul complet de l'historique entier.

UPD : essayez de limiter l'historique sur le graphique à un plus petit nombre de barres 10 000 est suffisant, dans MT4 il y avait un cas où un indicateur lourd "gobait" toute la mémoire et cherchait ensuite pourquoi l'EA ne fonctionnait pas correctement (il fonctionnait puis pas). Bien que dans MT5 il est peu probable que toute la mémoire soit utilisée.... mais cela peut arriver.

J'ai essayé d'optimiser le calcul et j'ai testé la version précédente de l'indicateur. J'ai calculé toutes les 1000 barres avant et maintenant j'attends que la nouvelle barre s'ouvre.

Si c'est la raison, je devrais quand même être très surpris. 1k barres de calculs pas très forts ralentit le dessin du graphique pendant 2 minutes ?

 
Aleksey Mavrin:

Si c'est la raison, cela vaut quand même la peine d'être surpris. 1 bar de calculs pas très forts ralentit le dessin du graphique pendant 2 minutes ?

ce n'est pas possible, à mon avis, le terminal va décharger un tel indicateur avec un message disant " calcul trop long dans l'indicateur xxx".

le temps d'exécution de MT (4/5) est très rapide, bien sûr vous pouvez calculer les mêmes données plusieurs fois, mais imho, vous devez essayer dur.

Je pense que l'auteur de l'indicateur n'est pas familier avec le calcul économique des buffers des indicateurs, et il oublie de calculer correctement les dernières barres... allez à QB pour étudier comment les indicateurs sont écrits ;)

 
Slava :

Ces deux programmes sont-ils dans le même terminal ou dans deux terminaux différents ?

Le code permettant de reproduire le problème est affiché ici. https://www.mql5.com/en/forum/332849

Vous devez exécuter le code au moins 2 fois pour le reproduire.

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:

Ce n'est pas du tout nécessaire. Pourquoi C ? Pourquoi pas C# ? - Il est plus proche de C# en termes de signification.

Probablement parce que µl c++ est similaire, et que les structures y sont venues du c.

Tous les discours sur les structures passives sont des notions archaïques, à mon avis.

Si vous avez besoin de constructeurs, utilisez des classes ou passez à Sharp. Pourquoi devrions-nous priver les structures de cette connotation ? Cela ne fera que rendre les programmes plus expressifs. Je peux prendre le code de quelqu'un et voir qu'il a une structure au lieu d'une classe et obtenir beaucoup d'informations à partir d'un seul mot. Vous n'obtiendrez rien, vous étudierez assidûment le code source pour obtenir le même résultat, que j'ai obtenu en une seule fois. Dans mon expérience - cette convention de structures est respectée, bien peut-être une sorte de marginalisme nihiliste remonté.

Je pense que, au minimum, chaque type devrait avoir un constructeur. Les champs non initialisés sont mauvais et doivent être évités.

Il n'y a pas de mal, il vous semble. Vaughn a même traîné dans la norme : la lecture de unsigned char et std::byte non initialisés n'est pas un comportement indéfini. Vous pouvez utiliser l'initialisation agrégée pour POD. Et n'oubliez pas - toute cette initialisation n'est pas gratuite, c'est une véritable consommation de ressources (CPU, mémoire, taille d'un exécutable). Si vous n'en avez rien à faire avec votre calculateur, dans le cas d'un microcontrôleur, cela peut être important. Après tout, le C/C++ n'est pas seulement un mélange de Windows comme 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
La seule initialisation d'une variable unique a augmenté la taille des instructions de 30%.
 
Stanislav Korotky:

Dans un terminal. L'expert écrit les données, l'indicateur les lit. Ils sont accrochés à des cartes différentes, mais pourraient évidemment être sur la même (si cela importe). Construire 2380.

Le conseiller expert qui lit le fichier doit garder ce fichier fermé.

La particularité de l'implémentation des fichiers dans MQL5 est qu'ils conservent au maximum les données des fichiers dans leurs propres tampons. Si la quantité d'informations est si importante qu'elle ne tient pas dans le tampon, votre astuce consistant à déplacer le pointeur au début puis à la fin du fichier peut fonctionner.

Donc, à ce stade, ouvrez le fichier, vérifiez son contenu, puis refermez-le.

 
Slava :

Un conseiller expert qui lit un fichier doit garder ce fichier fermé.

La particularité de l'implémentation des fichiers dans MQL5 est qu'ils conservent autant que possible les données des fichiers dans leurs propres tampons. Si la quantité d'informations est si importante qu'elle ne tient pas dans le tampon, votre astuce consistant à déplacer le pointeur au début puis à la fin du fichier peut fonctionner.

Donc, à ce stade, ouvrez le fichier, vérifiez son contenu, puis refermez-le.

Donc FileFlush () est inutile ?
 
Alain Verleyen:
Donc FileFlush () est inutile ?

Non. FileFlush doit être fait si vous voulez que quelqu'un d'autre puisse lire le fichier modifié.

Le problème est que le programme MQL5 lit le fichier dans son propre tampon lorsqu'il l'ouvre. Il ne saura rien des modifications apportées au fichier jusqu'à ce qu'il le relise. Le fichier ne peut être relu qu'en fermant puis en ouvrant le fichier.

 
Slava:
Non. FileFlush doit être fait si vous voulez que quelqu'un d'autre puisse lire le fichier modifié.

Même si vous fermez le fichier?

 
Andrey Barinov:

Même si vous fermez le fichier?

C'est exactement ce dont je parle. Fermer, puis rouvrir

Ou voulez-vous dire FileFlush avant de fermer le fichier ?

 
Slava :

Non. FileFlush doit être fait si vous voulez que quelqu'un d'autre puisse lire le fichier modifié.

Le problème est que le programme MQL5 lit le fichier dans son propre tampon lorsqu'il l'ouvre. Et il ne sait pas que quelque chose a changé dans le fichier jusqu'à ce qu'il relise le fichier. Le fichier ne peut être relu qu'en fermant puis en ouvrant ce fichier.

Glory, c'est exactement le problème. Veuillez consulter le lien que j'ai posté ci-dessus, vous y trouverez le code pour le reproduire.

Le même fichier s'ouvre à partir de la même EA, 1 descripteur pour écrire, 2e pour lire, fileflush est utilisé après l'écriture, essayez de lire et cela ne fonctionne pas correctement.

Bien sûr, si vous fermez/ouvrez, cela fonctionne, mais alors il n'y a pas besoin d 'utiliser FileFlush.

Raison: