Questions "pour" du conducteur de vélo - page 4

 

Simon,

Ok, laissez-moi essayer d'ajouter le niveau d'arrêt à l'EA aussi, juste pour faire bonne mesure.

Ah-ha ! Le niveau de gel pour USDJPY est 0 et le niveau de stop est 30.

Je suppose que 30 représente 3 parce que le courtier est à 5 chiffres. J'ai essayé d'utiliser le MODE_SPREAD et j'ai obtenu 20. Évidemment le spread sur USDJPY n'est pas de 20 mais ;) 2.0. On pourrait aussi dire que 2 pips sont équivalents à 20 points.

Merci.

 

Un indice pour vous. . . .

 

Simon,

Il semble qu'il s'agisse à nouveau d'un problème de sélection d'ordre.

La fonction OrderClose() essaie de fermer un ordre (pas l'ordre USDJPY). Elle essaie de clôturer l'ordre sur le graphique EURUSD.

La fonction OrderPrint() a déjà été sélectionnée avant son exécution et correspond clairement à son objectif tel que prévu.

La couleur rouge entourant le prix invalide doit indiquer WRONG.

La couleur verte entourant l'USDJPY doit indiquer le BON.

Donc, si tout est vrai, je dois me concentrer sur le cercle rouge et sélectionner l'ordre avant l'exécution de la fonction OrderClose().

Merci.

 
WhooDoo22:


Qu'est-ce que le Bid et le Ask ?

Ask est le dernier cours vendeur connu (cours vendeur) du symbole actuel.

Bid est le dernier prix d'achat connu (prix d'offre, prix de vente) du symbole actuel.

Vous connaissez déjà la raison de l'échec de la clôture... mais réfléchissez-y un instant.


Regardez votre code, quel prix utilisez-vous pour fermer l'ordre ?

 

Simon,

Ask/Bid est le dernier prix vendeur/acheteur connu pour le symbole actuel.

Le prix que l'EA souhaite fermer l'ordre est celui du symbole EURUSD.

Pourquoi l'EA doit-il être placé sur un graphique USDJPY pour fermer son ordre ? La fonction OrderSelect() était destinée à sélectionner le numéro de billet et une fois le numéro de billet sélectionné, l'EA pouvait alors sélectionner le numéro de billet.

Apparemment, l'EA doit se trouver sur le graphique du symbole USDJPY pour clôturer les ordres sur ce symbole.


Oubliez tout ce que je viens de dire.

Voici la solution. L'erreur se trouve dans le troisième paramètre. J'envisage de spécifier le symbole puis de placer la variable ask/bid dans son paramètre (emplacement du 3ème paramètre de la fonction OrderClose()). Cela devrait éliminer toute obscurité de la pensée.

Merci.

 
WhooDoo22:.

Voici la solution. L'erreur se situe dans le troisième paramètre. J'envisage de spécifier le symbole et de placer ensuite la variable ask/bid dans son paramètre (emplacement du 3ème paramètre de la fonction OrderClose()). Cela devrait éliminer toute obscurité de la pensée.

Je vous remercie.

L'offre et la demande sont des variables prédéfinies et ne concernent QUE le graphique actuel sur lequel se trouve l'EA. Si vous voulez l'offre ou la demande pour un symbole différent du graphique sur lequel se trouve l'EA, vous ne pouvez pas utiliser les variables prédéfinies Bid et Ask. Vous pouvez cependant utiliser MarketInfo() ;-)
 

Simon,

L'erreur se situe dans le troisième paramètre de la fonction OrderClose() car ;) Ask/Bid est le dernier prix vendeur/acheteur connu pour le symbole actuel. Si "pour le symbole actuel" signifie le graphique actuel sur lequel l'EA est placé, cela peut être un peu confus. Il faut se rappeler que MQL4 existe depuis un certain temps et a ses propres méthodes d'illustration et de représentation.

La solution consiste à remplacer les variables prédéfinies Ask/Bid par une alternative telle que...

// solution 1.

MarketInfo("USDJPY",MODE_BID);

// solution 2.

MarketInfo("USDJPY",MODE_ASK);

Qu'en dites-vous ?


J'ai ajouté une version de cet EA qui a la capacité d'imprimer les informations de l'ordre USDJPY et de le fermer quel que soit le graphique sur lequel il est placé. Je n'ai pas encore confirmé s'il a modifié le SL et le TP de l'ordre USDJPY mais je le confirmerai après vérification. L'EA produit une erreur finale qui ne devrait pas être difficile à résoudre. Je travaille actuellement sur ce point. Voici un instantané de la lecture de l'erreur :

erreur de ticket invalide

Merci.

Dossiers :
 
WhooDoo22:

Simon,

L'erreur se trouve dans le troisième paramètre de la fonction OrderClose() car ;) Ask/Bid est le dernier prix vendeur/acheteur connu pour le symbole actuel. Si "pour le symbole actuel" signifie le graphique actuel sur lequel l'EA est placé, cela peut être un peu confus. Je dois me rappeler que MQL4 existe depuis un certain temps et a ses propres méthodes d'illustration et de représentation.

La solution est de remplacer les variables prédéfinies Ask/Bid par une alternative telle que...

Qu'en dites-vous ?


J'ai ajouté une version de cet EA qui a la capacité d'imprimer les informations de l'ordre USDJPY et de le fermer quel que soit le graphique sur lequel il est placé. Je n'ai pas encore confirmé s'il a modifié le SL et le TP de l'ordre USDJPY mais je le confirmerai après vérification. L'EA produit une erreur finale qui ne devrait pas être difficile à résoudre. Je travaille actuellement sur ce point. Voici un instantané de la lecture de l'erreur :


Je vous remercie.

Et maintenant vous voyez les limites de votre code . ... vous n'avez plus d'ordre USDJPY, donc votre while trouve l'ordre à la position 0 et ce n'est pas USDJPY, puis il trouve le suivant à la position 1 et ce n'est pas USDJPY puis il regarde à la position 2 et l'OrderSelect() échoue, cela termine le while mais le reste du code est alors exécuté, cela donne un OrderModify() qui échoue, un OrderPrint() qui échoue, un OrderType() qui échoue et un OrderClose() qui échoue .... ... que fait ce GetLastError() tout seul ?
 

Simon,

L'opérateur du cycle 'while' est exécuté comme tel : Si l'expression est vraie, l'opérateur est exécuté jusqu'à ce que l'expression devienne fausse. Si l'expression est fausse, le contrôle est donné à l'opérateur suivant.

Le but du code dans la boîte SRC ci-dessous, est de faire ce qui suit :

Tant que la variable 'i' (contenue dans la fonction OrderSelect() ) n'est PAS le numéro de position du ticket USDJPY ET que le symbole de l'ordre n'est pas USDJPY,la variable 'i' est augmentée jusqu'à ce que la variable 'i' SOIT le numéro de position du ticket USDJPY ET que le symbole de l'ordre SOIT USDJPY. Une fois que le cycle 'while' devient faux, le contrôle est alors transmis à la ligne de code suivante.

J'ai fourni l'en-tête et le corps du cycle 'while' pour une aide visuelle.

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

i++;

Je pense que vous comprenez comment le cycle "while" localise un ticket sur la paire de devises USDJPY même si aucun ticket n'est actuellement présent sur la paire de devises mais ;) J'ai bien peur que non.

Comment le cycle 'while' peut-il localiser un ticket sur le graphique USDJPY s'il n'y a pas d'ordre à localiser sur un graphique USDJPY ?

Je crois que vous avez écrit quelque chose qui va dans le sens de la localisation de l'ordre à la position 0. Pouvez-vous développer ce point ou éventuellement fournir un lien pour l'étudier ?

Merci.

 
WhooDoo22:


Je crois que vous comprenez comment le cycle 'while' localise un ticket sur la paire de devises USDJPY même sans qu'un ticket soit actuellement sur la paire de devises mais ;) J'ai bien peur que non.

Comment le cycle 'while' peut-il localiser un ticket sur le graphique USDJPY s'il n'y a pas d'ordre à localiser sur le graphique USDJPY ?

Je crois que vous avez écrit quelque chose qui va dans le sens d'une localisation de l'ordre à la position 0. Pouvez-vous développer ce point ou éventuellement fournir un lien pour l'étudier ?

Si vous voulez écrire du code pour vous tout seul, vous devez accomplir la tâche de 3 personnes, peut-être même de 4. La personne qui rédige le document des exigences, l'ingénieur logiciel et l'ingénieur de test. Il ne suffit pas de connaître la syntaxe à l'envers et d'être capable d'écrire du code . . vous devez comprendre le problème que vous essayez de résoudre et comment vous allez le faire, et vous devez également savoir comment tester le code pour vous assurer qu'il répond aux exigences.

À un niveau de base, cela signifie qu'il faut parcourir votre code ligne par ligne et s'assurer qu'il fait ce que vous vouliez qu'il fasse, généralement avec une gamme de valeurs pour chaque variable allant de leur valeur minimale, en passant par les valeurs typiques jusqu'à la valeur maximale.


Prenons l'exemple de votre boucle while...

Lorsque vous déclarez une variable int sans lui donner de valeur, elle a une valeur de départ de 0, donc lorsque vous déclarez i (pourquoi ne pas utiliser un nom de variable plus descriptif ?) il a une valeur de 0, donc la première fois que vous faites le tour de la boucle whilei est 0, donc le OrderSelect() essaie de sélectionner l'ordre à la position 0 si cela fonctionne votre appel OrderSymbol() retournera le nom correct du symbole pour l'ordre à la position 0 et si ce n'est pas "USDJPY" alors l'expression(OrderSymbol() !="USDJPY" ) donnera une valeur vraie , si l'OrderSelect() est vrai et que la vérification du symbole est vraie,true et true =true et la ligne de code suivante (dans la boucle while) est exécutée.

Maintenant,i est 1, la fonction OrderSelect() sélectionne l'ordre à la position 1, ce qui donne une valeur de true, la vérification du symbole ne trouve pas de symbole de USDJPY et renvoie donc true.d'USDJPY et renvoie donc true, encore une fois true et true = true donc i++ est exécuté à nouveau

Maintenanti
est 2 , l'OrderSelect() essaie de sélectionner l'ordre à la position 2 mais échoue . . il n'y a que 2 ordres ouverts, aux positions 0 et 1, donc l'OrderSelect() renvoie false, que fait l'OrderSymbol() ? il n'y a pas d'ordre valide sélectionné .... . mais même si elle retourne vrai pour une raison bizarre, la fonction OrderSelect() a déjà retourné false,false et true = false . . . la boucle while s'est terminée eti est fixé à 2.

Maintenant travaillez sur le reste du code en gardant à l'esprit quei a une valeur de 2....

Raison: