Apprendre et écrire ensemble en MQL5 - page 14

 

Par curiosité, j'ai vérifié. Le résultat est le suivant

2011.04.15 15:50:34     123 (EURUSD,D1) time for 'd = a + b + c' = 84453 milliseconds, i = 10000000
2011.04.15 15:51:54     123 (EURUSD,D1) time for 'StringAdd()' = 80906 milliseconds, i = 10000000
2011.04.15 15:53:22     123 (EURUSD,D1) time for 'StringConcatenate(d,a,b,c)' = 87359 milliseconds, i = 10000000
2011.04.15 15:55:11     123 (EURUSD,D1) time for 'd = a + b + c' = 83266 milliseconds, i = 10000000
2011.04.15 15:56:39     123 (EURUSD,D1) time for 'StringAdd()' = 88390 milliseconds, i = 10000000
2011.04.15 15:58:12     123 (EURUSD,D1) time for 'StringConcatenate(d,a,b,c)' = 93391 milliseconds, i = 10000000

Mais il me semble qu'il y a quelque chose qui ne va pas ici (je veux dire vérifier l'algorithme)...

 

Yedelkin:

Il s'avère que StringConcatenate est plus lent que la liaison de chaînes de caractères utilisant des opérations d'addition. Quel est le problème ?

La particularité des cordes.
Dans la première passe, vous obtenez la bonne taille de tampon pour stocker le résultat de l'addition et de la transformation des chaînes de caractères, c'est-à-dire qu'il n'y a pas de déplacement de tampon pour les chaînes de caractères d,(chaîne)b et(chaîne)c.
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы ввода/вывода / Использование кодовой страницы
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы ввода/вывода / Использование кодовой страницы
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы ввода/вывода / Использование кодовой страницы - Документация по MQL5
 
mql5:
Cordes en vedette.
Lors de la première passe, vous obtenez la bonne taille de tampon pour stocker le résultat de l'addition et de la transformation des chaînes de caractères, c'est-à-dire que la réaffectation du tampon pour les chaînes d,(chaîne)b et(chaîne)c ne se produit pas.

J'ai essayé différentes méthodes de comparaison, mais je n'ai pas obtenu le résultat souhaité. Je me suis retrouvé avec un code comme celui-ci :

   uint   start,stop;
   long   i,length=1000000;
   string a1[1000000]; for(i=0;i<length;i++) a1[i]="Пример";
   string a2[1000000]; for(i=0;i<length;i++) a2[i]="Пример";
   string a3[1000000]; for(i=0;i<length;i++) a3[i]="Пример";

   double b1[1000000]; ArrayInitialize(b1,1.26);
   double b2[1000000]; ArrayInitialize(b2,1.26);
   double b3[1000000]; ArrayInitialize(b3,1.26);

   double c1[1000000]; ArrayInitialize(c1,1.27);
   double c2[1000000]; ArrayInitialize(c2,1.27);
   double c3[1000000]; ArrayInitialize(c3,1.27);

   string d1[1000000]; for(i=0;i<length;i++) d1[i]=NULL;
   string d2[1000000]; for(i=0;i<length;i++) d2[i]=NULL;
   string d3[1000000]; for(i=0;i<length;i++) d3[i]=NULL;


////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------//
//Work variables
//----------------------------------------------------------------------------//
   start=GetTickCount();
   for(i=0;i<length;i++)
     {
      d1[i]=a1[i]+(string)b1[i]+(string)c1[i];
     }
   stop=GetTickCount();
   Print("time for 'd = a + b + c' = ",(stop-start)," milliseconds, i = ",i);

//Второй способ
   start=GetTickCount();
   for(i=0;i<length;i++)
     {
      StringAdd(d2[i],a2[i]);
      StringAdd(d2[i],(string)b2[i]);
      StringAdd(d2[i],(string)c2[i]);
     }
   stop=GetTickCount();
   Print("time for 'StringAdd()' = ",(stop-start)," milliseconds, i = ",i);

//Третий способ
   start=GetTickCount();
   for(i=0;i<length;i++)
     {
      StringConcatenate(d3[i],a3[i],b3[i],c3[i]);
     }
   stop=GetTickCount();
   Print("time for 'StringConcatenate(d,a,b,c)' = ",(stop-start)," milliseconds, i = ",i);

Résultats :

KL 0 DoubleToString (EURGBP,M1)      23:53:01        time for 'd = a + b + c' = 15766 milliseconds, i = 1000000
HD 0 DoubleToString (EURGBP,M1)      23:53:26        time for 'StringAdd()' = 25390 milliseconds, i = 1000000
FK 0 DoubleToString (EURGBP,M1)      23:54:03        time for 'StringConcatenate(d,a,b,c)' = 36516 milliseconds, i = 1000000
KS 0 DoubleToString (EURGBP,M1)      23:54:56        time for 'd = a + b + c' = 15781 milliseconds, i = 1000000
FL 0 DoubleToString (EURGBP,M1)      23:55:21        time for 'StringAdd()' = 25375 milliseconds, i = 1000000
OR 0 DoubleToString (EURGBP,M1)      23:55:57        time for 'StringConcatenate(d,a,b,c)' = 35828 milliseconds, i = 1000000
 
Question. La fonction OrdersTotal() renvoie le nombre total d'ordres actifs pour un compte de trading. Existe-t-il un moyen simple d'obtenir le nombre d'ordres actifs pour un symbole spécifique ?
 
Yedelkin:
Question. La fonction OrdersTotal() renvoie le nombre total d'ordres actifs pour un compte de trading. Existe-t-il un moyen simple d'obtenir le nombre d'ordres actifs pour un certain symbole ?
Obtenez l'historique complet et faites une sélection.
 
Urain:
Obtenez l'histoire complète et faites un échantillonnage.
OK. Il n'y a donc pas de solution facile.
 

Question. Les fonctions HistorySelect() et HistorySelectByPosition() demandent l'historique des ordres et l'historique des transactions. J'ai exécuté le script explicatif du Guide, et sa liste de transactions est classée par ordre croissant. Est-ce un hasard ou les fonctions HistorySelect() et HistorySelectByPosition() sont-elles programmées pour retourner des listes ordonnées par ordre croissant ?

 
Yedelkin:

Question. Les fonctions HistorySelect() et HistorySelectByPosition() demandent l'historique des ordres et l'historique des transactions. J'ai exécuté le script explicatif du Guide, et sa liste de transactions est classée par ordre croissant. Est-ce un hasard ou les fonctions HistorySelect() et HistorySelectByPosition() ont-elles été programmées pour retourner les listes classées par ordre croissant ?

Peu importe le nombre de fois que j'ai expérimenté, le résultat est le même : une liste ordonnée d'une certaine manière est retournée.

Une fois, j'ai même voulu écrire une requête pour un paramètre supplémentaire spécifiant exactement comment les entrées devaient être triées.

Mais j'ai réfléchi et j'ai décidé que cela n'en valait pas la peine (ils peuvent répondre à cette question eux-mêmes et tout ça), même si c'est peut-être une erreur de ne pas avoir écrit...

 
Interesting:

... se débrouiller tout seul et tout ça

C'est juste que s'il existe un tri forcé prédéfini, c'est une chose, mais créer un tri supplémentaire manuellement en est une autre.
 
Yedelkin:
S'il existe un tri forcé prédéfini, c'est une chose, mais créer un tri supplémentaire manuellement en est une autre.

C'est juste que dans MT4 j'ai trié manuellement (et filtré aussi), si je ne me trompe pas j'ai trié en "bulles".

J'ai obtenu le code de tri de la base de données à cet endroit, ce qui peut être clarifié.

Et je n'ai pas encore décidé de la meilleure façon de trier dans MQL5, puisque j'ai compris que les requêtes d'historique ne sont désormais plus liées à l'onglet historique. (le tri et le contenu ne dépendent pas de ce que l'utilisateur a fait dans l'onglet).