Diskussion über die MQL4-Dokumentation - Seite 16

 
Yurixx:

Und ich wäre dankbar für eine klare Aussage, wann eine doppelte Normalisierung erforderlich ist.

Genau, hier liegt ein offensichtliches Missverständnis vor. Die Hilfe zu dieser Funktion enthält ein Beispiel, in dem diese Funktion völlig nutzlos ist:

double NormalizeDouble( double value, int digits)
Rundet den Fließkommawert auf die angegebene Genauigkeit. Gibt den normalisierten Wert des Typs double zurück.
Die berechneten StopLoss- und TakeProfit-Werte sowie der offene Preis von Pending Orders müssen mit einer Genauigkeit normalisiert werden, deren Wert in der vordefinierten Variable Digits gespeichert wird.
Parameter:
Wert - Fließkommawert.
Ziffern - Präzisionsformat, Anzahl der Stellen nach dem Dezimalpunkt (0-8).
Beispiel:
 double var1=0.123456789; Print(DoubleToStr(NormalizeDouble(var1,5),5)); // Ausgabe: 0.12346

Diese doppelte Umrechnung war für mich sehr verwirrend, als ich sie zum ersten Mal sah. Bei der Ausgabe des Codes in das Protokoll des Expert Advisors wird nämlich die

Print( DoubleToStr( var1, 5 ); 
Vielleicht wäre das Beispiel mit einer Handelsfunktion viel aussagekräftiger, d.h. es ist dort, wo die Normalisierung wirklich notwendig ist. Das Beispiel mit der Funktion CompareDoubles() aus stdlib.mq4 wäre ebenfalls sehr aufschlussreich (dies ist die Stelle, an der Anfänger fast immer darauf treten):

// Функция корректного сравнения двух переменных типа double из библиотеки stdlib.mq4
bool CompareDoubles(double number1,double number2)
{
   if(NormalizeDouble(number1-number2,8)==0) return(true);
   else return(false); 
}
Renat, ist das nicht eine Möglichkeit?
 
Da wir gerade darüber sprechen, möchte ich eine Frage stellen, mit der ich schon seit einiger Zeit zu kämpfen habe. Hier ist ein Beispielcode:
int start()
  {
   double haOpen, haHigh, haLow, haClose;
   if(Bars<=10) return(0);
   ExtCountedBars=IndicatorCounted();
//---- check for possible errors
   if (ExtCountedBars<0) return(-1);
Was ist der grundlegende Unterschied zwischen dem ersten Return(0) und dem zweiten Return(-1)?
Wie wirkt sich dies auf die Ausführung eines Indikators (oder Expert Advisors) aus?
Was geschieht, wenn ein negativer Wert zurückgegeben wird?
Und kann ich etwas schreiben wie:
void start()
{
  //
  //...
  //
  return;
}
 
Im Prinzip gibt es keinen Unterschied, da der Rückgabewert vom Terminal (derzeit) nicht ausgewertet wird. Tatsächlich ist dies ein Aufzeichnungsstil, der dem Programmierer selbst hilft zu verstehen, dass es in diesem Fall eine nicht standardmäßige Beendigung (Wert minus 1) von start() gibt.
 
PSmith:
Und kann ich etwas schreiben wie:
void start()
{
  //
  //...
  //
  return;
}

So habe ich in letzter Zeit geschrieben. :) Außerdem verwende ich die endgültige Rückgabe überhaupt nicht. Es scheint, dass irgendwo in der Dokumentation wurde sogar gesagt, dass in Funktionen wie void endgültige Rückkehr ist nicht erforderlich.
 
Eine weitere Frage: Warum wird die Funktion
double iVolume( string symbol, int timeframe, int shift)
einen Wert vom Typ double zurückgibt?
 
Ursprünglich war es nicht double, aber irgendwann stellte sich heraus, dass der Typ int nicht immer für die Speicherung von Volumina geeignet ist (z. B. bei einem monatlichen Zeitrahmen für ein sehr volatiles Instrument). In diesem Fall kann es leicht zu einem Überlauffehler kommen.
 

Aus der Dokumentation (Datentypen): Integer-Konstanten können Werte von -2147483648 bis 2147483647 annehmen. Juli 2002, EURUSD: maximale Anzahl von Ticks pro Monat in der Geschichte, 670000. Es würde 3000 Monate, d.h. 250 Jahre dauern, bis es selbst bei diesem maximalen Tickvolumen zu einem Überlauf kommt. Andererseits können die Volumina weiter wachsen, so dass die Zahl theoretisch gar nicht so unerreichbar ist...

 
Mathemat:

Aus der Dokumentation (Datentypen): Integer-Konstanten können Werte von -2147483648 bis 2147483647 annehmen. Juli 2002, EURUSD: maximale Anzahl von Ticks pro Monat in der Geschichte, 670000. Es würde 3000 Monate, d.h. 250 Jahre dauern, bis es selbst bei diesem maximalen Tickvolumen zu einem Überlauf kommt. Andererseits können die Volumina weiter wachsen, so dass die Zahl theoretisch gar nicht so unerreichbar ist...


Ich habe diese Frage selbst gestellt und genau diese Antwort erhalten. Auch wenn es schwer zu glauben ist. Aber wenn Sie Börsenkurse in MT4 eingeben ...
 
Derselbe Monat auf _DJI - 42228720! Ja...
 

Rosh, wenn ich dein Schweigen richtig verstehe, gibt es keine klare Aussage, für welche Fälle und für welche Ausdrücke/Variablen eine Normalisierung erforderlich ist. Wenn dies der Fall ist, kann vielleicht eine einfachere Frage beantwortet werden: Ist die Normalisierung der berechneten Werte der Form

int StLs=25;
double prc = Ask + StLs*Point;

Oder soll ich das selbst herausfinden, in einem Experiment?