Besoin d'aide pour repérer une légère erreur. - page 4

 
Si c'est le cas, alors j'ai raison dans mon 1er code également, j'appelle OrderSelect() tout de suite après la 1ère boucle for ...... Le problème maintenant est que le trailing stop loss ne fonctionne pas correctement et je n'ai toujours aucune idée de l'origine du problème.
 
juniorlcq: utilise la boucle de compte à rebours mais avec x-- . Je ne comprends pas pourquoi vous suggérez --x cependant .
  1. x++ lit la valeur, en enregistre une copie, incrémente la valeur, enregistre la nouvelle valeur dans x etrécupère la copie pour une utilisation ultérieure.
  2. ++x lit la valeur, incrémente la valeur, enregistre la nouvelle valeur dans x.
  3. Pour les entiers, cela fait peu de différence. Sur certaines plateformes, cette dernière est une instruction unique, ce qui la rend plusieurs fois plus rapide.
  4. Pour les classes (comme les itérateurs), vous avez un appel supplémentaire au constructeur et au destructeur, ce qui rend le processus beaucoup plus rapide.
    Opérateur préfixe++
    Opérateur postfixe++
    RaRev* RaRev::operator++(void){         // prefix
       ++mPos;
       return GetPointer(this); // Allow (++It).Get()
    }
    
    RaRev RaRev::operator++(int){               // postfix
       RaRev  orig(this); // Make a copy to return.
       ++this;            // Increment myself.
       return orig;       // Return the original position.
    }
    
    Dans la plupart des implémentations de la STL, vous verrez souvent "iterator last=end ; --end ;" plutôt que "iterator last=end--".

 

Si le prix monte de 600 points depuis OrderOpenprice(), = StartTraillingStop (200) + 8(xai)*50

le code est ici :

  if ( xai >= 8 ) 
    {
    if ( ( ( OrderClosePrice() - OrderOpenPrice() ) / Figure ) >= ( StartTrailingStop + ( CummulativeValue * xai ) ) )
        {
        if ( OrderStopLoss() == ( OrderOpenPrice() + ( ( TrailingStop + ( CummulativeValue * ( xai - 1 ) ) ) * Figure ) ) )
           {
            Result = OrderModify ( OrderTicket() , OrderOpenPrice() , ( OrderOpenPrice() + ( ( TrailingStop + ( CummulativeValue * xai ) ) * Figure ) ) , OrderTakeProfit() , 0 , Color ) ;
       }
    }

mais le code fera tous les xai de 0 à 8, disons que le code est à xai = 4 ; est-ce que cette condition est vraie ?

if ( ( ( OrderClosePrice() - OrderOpenPrice() ) / Figure ) >= ( StartTrailingStop + ( CummulativeValue * xai ) ) )

oui alors le SL sera fixé à : StartTraillinStop (200) + 4(xai)*50 ( en descendant à partir du précédent )

puis xai 5, le SL sera fixé à : StartTraillinStop (200) + 5(xai)*50

et ainsi de suite, donc il n'est pas possible de mettre un break une fois que le SL est fixé ;

 

juniorlcq Votre code est beaucoup plus facile à lire maintenant que vous l'avez reformaté. Je l'ai reformaté un peu plus pour le rendre plus petit à poster, j'ai mis en évidence les problèmes possibles. Je pense que tu as peut-être un problème de "double == calculated double" qui empêche ton code d'exécuter certaines pistes. Avez-vous déjà lu le fil de discussion à propos de can price != price ?

Je me méfie surtout du 2ème et du 4ème car ce sont des calculs plus compliqués.

Mettez des instructions Print() après ces calculs pour voir s'ils font vraiment == ou pas.

L'erreur connue sous le nom d'erreur de virgule flottante pourrait les rendre != même quand il semble qu'ils devraient être ==.

== n'est vraiment sûr à 100% qu'avec des nombres entiers, vous pouvez donc changer le == en <= ou >= comme test.

  void ProcessTrailingStop()
 {
  bool Result;
  for(int x=(OrdersTotal()-1); x>=0; x--)
  {if(OrderSelect(x,SELECT_BY_POS,MODE_TRADES)==True)
   {PointsDetection();
    if(OrderType()==OP_BUY)
    {for(int xai=0; xai<NumberOfTrail; xai++)
     {if(xai==0)
      {if(((OrderClosePrice()-OrderOpenPrice())/Figure)>=StartTrailingStop)
       {if(( OrderStopLoss()==0) || (OrderStopLoss()<(OrderOpenPrice()+(TrailingStop*Figure))))
        {Result=OrderModify(OrderTicket(),OrderOpenPrice(),(OrderOpenPrice()+(TrailingStop*Figure)),OrderTakeProfit(),0,Color);
      }}}
      if(xai==1)
      {if(((OrderClosePrice()-OrderOpenPrice())/Figure)>=(StartTrailingStop+CummulativeValue))
       {if(OrderStopLoss()==(OrderOpenPrice()+(TrailingStop*Figure)))
        {Result=OrderModify(OrderTicket(),OrderOpenPrice(),(OrderOpenPrice()+((TrailingStop+CummulativeValue)*Figure)),OrderTakeProfit(),0,Color);
      }}}
      if(xai>=2)
      {if(((OrderClosePrice()-OrderOpenPrice())/Figure)>=(StartTrailingStop+(CummulativeValue*xai)))
       {if(OrderStopLoss()==(OrderOpenPrice()+(( TrailingStop+(CummulativeValue *(xai-1)))*Figure)))
        {Result=OrderModify(OrderTicket(),OrderOpenPrice(),(OrderOpenPrice()+(( TrailingStop+(CummulativeValue*xai))*Figure)),OrderTakeProfit(),0,Color);
    }}}}}else
    {if(OrderType()==OP_SELL)
     {for(int xaii=0; xaii<NumberOfTrail; xaii++)
      {if(xaii==0)
       {if(((OrderOpenPrice()-OrderClosePrice())/Figure)>=StartTrailingStop)
        {if(( OrderStopLoss()==0) || (OrderStopLoss()>(OrderOpenPrice() -(TrailingStop*Figure))))
         {Result=OrderModify(OrderTicket(),OrderOpenPrice(),(OrderOpenPrice() -(TrailingStop*Figure)),OrderTakeProfit(),0,Color);
       }}}
       if(xaii==1)
       {if(((OrderOpenPrice()-OrderClosePrice())/Figure)>=(StartTrailingStop+CummulativeValue))
        {if(OrderStopLoss()==(OrderOpenPrice() -(TrailingStop*Figure)))
         {Result=OrderModify(OrderTicket(),OrderOpenPrice(),(OrderOpenPrice() -(( TrailingStop+CummulativeValue)*Figure)),OrderTakeProfit(),0,Color);
       }}}
       if(xaii>=2)
       {if(((OrderOpenPrice()-OrderClosePrice())/Figure)>=(StartTrailingStop+(CummulativeValue*xaii)))
        {if(OrderStopLoss()==(OrderOpenPrice() -(( TrailingStop+(CummulativeValue *(xaii-1)))*Figure)))
         {Result=OrderModify(OrderTicket(),OrderOpenPrice(),(OrderOpenPrice() -(( TrailingStop+(CummulativeValue*xaii))*Figure)),OrderTakeProfit(),0,Color);
 }}}}}}}}}


Aussi comme une note latérale : Votre code serait beaucoup plus efficace si vous appelez OrderOpenPrice(), OrderStopLoss(), OrderClosePrice() une fois au début de votre boucle OrderSelect() et assigner leurs valeurs à des vars locales à utiliser dans le reste du code. Les variables locales sont beaucoup plus rapides d'accès que les appels de fonction. Vous devez donc éviter de faire des appels de fonction répétés pour le même résultat... En règle générale, plus vous avez d'écriture rose dans votre code, plus les performances de l'EA seront lentes.

 

Je comprends, je n'arrive pas à le faire fonctionner, celui-ci peut fonctionner avec l'ordre d'achat, les SL descendent comme expliqué :

   extern double CummulativeValue = 50.0 ;
   extern int    NumberOfTrail = 100 ;



  void ProcessTrailingStop()
   {
       double Figure = Point;
    color Color = Yellow;
  
    bool Result ;
         for ( int x =  OrdersTotal(); x >= 0 ; x-- )
         {
         if ( OrderSelect ( x , SELECT_BY_POS , MODE_TRADES ) == false) continue;
        if ( OrderType() == OP_BUY )
           {
                 for ( int xai = 0 ; xai < NumberOfTrail ; xai++ )
                     {
                        if ( xai == 0 )
                        {
                           if ( ( ( OrderClosePrice() - OrderOpenPrice() ) / Figure ) >= StartTrailingStop )
                           {
                              if ( OrderStopLoss() == 0 ) 
                              {
                               Result = OrderModify ( OrderTicket() , OrderOpenPrice() , ( OrderOpenPrice() + ( TrailingStop * Figure ) ) , OrderTakeProfit() , 0 , Color ) ;
                          } } }                        
                  
                        if ( xai == 1 )
                           {
                           if ( ( ( OrderClosePrice() - OrderOpenPrice() ) / Figure ) >= ( StartTrailingStop + CummulativeValue ) )
                           {
                           Result = OrderModify ( OrderTicket() , OrderOpenPrice() , ( OrderOpenPrice() + ( ( TrailingStop + CummulativeValue ) * Figure ) ) , OrderTakeProfit() , 0 , Color ) ;
                          } }                         
                        
                        if ( xai >= 2 )
                           {
                          if ( ( ( OrderClosePrice() - OrderOpenPrice() ) / Figure ) >= ( StartTrailingStop + ( CummulativeValue * xai ) ) )
                           {
                           Result = OrderModify ( OrderTicket() , OrderOpenPrice() , ( OrderOpenPrice() + ( ( TrailingStop + ( CummulativeValue * xai ) ) * Figure ) ) , OrderTakeProfit() , 0 , Color ) ;
                        } }                         
                     }
                  }
                  
       }}           
 
WHRoeder:
  1. x++ lit la valeur, en enregistre une copie, incrémente la valeur, enregistre la nouvelle valeur dans x etrécupère la copie pour une utilisation ultérieure.
  2. ++x lit la valeur, incrémente la valeur, enregistre la nouvelle valeur dans x.
  3. Pour les entiers, cela fait peu de différence. Sur certaines plateformes, cette dernière est une instruction unique, ce qui la rend plusieurs fois plus rapide.
  4. Pour les classes (comme les itérateurs), vous avez un appel supplémentaire au constructeur et au destructeur, ce qui rend le processus beaucoup plus rapide.
    Opérateur préfixe++
    Opérateur postfixe++
    Dans la plupart des implémentations de la STL, vous verrez souvent "iterator last=end ; --end ;" plutôt que "iterator last=end--".


Ohhhhhhh je ne connaissais pas cela . Merci WHRoeder :) .

Alors, cela signifie-t-il que ,

disons que OrdersTotal() == 3 , avec le compte à rebours de la boucle for ( int x = ( OrdersTotal() - 1 ) ; x >= 0 ; x-- ) x enregistrera la première valeur comme 2, puis continuera la boucle for à partir de 2 sans repasser par OrdersTotal() ? ?

 
SDC:

juniorlcq Votre code est beaucoup plus facile à lire maintenant que vous l'avez reformaté. Je l'ai reformaté un peu plus pour le rendre plus petit à poster, j'ai mis en évidence les problèmes possibles. Je pense que tu as peut-être un problème de "double == calculated double" qui empêche ton code d'exécuter certaines pistes. Avez-vous déjà lu le fil de discussion à propos de can price != price ?

Je me méfie surtout du 2ème et du 4ème car ce sont des calculs plus compliqués.

Mettez des instructions Print() après ces calculs pour voir s'ils font vraiment == ou pas.

L'erreur connue sous le nom d'erreur de virgule flottante pourrait les rendre != même quand il semble qu'ils devraient être ==.

== n'est vraiment sûr à 100% qu'avec des nombres entiers, vous pouvez donc changer le == en <= ou >= comme test.



Non, je n'ai pas lu ce fil avant. Je viens juste de le faire.

Ce que vous avez suggéré semble logique. D'un autre côté, il arrive que les lignes tracées sur MT4 sur les propriétés du prix n'indiquent pas vraiment un prix à 5 chiffres, mais parfois quelque chose de plus que cela.

Mais voici un de mes trades flottants sur le compte précédent, je l'ai imprimé pour voir comment était le double avec un simple codage d'impression. Bizarre MQL4 je suppose @.@ ?

Je suis toujours en train de penser comment modifier la partie double == double .....

SDC:


Par ailleurs, votre code serait beaucoup plus efficace si vous appeliez OrderOpenPrice(), OrderStopLoss(), OrderClosePrice() une fois au début de votre boucle OrderSelect() et si vous assigniez leurs valeurs à des variables locales à utiliser dans le reste du code. Les variables locales sont beaucoup plus rapides d'accès que les appels de fonction. Vous devez donc éviter de faire des appels de fonction répétés pour le même résultat... En règle générale, plus vous avez d'écriture rose dans votre code, plus les performances de l'EA seront lentes.

Ohhh je ne savais pas qu'il y aurait une énorme différence dans la vitesse d'exécution, merci pour le guide SDC. Je vais modifier le code selon votre guide après que l'arrêt de la piste ait commencé à fonctionner.

 

Essayez de remplacer le dernier bloc de code par cette version de débogage. Vérifiez mon code, je ne l'ai pas compilé.

       if(xaii>=2)
       {if(((OrderOpenPrice()-OrderClosePrice())/Figure)>=(StartTrailingStop+(CummulativeValue*xaii)))
        {Print("debug2.1: first condition true");
         if(OrderStopLoss()==(OrderOpenPrice() -(( TrailingStop+(CummulativeValue *(xaii-1)))*Figure)))
         {Print("debug2.2: second condition true");
          Result=OrderModify(OrderTicket(),OrderOpenPrice(),(OrderOpenPrice() -(( TrailingStop+(CummulativeValue*xaii))*Figure)),OrderTakeProfit(),0,Color);
         }else
         {Print("debug2.2: second condition false");
          Print("debug2.2: val1=",OrderStopLoss()," val2=",OrderOpenPrice() -(( TrailingStop+(CummulativeValue *(xaii-1)))*Figure));
 }}}}}}}}}

Cela pourrait révéler quelque chose, vous pourriez faire quelque chose de similaire avec les autres conditions == aussi.

 
SDC:

Essayez de remplacer le dernier bloc de code par cette version de débogage. Vous pouvez faire quelque chose de similaire avec le xa

Cela pourrait révéler quelque chose, vous pourriez faire quelque chose de similaire avec les autres conditions == aussi.


Oui, le problème est apparu, il s'agit du " problème double == double calculé ". Merci d'avoir signalé le problème à SDC.

Merci ffoorr d'avoir également signalé le même problème plus tôt, mais je ne l'ai pas modifié de la bonne manière et j'ai pensé que ce n'était pas le problème.

J'ai une question et j'ai besoin d'une suggestion, pour les 2ème et 3ème if dans la 2ème boucle for, est-il préférable de mettre une instruction " entre " ? Comme OrderStopLoss() >= x + 1 && x - 1 ? ? Ou devrais-je simplement utiliser >= ou <= ? ??

 

J'espère que WHR ne lira pas ceci, il va faire une crise, mais je vais vous dire d'essayer NormalizeDouble() .... cela devrait rendre ces conditions égales quand elles sont supposées l'être. Il ne devrait pas être nécessaire de le faire aussi du côté de l'OrderStopLoss(), mais s'il n'y a toujours pas égalité quand il le faut, vous pouvez essayer de le faire des deux côtés de la condition.....

       if(xaii>=2)
       {if(((OrderOpenPrice()-OrderClosePrice())/Figure)>=(StartTrailingStop+(CummulativeValue*xaii)))
        {Print("debug2.0: condition true");
         if(OrderStopLoss()==NormalizeDouble((OrderOpenPrice() -(( TrailingStop+(CummulativeValue *(xaii-1)))*Figure)),Digits));
         {Print("debug2.1: condition true");
          Result=OrderModify(OrderTicket(),OrderOpenPrice(),(OrderOpenPrice() -(( TrailingStop+(CummulativeValue*xaii))*Figure)),OrderTakeProfit(),0,Color);
         }else
         {Print("debug2.1: condition false");
          Print("debug2.1: val1=",OrderStopLoss()," val2=",OrderOpenPrice() -(( TrailingStop+(CummulativeValue *(xaii-1)))*Figure));
 }}}}}}}}}
Raison: