Aide : Pourquoi l'EA ne ferme pas une transaction - page 6

 
RaptorUK:

Vous n'avez pas besoin de la Fonction du tout... ...débarrassez-vous-en.



Bonjour Raptor,

J'ai besoin de cette fonction car l'EA est assez complexe, et j'utilise cette fonction avec de nombreuses versions de conditions de clôture.

J'espère que vous me comprenez.

Y.

 
onewithzachy:

Recommençons la partie 2 :(


Merci onewithzachy, mais comme je l'ai déjà répondu, j'ai besoin de cette fonction pour fermer avec plusieurs versions de conditions, donc il est trop complexe de mettre les commandes de code de fermeture dans chaque condition, surtout que ce n'est pas une commande de code unique.

Merci,

Y.

 
RaptorUK:

Faites ceci... ( répété d'ici : https://www.mql5.com/en/forum/139543 )

. ... et vous n'aurez plus besoin de la Fonction du tout.


Raptor, j'ai besoin de cette fonction pour surmonter les situations REQUISES, comme vous pouvez le voir.

Y.

 
onewithzachy:

RaptorUK, j'envisage de porter un casque de protection pour pouvoir penser plus loin que je ne le fais actuellement. N'est-ce pas ce que font ces conducteurs, penser à l'avance ? :D


@ skaboy, je demande poliment ici, si cela ne vous dérange pas, pourriez-vous utiliser le bouton SRC pour poster votre code. Nous l'avons demandé trop de fois dans ce seul fil.

@ crossy, il y a presque une semaine depuis ton premier message. Je comprends certainement que vous n'ayez pas l'esprit clair maintenant face à 4000 lignes, en ce moment j'ai moi-même la mienne ici aussi. Si vous ne comprenez toujours pas, - ehm - vous pouvez nous demander d'écrire ce code Close pour vous. Cependant, vous devez encore écrire le code, même juste un peu - et nous montrer :D, le code de RaptorUK juste au-dessus est plus direct que le mien, pensez-y et ensuite vous pourrez avancer avec votre EA.

Avec la façon dont vous écrivez le code ici - trop de code répété inutile - vous devriez avoir un peu d'inquiétude avec vos 4000 lignes de code qui peuvent ralentir votre EA et lui faire manquer un tick. Il n'y a pas de mal à manquer un ou deux points, mais que se passe-t-il si vous manquez 10 points ? et probablement que vos 4000 lignes peuvent encore être réduites à seulement 400 lignes. Qui sait ? votre EA deviendra plus léger et plus rapide :D


Merci onewithzachy,

Mon EA a cette petite erreur, qui est :

1) Il ferme le ticket pertinent et le recherche aussi.

2) Cette erreur n'apparaît pas à chaque fermeture d'ordre, et parfois elle fonctionne bien.

En ce qui concerne les autres 3,950 lignes de code - elles fonctionnent très bien.

Je joins les lignes de code pertinentes, encore une fois.

Y.

...
   for(int cnt = OrdersTotal()-1; cnt >= 0 ; cnt--) 
   {
      CodeY = false;
      if ( OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) )
      {
         CodeY    = true;
         OrderS   = OrderSymbol();
         OrderT   = OrderTicket();
         OrderM   = OrderMagicNumber();
         OrderTyp = OrderType();
         OrderL   = OrderLots();
      }   
      if ( CodeY && OrderS == Pair1 && OrderTyp == OP_BUY && OrderM == MAG &&.... )
    
         CLOSE_Single_P(Pair1,"LONG",OrderT,OrderL);

//-----------------------------------------------+
void CLOSE_Single_P(string SYMB, string TREN, int TICKET, double LOTT)
{
   double PRC;
   bool Check = false;

   for ( int cntt=0; cntt<20000; cntt++ )
   {
      if ( Check )
      {
         Check_Ini();
         return;
      }
      Check = false;
      if ( TREN == "LONG" )
         PRC = MarketInfo(SYMB,MODE_BID);
      else
      if ( TREN == "SHORT" )
         PRC = MarketInfo(SYMB,MODE_ASK);
         
      Check = OrderClose(TICKET,LOTT,PRC,Slippage,Yellow);
   }
   return;
}
//-----------------------------------------------+
 
crossy:



Bonjour Raptor,

J'ai besoin de cette fonction car l'EA est très complexe, et j'utilise cette fonction avec de nombreuses versions de conditions de clôture.

J'espère que vous me comprenez.

Y.

Je ne pense pas que tu comprennes le code que tu as copié et collé d'ailleurs... et non, ce n'est pas pour les requotes... tu ne vérifies même pas si une erreur que tu obtiens est une requote. ... vous ne vérifiez même pas si une erreur que vous obtenez est une requote.
 
RaptorUK:
Je ne pense pas que vous compreniez le copié-collé que vous avez fait à partir d'un autre endroit... et non, ce n'est pas pour les requotes... vous ne vérifiez même pas si une erreur que vous obtenez est une requote... ... tu ne vérifies même pas si une erreur que tu obtiens est une requote.


Non Raptor, l'erreur que j'ai reçue était : Le numéro de ticket n'a pas été trouvé. Et je peux te dire que la résonance est Le ticket était déjà fermé une seconde avant.

Je ne comprends pas comment il ferme le ticket et continue à le chercher...

 
crossy:


Je ne comprends pas comment il ferme le ticket et continue à le chercher...

C'est à cause de la boucle dont j'ai dit que vous n'aviez pas besoin... dans la fonction dont vous n'avez pas besoin.

"Pourquoi avez-vous une boucle dans la fonction Close_Single_P ? " du 3ème post de la page 1

"pourquoi la boucle ?" de la page 4, 2ème post

 

Je me trompe ou cette fonction ne ferme jamais les ordres SHORT ?

...
   for(int cnt = OrdersTotal()-1; cnt >= 0 ; cnt--) 
   {
      CodeY = false;
      if ( OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) )
      {
         CodeY    = true;
         OrderS   = OrderSymbol();
         OrderT   = OrderTicket();
         OrderM   = OrderMagicNumber();
         OrderTyp = OrderType();
         OrderL   = OrderLots();
      }   
      if ( CodeY && OrderS == Pair1 && OrderTyp == OP_BUY && OrderM == MAG &&.... )
    
         CLOSE_Single_P(Pair1,"LONG",OrderT,OrderL);
                               ^^^^ - You always pass LONG to variable TREN, so variable PRC (below) is always equal taken from LONG, but NEVER from SHORT.

//-----------------------------------------------+
void CLOSE_Single_P(string SYMB, string TREN, int TICKET, double LOTT)
{
   double PRC;
   bool Check = false;

   for ( int cntt=0; cntt<20000; cntt++ )
   {
      if ( Check )
      {
         Check_Ini();
         return;
      }
      Check = false;
      if ( TREN == "LONG" )
         PRC = MarketInfo(SYMB,MODE_BID);
      else
      if ( TREN == "SHORT" )
         PRC = MarketInfo(SYMB,MODE_ASK);
         ^^^   Never executed
         
      Check = OrderClose(TICKET,LOTT,PRC,Slippage,Yellow);
   }
   return;
}
//-----------------------------------------------+
 
Waidas:

Ai-je tort ou cette fonction ne ferme jamais les ordres SHORT ?


Waidas, vous avez raison. Mais ce n'est qu'une petite partie de l'EA, qui ferme les ordres LONG et SHORT.

Merci.

 
RaptorUK:

C'est à cause de la boucle dont j'ai dit que vous n'aviez pas besoin... dans la fonction dont vous n'avez pas besoin.

"Pourquoi avez-vous une boucle dans la fonction Close_Single_P ? " du 3ème message de la page 1

"pourquoi la boucle ?" de la page 4, 2ème post


Raptor, vous aviez raison, et j'ai supprimé les boucles, donc la fonction est maintenant sans aucune boucle.

Je la joins à nouveau ici.

Y.

...
   for(int cnt = OrdersTotal()-1; cnt >= 0 ; cnt--) 
   {
      CodeY = false;
      if ( OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) )
      {
         CodeY    = true;
         OrderS   = OrderSymbol();
         OrderT   = OrderTicket();
         OrderM   = OrderMagicNumber();
         OrderTyp = OrderType();
         OrderL   = OrderLots();
      }   
      if ( CodeY && OrderS == Pair1 && OrderTyp == OP_BUY && OrderM == MAG &&.... )
    
         CLOSE_Single_P(Pair1,"LONG",OrderT,OrderL);

//-----------------------------------------------+
void CLOSE_Single_P(string SYMB, string TREN, int TICKET, double LOTT)
{
   double PRC;
   bool Check = false;

   for ( int cntt=0; cntt<20000; cntt++ )
   {
      if ( Check )
      {
         Check_Ini();
         return;
      }
      if ( TREN == "LONG" )
         PRC = MarketInfo(SYMB,MODE_BID);
      else
      if ( TREN == "SHORT" )
         PRC = MarketInfo(SYMB,MODE_ASK);
         
      Check = OrderClose(TICKET,LOTT,PRC,Slippage,Yellow);
   }
   return;
}
//-----------------------------------------------+