Erreurs, bugs, questions - page 2160
![MQL5 - Langage des stratégies de trading intégré au terminal client MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
Du point de vue de MQ, apparemment correctement. Comme toujours, il a décidé pour nous comment être plus confortable.
En passant au niveau de la télépathie... )))))
Bug peu clair dans l'indicateur principal. Apparaît uniquement sur les délais inférieurs à H1, et uniquement au démarrage du terminal. Texte de l'erreur "S-v5 (EURUSD,M10) array out of range in 'S-v5.mq5' (211,54)" . Le dessin est correct, mais dans l'ordre inverse, bien que l'indicateur de série chronologique soit activé pour tous les tampons.
La composition du modèle - l'indicateur principal (#1) (où l'erreur se produit), l'indicateur supplémentaire (#2) (combinaison de plusieurs poignées de l'indicateur principal avec différents paramètres (timeframe)), l'indicateur (#3) qui affiche des flèches dans le graphique principal sur les signaux de l'indicateur #1), l'indicateur (#4) qui affiche des flèches dans le graphique principal sur les signaux de l'indicateur #2.
Changement d'horizon temporel, réapplication du modèle, si vous supprimez 2 indicateurs de 2 à 4 ou seulement au numéro 1, la sortie d'un nouveau symbole de l'aperçu du marché et l'application de ce modèle - l'erreur n'est pas reproduite et le rendu de tous les indicateurs est correct.
Erreur de compilation
Le message d'erreur ne permet pas de comprendre la cause dans le code étendu
ci-dessous est clair
Aucun message d'erreur
de plus, il fonctionne et il y a même un résultat ( !)
Dans cette variante :
pas de saut à la ligne d'erreur (par Enter)
Erreur de compilation
En essayant d'accélérer les choses lors de la création de cet exemple, je suis tombé sur une bizarrerie tout à fait par hasard, que j'ai simplement mise de côté.
Et maintenant, quand j'ai essayé de faire face à cette bizarrerie, j'ai été encore plus confus.
Ainsi, dans le calcul, j'utilise la fonction racine carrée sqrt(), que j'ai décidé de contourner en créant un tableau double.
Comme je prends toujours la racine carrée des nombres entiers, la création d'un tableau ressemble à ceci :
Il est logique de supposer que la lecture du tableau SQRT[x] est plus rapide que l'utilisation de la fonction sqrt(x).
Et cela est confirmé par le code de contrôle :
le résultat montre un gain de vitesse de ~1,5 fois :
Mais lorsque je remplace la fonction sqrt() dans le code par la lecture des éléments du tableau SQRT[], au lieu d'accélérer, j'obtiens des décalages terribles.
La lecture d'un élément du tableau SQRT[] prend beaucoup de temps, peut-être même un ordre de grandeur plus long que l'exécution de sqrt().
Et je ne comprends pas où la fuite de vitesse se produit. Le code de contrôle ci-dessus vous indique le contraire.
Nous pouvons supposer que le compilateur accède à un grand tableau d'une manière étrange et semble "l'oublier" à chaque tour de boucle et effectue à chaque fois sa propre indexation de service.
Mais il s'agit d'un bug logique ou stratégique du compilateur. Et vous devriez évidemment faire quelque chose à ce sujet, car cette fuite de vitesse est très importante et difficile à détecter parce qu'elle n'est pas si évidente.
Je joins le code du script pour démontrer cette bizarrerie.
L'exécution par défaut (arr=false) calcule sqrt(), mais lorsque vous changez arr en true, la valeur de la racine carrée est prise dans le tableau.
QU'EST-CE QUI NE VA PAS ? POURQUOI EST-CE LENT ?
Pour tenter d'accélérer les choses, j'ai rencontré, lors de la création de cet exemple, une bizarrerie tout à fait par hasard, que j'ai simplement mise de côté.
Ilest logique de supposer que la lecture du tableau SQRT[x] est plus rapide que l'exécution de sqrt(x).
D'un point de vue dynamique, ce n'est pas un fait.
De plus, la prise de la racine est déjà au niveau de la commande du processeur SQRTSD. En d'autres termes, vous ne pouvez pas battre l'implémentation du processeur en utilisant le fameux coût d'accès dans un tableau dynamique.
Et ceci est confirmé par le code de vérification :
le résultat montre un gain de vitesse de ~1,5 fois :
Je doute que cela soit confirmé.
Le code de ce type est comme sorti d'un manuel sur l'optimisation des boucles. L'optimiseur de code pourrait s'en faire une raison parce que c'est un cas très simple :
En d'autres termes, la mesure des performances dans le cas de l'application des cas délibérément parfaitement optimisés doit être clairement liée aux objectifs du test.
Dans ce cas, le test est erroné.
Et je ne comprends pas où se produit la fuite de vitesse. Après tout, le code de test ci-dessus dit le contraire.
Sans voir le code assembleur final, je penche pour :
Vérifions attentivement l'ensemble du code. Il est intéressant de découvrir quelle est la véritable raison.
D'un tableau dynamique, pas d'un fait.
Sans voir le code assembleur final, je penche pour :
J'ai essayé un tableau statique - même chose.
Aussi rapide que soit sqrt, j'ai du mal à croire que cette fonction puisse être 10 fois plus rapide que la simple lecture d'un élément de tableau.
De plus, si dans mon exemple la taille de la toile est réduite, disons 50x50 (il existe un paramètre d'entrée Size pour cela, vous devez définir 50 au lieu de 0),
et le tableau sera beaucoup plus petit (5000 éléments), l'image de la vitesse change radicalement. Il n'y a plus de contraste aussi fort.
Mais je ne comprends pas : la taille du tableau affecte-t-elle la vitesse d'accès à ses éléments ?
Vous avez peut-être raison en ce qui concerne la simplicité du code de contrôle.
J'ai essayé de le rendre un peu plus compliqué et le résultat est complètement différent :
Vérifions attentivement l'ensemble du code. Intéressant de découvrir la vraie raison.
Cool ! Merci ! Je suis aussi intéressé.
Et sqrt est très rapide en effet. Moins d'une nanoseconde :)). Fantastique !