EA mélange les ordres d'ACHAT et de VENTE - page 3

 
WHRoeder:

int OrderType = OrderType() n'est pas correct, l'un peut cacher l'autre (les déclarations locales cachent les globales sans erreur).

int orderType = OrderType()

Le code original est ......

int orderType;
   for(cnt = total-1; cnt >= 0; cnt--)
   {
      while (!OrderSelect(cnt, SELECT_BY_POS)) {Sleep(500);}
      orderType = OrderType();

... ce qui est effectivement la même chose que ce que vous suggérez ?

Je pense que dvarrin dit que son problème réside dans son numéro de ticket.

 

Non, ce n'est pas le cas.

Letype d'ordre déclaré en dehors de la boucle transférera effectivement la valeur du type d'ordre au cycle suivant et même si une erreur se produit, cette valeur entrera dans la conditionnelle suivante.

Si vous déclarez un type d'ordre à l'intérieur de la boucle avec une valeur immédiate de OrderType(), il n'y aura pas de place pour une telle erreur.

(peut-être que ce n'est pas le problème du PO, mais cela peut en empêcher d'autres de se produire) qu'est-ce qu'il y a à ne pas essayer ?

De plus, une demi-seconde en veille est un peu exagérée. Les boucles de type "while" devraient fonctionner sans problème avec une minuterie de sommeil de 10 millisecondes sans aucun impact sur la charge du processeur (enfin presque :P).

 
forexCoder:

Non, ce n'est pas le cas.

Le type d'ordre déclaré en dehors de la boucle transférera effectivement la valeur du type d'ordre au cycle suivant et même si une erreur se produit, cette valeur entrera dans la conditionnelle suivante.

Si vous déclarez un type d'ordre à l'intérieur de la boucle avec une valeur immédiate de OrderType(), il n'y aura pas de place pour une telle erreur.

(peut-être que ce n'est pas le problème du PO, mais cela peut en empêcher d'autres de se produire) qu'est-ce qu'il y a à ne pas essayer ?

De plus, une demi-seconde en veille est un peu exagérée. Les boucles de type "while" devraient fonctionner sans problème avec une minuterie de sommeil de 10 millisecondes sans que la charge du processeur ne soit affectée (enfin presque :P).


Je soupçonne que le problème vient de l'utilisation de "demander une confirmation manuelle" lors du test de l'EA, mais je ne comprends pas ce qui se passe exactement.

Tout ce que je sais, c'est qu'il n'y a aucun moyen pour une variable nommée OrderType d'interférer avec une méthode portant le même nom et que l'emplacement de la déclaration n'a rien à voir avec mon problème.

Le problème est que OrderTicket(), OrderStoploss(), ... ne donnent pas les données pour la même commande après avoir utilisé OrderSelect().

Si j'utilise des variables locales et que je les définis après l'appel à OrderSelect(), cela fonctionne, mais si j'utilise directement OrderTicket() ou OrderStoploss(), cela donne des valeurs erronées.


Pourquoi dans mon code, OrderStopLoss() renvoie-t-il le stoploss d'un autre ordre dans la même itération de la boucle "for" ?

 

Voici le code complet de l'EA :

Le problème se situe dans la première boucle "for" de la méthode updateFbOrders().

Pour le tester, j'ajoute les indicateurs alligator et fractal sur un graphique et je trouve un graphique où la dernière fractale haute est au-dessus des lignes alligator et la dernière fractale basse est en dessous des lignes alligator.

Il devrait alors créer des ordres d'achat et de vente en attente. S'il y a eu une rupture d'une des fractales, il ouvrira un ordre immédiat.

Puis il modifiera le stoploss de chaque ordre chaque fois que les fractales changent, mais il fixe le stoploss pour le mauvais ordre.

Vérifiez les fenêtres d'alerte et cherchez un message comme celui-ci : Compte : 1 Stoploss 1.41008000 pour l'ordre d'achat : 46454014 orderType : 5, et si vous vérifiez l'ordre 46454014, vous verrez qu'il s'agit en fait d'un ordre de vente. Et il continuera à modifier les ordres même si le stoploss ne change pas, car il prend le mauvais niveau de stoploss.
Dossiers :
 

C'est stupide. Tu ne colles pas le code entier.

Tu as un

areBuyOrdersInProfitAt

que nous ne voyons pas à l'intérieur, veuillez la coller. Il est maintenant très probable que vous avez fait une erreur quelque part ailleurs. Utilisez-vous la fonction OrderSelect ailleurs ?

De même, où définissez-vous vos variables longSL et shortSL ? Veuillez coller cette partie du code également.

EDIT : vous l'avez collé pendant que je tapais, je regarde le nouveau message maintenant.

 
forexCoder:

C'est stupide. Tu ne colles pas le code entier.

Tu as un

areBuyOrdersInProfitAt

que nous ne voyons pas à l'intérieur, veuillez la coller. Il est maintenant très probable que vous avez fait une erreur quelque part ailleurs. Utilisez-vous la fonction OrderSelect ailleurs ?

De même, où définissez-vous vos variables longSL et shortSL ? Veuillez coller cette partie du code également.

EDIT : vous l'avez collé pendant que je tapais, je regarde maintenant le nouveau message.

Bonjour forexCoder

J'ai ajouté l'EA au message précédent.


Mais je pense que vous avez mis le doigt sur le problème : j'utilise OrderSelect() dans la méthode "areBuyOrdersInProfitAt". :-)))))))))))

 

Oui, comme je le pensais.

La fonction areBuyOrdersInProfitAt contient une autre fonction OrderSelect et elle écrase ce que fait celle du snippet original. Lorsque cette fonction areBuyOrdersInProfitAt revient, l'OrderSelect est modifié, ainsi que le ticket. Dans ce cas, vous devriez toujours obtenir la dernière commande de votre liste ici.

 

Une fois que vous commencez à utiliser OrderSelect dans une boucle for, en passant par tous les ordres, vous ne pouvez pas créer une autre boucle for OrderSelect à l'intérieur, parce que lorsque la seconde retourne, vous utiliserez le ticket du dernier ordre dans votre pool de négociation.

Vous avez un code assez long, donc je n'ai pas envie de le corriger (sry:P) mais vous avez maintenant une indication dans la bonne direction.

 
dvarrin:

Mais je pense que vous avez mis le doigt sur le problème : j'utilise OrderSelect() dans la méthode "areBuyOrdersInProfitAt". :-)))))))))))

Je suis heureux d'apprendre que vous êtes sur la voie de la solution :-)
 
RaptorUK:
Je suis heureux d'apprendre que vous êtes sur la voie d'une solution :-)
Merci beaucoup à tous. C'est vraiment une erreur stupide que j'ai commise :-((
Raison: