Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 1413

 
Alexey Viktorov:

Les fonctions IntegerToString() et DoubleToString() représentent simplement le nombre sous la forme d'une chaîne de caractères qui est transmise à la fonction. Dans l'exemple

il s'agit de la conversion de r en chaîne de caractères et les chaînes de caractères sont "ajoutées". Mais avant cela, la valeur de r change.

Je ne comprends pas bien la question, mais si vous devez sélectionner uniquement les éléments pairs du tableau, la boucle devrait être construite de la manière suivante


Merci pour l'explication.

 
Alexey Viktorov:

Les fonctions IntegerToString() et DoubleToString() représentent simplement le nombre sous la forme d'une chaîne de caractères qui est transmise à la fonction. Dans l'exemple

il s'agit de la conversion de r en chaîne de caractères et les chaînes de caractères sont "ajoutées". Mais avant cela, la valeur de r change.



Je n'arrive pas à comprendre le processus d'"ajout" des valeurs des variables de type chaîne. Je vois 2 variantes de chaînes "d'ajout" dans mon code.

1. Ils additionnent la valeur de la variable chaîne de l'itération actuelle avec la valeur de la même variable chaîne de l'itération précédente.

2. À l'itération courante, les valeurs des deux variables de terme sont additionnées, c'est-à-dire IntegerToString(r) + DoubleToString(LoY[r],4).

Il me semble que vous voulez parler de la première variante.

Mais ensuite .... La valeur de IntegerToString(r) à l'itération précédente = "0". et sur l'itération en cours = "1" . Le résultat de l'addition doit être "01".

Si, dans l'itération actuelle, avant de faire la somme, la valeur IntegerToString(r) passe de 0 à 1, nous obtenons toujours une représentation sous forme de chaîne à deux chiffres du nombre, c'est-à-dire "11".

Si nous utilisons le même algorithme pour additionner les valeurs de la variable chaîne de caractères DoubleToString(LoY[r],4), alors le résultat de l'addition de deux chaînes de caractères devrait être des valeurs comme 1.61041.6105

Mais Print() imprime les résultats de l'addition comme d'autres nombres pour une raison quelconque (comme ils devraient l'être)
Je ne le comprends pas.
Voici votre exemple de la façon dont les valeurs des variables de chaîne sont additionnées "...... et si vous additionnez des chaînes de caractèresDoubleToString(2.3, 1)+DoubleToString(3.6, 1), ce sera 2.33.6 comme chaîne de caractères". Autrement dit, avant l'addition, la représentation en chaîne du nombre de chaque variable était de 2 caractères, mais après l'addition de deux variables en chaîne, le résultat de l'addition est une représentation en chaîne du nombre de 4 caractères. Pourquoi l'addition dans votre code ne donne-t-elle pas un nombre avec deux fois plus de caractères ?

 
Alexey Viktorov:


Je ne comprends pas bien la question, mais si vous voulez sélectionner uniquement les éléments pairs d'un tableau, alors la boucle devrait être construite comme ceci


En fait, c'est ce que je voulais dire par ..... Voici le code original complété par le BOX 2

int P1=0;
double LoY[31];
void OnTick()
{
if (P1==0)
{
for(int r=0; r<31;r++)
{
LoY[r]=1.6104+(r*2)*0.0001;
Print("-------------------------------------LoY[r]--------------=",  LoY[r]);
P1=1;
}
}
//*************************************************************  Б Л О К    N 2
for(int x=0; x<31;x++)
{
if (Bid < LoY[x] )
{
LoY[x]=Bid;
ArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND);
Print("---LoY[0]--",  X, "---LoY[1]--" ,  X,   "---LoY[2]--" ,  X,  "---LoY[3]--" ,  X,  "---LoY[4]--" ,  X, ................  "---LoY[30]--" ,  X );
}
}
}

Dans le deuxième bloc, les valeurs des éléments du tableau ne diffèrent plus du même delta que dans le premier bloc. Le delta entre des éléments adjacents peut être différent et donc l'algorithme de connexion des chaînes du premier bloc ne convient pas au deuxième bloc.... il me semble.

QUESTION Avec quelle construction ou fonction du langage MQL4 dans le deuxième bloc du code ci-dessus, la fonction Print(), à la fin de la boucle,n' imprimeraqu'une seule fois, avec toutes les valeurs des éléments du tableau remplis, disposés sur une seule ligne, c'est-à-dire qu'elle aura la forme suivante

Print("---LoY[0]--", X,"---LoY[1]--", X,"---LoY[2]--", X,"---LoY[3]--", X,"---LoY[4]--", X................"---LoY[30]--", X ) ;

Ne me jugez pas sévèrement, mais je ne suis pas sûr de pouvoir comprendre l'explication en mots, car le deuxième bloc est beaucoup plus compliqué que le premier.... il me semble.
Merci pour votre aide.

 

Lors de la programmation, il y a beaucoup de travail de routine, du moins au début. Vous réfléchissez à l'idée, puis vous écrivez le code, et enfin vous le déboguez. Parfois, le temps de débogage est plus long que tout le reste.

Il arrive souvent que l'idée initiale ne fonctionne pas. Vous commencez à regarder de haut en bas dans l'ordre de ce qui ne va pas.

Insérez printf() partout, et voyez si c'est ce que vous attendez ou non. De cette façon, vous comprendrez plus rapidement comment le code fonctionne et où vous avez une erreur. Sinon, la compréhension prendra beaucoup de temps.


Ce ne sont pas mes affaires, mais essayez d'écrire joliment. Choisissez un style pour vous-même et tenez-vous en à ce style. Placez des crochets dans les crochets par étapes pour rendre les pièces jointes visibles. Si vous utilisez des espaces entre les déclarations, alors utilisez-les partout, ou inversement, ne les utilisez pas partout.

for(int x=0; x<31;x++)

if (Bid < LoY[x] )

Il sera alors plus facile pour vous de lire votre propre code.

-----------------

Sur le deuxième bloc :

Dans le deuxième bloc, le x minuscule et le X majuscule sont des variables différentes, le code ne fonctionnera pas comme vous le souhaitez.

Il serait préférable de trier le tableau en dehors de la boucle.

Dans Imprimer vous utilisez X plusieurs fois, vous imprimerez le même nombre de fois.

-----------------

A propos du code. Il est difficile de comprendre la question, alors je vais vous dire ce que j'ai compris.

Si vous écrivez Print dans une boucle, vous obtiendrez autant d'impressions que cette boucle a itéré. Si vous devez imprimer la sortie une seule fois, placez Print après la boucle.

Dans ce cas, utilisez une variable, dans laquelle vous écrirez la valeur de chaque itération, pour collecter les informations. Notre variable est une chaîne, donc tous les nombres doivent être convertis en chaîne.

Nous avons une variable de type chaîne de caractères car la fonction Print accepte une chaîne de caractères.

Ce qui se passe :

Première passe. Avant le premier passage avant la boucle, nous avons une variable vide : string str="";
Ensuite, nous assignons une valeur vide à la variable plus "--LoY["+IntegerToString(r)+"]--, "+DoubleToString(LoY[r],4)+",";
ici r est 0 et nous ajoutons réellement quelques chaînes :

"--LoY["+

IntegerToString(0)+

"]--, "+

DoubleToString(LoY[0],4)+

", ";

Deuxième passage.

A tout cela, nous ajoutons les informations du deuxième élément

"--LoY["+IntegerToString(1)+"]--, "+DoubleToString(LoY[1],4)+", ";

Cela ne modifie pas la chaîne de caractères du premier élément.



Il vaut mieux expliquer l'objectif en mots, ce dont vous avez besoin plutôt que la façon dont vous le faites. Sinon, nous pourrions discuter de votre code pendant longtemps et il s'avérera que votre objectif peut être résolu d'une autre manière.

 
ANDREY:

Je n'arrive pas à comprendre le processus d'"addition" des valeurs des variables de type chaîne. Je vois 2 options pour "ajouter" des chaînes de caractères dans mon code.

1. La valeur de la variable chaîne de l'itération courante est ajoutée à la valeur de la même variable chaîne de l'itération précédente.

2. À l'itération courante, les valeurs des deux variables de terme sont additionnées, c'est-à-dire IntegerToString(r) + DoubleToString(LoY[r],4).

Il me semble que vous voulez parler de la première variante.

Mais ensuite .... La valeur de IntegerToString(r) à l'itération précédente = "0". et sur l'itération en cours = "1" . Le résultat de l'addition doit être "01".

Si la valeur IntegerToString(r) passe du 0 précédent au 1 actuel avant l'addition , nous obtenons toujours une représentation en chaîne à deux chiffres du nombre, c'est-à-dire "11".

Si nous ajoutons les valeurs de la variable chaîne DoubleToString(LoY[r],4) par le même algorithme , alors le résultat de l'addition de deux chaînes doit être des valeurs comme 1.61041.6105

Mais Print(), pour une raison quelconque, imprime les résultats de l'addition comme d'autres nombres (comme ils devraient l'être)
Je ne le comprends pas.
Voici votre exemple d'ajout de valeurs de variables de type chaîne de caractères "...... et si vous ajoutez des chaînes de caractèresDoubleToString(2.3, 1)+DoubleToString(3.6, 1), ce sera 2.33.6 comme chaîne de caractères". Autrement dit, avant l'addition, la représentation en chaîne du nombre de chaque variable était de 2 caractères, mais après l'addition de deux variables en chaîne, le résultat de l'addition est une représentation en chaîne du nombre de 4 caractères. Pourquoi l'addition dans votre code ne donne-t-elle pas un nombre avec deux fois plus de caractères ?

En fait, c'est comme pour la rédaction de n'importe quel texte. Nous commençons par une feuille de papier vierge, ou devrais-je dire une ligne vierge. Ensuite, nous écrivons le premier mot, nous y ajoutons le deuxième et ainsi de suite........... Et lorsque nous voyons des chiffres dans le texte, nous les écrivons comme un symbole de ligne. C'est-à-dire que si on ajoute 2 + 5, on obtient 7, et si on écrit simplement ces mêmes chiffres, on écrit d'abord 2 puis 5... on obtient donc deux chiffres 25, écrits l'un à côté de l'autre. Je ne sais pas comment l'expliquer autrement.

En fait, si vous ignorez les avertissements du compilateur, la conversion des valeurs r en chaîne dans votre échantillon n'est pas nécessaire. Ici, vous pouvez vérifier ces deux options

Print("Test 1 " + (string)1 + (string)2);
Print("Test 2 " + 1 + 2);
 
Aleksei Stepanenko:


Merci pour votre aide et vos conseils.

 
Alexey Viktorov:

En fait, c'est exactement la même chose que d'écrire n'importe quel texte. Tout d'abord, nous avons une feuille de papier vierge, ou devrais-je dire une ligne vierge. Ensuite, nous écrivons le premier mot, nous y ajoutons le deuxième et ainsi de suite........... Et lorsque nous voyons des chiffres dans le texte, nous les écrivons comme un symbole de ligne. C'est-à-dire que si l'on ajoute 2 + 5, on obtient 7, et si l'on écrit simplement ces mêmes chiffres, on écrit d'abord 2 et ensuite 5... on obtient donc deux chiffres 25, écrits l'un à côté de l'autre. Je ne sais pas comment l'expliquer autrement.

En fait, si vous ignorez les avertissements du compilateur, la conversion des valeurs r en chaîne dans votre échantillon n'est pas nécessaire. Vous êtes ici et vous vérifiez deux de ces variantes.

Merci pour tout

 
ANDREY:

C'est en fait ce que je voulais dire par ..... Voici le code original, complété par le BOX 2

Dans le deuxième bloc, les valeurs des éléments du tableau ne diffèrent pas du même delta que dans le premier bloc. Le delta entre des éléments adjacents peut être différent et donc l'algorithme de connexion des chaînes du premier bloc n'est pas adapté au deuxième bloc.... il me semble.

QUESTION Avec quelle construction ou fonction du langage MQL4 dans le deuxième bloc du code ci-dessus, la fonction Print()n' imprimeraqu'une seule fois après la fin de la boucle, avec toutes les valeurs des éléments du tableau remplies sur une ligne, c'est-à-dire qu'elle aura la forme suivante

Print("---LoY[0]--", X,"---LoY[1]--", X,"---LoY[2]--", X,"---LoY[3]--", X,"---LoY[4]--", X................"---LoY[30]--", X ) ;

Ne me jugez pas sévèrement, mais je ne suis pas sûr de pouvoir comprendre l'explication en mots, car le deuxième bloc est beaucoup plus compliqué que le premier.... il me semble.
Merci pour votre aide.

Et pourquoi trier le tableau à chaque itération de la boucle ? Parce que si vous avez remplacé la valeur du 0ème élément du tableau et qu'après le tri, elle est allée à la fin du tableau, alors zéro sera la valeur qui était la première, et la première sera la valeur qui était la seconde. Ainsi, la valeur du premier élément du tableau sera ignorée et vous obtiendrez "rubbish". En somme, tout votre code est quelque chose de déplacé.

Pourquoi avez-vous besoin du premier bloc dans lequel vous remplissez le tableau ? Remplissez tout de suite le tableau avec les valeurs dont vous avez besoin, puis triez-le. Vrai, vous devrez exécuter une autre boucle pour remplir la chaîne et imprimer. J'aurais aimé que mql4 ait ArrayPrint()... Mais ce ne sont que des expériences, et vous n'aurez pas vraiment besoin d'imprimer les valeurs du tableau.

 
Aleksei Stepanenko:

Il vaut mieux expliquer votre objectif en mots, ce dont vous avez besoin, pas comment vous le faites. Sinon, nous pouvons discuter de votre code pendant si longtemps, et il s'avérera que votre objectif peut être résolu d'une autre manière.

Tout en étudiant mql4 (et un peu mql5), j'écris divers codes. Cela inclut les codes qui utilisent des tableaux. Il est souvent nécessaire de vérifier les éléments du tableau à un endroit du code. J'ai appris à le faire en utilisant Print() dans une boucle. Mais dans ce cas, Print() est imprimé à chaque itération. Lorsqu'il y a de nombreuses itérations, c'est gênant à la fois pour le programme et pour la lecture. Vous avez correctement dit que Print() doit être retiré en dehors de la boucle pour Print() avec les valeurs des éléments du tableau à imprimer une seule fois. Je l'avais deviné avant vos mots.

J'ai appris très vite à mettre Print() en dehors de la boucle. Et maintenant, j'essaie d'apprendre comment faire en sorte que Print() imprime toutes les valeurs des éléments du tableau sur une seule ligne.

On m'a expliqué comment procéder en ce qui concerne le premier bloc de mon code. Jusqu'à présent, en termes généraux, j'ai compris cette technologie. Je vais continuer à me creuser les méninges pour comprendre les détails de cette méthode.
Mais dans le deuxième bloc de mon code, il me semble que la méthode du premier bloc ne convient pas car, contrairement au premier bloc, le delta entre les valeurs des éléments du tableau dans le deuxième bloc est différent.
Si j'ai raison et que la méthode du premier bloc ne s'adapte pas au second, je vous serais reconnaissant de me montrer comment faire la même chose que dans le premier bloc, mais en se référant au second.

J'ai corrigé le deuxième bloc. J'ai mis Print() et ArraySort() en dehors de la boucle. J'ai supprimé la variable X de Print() afin de ne pas vous induire en erreur.

int P1=0;
double LoY[31];
void OnTick()
{
if (P1==0)
{
for(int r=0; r<31;r++)
{
LoY[r]=1.6104+(r*2)*0.0001;
P1=1;
}
}
//*************************************************************  Б Л О К    N 2
for(int x=0; x<31;x++)
{
if (Bid < LoY[x] )
{
LoY[x]=Bid;
}
}
ArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND);
Print("-LoY[0]-", (знач.эл.масс с инд.0), "---LoY[1]--" ,  (знач.эл.масс с инд.1),   "---LoY[2]--" ,  (знач.эл.масс с инд.2),  "---LoY[3]--" ,  (знач.эл.масс с инд.3),................  "---LoY[30]--" ,  (знач.эл.масс с инд.30) );
}
 
Print("-LoY[0]-", DoubleToString(LoY[0],4), "---LoY[1]--", DoubleToString(LoY[1],4), "---LoY[2]--" , DoubleToString(LoY[2],4), "---LoY[3]--" , DoubleToString(LoY[3],4),................  "---LoY[30]--" ,  DoubleToString(LoY[30],4) );

ou créer une fonction d'impression de tableau distincte :

void PrintArray(double &eArray)
   {
   string eStr="";
   int eSize=ArraySize(eArray);
   for(int i=0; i<eSize; i++)
      {
      eStr+=IntegerToString(i)+": "+DoubleToString(eArray[i],4)+", ";
      }
   Print(str);
   }

Et appelez-le de n'importe où

PrintArray(LoY);