Rejoindre la communauté
banner_forum
Devenez membre de la plus grande
communauté francophone sur le Forex
Partagez, échangez et apprenez en gagnant des crédits sur votre compte de trading

Fermetures de tout les ordres simultanément

  • MKlod

    Bonjour,

    Je teste une stratégie qui m'amène à avoir plusieurs ordres ouverts sur une valeur. Dès qu'un signal est activé, je voudrai que tous ces ordres soient immédiatement fermés.
    Mon problème est le suivant :
    - tant qu'il n'y a pas de signal, la commande Orderselect détecte bien tous mes ordres ouverts, grâce à une boucle for.
    - dès que le signal de sortie de position s'active, le premier ordre dans la liste est correctement sélectionné et donc vendu ; par contre, pour les ordres suivants, la commande Orderselect déclenche cette fois le message d'erreur 4105 (no order selected), et la vente ne se fait donc pas. C'est la même boucle for, la seule chose qui a changé est qu'il y a eu fermeture de l'ordre précédent.
    - il faut alors attendre le prochain signal pour que l'ordre suivant soit vendu, sans aucun problème de sélection cette fois.
    - j'ai essayé d'introduire des délais d'attente (sleep) de 10 secondes entre les ordres de cloture, sans succès.

    Merci d'avance de toute idée qui me ferait avancer car ça fait une semaine que je bute sur ce problème.
    Voici quelques détails sur le code que j'utilise : je me suis en fait inspiré du code "Macd sample" fournit avec MT4, et en particulier la boucle suivante :
    Code
    total=Ordertotal(); for(cnt=0;cnt<total;cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); // fonctionne bien tant qu'il n'y a pas eu de clôture d'ordre juste avant if(OrderType()<=OP_SELL && OrderSymbol()==Symbol()) { je place ici tout mon code de test du signal et l'ordre de vente conditionné à ce test } }
    Par rapport au code original de "Macd sample", j'ai juste enlevé les instructions Return(0), pour que ça boucle autant de fois que nécessaire.
    Merci d'avance

    M'Klod
    Modifié le 2013-11-29 17:43:08 par AliX
  • riden

    Salut,
    C'est normal, si tu veux clôturer plusieurs ordre en simultanée avec cette méthode, il faut que tu commences par le dernier.
    si tu commences par le premier, si il est clôturé, le deuxième deviendra le premier et lorsque tu va le chercher avec orderselect tu sélectionnera le 3ème (qui est devenu 2ème) s'il existe sinon ça va te renvoyer une erreur. Donc à chaque itération tu va sauter un ordre et tu finiras toujours par avoir une erreur.

    Voilà une fonction, qui te permet de clôturer toutes les positions d'achat ou de vente ou les deux. Elle ne prend pas en compte les ordres diff mais tu peux intégrer ça facilement

    Code
    void closeall (int p) { // p=1 fermer achat only -- p=2 fermer vente only -- p=3 fermer achat&vente for(int i = OrdersTotal()-1;i>=0;i--){ if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){ if((OrderType()==OP_BUY)&& ( (p==1)||(p==3))){ temp = OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),3,CLR_NONE);} if((OrderType()==OP_SELL)&& ( (p==2)||(p==3))){ temp = OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),3,CLR_NONE);} }}}
    Modifié le 2013-11-30 01:30:24 par AliX
  • MKlod — en réponse à riden dans son message #87262

    Super, je vais essayer ça dès lundi, merci bien.
  • Keilin

    Voici un EA qui permet de clôturer tous les ordres en fonction d'un profit ou perte totale.
    Code
    //+------------------------------------------------------------------+ //| Close All 1_0.mq4 | //| Copyright © 2007, Wolfe | //| | //+------------------------------------------------------------------+ #property copyright "Copyright © 2007, Wolfe" #property link "" extern double Stop_Loss=-200; //If open order dollar amount is < Stop_Loss value Close All will be executrd extern double Take_Profit=200;//If open order dollar amount is > Take_Profit value Close All will be executed //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { if ((AccountProfit() < Stop_Loss) || (AccountProfit() > Take_Profit)) { while(OrdersTotal()>0) { OrderSelect(0,SELECT_BY_POS); if(OrderType()==OP_BUY) OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),999,Purple); if(OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),999,Purple); if(OrderType()==OP_BUYLIMIT||OrderType()==OP_BUYSTOP||OrderType()==OP_SELLLIMIT||OrderType()==OP_SELLSTOP) OrderDelete(OrderTicket()); } } //---- return(0); } //+------------------------------------------------------------------+
  • riden — en réponse à MKlod dans son message #87259

    Salut,
    J'ai oublié un détail, avant je me servais de "temp" (qui était déclaré en dehors de la fonction) pour gérer les erreurs mais tu n'as pas besoin en plus de ça elle n'est pas déclarée dans la fonction, donc tu peux enlever "temp =" et laisser uniquement "Orderclose(...);"
    @+
  • MKlod — en réponse à Keilin dans son message #87276

    Merci bien, mais je pense que le conseil de Riden devrait régler mon problème. Je garde néanmoins ton code sous le coude car c'est une bonne sécurité et je l'ajouterai à mon dispositif. Merci encore.

    M'Klod