Questions "pour" du conducteur de vélo

 

Bonjour la communauté MQL4,


Première référence : https://book.mql4.com/operators/for

Selon la première référence, un exemple de format de l'opérateur 'for' est écrit comme tel :

  for (Expression_1; Condition; Expression_2)         // Cycle operator header
      One operator, cycle body                     // Cycle body is one operator


Deuxième référence : https://docs.mql4.com/basis/operators/for

Selon la deuxième référence, l'exemple fourni de l'opérateur 'for' est décrit comme tel :

for (Expression1; Expression2; Expression3)
   operator;


Pourquoi ce premier exemple contient-il une "condition" comme second paramètre alors que le second exemple contient "Expression2" comme second paramètre ?

Quelle est la signification de cette contradiction ?

Est-elle même importante ?

Si je dois utiliser l'opérateur de cycle 'for', je pense que je dois avoir une compréhension approfondie de tous ses paramètres.

Je vous remercie.

 

Pour mieux comprendre une boucle for, il faut d'abord comprendre une boucle while... Une boucle for est juste une boucle while avec une condition initiale et un incrément intégré...

Regardez la documentation surfor, elle dit...

"L'opérateurfor est équivalent à la succession suivante d'opérateurs :"

Expression1;
while(Expression2)
  {
   operator;
   Expression3;
  };


En ce qui concerne votre question,"Pourquoi le premier exemplecontient-il une "condition" comme deuxième paramètre alors que le deuxième exemple contient "Expression2"comme deuxième paramètre ?"Une expression peut être une condition, une condition a pour résultat une valeur vraie ou fausse, par exemple (a > b) ou (c || d) ou (OrdersTotal() >= 0)." L'expression2 est le test conditionnel pour la fin du cycle."

 

Simon,

une expression peut être une condition

Donc, le paramètre deux dans un en-tête d'opérateur 'for' peut être une expression OU une condition ? Je suppose que l'expression 1 et l'expression 3 doivent rester des expressions et ne pas se transformer en conditions, n'est-ce pas ? Je ne vois pas pourquoi les expressions 1 et 3 ne pourraient pas également être des conditions. Les deux expressions 1&3 sont juste des paramètres à remplir. (être une condition pourrait aussi être le paramètre 2, c'est-à-dire le but de l'Expression_2).

Veuillez confirmer vos idées.

Les expressions peuvent être des opérations arithmétiques (2+2=4), des affectations, etc. (toutes listées dans le dictionnaire MetaEditor).

La condition est vraie ||faux (exemples : a>b, a>=b, a==b, etc.).

Les opérations sont également contenues dans le dictionnaire MetaEditor (exemples : Break, Continue, Return, while, for, etc.).

Merci de votre compréhension

 
WhooDoo22:

Simon,

une expression peut être une condition

Donc, le paramètre deux dans un en-tête d'opérateur 'for' peut être une expression OU une condition ? Je suppose que l'expression 1 et l'expression 3 doivent rester des expressions et ne pas se transformer en conditions, n'est-ce pas ? Je ne vois pas pourquoi les expressions 1 et 3 ne pourraient pas également être des conditions. Les deux expressions 1&3 sont juste des paramètres à remplir. (être une condition pourrait aussi être le paramètre 2, c'est-à-dire le but de l'Expression_2).

Apprenez à utiliser correctement le while ... Une boucle for est une boucle while, mais elle est disposée de manière plus esthétique. Ensuite, les expressions et les conditions auront un sens... . . faites-vous une faveur et réduisez les possibilités de maux de tête . . . étudiezwhile

Documentation - while

Livre - while
 
WhooDoo22: Donc, le paramètre deux dans un en-tête d'opérateur 'for' peut être une expression OU une condition ?
Toute expression donne lieu à un nombre. Le nombre, converti en booléen, est une condition. C'est la même chose. Vous dites tuh-mey-toh , et je distuh-mah-toh.
 

Simon, je vais m'entraîner à utiliser l'opération while dans le code. Faites-vous une faveur... J'aime le son de ceci ! :) Merci.

William, le nombre, converti en booléen est une condition ... (1=vrai, 0=faux). Merci beaucoup.

Merci.

 

Simon,

J'ai écrit un EA qui devrait ;) être capable de faire ce que vous avez demandé.

Je partage une combinaison de cet EA couplé avec un cliché du résultat de l'onglet "Experts" dans le Terminal.


L'EA semble être capable de sélectionner l'ordre USDJPY et d'imprimer ses informations dans l'onglet "Experts". Pourquoi l'EA ne ferme-t-il pas l'ordre et n'imprime-t-il pas les informations relatives à l'ordre ?

Merci.

Dossiers :
 
WhooDoo22:

Simon,

J'ai écrit un EA qui devrait ;) être capable de faire ce que vous avez demandé.

Je partage une combinaison de cet EA couplé avec un cliché du résultat de l'onglet "Experts" dans le Terminal.


L'EA semble être capable de sélectionner l'ordre USDJPY et d'imprimer ses informations dans l'onglet "Experts". Pourquoi l'EA ne ferme-t-il pas l'ordre et n'imprime-t-il pas les informations relatives à l'ordre ?

Merci.

Vous avez dit que vous compreniez les accolades ?https://www.mql5.com/en/forum/142732


Je vous prie d'expliquer votre code et ce qu'il est censé faire... en particulier, expliquez-moi le "while", s'il vous plaît.
 

Simon,

Je vous prie d'expliquer votre code et ce qu'il est censé faire... et en particulier de m'expliquer ce qui se passe.

Je ferai de mon mieux pour expliquer le code et son but.


Objectif du code :

1. Sélectionnez l'ordre USDJPY dans un pool de trois ordres.

2. Modifier le TP et le SL de l'ordre USDJPY.

3. Exécutez la fonction OrderPrint().

4. Fermez l'ordre USDJPY.


Explication du code :

Tout d'abord, les variables sont déclarées.

   int i;
   double bid_ask;

Deuxièmement, la boucle 'while' est exécutée.

Logique de la boucle 'while' :

Lafonction OrderSelect() utilise la variable 'i' comme substitut d'un nombre 1, 2, 3, etc. (gardez ceci à l'esprit s'il vous plaît)

Donc, si la variable i dans la fonction OrderSelect() et la fonction OrderSymbol() n'est PAS USDJPY, augmenter la variable i de 1. ( i++ ; )

   while(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderSymbol()!="USDJPY")

         i++;

La boucle 'while' augmente la variable 'i' jusqu'à ce que la fonction OrderSelect() sélectionne le bon ticket d'ordre ET que la fonction OrderSymbol() sélectionne un ordre USDJPY. Lorsque les deux objectifs ont été atteints, la boucle 'while' devient fausse et le contrôle est passé sous i++ ; (le corps de la boucle 'while').

Troisièmement, la fonction OrderModify() est exécutée.

OrderModify(i,OrderOpenPrice(),50*Point,50*Point,0,CLR_NONE);

Quatrièmement, la fonction OrderPrint() est exécutée.

OrderPrint();

Cinquièmement, des paramètres sont inclus pour discerner si l'ordre à fermer est un ordre d'achat ou de vente.

         if(OrderType()==OP_BUY){bid_ask=Bid;}
         if(OrderType()==OP_SELL){bid_ask=Ask;}

Sixièmement, lorsque le programme distingue si l'ordre est d'achat ou de vente, il exécute la fonction OrderClose().

OrderClose(i,OrderLots(),bid_ask,3,CLR_NONE);

Septièmement (et enfin), le programme inclut un commentaire qui affichera la variable 'i' pour confirmer que le numéro du ticket est bien le ticket sur USDJPY pendant le test visuel dans le testeur de stratégie.

Comment("i = " ,i);

Merci.

 
WhooDoo22:

Simon,


La logique de la boucle 'while' :

La fonction OrderSelect() utilise la variable 'i' comme substitut d'un nombre 1,2,3, etc... (gardez ceci à l'esprit s'il vous plaît)

Donc, si la variable i dans la fonction OrderSelect() et la fonction OrderSymbol() n'est PAS USDJPY, augmentez la variable i de 1. ( i++ ; )

La boucle 'while' augmente la variable 'i' jusqu'à ce que la fonction OrderSelect() sélectionne le bon ticket d'ordre ET que la fonction OrderSymbol() sélectionne un ordre USDJPY. Lorsque les deux objectifs ont été atteints, la boucle 'while' devient fausse et le contrôle est passé sous i++ ; (le corps de la boucle 'while').

Désolé, j'ai mal interprété votre code . Le problème que vous rencontrez est très simple... il suffit de regarder le message d'erreur dans la capture d'écran que vous avez postée... regardez ce que produit OrderPrint(), y compris le numéro de l'ordre, puis regardez l'erreur.

Si vous aviez inclus la vérification des valeurs de retour et le signalement des erreurs, vous auriez probablement vu votre problème vous-même.
 

Simon,

Je ne vois pas ce que tu vois mais ;) Je vais rapidement inclure la fonction GetLastOrder() pour éclaircir ce problème. Je m'excuse d'avoir posté une question sans avoir d'abord inclus la fonction GetLastOrder() dans le code.

Je vous remercie.