question simple

 

Salutations à tous. J'ai créé un code (en modifiant d'autres codes) pour la fermeture des ordres de marché.



int l_pos_44 = 0 ;

if (CheckFirstOP(OP_BUY) > 1) {

for (l_pos_44 = 0 ; l_pos_44 < OrdersTotal() ; l_pos_44++) {

OrderSelect(l_pos_44, SELECT_BY_POS, MODE_TRADES) ;

if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber || OrderType() != OP_BUY) continue ;

double Price = OrderOpenPrice() ;

si (NormalizeDouble(MathAbs(Bid - Price), Digits) < NormalizeDouble(Dist, Digits)) {

Dist = MathAbs(Bid - Price) ;

int Ticket = OrderTicket() ;

double Lot = OrderLots() ;

OrderClose(Ticket, Lot, Bid, 3) ;

}

}


(le même code pour la fermeture des positions de vente (évidemment avec la variable OP_SELL au lieu de OP_BUY))


int CheckFirstOP(int a_cmd_0) {

int l_count_4 = 0 ;

for (int l_pos_8 = 0 ; l_pos_8 < OrdersTotal() ; l_pos_8++) {

if (OrderSelect(l_pos_8, SELECT_BY_POS)) {

if (OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol()) {

si (OrderType() == a_cmd_0) {

l_count_4++ ;

pause ;

}

}

}

}

return (l_count_4) ;

}


J'ai besoin d'un code pour fermer les positions longues ou courtes lorsqu'il y a plus d'une position ouverte pour le type... donc pour garder 2 positions au total (1 achat et 1 vente)... J'ai également besoin de garder la position ouverte la plus récente, c'est-à-dire dans ce cas celle avec le prix ouvert le plus élevé pour la position d'achat et celle avec le prix ouvert le plus bas pour la position de vente. Le problème est que le code ne ferme pas les positions... il ne ferme aucune d'entre elles.


Quand : "if (CheckFirstOP(OP_BUY) == 1)" alors le code ferme les premières positions immédiatement après leur ouverture... c'est-à-dire qu'après l'ouverture d'un ordre d' achat et d'un ordre de vente, ils sont fermés au prochain tick. Et quand : "if (CheckFirstOP(OP_BUY) > 1)" aucune des positions n'est fermée. Je ne sais pas ce que je fais de mal.

Quelqu'un peut-il m'aider ?

 

I forgot:


double Dist = 1000000.0 ;

 
Aljohin:

Quelqu'un peut-il m'aider ?

1. Ce n'est qu'une partie de votre code, montrez-nous la fonction CheckFirstOP() par exemple.

2. La boucle for s'incrémente. Cela ne fonctionnera pas correctement si l'on ferme des ordres dans la boucle, veuillez voir -> https://www.mql5.com/en/forum/119840.

3. Votre convention de dénomination des variables n'est... pas très bonne.

4. Veuillez utiliser le bouton SRC pour poster votre code afin qu'il conserve son formatage. Il est très difficile de lire votre code comme ça.

 
gordon:

1. Ce n'est qu'une partie de votre code, montrez-nous la fonction CheckFirstOP() par exemple.

2. La boucle for s'incrémente. Cela ne fonctionnera pas correctement si l'on ferme des ordres dans la boucle, veuillez voir -> https://www.mql5.com/en/forum/119840.

3. Votre convention de dénomination des variables n'est... pas très bonne.

4. S'il vous plaît utiliser le bouton SRC pour afficher votre code afin qu'il conserve le formatage. Il est très difficile de lire votre code comme ceci.


double Dist=1000000.0;
if ( CheckFirstOP(OP_BUY) > 1) {
      for ( l_pos_44 = 0; l_pos_44 < OrdersTotal(); l_pos_44++) {
          OrderSelect( l_pos_44, SELECT_BY_POS, MODE_TRADES);
          if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber || OrderType() != OP_BUY) continue;     
          double Price = OrderOpenPrice();
          if (NormalizeDouble(MathAbs(Bid - Price), Digits) > NormalizeDouble( Dist, Digits)) {              
             Dist = MathAbs(Bid - Price);                 
             int Ticket = OrderTicket();           
             double Lot = OrderLots();                          
             OrderClose( Ticket, Lot, OrderClosePrice(), 3); 
         }    
      }   
   }

int CheckFirstOP(int a_cmd_0) {
   int l_count_4 = 0;
   for (int l_pos_8 = 0; l_pos_8 < OrdersTotal(); l_pos_8++) {
      if (OrderSelect( l_pos_8, SELECT_BY_POS)) {
         if (OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol()) {
            if (OrderType() == a_cmd_0) {
               l_count_4++;
               break;
            }
         }
      }
   }
   return ( l_count_4);
}
my fault...i'm very new to this stuf...
 
gordon:

3. Votre convention de dénomination des variables n'est... pas très bonne.

ressemble à une convention de nom de décompilateur ...

"il est nouveau dans ce domaine"

 
meikel:

ressemble à une convention de nom de décompilateur ...

"il est nouveau dans ce domaine"

probablement oui...je veux modifier un EA que j'ai acheté...ils m'ont aussi envoyé le code (ils ont dit par erreur)...maintenant je comprends la raison de cette nomenclature si étrange...comme je l'ai dit je suis nouveau (je viens de lire le livre de MQL4 sur ce site) et je ne voulais pas modifier beaucoup de choses au moins au début donc j'ai laissé les noms comme je les ai trouvés.

 
Ais:

Bonjour

L'ordre sélectionné peut être complètement fermé par l'expression : "OrderClose ( OrderTicket (), OrderLots (), OrderClosePrice (), 0 ) ;"

Meilleures salutations

ne résout pas mon problème...

 
gordon:

2. La boucle for s'incrémente. Cela ne fonctionne pas correctement si on ferme des ordres dans la boucle, voir -> https://www.mql5.com/en/forum/119840.

Pourquoi l'incrémentation ne fonctionne pas ? Dans le livre de MQL4, ce n'est pas mentionné (je pense)... de toute façon, j'ai essayé :


if ( CheckFirstOP(OP_BUY) > 1) {
      for(int i = OrdersTotal() - 1; i >= 0; i--) {
          OrderSelect( i, SELECT_BY_POS, MODE_TRADES);
          if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber || OrderType() != OP_BUY) continue;     
          double Price = OrderOpenPrice();
          if (NormalizeDouble(MathAbs(Bid - Price), Digits) > NormalizeDouble( Dist, Digits)) {              
             Dist = MathAbs(Bid - Price);                 
             int Ticket = OrderTicket();           
             double Lot = OrderLots();                          
             OrderClose( Ticket, Lot, OrderClosePrice(), 3); 
         }    
      }   
   }
it doesn't work, don't know why
 
Ais:

simplement être sûr dans cette ligne maintenant

Oui bien sûr j'ai essayé et cela ne change rien...des choses étranges avec cette programmation :) il ne serait pas difficile d'écrire un simple ordre de fermeture (je pensais)...

 
it doesn't work, don't know why
Lorsque vous fermez l'indice d'ordre 5, l'indice d'ordre 6 devient l'indice 5, 7 devient 6, etc. En comptant, il vous manque un ordre ouvert sur deux.
 
WHRoeder:
Lorsque vous fermez l'ordre index 5, l'index 6 devient index 5, 7 devient 6, etc. En comptant, vous oubliez tous les autres ordres ouverts.

ah ok, compris...de toute façon le code est censé ne garder qu'un seul ordre ouvert et commencer à travailler immédiatement quand il y a 2 ordres ouverts et en ferme un après les avoir tous sélectionnés et analysés (i.e. 2 ordres)...donc je ne pense pas que ce soit une grosse erreur d'incrémenter dans la sélection des ordres...De toute façon, j'ai essayé la méthode de décrémentation sans aucun résultat... peut-être que j'essaie d'une mauvaise manière... je ne sais pas... est-ce que quelqu'un peut essayer mon code et voir s'il ferme vraiment les trades... ou est-ce que quelqu'un peut écrire un code simple pour sélectionner et fermer l'ordre ouvert précédent (c'est-à-dire celui avec un prix ouvert plus élevé pour l'achat et avec un prix ouvert plus bas pour la vente) ?

Merci