Question aux maîtres du MQL4. Encore une fois à propos de Double Comparaison. - page 3

 
komposter:

Et sous une forme simplifiée, il fonctionne aussi rapidement que ComparePrice :
.
Mais pas aussi précis :)
Si les valeurs diffèrent d'un point, il donnera des résultats erronés la moitié du temps.

Et qu'est-ce que le mode simplifié vient faire là-dedans ? ComparePrice sous une forme simplifiée peut être aussi lent qu'un égal non simplifié.
 
Irtron:
Entier:

Tout d'abord, écrivez quelques Expert Advisors sur votre propre ordre, sentez la tempête d'un client qui soudainement le stop-loss était faux d'un point... Et ensuite, expliquez-leur l'absurdité de la fonction NormalizeDouble(), je me demande comment cela va se passer pour vous=)

Laissez-moi vous dire un secret.
J'ai écrit beaucoup plus de conseillers experts personnalisés qu'il n'en fallait pour commencer. Je n'ai jamais ressenti le besoin d'en acheter car je n'ai jamais eu de raison de le faire. Dans mes programmes, le stoploss est garanti (et ne "semble" pas) être là où il devrait être. Par conséquent, je n'ai pas à expliquer quoi que ce soit de ce genre au client, surtout en ce qui concerne une fonction très spécifique. Il me semble que le but de l'écriture d'une EE est de se débarrasser de ces questions et explications pour le client.

Et comment peut-on le localiser de manière fiable là où il doit être sans la fonction NormalizeDouble() ? Et comment s'affranchir des explications sans utiliser NormalizeDouble() ?
 
Irtron:
VBAG:
Et il s'avère que même le prix extrait du serveur de votre commande doit encore être normalisé ! !!
C'est peu probable. Les entrailles de la MT sont déjà presque au-delà de la normalisation.
Il y a eu et il y a encore beaucoup de discussions sur les performances incompréhensibles du conseiller expert lorsqu'il est testé sur des données historiques incompréhensibles.
Exactement, il y avait une histoire incorrecte, je m'en souviens. Mais c'est l'absence de normalisation qui était critique pour le testeur. Peu importe.
Et comment gérez-vous les doublons d'indicateurs lorsque vous comparez à 0 etc. sans normalisation. Très intéressant.
 
VBAG:
Et comment gérez-vous les doublons d'indicateurs lorsque vous comparez à 0 etc. sans normalisation. Très intéressant.
Vous ne le croirez pas :)
    double cci;
    
    cci = iCCI(NULL, 0, 14, PRICE_CLOSE, 1);
    
    if (cci > 0.)
        Print("Above");
    else if (cci < 0.)
        Print("Below");
    else
        Print("Bingo!");
 
Irtron:
VBAG:
Et comment gérez-vous les doublons d'indicateurs lorsque vous comparez à 0 etc. sans normalisation. Très intéressant.
Vous ne le croirez pas :)
    double cci;
    
    cci = iCCI(NULL, 0, 14, PRICE_CLOSE, 1);
    
    if (cci > 0.)
        Print("Above");
    else if (cci < 0.)
        Print("Below");
    else
        Print("Bingo!");
Ouais, eh bien... - c'est compréhensible. J'ai compris votre approche, à savoir que dans chaque situation spécifique, on cherche la solution la plus simple.


 
VBAG, regardez ce script
int start()
  {
//----
string str;
bool ok1,ok2;
   for(int i=0;i<10;i++){
      double NotNormPrice_1=StrToDouble("1.1111"+i);
         for(int j=0;j<10;j++){
            double NotNormPrice_2=StrToDouble("1.1111"+j);
               if(NormalizeDouble(NotNormPrice_1,4)==NormalizeDouble(NotNormPrice_2,4)){
                  str="Metod 1: "+DoubleToStr(NotNormPrice_1,5)+" = "+DoubleToStr(NotNormPrice_2,5)+" ";
                  ok1=true;
               }                 
               else{
                  str="Metod 1: "+DoubleToStr(NotNormPrice_1,5)+" != "+DoubleToStr(NotNormPrice_2,5)+" ";
                  ok1=false;
               }
               if(NormalizeDouble(NotNormPrice_1-NotNormPrice_2,4)==0.0){
                  str=str+"Metod 2: "+DoubleToStr(NotNormPrice_1,5)+" = "+DoubleToStr(NotNormPrice_2,5);
                  ok2=true;
               }         
               else{
                  str=str+"Metod 2: "+DoubleToStr(NotNormPrice_1,5)+" != "+DoubleToStr(NotNormPrice_2,5);                
                  ok2=false;
               }
            if(ok1!=ok2)Print(str);
         }
   }
//----
   return(0);
  }

et les résultats de son travail

09:04:13 NormExperiment EURUSD,M5 : Metod 1 : 1.11111 != 1.11115 Metod 2 : 1.11111 = 1.11115
09:04:13 NormExperiment EURUSD,M5 : Metod 1 : 1.11111 != 1.11116 Metod 2 : 1.11111 = 1.11116
09:04:13 NormExperiment EURUSD,M5 : Metod 1 : 1.11112 != 1.11115 Metod 2 : 1.11112 = 1.11115
09:04:13 NormExperiment EURUSD,M5 : Metod 1 : 1.11112 != 1.11116 Metod 2 : 1.11112 = 1.11116
09:04:13 NormExperiment EURUSD,M5 : Metod 1 : 1.11112 != 1.11117 Metod 2 : 1.11112 = 1.11117
09:04:13 NormExperiment EURUSD,M5 : Metod 1 : 1.11113 != 1.11115 Metod 2 : 1.11113 = 1.11115
09:04:13 NormExperiment EURUSD,M5 : Metod 1 : 1.11113 != 1.11116 Metod 2 : 1.11113 = 1.11116
09:04:13 NormExperiment EURUSD,M5 : Metod 1 : 1.11113 != 1.11117 Metod 2 : 1.11113 = 1.11117
09:04:13 NormExperiment EURUSD,M5 : Metod 1 : 1.11114 != 1.11115 Metod 2 : 1.11114 = 1.11115
09:04:13 NormExperiment EURUSD,M5 : Metod 1 : 1.11114 != 1.11116 Metod 2 : 1.11114 = 1.11116
09:04:13 NormExperiment EURUSD,M5 : Metod 1 : 1.11114 != 1.11117 Metod 2 : 1.11114 = 1.11117
09:04:13 NormExperiment EURUSD,M5 : Metod 1 : 1.11114 != 1.11118 Metod 2 : 1.11114 = 1.11118
09:04:13 NormExperiment EURUSD,M5 : Metod 1 : 1.11114 != 1.11119 Metod 2 : 1.11114 = 1.11119
09:04:13 NormExperiment EURUSD,M5 : Metod 1 : 1.11115 != 1.11111 Metod 2 : 1.11115 = 1.11111
09:04:13 NormExperiment EURUSD,M5 : Metod 1 : 1.11115 != 1.11112 Metod 2 : 1.11115 = 1.11112
09:04:13 NormExperiment EURUSD,M5 : Metod 1 : 1.11115 != 1.11113 Metod 2 : 1.11115 = 1.11113
09:04:13 NormExperiment EURUSD,M5 : Metod 1 : 1.11115 != 1.11114 Metod 2 : 1.11115 = 1.11114
09:04:13 NormExperiment EURUSD,M5 : Metod 1 : 1.11116 != 1.11111 Metod 2 : 1.11116 = 1.11111
09:04:13 NormExperiment EURUSD,M5 : Metod 1 : 1.11116 != 1.11112 Metod 2 : 1.11116 = 1.11112
09:04:13 NormExperiment EURUSD,M5 : Metod 1 : 1.11116 != 1.11113 Metod 2 : 1.11116 = 1.11113
09:04:13 NormExperiment EURUSD,M5 : Metod 1 : 1.11116 != 1.11114 Metod 2 : 1.11116 = 1.11114
09:04:13 NormExperiment EURUSD,M5 : Metod 1 : 1.11117 != 1.11112 Metod 2 : 1.11117 = 1.11112
09:04:13 NormExperiment EURUSD,M5 : Metod 1 : 1.11117 != 1.11113 Metod 2 : 1.11117 = 1.11113
09:04:13 NormExperiment EURUSD,M5 : Metod 1 : 1.11117 != 1.11114 Metod 2 : 1.11117 = 1.11114
09:04:13 NormExperiment EURUSD,M5 : Metod 1 : 1.11118 != 1.11114 Metod 2 : 1.11118 = 1.11114
09:04:13 NormExperiment EURUSD,M5 : Metod 1 : 1.11119 != 1.11114 Metod 2 : 1.11119 = 1.11114

Décidez vous-même de l'arithmétique que vous préférez.

Lorsque vous déterminez le croisement de la ligne de l'indicateur (par exemple MA) avec le prix (du type Price_Now>MA_Now et Previous_Price<=Previous_MA), vous devez toujours normaliser à 8 chiffres.

 
Integer:

il est obligatoire de normaliser à 8 chiffres.


Non, pourquoi descendre à 8 ? :) Il y a aussi un 7, un 9 ou un 6. Certaines personnes vont jusqu'à 4.
Vraiment, pourquoi un 8 ? Quels sont les critères ?
 
VBAG:
Je suppose que votre approche consiste à rechercher la solution la plus simple dans chaque situation spécifique.

Correction. La plus adaptée et, si possible, la plus efficace. Malheureusement, ce n'est pas toujours la plus facile.
 
Irtron:
Entier:

il est obligatoire de normaliser à 8 chiffres.


Non, pourquoi jusqu'à 8 ? :) Il y a aussi un 7, un 9 ou un 6. Certaines personnes vont jusqu'à 4.
Vraiment, pourquoi un 8 ? Quels sont les critères ?

Supposons que

prix = 1,1111

ma = 1.11110001

Si on normalise à 8 chiffres, ma>prix est correct. La normalisation à un nombre inférieur de chiffres les rendra égaux - incorrects. De cette façon, on obtient une précision maximale.

La normalisation à 9 chiffres ne fonctionne pas. C'est comme si le prix avait 9 chiffres et l'indicateur en avait 8 ou vice versa (je ne me souviens plus), bref qu'il était recouvert par le mystère de l'inconnu.

 
Irtron:

    double cci;
    
    cci = iCCI(NULL, 0, 14, PRICE_CLOSE, 1);
    
    if (cci > 0.)
        Print("Above");
    else if (cci < 0.)
        Print("Below");
    else
        Print("Bingo!");

Cette méthode passe. Jusqu'à présent, personne n'a remarqué la marge d'erreur qui en résulte).