Test du nouveau compilateur MQL5 pour les plateformes x64 - calculs 2 à 10 fois plus rapides ! - page 14

 

Je voulais tester l'accélération des calculs sur mon Expert Advisor aujourd'hui en prévision de la super vitesse (j'ai même utilisé un CPU plus rapide) et... Pour une raison quelconque, le conseiller expert optimisé fonctionnait trois fois plus lentement dans le testeur. Cela ne vous est jamais arrivé ? Dès que j'aurai localisé et reproduit le problème, je posterai le code. Il n'y a pas d'appels système, seulement des opérations avec un tas de tableaux et des opérations arithmétiques de base.

Aussi, voici quelques demandes :

1. Nous pourrions ajouter la possibilité de lancer le script à partir de l'éditeur sans déboguer, c'est-à-dire comme s'il était fait à partir du Navigateur. Ce type de lancement est présent dans tout environnement de développement. Je pensais suggérer Ctrl + F5, comme dans sys, mais la combinaison est déjà prise par vous :)

2. Ajout de l'invocation de la console stdout de wind à partir du script, pour éviter de passer au terminal à chaque fois pour voir le résultat du script. Bien que, d'après ce que je comprends, vous pouvez essayer de l'appeler en utilisant WinAPI.

3. Ajoutez au moins quelques paramètres d'optimisation génétique. Par exemple, le nombre de combinaisons peut être de 1e35 et 10k passages ne sont pas toujours suffisants (l'optimiseur ne génère même pas de nouveaux passages après 10k), vous comprenez que 20-30k seraient suffisants, mais vous ne pouvez pas le régler. D'autre part, lorsque vous fixez certains paramètres et en laissez d'autres pour un réglage plus fin et une étude de la distribution... Ainsi, lorsque le nombre de combinaisons est faible, par exemple 50k, l'optimiseur pour GA n'offre que 2k exécutions - et cela n'est pas non plus suffisant pour cette tâche particulière - pour mieux étudier le comportement de la fonction sur ces paramètres. C'est-à-dire qu'il est stupide de passer par les 50k, alors que GA ne génère que 2k courses et ne donne pas une image suffisante. J'espère que vous comprenez ce dont je parle.

 
Renat Fatkhullin:

Des améliorations sont à prévoir.

Quelqu'un a-t-il déjà testé le débogage sur l'historique dans le testeur de stratégie?

Je pense que beaucoup aimeraient tester, mais la difficulté et la réalité est qu'ils testent généralement là où ils écrivent le code et ont l'intention de faire du commerce. Très peu de courtiers proposent MT5, ce qui ralentira le test de toutes les nouvelles fonctionnalités par les traders et ralentira inévitablement le développement de MT5. Il est donc peut-être judicieux de chercher une solution non triviale qui résoudra ce problème et augmentera la motivation à utiliser MT5.
 
Renat Fatkhullin:

Des améliorations sont à prévoir.

Quelqu'un a-t-il déjà testé le débogage sur l'historique dans le testeur de stratégie?

Je fais quelque chose de mal. Mon visualiseur s'ouvre simplement, et fonctionne comme d'habitude. Le point de rupture est juste sur la première déclaration dans OnInit() - mais cela ne fonctionne pas.
 
Renat Fatkhullin:

Des améliorations sont à prévoir.

Quelqu'un a-t-il déjà testé le débogage sur l'historique dans le testeur de stratégie?

Il serait également agréable de pouvoir sélectionner "trouver les usages" dans le menu contextuel.

Je sais que c'est un peu hors sujet, et je n'ai pas besoin d'écrire de modifications, mais c'est agréable pour les développeurs d'avoir de telles choses.

J'ai vérifié Moving Average, MACD Sample sur le nouveau compilateur, mais je n'ai pas trouvé de différences. Je vais l'essayer sur mes EAs.

 

Je n'ai pas encore entièrement débogué et trouvé le bug (de manières très différentes), mais jusqu'à présent j'ai trouvé les problèmes suivants avec Optimize=1. Laissez-moi vous dire tout de suite que mon conseiller expert a environ 100 paramètres d'entrée, et qu'il travaille beaucoup avec des tableaux. En outre, il ne fait pas de commerce, il ne fait qu'effectuer des calculs.

Je vais décrire l'ordre de mes actions :

1. Je lance le terminal, sélectionne "Optimisation = désactivée" dans le testeur et donne un jeu de paramètres d'entrée maître. Le testeur donne le résultat correct.

2. Je choisis "Optimisation = Rapide (algorithme génétique)", je le lance - le testeur ne génère même pas la première étape. Les agents (processeurs) ne répondent pas. Au début, j'ai pensé qu'il pouvait y avoir des erreurs de calcul avec de mauvais jeux de paramètres et que le testeur mourrait simplement.

3. Je sélectionne à nouveau "Optimisation = désactivée" et je donne à nouveau le jeu de référence. Maintenant, le testeur ne montre aucun résultat.

4. j'ouvre le code EA dans l'éditeur, je presse F5 pour générer un code non optimisé. Dans le testeur, je l'exécute à nouveau sur le jeu de référence - voilà, il y a un résultat. Eh bien, il y a un problème à l'intérieur du conseiller expert en raison de l'optimisation.

J'ai ajouté une fonction qui enregistre les paramètres d'entrée de l'Expert Advisor dans un fichier. Ainsi, à l'étape 2 (l'optimisation est en cours et les étapes du testeur ne sont presque pas générées), des valeurs aléatoires apparaissaient pour certains paramètres qui ne sont pas fournis du tout parce que le paramètre est soit immuable, soit la valeur est en dehors de la plage définie. Par exemple, j'avais un paramètre réglé sur 80 et il était invariable. Dans le journal, il était réglé sur 0,01355835795402527 ( ?). L'autre a été fixé à 0 et enregistré comme 4.940656458412465e-324 ; Les deux paramètres étaient doubles. Mais j'ai ensuite découvert qu'il y avait aussi des valeurs totalement inappropriées pour int.

Deuxièmement, j'ai supprimé le code "inutile" de l'Expert Advisor pour ne laisser que le code qui provoque également une erreur. Pourtant, il s'est avéré que c'était beaucoup. De plus, la fonction d'enregistrement transmettait la valeur de TOUS les paramètres. Cependant, lorsque j'ai supprimé la plupart des paramètres (et qu'ils sont devenus inférieurs à 64 ou 80), le testeur n'est pas mort. Cela dit, j'ai également trouvé un lien étrange entre l'erreur et ma fonction de journalisation. Lorsqu'il est commenté (c'est-à-dire que tous les paramètres ne sont PAS utilisés dans le code), le testeur meurt. Quand il se connecte, le testeur meurt. Très étrange.

Et troisièmement. J'ai remarqué que la mise en parallèle des calculs n'entraîne pas une augmentation linéaire de la vitesse globale des exécutions. Par exemple, je joins les fichiers : un script et un Expert Advisor avec le même code. Il s'agit d'un véritable morceau de code, extrait de mon Expert Advisor, mais les tableaux sont renommés. Avec Optimize=1, mon script s'exécute en 156 ms, c'est-à-dire peut-être 6 exécutions par seconde. (Sans Optimize, cela prend 3 fois plus de temps). Je dispose de 8 threads, c'est-à-dire que théoriquement 48 exécutions par seconde sont possibles. En exécutant l'Expert Advisor dans le testeur (faire une Optimisation lente, activer le paramètre fictif, par exemple, pour 2000 exécutions), je n'ai obtenu qu'un peu plus de 4 exécutions par seconde, c'est-à-dire encore plus lentement que sur un seul cœur ! Bien qu'il y avait honnêtement 8 processus suspendus dans le gestionnaire de tâches. Pourquoi en est-il ainsi ? Plusieurs processus bloquent l'accès à la mémoire ? Initialisation longue des tableaux ? (Il est vrai que les tableaux n'y sont pas très importants).

Lorsque nous exécutons un seul test dans le testeur, Print : 156 ms. C'est-à-dire que tout semble être normal avec le conseiller expert.

D'ailleurs, y aura-t-il un jour des pointeurs dans MQL ? :) Parce que j'ai dû faire des copies de tableaux.

Dossiers :
 
xfo:

Pour une raison quelconque, l'expert avec optimisation fonctionnait 3 fois plus lentement dans le testeur.

Je comprends maintenant pourquoi il devient plus lent - seul un agent (aléatoire) fonctionne, les autres échouent et ainsi de suite une tentative toutes les quelques secondes. Rien n'est clair dans le journal du testeur. Si je comprends bien, si l'agent le plus récent échoue également, alors ce que j'ai écrit plus tôt se produit : les étapes du testeur ne sont pas générées du tout.

La build 1117 n'a pas résolu tous les problèmes décrits ci-dessus (y compris struct array).

 

Mis à jour à 1117 aujourd'hui, mais le débogage sur les données historiques - toujours pas en marche.

Je prends ExpertMACD.mt5, je mets un point d'arrêt juste à l'entrée de la fonction Init, je lance le débogage sur les données historiques (appuyer sur le bouton), la fenêtre de l'éditeur se ferme, les paramètres du testeur de stratégie s'ouvrent. Je définis la période de temps (pour 2015, les jours, tous les ticks), la visualisation - la case à cocher est activée, j'appuie sur le bouton Start et la visualisation commence. Le point d'arrêt n'a pas fonctionné.

Qu'est-ce que je fais de mal ?

 
George Merts:

Mis à jour à 1117 aujourd'hui, mais le débogage sur les données historiques - toujours pas en marche.

Je prends ExpertMACD.mt5, je mets un point d'arrêt juste à l'entrée de la fonction Init, je lance le débogage sur les données historiques (appuyer sur le bouton), la fenêtre de l'éditeur se ferme, les paramètres du testeur de stratégie s'ouvrent. Je définis la période de temps (pour 2015, journaux, tous les ticks), la visualisation - la case à cocher est activée, j'appuie sur le bouton Start et la visualisation commence. Le point d'arrêt n'a pas fonctionné.

Qu'est-ce que je fais de mal ?

Je dois ouvrir un compte de démonstration surMetaQuotes-Demo, puis

Mon MACD Sample.mq5 sur un compte de démonstration moex le symbole USDRUB_TOM ne fonctionne pas (il démarre d'abord puis s'arrête après quelques étapes) et un backtest simple ne fonctionne pas non plus.

Mais la moyenne mobile.mq5 sur un compte de démonstration moex USDRUB_TOM fonctionne bien (tout comme le backtest simple).

Sur le compte de démonstration demoforex, le symbole EURUSD fonctionne bien (ainsi que le backtest simple) MACD Sample.mq5 et Moving Average.mq5.

Enregistré une vidéo de débogage sur MACD Sample.mq5 symbole EURUSD sur le compte demoforex. (le quotidien fonctionne bien aussi)

Dossiers :
capture-mt5-1.zip  5457 kb
 
xfo:

Je ne l'ai pas entièrement débogué et je n'ai pas trouvé comment le bug se manifeste (de manières très différentes), mais jusqu'à présent j'ai trouvé les problèmes suivants lorsque Optimize=1. Laissez-moi vous dire tout de suite que mon conseiller expert a environ 100 paramètres d'entrée, et qu'il travaille beaucoup avec des tableaux. De plus, il n'effectue pas de transactions mais uniquement des calculs.

........................

.......................

D'ailleurs, y aura-t-il un jour des pointeurs dans MQL ? :) Parce que j'ai dû faire des copies de tableaux.

Bonjour, je voudrais être plus précis.

1. Votre conseiller expert a effectué des calculs, mais n'a pas effectué de transaction. Qu'est-ce que le conseiller expert affiche et comment le fait-il ? Qu'attendez-vous du conseiller expert lorsque vous l'exécutez dans le testeur de stratégie? Quelles données espérez-vous obtenir lors des tests d'optimisation ? Nous n'avons pas trouvé d'erreurs pendant le test du conseiller expert ci-joint. Les erreurs que vous décrivez y sont-elles liées ?

2. pas à pas ce que vous faites et ce que vous attendez, veuillez joindre le code que vous utilisez.

3. pouvez-vous joindre les journaux de test avec et sans optimisation ?

4. Version de votre terminal, OS ?

 

Eduard Vavrin, le fichier joint n'est pas lié aux erreurs décrites. Je vais essayer de préparer le code qui conduit à l'erreur et vous l'envoyer. Cela prend juste du temps et jusqu'à présent ce code contient trop de choses provenant de la source de l'Expert Advisor.

Concernant le fichier que j'ai joint : il indique qu'une seule exécution de l'EA joint prend 156 ms, c'est-à-dire 1/6 de seconde. Nous pouvons supposer que sur 8 threads, nous obtiendrions 48 exécutions par seconde. En réalité, le multi-runner (il y a le paramètre fictif, mode d'optimisation lente) ne donne que 4-5 exécutions par seconde sur 8 threads. La question était : pourquoi la vitesse diminue-t-elle ? Dans l'onglet Agents, je peux voir que tous les threads sont en cours d'exécution et que chaque thread passe plus d'une seconde pour une exécution. Ce que le conseiller expert renvoie à rand() est juste un tick pour voir que cela a fonctionné.