Can price != price ? - page 6

 

C'est ce que j'appelle une double boîte de vers.... (jeu de mots ;)

Il semble que sur les différentes fonctions personnalisées proposées, aucune n'ait fait l'objet d'un consensus. Quelqu'un pourrait-il nous dire quelle est la fonction CompareDouble qu'il utilise au quotidien (sans jeu de mots) ?

Il est évident que nous devons utiliser une fonction CompareDouble personnalisée si nous voulons des systèmes fiables.

 

Le problème peut être ignoré, la plupart du temps sauf si la valeur EXACTE est importante.

Si je cherche à ouvrir au-dessus d' un prix de déclenchement (éventuellement non normalisé), j'utilise Bid > trigger. S'il arrive que le déclenchement se fasse à ce prix à cause d'un arrondi, je m'en moque.

Si je cherche à ouvrir à ou autour d' un prix de déclenchement (éventuellement non normalisé), je teste un gap : Bid > trigger && Bid < trigger+3*pips2dbl. Le marché peut facilement bouger d'un pip entier en un tick, donc Bid == trigger est toujours faux et MathAbs(bid-trigger) < Point/2 est correct mais ne fonctionnera probablement pas.

Si l'égalité est importante, par exemple si je cherche à déplacer un SL mais que je suis trop proche du marché(niveau de stop), alors j'utilise Bid - newSL > StopLelvel - Point/2.

 
WHRoeder:

Le problème peut être ignoré, surtout si la valeur EXACTE n'est pas importante.

Si je cherche à ouvrir au-dessus d' un prix de déclenchement (éventuellement non normalisé), j'utilise Bid > trigger. S'il se trouve que le déclenchement se fait à ce prix à cause d'un arrondi, cela m'est égal.

Si je cherche à ouvrir à ou autour d' un prix de déclenchement (éventuellement non normalisé), je teste un gap : Bid > trigger && Bid < trigger+3*pips2dbl. Le marché peut facilement bouger d'un pip entier en un tick, donc Bid == trigger est toujours faux et MathAbs(bid-trigger) < Point/2 est correct mais ne fonctionnera probablement pas.

Si les égalités sont importantes, par exemple si je cherche à déplacer un SL mais que je suis trop proche du marché (niveau de stop), alors j'utilise Bid - newSL > StopLelvel - Point/2.


Merci. C'est ce que j'appellerais un fil décoché...

En fait, ce que vous avez mentionné est très proche de mon application : J'établis si le nouveau TakeProfit est différent (selon les normes du courtier ou de MQL4) du TakeProfit original déjà défini et envoyé. Je compare deux valeurs d'indicateur et deux valeurs de TakeProfit avant l'appel de OrderModify.

if (Volume[0]>1)return;
 
       for(int b=OrdersTotal()-1;b>=0; b--)
       {
       if(atr2kTP == atr2kTPAdjust|| btphold==btp)) return;//-----------This is where I am comparing them, and where the function would go.
         if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES))
           if(OrderMagicNumber()==MAGICMA)
             if(OrderSymbol()==Symbol())
                if(OrderType()==OP_BUY)                                  
                  atr2kTPAdjust=atr2kTP; 
                       OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),btp,0,CLR_NONE);                          
 
       }              
         for(int s=OrdersTotal()-1;s>=0; s--)
         {
          if(atr2kTP == atr2kTPAdjust|| stphold==stp) return;
           if(OrderSelect(s,SELECT_BY_POS,MODE_TRADES))
             if(OrderMagicNumber()==MAGICMA)
               if(OrderSymbol()==Symbol())
                  if(OrderType()==OP_SELL)                      
                      atr2kTPAdjust=atr2kTP;                      
                        OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),stp,0,CLR_NONE);
         }
 }
 

Ceci était mon code OrderMod final, utilisant le filtre Point/2 pour comparer les valeurs des commandes doubles. Il a fonctionné SANS erreur et a modifié les ordres à chaque fois. Merci !

void AutoAdjustTakeProfit()
{
if (Volume[0]>1 || atr2kTP == atr2kTPAdjust)return;  

       for(int b=OrdersTotal()-1;b>=0; b--)
          { 
            if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES))
               if(OrderMagicNumber()==MAGICMA)
                 if(OrderSymbol()==Symbol())
                    {          
                      if(OrderType()==OP_BUY)// buy ordeer section
                        {  
                          if((btphold-btp> Point/2) || (btphold-btp<-Point/2))  //--------------------------This is the DoubleCompare Code
                            {                                                                             
                              atr2kTPAdjust=atr2kTP; 
                              OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),btp,0,CLR_NONE);                          
                            }
                        } 
                     
                      if(OrderType()==OP_SELL) // Sell ordeer section
                        {   
                          if((stphold-stp>Point/2) || (stphold-stp <-Point/2)) //--------------------------This is the DoubleCompare Code
                            {                                                  
                               atr2kTPAdjust=atr2kTP;                      
                               OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),stp,0,CLR_NONE);
                            }
                        }
                    }
           }
}
 
  1. if (Volume[0]>1)return;
    Si vous manquez quelques ticks au début d'une nouvelle barre, votre code ne s'exécute pas. Toujours utiliser le temps
  2.   if((stphold-stp>Point/2) || (stphold-stp <-Point/2))
      if( MathAbs(stphold - stp) > Point/2) // Simplified
    Encore une fois, vous souciez-vous vraiment des égaux ? Si vous utilisez :
      if( MathAbs(stphold - stp) >= Point)
    il pourrait se déclencher à un peu moins d'un point. C'est toujours la même chose que de ne pas être égal.
  3. Pourquoi le déplacer d'un point, les déplacer par pips et éviter le problème d'arrondi, et ERR_TOO_FREQUENT_REQUESTS
 

newBar fonctionne très bien.

MathAbs est génial, je pensais qu'il ne convertissait que les négatifs du côté gauche des équations, je ne savais pas qu'il pouvait aussi convertir la différence en valeur positive.

La précision du point/2 n'est pas importante pour mon signal. Je voulais seulement éviter les erreurs d'arrondi pour éviter un codage faible.

Je préfère piétiner les erreurs de fréquence aussi bien que les erreurs d'arrondi. Je veux donc utiliser les calculs stables les plus exempts d'erreurs, par opposition au code de calcul le plus précis.

Donc, en augmentant encore plus mes comparaisons TakeProfit MathAbs (stphold - stp) à >2*pips, je devrais avoir la plus grande chance d'éliminer les erreurs d'arrondi et les erreurs de fréquence ?

Merci beaucoup.

removed.

 
moneycode:

newBar fonctionne très bien.

Auparavant, j'ai rencontré des problèmes avec IsNewCandle, c'est pourquoi je suis passé à un déclencheur de volume. Si le traitement des ticks de volume peut être lent ou absent, alors les bougies pourraient l'être aussi. Donc les deux étaient une mauvaise idée..

Puisque newBar fonctionne bien, j'ai maintenant essayé d'identifier les occurrences d'échec de IsNewCandle, avec le code ci-dessous :

L'appel à la fonction IsNewCandle() est à l'intérieur de start(), AU-DESSUS de la ligne de code newBar. (Ce test d'impression n'a pas fonctionné, au contraire, il s'est imprimé sur chaque nouvelle barre.

A mon avis, c'est une mauvaise idée de mettre la vérification d'une nouvelle barre dans une fonction, une fonction est utilisée pour rendre le code réutilisable... Essayez d'appeler IsNewCandle() deux fois pendant le même premier tick d'une nouvelle barre et voyez les réponses que vous obtenez...

Au fait... c'est hors sujet pour ce fil, si vous souhaitez continuer la discussion, veuillez la déplacer dans un nouveau fil. J'y mettrai de l'ordre plus tard...

 
WHRoeder:

....Puisque les prix ne peuvent varier que d'un multiple de point, point/2 est juste cela.....


Si vous comparez des prix, c'est parfait. Mais si vous comparez des doubles, par exemple des moyennes de prix, Point/2 ne fera pas l'affaire.
 
HarriMQL4:

Si vous comparez des prix, c'est parfait. Mais si vous comparez des doubles, par exemple des moyennes de prix, Point/2 ne fera pas l'affaire.


Avez-vous remarqué le titre de ce sujet ?

;)

 
HarriMQL4:

Si vous comparez des prix, c'est parfait. Mais si vous comparez des doubles, par exemple des moyennes de prix, Point/2 ne fera pas l'affaire.
Les prix sont des doubles. . .