Frage an die MQL4-Meister. Nochmals zu Double Compare. - Seite 3

 
komposter:

Und in vereinfachter Form funktioniert es genauso schnell wie ComparePrice:
Aber nicht so genau :)
Wenn sich die Werte um einen Punkt unterscheiden, werden in der Hälfte der Fälle falsche Ergebnisse angezeigt.

Und was hat der vereinfachte Modus überhaupt damit zu tun? ComparePrice in vereinfachter Form kann genauso langsam sein wie die unvereinfachte Variante.
 
Irtron:
Ganzzahlig:

Schreiben Sie zunächst ein paar Expert Advisors auf Ihre eigene Order, spüren Sie den Sturm eines Kunden, der plötzlich den Stop-Loss um 1 Punkt falsch gesetzt hat... Und dann erklären Sie ihnen die Absurdität der Funktion NormalizeDouble(), ich frage mich, wie es für Sie funktionieren wird=)

Ich will Ihnen ein Geheimnis verraten.
Ich habe viel mehr benutzerdefinierte Expert Advisors geschrieben, als ich anfangs brauchte. Ich habe nie den Drang verspürt, sie zu kaufen, weil ich nie einen Grund dazu hatte. In meinen Programmen ist der Stoploss garantiert dort, wo er sein soll (und nicht "erscheint"). Dementsprechend muss ich dem Kunden nichts erklären, schon gar nicht eine ganz bestimmte Funktion. Mir scheint, dass der Sinn der Erstellung eines EA darin besteht, dem Kunden solche Fragen und Erklärungen zu ersparen.

Und wie kann man ohne die Funktion NormalizeDouble() zuverlässig feststellen, wo sie sein sollte? Und wie kann man sich von Erklärungen befreien, ohne NormalizeDouble() zu verwenden?
 
Irtron:
VBAG:
Und es stellt sich heraus, dass sogar der Preis, der vom Server von Ihrer Bestellung genommen wird, noch normalisiert werden muss!!!
Das ist unwahrscheinlich. Die MT-Eingeweide sind schon fast nicht mehr normalisierbar.
Es gab und gibt viele Diskussionen über die nicht nachvollziehbare Performance des Expert Advisors, wenn er mit nicht nachvollziehbaren historischen Daten getestet wird.
Genau, ich erinnere mich, dass es eine falsche Geschichte gab. Aber das Fehlen der Normalisierung war für den Prüfer entscheidend. Wie auch immer.
Und wie gehen Sie mit Indikator-Dubs um, wenn Sie mit 0 usw. vergleichen, ohne zu normalisieren. Sehr interessant.
 
VBAG:
Und wie geht man mit Indikator-Dubs um, wenn man mit 0 usw. vergleicht, ohne zu normalisieren. Sehr interessant.
Du wirst es nicht glauben :)
    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:
Und wie geht man mit Indikator-Dubs um, wenn man mit 0 usw. vergleicht, ohne zu normalisieren. Sehr interessant.
Du wirst es nicht glauben :)
    double cci;
    
    cci = iCCI(NULL, 0, 14, PRICE_CLOSE, 1);
    
    if (cci > 0.)
        Print("Above");
    else if (cci < 0.)
        Print("Below");
    else
        Print("Bingo!");
Ja, nun... - Das ist verständlich. Ich habe Ihren Ansatz verstanden, dass in jeder spezifischen Situation die einfachste Lösung gesucht wird.


 
VBAG schauen Sie sich dieses Skript an
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);
  }

und die Ergebnisse seiner Arbeit

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

Entscheiden Sie selbst, welche Arithmetik Sie bevorzugen.

Bei der Bestimmung der Kreuzung der Indikatorlinie (z.B. MA) mit dem Preis (vom Typ Price_Now>MA_Now und Previous_Price<=Previous_MA) müssen Sie immer auf 8 Stellen normalisieren.

 
Integer:

ist eine Normalisierung auf 8 Stellen vorgeschrieben.


Nein, warum nur 8? :) Es gibt auch eine 7, 9 oder 6. Manche Leute entscheiden sich für 4.
Wirklich, warum eine 8? Was sind die Kriterien?
 
VBAG:
Ich verstehe Ihren Ansatz, in jeder Situation nach der einfachsten Lösung zu suchen.

Berichtigung. Die am besten geeignete und möglichst wirksame. Leider ist sie nicht immer die einfachste.
 
Irtron:
Ganzzahlig:

ist eine Normalisierung auf 8 Stellen vorgeschrieben.


Nein, warum bis zu 8? :) Es gibt auch eine 7, 9 oder 6. Manche Leute entscheiden sich für 4.
Wirklich, warum eine 8? Was sind die Kriterien?

Angenommen,

Preis = 1,1111

ma = 1,11110001

Wenn Sie auf 8 Ziffern normalisieren, ist ma>price korrekt. Die Normalisierung auf eine geringere Anzahl von Ziffern macht sie gleich - falsch. Auf diese Weise wird maximale Genauigkeit erreicht.

Die Normalisierung auf 9 Ziffern funktioniert nicht. Es ist, als hätte der Preis 9 Ziffern und der Indikator 8 oder umgekehrt (ich erinnere mich nicht mehr), kurz gesagt, es liegt das Geheimnis des Unbekannten in der Luft.

 
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!");

Diese Methode ist erfolgreich. Bisher hat noch niemand die daraus resultierende Fehlermarge bemerkt).