Aide : Pourquoi l'EA ne ferme pas une transaction

 

Bonjour mes amis,

J'ai besoin de votre aide.

J'ai construit un EA dont une partie du processus doit fermer une transaction en utilisant une fonction. Voici les lignes de kod's concernées.

Quelqu'un peut-il m'aider à comprendre pourquoi l'EA ne ferme pas la transaction ? Merci.

(Peut-être, puisque si j'utilise ORDERSELECT dans la partie principale, il ne peut pas utiliser ORDERSELECT dans la fonction, aussi ????)

for(int cnt=0 ; cnt < OrdersTotal() ; cnt++)

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) ;

if ( OrderSymbol() == Pair && OrderType() == OP_BUY )

{

si ( MarketInfo(Pair,MODE_BID) >= Open_P_BUY + MarketInfo(Pair,MODE_POINT)*facteur*TP )

{

CLOSE_Single_P(Pair, "LONG", OrderTicket(), OrderLots()) ;

}

}

}

...

...

...

//-----------------------------------------------+

void CLOSE_Single_P(string SYMB, string TREN, int TICKET, double LOTT)

{

int Code, sig ;

double PRC ;

si ( TREN == "LONG" )

Code = 0;//OP_BUY

sinon

si ( TREN == "SHORT" )

Code = 1;//OP_SELL

for ( int k=0 ; k < OrdersTotal() ; k++ )

{

OrderSelect(k, SELECT_BY_POS, MODE_TRADES) ;

if( OrderSymbol() == SYMB && OrderType() == Code && OrderLots() == LOTT && OrderTicket() == TICKET )

{

si ( OrderType() == OP_BUY )

PRC = MarketInfo(OrderSymbol(),MODE_BID) ;

sinon

si ( OrderType() == OP_SELL )

PRC = MarketInfo(OrderSymbol(),MODE_ASK) ;

OrderClose(TICKET,LOTT,PRC,Slippage,Yellow) ;

break ;

}

}

retour ;

}

 

Utilisez le bouton SRC pour afficher votre code pour une meilleure lecture, s'il vous plaît :)

Votre OrderSelect() est codé d'une manière incorrecte. Comparez votre code avec celui-ci. Puis écrivez si vous avez toujours le problème ou pas :)

   for(int cnt=0; cnt<OrdersTotal(); cnt++)
     {
      if (OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES) == true &&
          OrderSymbol()==Pair && 
          OrderType()==OP_BUY)
          {
          // code to close
          }
      }
 
crossy:

Bonjour mes amis,

J'ai besoin de votre aide.

J'ai construit un EA dont une partie du processus doit fermer une transaction en utilisant une fonction. Voici les lignes de kod's concernées.

Quelqu'un peut-il m'aider à comprendre pourquoi l'EA ne ferme pas la transaction ? Merci.

Lorsque vous avez une boucle et que vous fermez ou supprimez des ordres (en attente), vous DEVEZ compter vers le bas et NON vers le haut....

Pourquoi avez-vous une boucle dans la fonction Close_Single_P ? n'est-elle pas conçue pour fermer un seul ordre ? lorsque vous appelez la fonction, vous passez le symbole, le numéro de ticket, le type d'ordre et la taille de la position... c'est tout ce dont vous avez besoin pour fermer l'ordre... enfin presque, vous avez besoin du prix de fermeture et pour cela vous pouvez utiliser OrderClosePrice() et ensuite vous n'avez pas à vous soucier de savoir si c'est un achat ou une vente... en fait, il suffit de se débarrasser de la fonction et d'utiliser cette ligne à la place de l'appel de la fonction...

OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage, Yellow);

Au fait, où définissez-vous le Slippage ? et compensez-vous pour les courtiers à 4/5 chiffres ?

Lorsque vous utilisez les fonctions d'ordre, elles renvoient une valeur... cette valeur de retour vous indique si la fonction a fonctionné ou non... apprenez à utiliser cette valeur de retour et si elle vous indique qu'il y a eu un problème, utilisez une instruction Print pour rapporter l'information pertinente dans les journaux... ainsi vous saurez ce qui a mal fonctionné au lieu d'essayer de deviner...

Votre commande doit-elle être fermée ? Avez-vous vérifié que ceci . . .

if ( MarketInfo(Pair,MODE_BID) >= Open_P_BUY + MarketInfo(Pair,MODE_POINT)*factor*TP )

. . . est vrai ?

Pourquoi ne pas ajouter une instruction d'impression qui est exécutée si cette ligne est vraie... alors vous saurez si elle l'est ou non...

if ( MarketInfo(Pair,MODE_BID) >= Open_P_BUY + MarketInfo(Pair,MODE_POINT)*factor*TP )
   {
   Print("Trying to close Order: ", OrderTicket());                             // <---- tells you that the   if  returned true
   if (!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage, Yellow)
      Print("OrderClose failed, error # ", GetLastError());                          // <------- reports the error if the OrderClose failed . . 
   }
 
onewithzachy:

Utilisez le bouton SRC pour afficher votre code pour une meilleure lecture, s'il vous plaît :)

Quel est le retour de GetLastError() alors ?


Le code compte environ 4 000 lignes...

En tout cas, je n'obtiens pas de massage d'erreur.

 
crossy:


Le code compte environ 4 000 lignes...

Quoi qu'il en soit, je ne reçois pas de massage d'erreur.

Vous n'avez pas besoin de poster TOUT votre code . ... mais quand vous postez TOUT le code s'il vous plaît utiliser le bouton SRC... .

Vous n'obtenez pas de messages d'erreur parce que vous ne les rapportez pas dans le journal . ... vous devez vérifier les valeurs de retour et signaler les erreurs.

 
RaptorUK:

Lorsque vous avez une boucle et que vous fermez ou supprimez des ordres (en attente), vous devez compter vers le bas et non vers le haut....

Pourquoi avez-vous une boucle dans la fonction Close_Single_P ? n'est-elle pas conçue pour fermer un seul ordre ? lorsque vous appelez la fonction, vous passez le symbole, le numéro de ticket, le type d'ordre et la taille de la position... c'est tout ce dont vous avez besoin pour fermer l'ordre... enfin presque, vous avez besoin du prix de fermeture et pour cela vous pouvez utiliser OrderClosePrice() et alors vous n'avez pas à vous soucier de savoir si c'est un achat ou une vente... en fait, débarrassez-vous simplement de la fonction et utilisez cette ligne à la place de l'appel de la fonction...

. Au fait, où définissez-vous le Slippage ? et compensez-vous pour les courtiers à 4/5 chiffres ?

Lorsque vous utilisez les fonctions d'ordre, elles renvoient une valeur... cette valeur de retour vous indique si la fonction a fonctionné ou non... apprenez à utiliser cette valeur de retour et si elle vous indique qu'il y a eu un problème, utilisez une instruction Print pour rapporter l'information pertinente dans les journaux... ainsi vous saurez ce qui a mal fonctionné au lieu d'essayer de deviner...

Votre commande doit-elle être fermée ? Avez-vous vérifié que cette...

. . . est vrai ?

Pourquoi ne pas ajouter une instruction print qui serait exécutée si cette ligne était vraie... vous sauriez alors si c'est le cas ou non...


Merci Raptor pour tes offres judicieuses. Vous m'aidez toujours de manière intelligente et claire.

Je vais essayer ce que vous venez de suggérer.

Je vous souhaite bonne chance.

 

Vous avez déjà sélectionné le billet, pourquoi passer par une deuxième boucle orderSelect pour trouver le même billet ?

Pourquoi ne vérifiez-vous pas la valeur de retour de OrderClose et n'imprimez-vous pas l'erreur pour savoir POURQUOI ?

 
WHRoeder:

Vous avez déjà sélectionné le billet, pourquoi passer par une deuxième boucle orderSelect pour trouver le même billet ?

Pourquoi ne vérifiez-vous pas la valeur de retour de OrderClose et n'imprimez-vous pas l'erreur pour savoir POURQUOI ?


Bien chers amis, merci pour vos efforts.

J'ai fait quelques changements et rien n'a été utile, jusqu'à ce que je voie le commentaire de WHRoeder.

Vous êtes géniaux, je pense que vous avez raison.

Je vais essayer l'EA modifié lundi.

Je vous souhaite un bon week-end.

 
crossy:


Bien chers amis, merci pour vos efforts.

J'ai fait quelques changements et rien n'a été utile, jusqu'à ce que je voie le commentaire de WHRoeder.

Vous êtes géniaux, je pense que vous avez raison.

Je vais essayer l'EA modifié lundi.

Passez un bon week-end.


Eh bien, mes amis,

J'ai fait toutes vos suggestions - et l'EA a échoué.

D'autres idées ?

 

On recommence

  #include "..\libraries\stdlib.mq4" // drag and drop from libraries to very top of your code
  
  for(int cnt = OrdersTotal(); cnt >= 0; cnt--)  // from RaptorUK, count it down to zero 
     {
     if (OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES) == true && OrderSymbol() == Pair) // this is how to write OrderSelect()
        {
        if(OrderType()== OP_BUY) // the code below is to close buy position only
          {
          
          //---
           if(MarketInfo(Pair,MODE_BID) >= Open_P_BUY + MarketInfo(Pair,MODE_POINT) * factor * TP) // from RaptorUK, is this statemement true ?
             {
              //CLOSE_Single_P(Pair,"LONG",OrderTicket(),OrderLots()) // From RaptorUK & WHRoeder, you don't have to do OrderSelect() twice
             Print("Trying to close buy position : ", OrderTicket());                            
             if (!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage, Yellow)) // From Raptor UK, are you doing the slippage correctly ?
                Print("failed to close buy position ", ErrorDescription(GetLastError())  ); 
             }
             else
             {
             Print ("Not qualify to close buy position ", OrderTicket()); // from RaptorUK, is this statemement true ?, if not this print will tell you
             }
          //---
             
           }
           /*
           else
           {
           if (OrderType() == OP_SELL)
              {
              
              }
           }
           */
        }
     }
      

Alors que je suis encore en train de lire le deuxième podium de Valentino Rossi au Mans en MotoGP, j'espère écrire ceci correctement :)

 
onewithzachy:

On recommence

Alors que je suis encore en train de lire le deuxième podium de Valentino Rossi en MotoGP au Mans, j'espère que j'écris correctement :)


Merci à unwithzachy,

D'abord je pense que vous avez une petite erreur avec :

for(int cnt = OrdersTotal() -1 ; cnt >= 0 ; cnt--)

Vous devez ajouter la correction en vert et en gras.

Mais, je ne comprends pas comment la ligne suivante peut nous aider ?

#include "..\libraries\stdlib.mq4"

Merci, Y.

Raison: