Cette approche ne fonctionne que si la taille de la position actuelle est nulle et que la nouvelle transaction est exécutée avec succès avec la taille de position souhaitée.
Voir le code :
#include <Trade\Trade.mqh>
//--- global variables
CTrade trade;
bool position_opened=false;
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+voidOnTick()
{
bool conditions_to_open;
ENUM_ORDER_TYPE order_type;
double lot;
double price,sl,tp;
//---...set variables//--- inside OnTick()if(conditions_to_open && !position_opened) //-- Or position_opened==false
{
if(trade.PositionOpen(_Symbol,order_type,lot,price,sl,tp,"comment")
&&
(trade.ResultRetcode()==10009 || trade.ResultRetcode()==10008)) //-- Or others condition according to your needs
{
//--- set the global variable to true to avoid duplicate orders
position_opened=true;
Print("Success!");
}
else
{
Print("Error = ",GetLastError(), "trade error = ", trade.ResultRetcode());
//--- Sets the global variable to false// position_opened=false; //-- Not needed as position_opened is already falsereturn;
}
}
//---
}
Mais que se passe-t-il si votre EA retourne la position : d'une position LONG à une position SHORT ou vice versa et que cette action est exécutée dans 2 trades différents ?
Après le premier trade, le booléen "position_opened" est mis à "TRUE" et l'EA ne peut pas ouvrir le 2e trade car la condition vérifie"if(conditions_to_open && !position_opened)", donc le deuxième trade sera bloqué.
Et que se passe-t-il si la taille de la position n'est que partiellement ouverte ? Vous avez besoin d'une deuxième transaction pour que la taille de votre position soit correcte.
En fin de compte, pour faire "une longue histoire courte", vous avez toujours besoin de la fonction PositionSelect(Symbol()) pour calculer la taille de la position ACTUELLE et c'est là que le problème a commencé (et ce fil du forum).
Au moment critique, lorsque l'EA appelle la fonction PositionSelect(Symbol()), le terminal n'a pas encore mis à jour la taille de la position ACTUELLE et l'EA travaille avec la mauvaise taille de position et envoie un nouvel ordre double au serveur de négociation.
Je pense que l'approche de(figurelli) est meilleure car vous êtes obligé d'attendre que l'EA ait mis à jour la fonction PositionSelect(Symbol()) à la bonne taille de position.
bool fatalError=false; // atention: declare this as global
....
if(fatalError == false)
{
if(m_Trade.PositionOpen(Symbol(), ORDER_TYPE_BUY, LotSize, Price, 0, 0))
{
Print("Position opened in ", Symbol());
int maxTimeout=0;
while(!PositionSelect(Symbol()))
{
Sleep(100);
maxTimeout++;
if(maxTimeout > 100)
{
Print("### PositionSelect fatal error!");
fatalError = true;
break;
}
}
Print("--> PositionSelect delay=",maxTimeout * 100);
break;
}
}
Cette approche ne fonctionne que si la taille de la position actuelle est nulle et que la nouvelle transaction est exécutée avec succès avec la taille de position souhaitée.
Voir le code :
Mais que se passe-t-il si votre EA retourne la position : d'une position LONG à une position SHORT ou vice versa et que cette action est exécutée dans 2 trades différents ?
Après le premier trade, le booléen "position_opened" est mis à "TRUE" et l'EA ne peut pas ouvrir le 2e trade car la condition vérifie"if(conditions_to_open && !position_opened)", donc le deuxième trade sera bloqué.
Et que se passe-t-il si la taille de la position n'est que partiellement ouverte ? Vous avez besoin d'une deuxième transaction pour que la taille de votre position soit correcte.
En fin de compte, pour faire "une longue histoire courte", vous avez toujours besoin de la fonction PositionSelect(Symbol()) pour calculer la taille de la position ACTUELLE et c'est là que le problème a commencé (et ce fil du forum).
Au moment critique, lorsque l'EA appelle la fonction PositionSelect(Symbol()), le terminal n'a pas encore mis à jour la taille de la position ACTUELLE et l'EA travaille avec la mauvaise taille de position et envoie un nouvel ordre double au serveur de négociation.
Je pense que l'approche de(figurelli) est meilleure car vous êtes obligé d'attendre que l'EA ait mis à jour la fonction PositionSelect(Symbol()).
Vous avez raison, les deux approches ont des limites.
L'origine de ce problème est maintenant clairement identifiée. Chacun doit adapter son code en fonction de sa stratégie. Je ne pense pas qu'il existe une méthode générale qui puisse s'appliquer à tous les cas.
Ubzen: Avons-nous besoin d'une bibliothèque OrderSendReliable() pour le grand et puissant mql5 ?
Je ne pense pas que le sarcasme puisse être d'une quelconque utilité. Bien que ce soit clairement une mauvaise conception qui mène à une telle complexité.
Vous avez raison, les deux approches ont des limites.
L'origine de ce problème est maintenant clairement identifiée. Chacun doit adapter son code en fonction de sa stratégie. Je ne pense pas qu'il existe une méthode générale qui puisse s'appliquer à tous les cas.
Ou bien nous devons attendre une "déclaration officielle" des gars de Metaquotes eux-mêmes.
Y a-t-il déjà une réponse du service d'assistance ?
angevoyageur: Je ne pense pas que le sarcasme puisse être d'une quelconque aide. Bien que ce soit clairement une mauvaise conception qui mène à une telle complexité.
Si je suis d'accord avec vous, considérez-vous que cela n'aide pas ? .
J'ai simplement enseigné que la solution consistant à dormir jusqu'à la fin de la négociation me faisait penser à OrderSendReliable(). J'ai enseigné que ces solutions auraient été traitées de manière plus élégante.
Cela me rappelle également le traitement des anciens documents ... où il y a {et toutes les transactions doivent être arrêtées}.
Quoi qu'il en soit, mes excuses, je ne voulais pas m'en prendre à mql5.
Ou nous devons attendre une "déclaration officielle" des gars de Metaquotes eux-mêmes.
Y a-t-il déjà une réponse du service desk ?
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 changer cette conception. Mais nous pouvons essayer.
Les gens peuvent écrire au ServiceDesk et rapporter le numéro de ticket ici. Le mien est
Si j'étais d'accord avec vous, considéreriez-vous que cela n'aide pas ? .
J'ai simplement enseigné que la solution consistant à dormir jusqu'à la fin de la négociation me faisait penser à OrderSendReliable(). J'ai enseigné que ces solutions auraient été traitées de manière plus élégante.
Cela me rappelle également le traitement des anciens documents ... où il va {et toutes les transactions doivent être arrêtées}.
Quoi qu'il en soit, mes excuses, je ne voulais pas m'en prendre à mql5.
Je me demande si un problème similaire n'existe pas aussi dans mql4, j'ai lu au moins 2 sujets ces derniers mois sur le forum mql4 d'utilisateurs qui se plaignent de doubles trades. Je ne suis pas sûr que ce soit lié, mais il peut être intéressant de vérifier ces sujets. Lisez-vous aussi ces sujets ?
angevoyageur: Je me demande si un problème similaire n'existe pas aussi dans mql4, j'ai lu au moins 2 sujets au cours des derniers mois sur le forum mql4 d'utilisateurs qui se plaignent des doubles trades. Je ne suis pas sûr que ce soit lié, mais il peut être intéressant de vérifier ces sujets. Lisez-vous aussi ces sujets ?
Oui, mais il est difficile de dire si c'est à cause d'un mauvais codage. Le double échange était un problème même avant le fil de discussion sur les échanges multiples. La façon dont il est traditionnellement géré est la façon dont snelle_moda le gère.
Oui, mais il est difficile de dire si c'est à cause d'un mauvais codage. Le double échange était un problème même avant le fil de discussion sur les échanges multiples. La façon dont il est traditionnellement géré est la façon dont snelle_moda le gère.
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 "fil d'échange multiple" ?
Si vous n'avez pas de compte, veuillez vous inscrire
Autorisez l'utilisation de cookies pour vous connecter au site Web MQL5.com.
Veuillez activer les paramètres nécessaires dans votre navigateur, sinon vous ne pourrez pas vous connecter.
Vous êtes connecté. L'authentification à deux facteurs a été désactivée. Configurez-la à nouveau et scannez un nouveau code QR, ou continuez avec l'authentification à deux facteurs désactivée.
Bonjour
Cette approche ne fonctionne que si la taille de la position actuelle est nulle et que la nouvelle transaction est exécutée avec succès avec la taille de position souhaitée.
Voir le code :
Mais que se passe-t-il si votre EA retourne la position : d'une position LONG à une position SHORT ou vice versa et que cette action est exécutée dans 2 trades différents ?
Après le premier trade, le booléen "position_opened" est mis à "TRUE" et l'EA ne peut pas ouvrir le 2e trade car la condition vérifie"if(conditions_to_open && !position_opened)", donc le deuxième trade sera bloqué.
Et que se passe-t-il si la taille de la position n'est que partiellement ouverte ? Vous avez besoin d'une deuxième transaction pour que la taille de votre position soit correcte.
En fin de compte, pour faire "une longue histoire courte", vous avez toujours besoin de la fonction PositionSelect(Symbol()) pour calculer la taille de la position ACTUELLE et c'est là que le problème a commencé (et ce fil du forum).
Au moment critique, lorsque l'EA appelle la fonction PositionSelect(Symbol()), le terminal n'a pas encore mis à jour la taille de la position ACTUELLE et l'EA travaille avec la mauvaise taille de position et envoie un nouvel ordre double au serveur de négociation.
Je pense que l'approche de(figurelli) est meilleure car vous êtes obligé d'attendre que l'EA ait mis à jour la fonction PositionSelect(Symbol()) à la bonne taille de position.
Bonjour
Cette approche ne fonctionne que si la taille de la position actuelle est nulle et que la nouvelle transaction est exécutée avec succès avec la taille de position souhaitée.
Voir le code :
Mais que se passe-t-il si votre EA retourne la position : d'une position LONG à une position SHORT ou vice versa et que cette action est exécutée dans 2 trades différents ?
Après le premier trade, le booléen "position_opened" est mis à "TRUE" et l'EA ne peut pas ouvrir le 2e trade car la condition vérifie"if(conditions_to_open && !position_opened)", donc le deuxième trade sera bloqué.
Et que se passe-t-il si la taille de la position n'est que partiellement ouverte ? Vous avez besoin d'une deuxième transaction pour que la taille de votre position soit correcte.
En fin de compte, pour faire "une longue histoire courte", vous avez toujours besoin de la fonction PositionSelect(Symbol()) pour calculer la taille de la position ACTUELLE et c'est là que le problème a commencé (et ce fil du forum).
Au moment critique, lorsque l'EA appelle la fonction PositionSelect(Symbol()), le terminal n'a pas encore mis à jour la taille de la position ACTUELLE et l'EA travaille avec la mauvaise taille de position et envoie un nouvel ordre double au serveur de négociation.
Je pense que l'approche de(figurelli) est meilleure car vous êtes obligé d'attendre que l'EA ait mis à jour la fonction PositionSelect(Symbol()).
Vous avez raison, les deux approches ont des limites.
L'origine de ce problème est maintenant clairement identifiée. Chacun doit adapter son code en fonction de sa stratégie. Je ne pense pas qu'il existe une méthode générale qui puisse s'appliquer à tous les cas.
Avons-nous besoin d'une bibliothèque OrderSendReliable() pour le grand et puissant mql5 ?
Vous avez raison, les deux approches ont des limites.
L'origine de ce problème est maintenant clairement identifiée. Chacun doit adapter son code en fonction de sa stratégie. Je ne pense pas qu'il existe une méthode générale qui puisse s'appliquer à tous les cas.
Ou bien nous devons attendre une "déclaration officielle" des gars de Metaquotes eux-mêmes.
Y a-t-il déjà une réponse du service d'assistance ?
Si je suis d'accord avec vous, considérez-vous que cela n'aide pas ?
.
J'ai simplement enseigné que la solution consistant à dormir jusqu'à la fin de la négociation me faisait penser à OrderSendReliable(). J'ai enseigné que ces solutions auraient été traitées de manière plus élégante.
Cela me rappelle également le traitement des anciens documents ... où il y a {et toutes les transactions doivent être arrêtées}.
Quoi qu'il en soit, mes excuses, je ne voulais pas m'en prendre à mql5.
Ou nous devons attendre une "déclaration officielle" des gars de Metaquotes eux-mêmes.
Y a-t-il déjà une réponse du service desk ?
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 changer cette conception. Mais nous pouvons essayer.
Les gens peuvent écrire au ServiceDesk et rapporter le numéro de ticket ici. Le mien est
Si j'étais d'accord avec vous, considéreriez-vous que cela n'aide pas ? .
J'ai simplement enseigné que la solution consistant à dormir jusqu'à la fin de la négociation me faisait penser à OrderSendReliable(). J'ai enseigné que ces solutions auraient été traitées de manière plus élégante.
Cela me rappelle également le traitement des anciens documents ... où il va {et toutes les transactions doivent être arrêtées}.
Quoi qu'il en soit, mes excuses, je ne voulais pas m'en prendre à mql5.
Oui, mais il est difficile de dire si c'est à cause d'un mauvais codage. Le double échange était un problème même avant le fil de discussion sur les échanges multiples. La façon dont il est traditionnellement géré est la façon dont snelle_moda le gère.
Oui, mais il est difficile de dire si c'est à cause d'un mauvais codage. Le double échange était un problème même avant le fil de discussion sur les échanges multiples. La façon dont il est traditionnellement géré est la façon dont snelle_moda le gère.