Tu es sur une fausse route, tu te fais guider par le code alors que c'est toi qui l'écrit ;)
Prends un peu de recul et demande-toi ce dont tu as besoin, la réponse est simple : "J'ai besoin d'une fonction qui ouvre un ordre et j'ai besoin de savoir si l'ordre à été ouvert ou non".
Donc, le prototype de ta fonction devrait ressembler à ça :
Ensuite il faut essayer de ne pas coder du jetable mais du réutilisable : "de quoi ma fonction aurait-elle besoin pour pouvoir être réutilisée dans tous mes programmes ?"
Soit tu définis une interface de dialogue commune en définissant des noms de variables globales soit tu passes les paramètres en arguments à ta fonction ce qui me semble plus judicieux. De plus, la valeur de retour pourrait renvoyer le n° du ticket plutôt que vrai/faux.
On obtiens donc le prototype minimaliste suivant :
Si on veut pousser un peu plus loin le raisonnement on peut spécifier un nombre d'essai d'ouverture d'ordre et fixer une valeur par défaut aux valeurs optionnelles :
Enfin, pour faciliter l'utilisation il faut placer les arguments en fonction de leur fréquence d'utilisation ce qui donnerait par exemple :
Comme je l'avais indiqué il y a quelque temps il est préférable de ne pas fixer les TP/SL à l'ouverture des ordres car certains brokers ne le supporte pas. Dans ce cas il faudra également créer une fonction ModifyOrder avec par exemple le prototype suivant :
Passons ensuite au code à proprement parler :
Prends un peu de recul et demande-toi ce dont tu as besoin, la réponse est simple : "J'ai besoin d'une fonction qui ouvre un ordre et j'ai besoin de savoir si l'ordre à été ouvert ou non".
Donc, le prototype de ta fonction devrait ressembler à ça :
Code
bool LaunchOrder()
Ensuite il faut essayer de ne pas coder du jetable mais du réutilisable : "de quoi ma fonction aurait-elle besoin pour pouvoir être réutilisée dans tous mes programmes ?"
Soit tu définis une interface de dialogue commune en définissant des noms de variables globales soit tu passes les paramètres en arguments à ta fonction ce qui me semble plus judicieux. De plus, la valeur de retour pourrait renvoyer le n° du ticket plutôt que vrai/faux.
On obtiens donc le prototype minimaliste suivant :
Code
int LaunchOrder(string symb, int type, double lots, int slippage, string comment, int magic)
Si on veut pousser un peu plus loin le raisonnement on peut spécifier un nombre d'essai d'ouverture d'ordre et fixer une valeur par défaut aux valeurs optionnelles :
Code
int LaunchOrder(string symb, int type, double lots, int slippage = 2, int maxtry = 5, string comment = "", int magic = 0)
Enfin, pour faciliter l'utilisation il faut placer les arguments en fonction de leur fréquence d'utilisation ce qui donnerait par exemple :
Code
int LaunchOrder(string symb, int type, double lots, int magic = 0, string comment = "", int maxtry = 5, int slippage = 2)
Comme je l'avais indiqué il y a quelque temps il est préférable de ne pas fixer les TP/SL à l'ouverture des ordres car certains brokers ne le supporte pas. Dans ce cas il faudra également créer une fonction ModifyOrder avec par exemple le prototype suivant :
Code
bool ModifyOrder(int ticket, double sl, double tp)
Passons ensuite au code à proprement parler :
Code
int LaunchOrder(string symb, int type, double lots, int slippage, int maxtry, string comment = "", int magic = 0) {
int err, try = 0;
int ticket = -1;
double price;
while (ticket < 0 && try < maxtry) { // on essaye tant que le ticket est invalide et que la limite d'essai n'est pas dépassée
if (type == OP_BUY)
price = MarketInfo(symb, MODE_ASK);
else
price = MarketInfo(symb, MODE_BID);
ticket = OrderSend(symb, type, lots, price, slippage, 0, 0, comment, magic);
err = GetLastError(); // on récupère la dernière erreur : celle de l'OrderSend
if (err == 0) // s'il n'y a pas d'erreur on sort de la boucle
break;
if (err == ERR_PRICE_CHANGED || err == ERR_REQUOTE) { // si le prix a changé on rafraichit le cours et on réessaie immédiatement
RefreshRates();
try++;
continue;
} // s'il y a une autre erreur on attend un quart de seconde et on réessaie, idéalement il faut vérifier tous les types d'erreur et sortir de la boucle en cas d'erreur critique (inutile d'essayer 5 fois si les paramètres passés sont incorrects)
Sleep(250);
RefreshRates();
try++;
}
return(ticket);
}