Ermitteln der Anzahl der Dezimalstellen beliebiger Zahlen (nicht nur Anführungszeichen) unter Umgehung von Digits() in MQL4 und MQL5 - Seite 9

 
Mesaoria:

Das ist nicht das, was ich gemeint habe. Die Idee, ein Duble in eine Zeichenkette umzuwandeln, um dann die Zeichen in der Zeichenkette zu zählen, ist völliger Unsinn. Ganz gleich, was Sie tun.

Was ist denn so schlimm daran? Bislang ist diese Option die schnellste, funktionellste und garantiert korrekteste. Was sind Ihre Möglichkeiten?

 
Alexandr Sokolov:
Ja, meine Variante ist wahrscheinlich nicht die beste, aber da ich noch nie etwas darüber gefunden habe, ist es die beste, die ich mir selbst ausgedacht habe, wie ich oben kommentiert habe, während Sie keine eigene Variante vorgeschlagen haben.

Ich habe diese Varianten verglichen:

int ds(double v){
   string s=(string)v;
   int l=StringLen(s);
   int n=l-StringFind(s,".",0)-1;
   if(StringSubstr(s,l-1,1)=="0")n--;
   return(n);
}

int d(double x){
   int n;
   for(n=0;n<8;n++){
      if(x==NormalizeDouble(x,n)){
         return(n);
      }
   }
   return(n-1);
}

Die String-Variante ist etwas schneller und nicht wie d() auf 8 Ziffern beschränkt. Und die Garantie für die Korrektheit ist die Zählung durch die Art und Weise, wie das Terminal die Zahl anzeigt.

Ich wähle die Variante mit Konvertierung in String.

 
Dmitry Fedoseev:

Was ist denn so schlimm daran? Bislang ist diese Option die schnellste, funktionellste und garantiert die richtige. Was sind Ihre Möglichkeiten?

Können Sie mindestens einen Fall nennen, in dem der obige Algorithmus angewendet wurde?

 
Mesaoria:

Können Sie mindestens einen Fall nennen, in dem der obige Algorithmus angewendet wurde?

Es gab einen Fall, in dem das Handels-Panel die Losgröße mit der korrekten Anzahl von Dezimalstellen im Textfeld ausgab. Dies ist der einzige Fall.

 
Dmitry Fedoseev:

In einem Fall gab das Handels-Panel die Losgröße mit der korrekten Anzahl von Dezimalstellen im Textfeld aus. Dies ist der einzige Fall.

D.h. es wird "1" im Falle von 1 Lot und "0.01" im Falle von 0.01 Lot ausgegeben?

 
Mesaoria:

Es wird also "1" im Falle von 1 Lot und "0,01" im Falle von 0,01 Lots ausgegeben?

Nicht ganz. Das hängt von der Mindestmenge und der Losgröße ab. Wenn die Mindestmenge 0,01 beträgt, wird 1 als 1,00 angezeigt.

 
Dmitry Fedoseev:

Nicht wirklich. Abhängig von der Mindestparzelle und dem Parzellenzuwachs. Wenn die Mindestmenge 0,01 beträgt, wird 1 als 1,00 angezeigt.

o.ä.

Es stellt sich also heraus, dass Sie Ihre Funktion nicht verwenden, sondern immer noch etwas wie DoubleToString(LotSize, <some const value>) anzeigen, oder?

 
Mesaoria:

O.o

Es stellt sich also heraus, dass Sie Ihre Funktion nicht verwenden, aber trotzdem so etwas wie DoubleToString(LotSize, <einem konstanten Wert>) ausgeben, oder?

Ja, aber Sie müssen wissen, wie viele Dezimalstellen ausgegeben werden sollen.

 
Dmitry Fedoseev:

Ja, aber Sie müssen wissen, wie viele Dezimalstellen ausgegeben werden sollen.

Mit anderen Worten: Verwenden Sie das vom Benutzer eingegebene Mindestlos (oder den Losschritt), um zu bestimmen, wie viele Dezimalstellen dieser Wert hat, und speichern Sie ihn dann, um zukünftige Werte zu normalisieren?

 
Mesaoria:

Das heißt, Sie ermitteln anhand der vom Benutzer eingegebenen Mindestmenge (oder Mengenschrittweite), wie viele Nachkommastellen dieser Wert hat, und speichern ihn dann, um zukünftige Werte zu normalisieren?

Was verstehst du nicht? Für den Preis gibt es Digits(), für das Volumen nicht. So wird sie berechnet.

Warum brauchen Sie Volumenangaben? Aus demselben Grund brauchen wir die Preisziffern!