Mon EA fait une double entrée - page 5

 
Klammeraffe:

La ligne concernant "chaque tick" pourrait être la raison pour laquelle cela ne se produit plus.

La fonction n'est exécutée que lorsqu'une nouvelle barre apparaît. Donc, très probablement, seul le premier tick d'une barre peut exécuter un trade. Après la première barre, le code reçoit un 'return' jusqu'à ce qu'une nouvelle barre apparaisse. Peut-être que cela a résolu le problème pour moi.

Je pense que ce morceau de code provient des articles :

C'est une autre solution mais s'il y a un retour d'erreur par le courtier ou autre, votre signal n'est plus valide à moins que vous ne gardiez une boucle pour vérifier encore et encore.
 
doshur:
  • Le code posté initialement par doshur, peut expliquer pourquoi il peut voir dans son log "Position opened in..." alors qu'aucun trade n'a été ouvert. En effet, même si PositionOpen() renvoie true, cela ne signifie pas qu'une position a été ouverte (voir la documentation). Mais cela ne peut pas expliquer pourquoi un "double" trade a été placé.
Correction. Il y a un double"Position opened in..." et 2 trades ont été ouverts.
Bien sûr. Je veux dire "pourquoi il pouvait voir...". Le point ici est qu'il n'y a rien dans votre code qui peut expliquer pourquoi vous avez eu ces 2 trades.
 
angevoyageur:
Bien sûr. Je veux dire "pourquoi il a pu voir...". Le point ici est qu'il n'y a rien dans votre code qui peut expliquer pourquoi vous avez eu ces 2 échanges.
Ok. Comprenez.
 
angevoyageur:

Je pense qu'il est très important de trouver la raison derrière ce problème, bien sûr il est également important d'avoir une solution de contournement (Sleep ?) jusqu'à ce que nous puissions comprendre pleinement ce qui se passe. J'essaie donc de résumer la situation :

* Lors de l'utilisation de la méthode PositionOpen de la classe CTrade, au moins 3 utilisateurs ont obtenu à un moment donné, 2 transactions dans la même direction au lieu d'une, résultant en une position avec un volume doublé par rapport à ce qui est attendu.

J'utilise les deux méthodes, pour ouvrir une nouvelle position = "à l'ancienne", en modifiant le stoploss = "classe CTrade".


* Ce problème semble se produire sur le même broker, avec un symbole où la profondeur de marché est activée (les personnes concernées peuvent-elles le confirmer s'il vous plaît).

Oui le serveur du broker X, Depth of Market est activé.


* Ce problème se produit avec un ordre synchrone, l'ordre asynchrone n'a pas été utilisé (veuillez confirmer).

Oui, l'ordre asynchrone n'a pas été utilisé.


* Le problème se produit de manière aléatoire.

Oui, mais seulement pendant les heures de pointe du marché( événementsmacro-économiques ).



 

A mon avis, ce problème peut être facilement résolu.


L'EA doit toujours attendre une réponse si la fonction "PositionSelect(Symbol())" est utilisée et que le terminal a mis à jour les données de la fonction, avant de pouvoir reprendre l'exécution du code.

L'EA doit toujours attendre une réponse si la fonction "OrderSend(mrequest,mresult)" est utilisée et que le terminal a mis à jour les données de la fonction, avant de pouvoir reprendre l'exécution du code.


Je mentionne également le terminal lui-même car les données de la fonction seront copiées sur le terminal et cela prendra également un certain temps.

De cette façon, la taille de la position actuelle sera toujours calculée correctement, de sorte que le double ordre n' aura plus lieu.


Qu'en pensez-vous ?

 
snelle_moda:

A mon avis, ce problème peut être facilement résolu.


L'EA doit toujours attendre une réponse si la fonction "PositionSelect(Symbol())" est utilisée et que le terminal a mis à jour les données de la fonction, avant de pouvoir reprendre l'exécution du code.

L'EA doit toujours attendre une réponse si la fonction "OrderSend(mrequest,mresult)" est utilisée et que le terminal a mis à jour les données de la fonction, avant de pouvoir reprendre l'exécution du code.


Je mentionne également le terminal lui-même parce que les données de la fonction seront copiées sur le terminal et cela prendra également un certain temps.

De cette façon, la taille de la position actuelle sera toujours calculée correctement, de sorte que le double ordre n' aura plus lieu.


Qu'en pensez-vous ?

Je ne suis pas sûr de ce que vous voulez dire par "attendre toujours une réponse..." ?

Quoi qu'il en soit, j'ai envoyé une demande au ServiceDesk pour demander conseil. Nous verrons bien.

 
angevoyageur:

Je ne suis pas sûr de ce que vous voulez dire par "toujours attendre une réponse...". ?

Quoi qu'il en soit, j'ai envoyé une demande au ServiceDesk pour demander conseil. Nous allons voir.

"Je ne suis pas sûr de ce que vous voulez dire par "toujours attendre une réponse..." ? ?"


L'EA doit attendre/se stopper jusqu'à ce que la fonction PositionSelect(Symbol()) ait terminé de copier les données sur une position dans l'environnement du programme.

Voyez cela comme une fonction sleep() forcée.

 
snelle_moda:

"Je ne sais pas ce que vous voulez dire par "toujours attendre une réponse...". ?"


L'EA doit attendre/se stopper jusqu'à ce que la fonction PositionSelect(Symbol()) ait terminé de copier les données relatives à une position dans l'environnement du programme.

Considérez-la comme une fonction sleep() forcée.

Ok compris. Mais je ne peux pas me satisfaire d'une telle solution, soit il y a quelque chose que nous ne comprenons pas, soit il y a un bug quelque part.
 
J'espère seulement qu'il y aura une solution.

Quoi qu'il en soit, joyeux Noël à tous.
 
Des nouvelles du service d'assistance ?