Erreurs, bugs, questions - page 2541
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
Je ne veux pas que des personnes incompétentes comme vous, Fedoseyev, etc. soient impliquées dans la discussion des bugs et des constructions.
de sorte que les constructions et les mécanismes pris dans MQL à partir de C++ dans leur intégralité et ayant la même apparence que dans C++ fonctionneraient de la même manière que dans C++.
C'est des conneries et tu le sais, mais tu dois le dire.C'est vous qui pleurnichez pour dire que c'est ennuyeux, qu'il faut une langue et un fil de discussion séparés.
Ouvrez un fil séparé pour vous et vos sympathisants et pleurnichez-y.
J'avais une meilleure opinion de toi. Mon erreur. Ça arrive. Tu es rustre et... pas intelligent.
Il est fait pour l'exemple, alors que devrait être exécuté dans un thread séparé, afin de ne pas bloquer le thread mql.
J'obtiens le même comportement lorsque je démarre dans un autre thread, le problème est dans DLL_PROCESS_DETACH, cet identifiant ne fonctionne pas, pour le flag Detach existant.
Oui, nous avons déjà écrit, que nous devons créer une fonction exportée séparée et l'utiliser pour contrôler ce drapeau.
Mais comme le montre cet exemple, l'indicateur dans DLL_PROCESS_DETACH ne fonctionne pas.
S'il y a une erreur dans le terminal, il est logique que DLL_PROCESS_DETACH transfère le drapeau vers un autre état.
La boucle while obtient cet état, sort de la boucle, tout ce qui est rencontré en cours de route est exécuté et termine la fonction Fn() elle-même.
Ce n'est qu'après cela que la dll doit être déchargée !
Mais ce n'est pas le cas, nous avons une sorte de déchargement anticipé des dll par des mécanismes cachés du terminal, et nous avons donc un crash.
Le fait de ne pas reprendre le contrôle n'est qu'un exemple. Il est clair que l'exécution de while doit se faire dans un thread séparé afin de ne pas bloquer le thread.
Forum sur le trading, les systèmes de trading automatisé et les tests de stratégies de trading
Bugs, bugs, questions
Sergey Dzyublik, 2019.05.26 15:12
Malheureusement, à l'heure actuelle, les types de pointeurs de fonction dans MT4/MT5 sont très limités et peu pratiques en raison de certains défauts :#(non corrigé dans MT5(build 2118))"Erreur de compilation lors de l'utilisation répétée de la même signature de fonction dans un typedef".
#(non corrigé dans MT5(build2118))"Lors du travail avec typedef, l'utilisation d'une fonction template avec une spécialisation explicite ne génère pas de code pour cette fonction template".
Compte tenu de l'implémentation en cours de l'espace de noms, veuillez envisager d'implémenter la prise en charge de ce comportement dans le cadre des corrections de défauts dans le prochain C++:
MT5 (build 2118), Combien de temps pouvons-nous encore attendre pour des corrections de bugs dans la fonctionnalitétypedef?
Quelques absurdités - un pas à gauche d'un exemple primitif sur l'utilisation detypedef et c'est tout -un tas de bugs bloquant le développement futur.
Laissez-moi deviner. Si vous exécutez une boucle de dll dans un thread du terminal, elle se bloque, mais si vous l'exécutez dans un thread séparé auquel vous détachez(), le terminal se bloque avec une erreur ?
Pas exactement.
Le lancement d'une boucle fonctionne bien.
Le problème se pose lorsque l'on arrête de force le programme et que l'on passe un drapeau à la boucle pour sortir de la boucle et terminer une fonction en cours d'exécution.
Mais le terminal ne permet pas de sortir de la boucle et de terminer correctement la fonction en cours d'exécution, car le déchargement anticipé de la dll est déjà déclenché. On a un blocage.
La dll est déchargée avant que l'état du drapeau soit passé et la fonction Fn ne se termine pas, le déchargement précoce casse tout.
Je l'ai fait dans un thread terminal par exemple, pour éviter d'écrire tout le code, car en mode bloquant on voit mieux le problème.
J'ai créé une fonction distincte pour le drapeau de boucle et la boucle en cours d'exécution s'exécute dans un thread différent, mais le même comportement.
Et lorsque j'essaie de faire passer le drapeau à un autre état à partir d'un code mql non verrouillé, via une fonction de sortie de la boucle,
le terminal n'attend pas que la boucle en cours d'exécution se termine, et ne laisse pas la fonction Fn se terminer là où la boucle est en cours d'exécution.
Le terminal effectue immédiatement un déchargement anticipé de dll sans attendre la fin de la fonction Fn. C'est là le problème.
alors donnez un exemple approprié tout de suite. et laissez l'attachi detachi tranquille. contrôlez la création/suppression des fils de discussion explicitement vous-même.
Vous pouvez mieux voir le problème en mode verrouillé. Ce qui change l'état du drapeau n'a pas vraiment d'importance. Avec un point d'entrée ou une fonction séparée.
Le point d'entrée est meilleur pour le mode verrouillé, puisque le contrôle n'est pas retransmis et que la fonction de changement de drapeau ne peut pas être appelée. C'est pourquoi l'atachi detechi est utilisé comme exemple.
Atachi détachable laissé seul, fait une fonction séparée comme vous l'avez conseillé, pas de chance, sur un projet en cours en mode non bloquant, même comportement.
La dll est déchargée trop tôt, la fonction en cours d'exécution avec la boucle while n'a pas le temps de se terminer et se bloque.
La dll est déchargée trop tôt, une fonction en cours d'exécution avec une boucle while n'a pas le temps de se terminer et un blocage se produit.
il ne peut y avoir de blocage dans une mise en œuvre normale
Quelqu'un a-t-il rencontré le problème suivant avec les symboles personnalisés ? La fonction CustomRatesUpdate reçoit des cotations normales, mais en fait le graphique et la fenêtre de données contiennent quelque chose d'étrange (dans ce cas les valeurs de clôture et de bas sont 100 fois inférieures à celles passées) :
Aussi, en parallèle, les ticks simples sont émulés avec CustomTicksAdd avec les mêmes valeurs de prix de clôture que dans le log (immédiatement avant CustomRatesUpdate), c'est-à-dire qu'il n'est pas clair d'où viennent les valeurs réduites entre guillemets.
UPD :
J'ai une situation "inverse" sur USDCAD - les cotations augmentent 10 fois après l'écriture. Voici le journal que je reçois :
Le premier ArrayPrint est ce qui a été écrit dans CustomRatesUpdate, et le second ArrayPrint est ce qui a été lu en utilisant CopyRates à partir de la dernière barre la plus récente immédiatement après l'écriture. Tout d'abord, la différence est le dernier chiffre de l'ouverture, mais plus important encore, le sommet et la clôture sont augmentés d'un facteur 10.
Quelqu'un a-t-il rencontré le problème suivant avec les symboles personnalisés ? La fonction CustomRatesUpdate reçoit des cotations normales, mais en fait le graphique et la fenêtre de données contiennent quelque chose d'étrange (dans ce cas les valeurs de clôture et de bas sont 100 fois inférieures à celles passées) :
De plus, les ticks simples sont émulés en parallèle en utilisant CustomTicksAdd avec les mêmes valeurs de prix de clôture que dans le journal (immédiatement avant CustomRatesUpdate), c'est-à-dire qu'il n'est pas clair d'où proviennent les valeurs réduites dans les cotations.
Oui, je l'ai rencontré, seulement mon null n'était pas clair. Tu as 100 fois plus de pointes.
Veuillez reproduire le problème dans ce fil de discussionJ'ai fait une vérification supplémentaire du zéro, ça n'a pas aidé, ça fonctionnait de travers, puis ça dessinait de tels pics.
Ce comportement a surtout été observé au premier démarrage du programme, et au premier démarrage les fichiers d'historique ont été créés avec une date inexistante.
Nettoyé le dossier ticks, corrigé le code, afin de trouver où le bug, ennuyé, reporté pour le moment, mais aussi doivent revenir à ce problème ((
Vérifiez également l'historique du dossier personnalisé, il peut y avoir des fichiers avec une date qui n'existe pas ;)))
En général, l'insecte y vit de manière spécifique.
Je crois que Slava s'occupe des personnages personnalisés là-bas.
Pour rappeler le problème.
Cette erreur a-t-elle déjà été mentionnée ? Je ne le trouve pas. En résumé, lors du chargement des résultats d'optimisation à partir du fichier de cache, les résultats avant sont affichés de manière incorrecte. Les valeurs des paramètres ont des chiffres erronés.
Vous allez dans l'onglet d'optimisation. Sélectionnez le conseiller expert. Sélectionnez l'une des optimisations précédentes. Les backtests sont chargés normalement. Les attaquants donnent ça :
MT5, dernière version. x64.