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

 
Yury Kulikov:
Par exemple, les communications inter-terminales.

Eh bien, si vous le déformez comme ça, alors bien sûr, la DLL est une fonctionnalité utile...

Mais j'ai personnellement décidé, pour cette tâche précise, que je n'avais pas vraiment besoin d'une DLL pour cela. Pour l'instant, je pense à un EA qui prendrait les cotations d'une société de courtage et enverrait des signaux à une autre, et qui n'a même pas MetaTrader. (DucaCopi, d'ailleurs, je me demande si MetaQuotes sera d'accord avec ce vénérable courtier).

Je pensais plutôt à DLL. Mais il a décidé que les fichiers partagés sont beaucoup plus sûrs et plus raisonnables. Laissez MetaTrader écrire les signaux dans le fichier. Et laissez un autre MetaTrader (ou JForex ou quelqu'un d'autre) les lire et les exécuter.

 

Au fait, j'ai réfléchi aux références des tableaux...

Renat, je fais une suggestion :

Puisque nous avons une bibliothèque standard, ne devrions-nous pas ajouter une variante de la fonction OnCalculate() avec le prototype suivant :

intOnCalculate(constint rates_total,//taille de la série chronologique d'entrée
constint prev_calculated,// barres traitées lors de l'appel précédent
const CiTime* ptTime,// Temps
const CiOpen* poOpen,// Ouvrir
const CiHigh* phHigh,// Haut
const CiLow* plLow,// Basse
const CiClose* pcClose,// Fermer
const CiTickVolume* ptvTickVolume,// Volume du Tick
const CiRealVolume* prvRealVolume,// Volume réel
const CiSpread* psSpread// Écartèlement
) ;

?

À mon avis, cela nécessiterait de très petites modifications dans MetaTrader, mais d'un autre côté, cela fournit simplement des pointeurs vers des tableaux, qui peuvent être transmis aux classes de gestionnaires sans être copiés. Et l'idée de la bibliothèque standard elle-même est popularisée.

 

Nous avons obtenu les premiers résultats de la comparaison des performances de l'ancien et du nouveau compilateur sur l'exemple d'un grand projet réel (~20 000 lignes de code source).

Résultats du temps d'exécution du programme compilé avec l'ancienne version du compilateur (4 exécutions) :

2015.05.02 13:48:46.641 *** (EURUSD,D1)       Start ***. Parsing of history deals (22575) and orders (22656) completed in 6.443 sec. 116 MB RAM used.
2015.05.02 13:48:27.879 *** (EURUSD,D1)       Start ***. Parsing of history deals (22575) and orders (22656) completed in 6.427 sec. 116 MB RAM used.
2015.05.02 13:48:12.067 *** (EURUSD,D1)       Start ***. Parsing of history deals (22575) and orders (22656) completed in 6.287 sec. 116 MB RAM used.
2015.05.02 13:47:49.719 *** (EURUSD,D1)       Start ***. Parsing of history deals (22575) and orders (22656) completed in 8.751 sec. 116 MB RAM used.

Résultats du temps d'exécution d'un programme compilé dans la nouvelle version du compilateur (4 exécutions) :

2015.05.02 13:54:18.638 *** (EURUSD,D1) Start ***. Parsing of history deals (22575) and orders (22656) completed in 5.475 sec. 116 MB RAM used.
2015.05.02 13:54:01.995 *** (EURUSD,D1) Start ***. Parsing of history deals (22575) and orders (22656) completed in 5.616 sec. 116 MB RAM used.
2015.05.02 13:53:43.853 *** (EURUSD,D1) Start ***. Parsing of history deals (22575) and orders (22656) completed in 5.444 sec. 116 MB RAM used.
2015.05.02 13:53:25.809 *** (EURUSD,D1) Start ***. Parsing of history deals (22575) and orders (22656) completed in 6.147 sec. 116 MB RAM used.

*Les deuxième et troisième exécutions du programme ont été réalisées avec un cache chauffé - comme on le voit, le cache chauffé augmente la productivité de 15 à 30 %.

Comme vous pouvez le constater, les résultats sont meilleurs avec le nouveau compilateur : il a fallu ~6,4 secondes pour analyser plus de 20000 transactions et ordres lors de la première exécution et ~5,4 secondes lors de la seconde, soit un gain de performance de 15-20%.

L'amélioration des performances aurait pu être plus importante, mais la majeure partie du temps est occupée par des appels de fonctions système.

 

Le nouveau compilateur n'a détecté aucune erreur dans le projet, qui compte plus de 20 000 lignes de code source. C'est un excellent résultat, compte tenu du fait que ce projet a été créé pour l'ancienne version du compilateur.

Cependant, le nouveau compilateur a généré plusieurs messages d'avertissement liés à l'affichage incorrect des chemins de fichiers (exigence d'échappement des slashs) :

Il s'agit d'une exigence juste, qui peut facilement être satisfaite avec quelques modifications mineures.

Ainsi, nous pouvons conclure que même les grands projets écrits en MQL5 sont prêts pour le nouveau compilateur et que le passage à celui-ci ne sera pas un problème pour les développeurs professionnels.

 
Sergey Eremin:
...
J'obtiens"erreur de génération de code 1 1".

...

Je reçois également cette erreur.
 
Le gain principal réside dans les mathématiques et vos propres calculs.

Si la majeure partie du travail difficile se trouve dans les appels système, l'accélération sera faible.
 
Renat Fatkhullin:
Le gain principal porte sur les mathématiques et les calculs personnels.

Si la majeure partie du travail difficile se trouve dans les appels système, l'accélération sera faible.

Il est encore bon, car vous pouvez créer votre propre environnement avec un minimum d'appels de fonctions système.

(copier l'environnement une fois dans vos classes et travailler avec lui directement).

 
George Merts:

Eh bien, si vous le déformez comme ça, alors bien sûr, la DLL est une fonctionnalité utile...

Mais j'ai personnellement décidé, pour cette tâche précise, que je n'avais pas vraiment besoin d'une DLL pour cela. Pour l'instant, je pense à un EA qui prendrait les cotations d'une société de courtage et enverrait des signaux à une autre, et qui n'a même pas MetaTrader. (DucaCopi, d'ailleurs, je me demande si MetaQuotes sera d'accord avec ce vénérable courtier).

J'ai pensé à Dll. Mais j'ai décidé qu'il était plus sûr et plus raisonnable d'utiliser des fichiers partagés. Laissez MetaTrader écrire les signaux dans le fichier. Et un autre MetaTrader (ou JForex, ou quelqu'un d'autre) - laissez-les lire et exécuter.

Il existe une option avec des canaux nommés, mais il est nécessaire d'avoir un serveur intermédiaire,

Vous trouverez des exemples de la manière de procéder sur le forum.

 
Yury Kulikov:
Par exemple, les communications interterminales.

Alexandr Bryzgalov:

Il existe une option avec des canaux nommés, mais vous avez besoin d'un serveur intermédiaire,

Vous trouverez des exemples de la manière de procéder sur le forum.

Pas besoin de chaînes nommées ! Nous attendons que le support SQL soit ajouté. Échange de données par le biais d'un tableau. SQL est un support intégré pour les systèmes multithreads et à forte charge.
 
Vasiliy Sokolov:

Pas besoin de chaînes nommées ! En attendant d'ajouter le support SQL. Échangez des données via un tableau. SQL est un support intégré pour les systèmes multithreads à forte charge.
Je parlais juste de ce que nous avons et si nous ajoutons le sql, nous pourrons en parler aussi ;)