Mon EA fait une double entrée - page 10

 
angevoyageur: Je ne suis pas sûr de comprendre ce que vous voulez dire. Le problème dont nous parlons dans ce sujet n'est pas causé par un mauvais codage mais par une mauvaise conception de mql5 (c'est mon opinion, ou peut-être est-ce simplement un bug?). Qu'entendez-vous par "multiple trading thread" ?

Je suis revenu en arrière et j'ai relu ce que vous considérez comme une mauvaise conception.

Dans l'ancienne version de mql5, ces classes n'existent pas. La méthode normale de vérification des Successful_Orders est Ticket#==(-1) && GetLastError(). Je n'ai jamais vu un cas où votre ordre renvoie un ticket# valide et GLE=0. Mais au prochain tick, votre OrdersTotal() renvoie toujours 0.

Maintenant, gardez à l'esprit que je n'ai pas parcouru l'ensemble des documentations mql5. Cependant, s'il est dit que PositionSelect_Information n'est pas mis à jour avant plus tard. Et quelqu'un utilise PositionSelect pour évaluer sa logique d'entrée. Alors cette personne doit attendre que PositionSelect_Information soit mis à jour avant de sortir de la logique d'envoi d'ordre.

Pour le truc du fil... Je parlais des fils multiples par rapport aux fils uniques pour l'envoi des ordres. Comme dans les ordres simultanés ouvrant en même temps. Cela peut ou non être pertinent ici.

 
Ubzen:

Je suis revenu en arrière et j'ai relu ce que vous considérez comme une mauvaise conception.

Dans old-mt4, ces classes n'existent pas. La méthode normale de vérification des Successful_Orders est Ticket#==(-1) && GetLastError(). Je n'ai jamais vu un cas où votre commande renvoie un ticket# valide et GLE=0. Mais au prochain tick, votre OrdersTotal() renvoie toujours 0.

Maintenant, gardez à l'esprit que je n'ai pas parcouru l'ensemble des documentations mql5. Cependant, s'il est dit que PositionSelect_Information n'est pas mis à jour avant plus tard. Et quelqu'un utilise PositionSelect pour évaluer sa logique d'entrée. Alors cette personne doit attendre que PositionSelect_Information soit mis à jour avant de sortir de la logique d'envoi d'ordre.

Pour le truc du fil... Je parlais des fils multiples par rapport aux fils uniques pour l'envoi des ordres. Comme dans les ordres simultanés ouvrant en même temps. Cela peut ou non être pertinent ici.

La documentation sur PositionSelect ne dit rien à propos de "n'est pas mis à jour jusqu'à plus tard". Elle dit seulement que même si PositionSelect est vrai, les informations sur une position peuvent être périmées, ce qui n'est pas lié à votre problème ici.

Je vais prendre le temps de faire quelques tests lorsque le marché est ouvert pour être sûr de ne pas dire de bêtises, réponse plus complète plus tard.

 
angevoyageur:

La documentation sur PositionSelect ne dit rien à propos de "ne sera pas mis à jour avant plus tard". Elle dit seulement que même si PositionSelect est vrai, l'information sur une position peut être périmée, ce qui n'est pas lié à votre problème ici.

Je vais prendre le temps de faire quelques tests lorsque le marché est ouvert pour être sûr de ne pas dire de bêtises, réponse plus complète plus tard.

K..... et btw, si le document ne dit rien alors je suis totalement d'accord avec vous.

La question que nous allons poser au Service_Desk en fin de compte est "pourquoi ne pouvez-vous pas mettre à jour la Position_Information lorsque trade.PositionOpen()==true ?".

Ils auront probablement une bonne réponse pour nous .

 
angevoyageur:

Non, je pensais justement à cela... Il serait probablement utile que toutes les personnes concernées écrivent un ticket au ServiceDesk à propos de ce problème. Cependant, je suis très sceptique quant à la volonté de MQ de modifier cette conception. Mais nous pouvons essayer.

Les gens peuvent écrire à ServiceDesk et rapporter le ticket# ici. Le mien est

Erreurs, MetaTrader 5 MQL, Ouvrir, Démarrer : 2013.12.23 19:08, #916435


J'ai également informé le service desk, #933192 | 2014.01.19 14:44

 

MQ peut facilement redessiner cela pour avoir une fonction de délai d'attente ?

Par exemple, si nous ne répondons pas, nous recevrons une erreur, quelque chose comme ça ?

 
doshur:

MQ peut facilement redessiner cela pour avoir une fonction de délai d'attente ?

Par exemple, si nous ne répondons pas, nous recevrons une erreur, quelque chose comme ça ?


Ils ont fait exactement l'inverse. Quand mql5 a été créé , il y avait un paramètre de timeout pour une fonction comme PositionSelect.

Mais ils l'ont supprimé plus tard, voir le point 9 ici https://www.mql5.com/en/forum/53/page5#comment_14479.

 

Je suis d'accord avec les arguments d'une mauvaise conception, mais à mon avis, le principal problème de MQL5 était d'adapter un code basé sur le Forex pour qu'il fonctionne en tant que tel avec les marchés boursiers (ce qui est vraiment une bonne chose).

Par exemple, plusieurs marchés boursiers utilisent le protocole FIX comme standard, et pour moi ce protocole de communication n'est pas facile à adapter à n'importe quel code ou architecture.

Quoi qu'il en soit, je crois que les gars de MQ avaient un défi à relever, et devaient créer MQL5 sur la base de MQL4, et non pas à partir de zéro. Je me souviens que le championnat de cette année-là a été suspendu pour qu'ils aient plus de temps.

Donc, peut-être que ce sujet peut être un excellent conseil pour le futur MQL6 et pour une architecture vraiment nouvelle à partir de zéro, principalement en ce qui concerne la résilience des transactions et les solutions agnostiques pour travailler dans n'importe quel marché.

 
doshur:

MQ peut facilement redessiner cela pour avoir une fonction de délai d'attente ?

Par exemple, si nous ne répondons pas, nous aurons une erreur, quelque chose comme ça ?

Traditionnellement, TimeOut ne signifie pas que l'ordre ne va pas devenir une position. Vous devrez attendre pendant une longue période de temps ... en vérifiant s'il devient une position ... et finir par suspendre la négociation si l'ordre n'est pas exécuté.

Je pense que MQ serait du côté de figurelli pour dire que c'est une erreur de programmeur. Parce que les fonctions sur lesquelles le trade.PositionOpen est construit indique clairement que vous devez vérifier d'autres choses.


****** (Ajout d'un agenda personnel ... vous pouvez arrêter de lire à ce stade) *******

C'est la raison pour laquelle je ne harcèle pas les nouveaux programmeurs au sujet des fonctions et de leurs valeurs de retour lorsque je les aide sur le mql_forum. Je ne vois pas l'intérêt de dire de toujours faire ce qui suit.

if( OrderSend()<0 ) { Print( GetLastError() ) ; }

C'est supposé être un trader automatisé ... vous pourriez être absent ... et ce qu'il fait est Print() ?

Dans mon esprit, la gestion des erreurs et le signalement des erreurs sont deux monstres très différents. Essayer d'expliquer la bonne façon de gérer une erreur pourrait prendre des pages et c'est très personnel pour le trader de savoir combien de fois il doit réessayer ou même s'il doit terminer le trading.

**** Maintenant, je ne dis pas que si un débutant code un EA et qu'il a des problèmes de trading ... qu'il ne devrait pas Print( GetLastError() ; ) <- Cela devrait être évident. Mais si je vais leur dire de toujours Get_Error, alors je devrais aussi leur dire de toujours Handle_Error. *** Fin de l'agenda. ****

 
angevoyageur:


Ils ont fait exactement l'inverse. Quand mql5 a été créé , il y avait un paramètre de timeout pour des fonctions comme PositionSelect.

Mais ils l'ont supprimé plus tard, voir le point 9 ici https://www.mql5.com/en/forum/53/page5#comment_14479.

Il est temps de le faire revivre ?
 
doshur:
Il est temps de le relancer ?

Je ne le pense pas. Une demande de négociation synchrone doit être synchrone dans tous ses aspects. C'est aussi simple que cela.

Ici, la demande est synchrone mais vous devez ensuite gérer des choses asynchrones. Et rien n'est documenté à ce sujet.