Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 158

 

Es gibt eine Matrix, die sowohl mit großen, etwa 10e60, als auch mit kleinen, etwa 1e-40, Werten gefüllt ist. Und es gibt einen Code wie diesen

      for(k=-16;k<=16;++k)
      {
        double Tmp1=(double)(DoubleToString(Matrix[i][j],k));
        double Tmp2=(double)((string)Matrix[i][j]);
        if(Tmp1==Tmp2)
          break;
      }
In etwa 27 % der Fälle ist k=-15. In anderen Fällen ist k=-16. Daher eine Frage: Gibt es eine Möglichkeit, die Operation(string)Matrix[i][j] durch eine strengere Konvertierungsfunktion zu ersetzen? Oder gibt es vielleicht eine Funktion, die einige der Nachkommastellen abschneidet? NormalizeDouble ist nicht richtig, es wird 1.12345678e-40 in 0 abgeschnitten. Ich möchte, dass es nach dem Dezimalpunkt abgeschnitten wird. Oder die Umwandlung in (String) hat ein Eigenleben und kann nicht durch Funktionen ausgedrückt werden? Ich danke Ihnen.
 
traveller00:

Modulus der Differenz.

 
fxsaber:

Das Modul der Differenz.

Könnten Sie etwas genauer sein? Vielleicht mit einem Codebeispiel? Was ist der Unterschied zwischen was und was?

Der Punkt ist, dass eine solche Doppelkonvertierung(double)((string)Matrix[i][j]);; eine unkontrollierbare Anzahl von Zeichen nach dem Dezimalpunkt abschneidet. Ich möchte diese Kürzung beibehalten = einerseits wiederholen können und andererseits die Anzahl der Zeichen kontrollieren.

 
traveller00:

Könnten Sie etwas genauer sein? Vielleicht mit einem Codebeispiel? Unterschiede zwischen was und was?

if (MathAbs(Value1 - Value2) < Epsilon)
 

Ah, ich verstehe, was Sie meinen. Nein, die Frage ist ein bisschen anders. Der Vergleich dient hier nur als Beispiel, um zu zeigen, dass wir die Umwandlung über (double)((string)Matrix[i][j]); nicht durch die Umwandlung über DoubleToString ersetzen können. In der Tat handelt es sich bei der vorliegenden Aufgabe nicht um einen Vergleich. Es handelt sich vielmehr um eine gewisse Zurücksetzung der Genauigkeit durch eine solche doppelte Umrechnung. Auf der einen Seite möchte ich in der Lage sein, Clipping über (String) zu wiederholen, auf der anderen Seite möchte ich in der Lage sein, die Clipping-Genauigkeit zu kontrollieren, wie DoubleToString tut.

Und nebenbei gefragt: Könnte es sein, dass diese Bekehrungen auf unterschiedliche Weise erfolgen und ihr eigenes, unabhängiges Leben führen?

 
traveller00:

Ah, ich verstehe, was Sie meinen. Nein, die Frage ist ein bisschen anders. Der Vergleich dient hier nur als Beispiel, um zu zeigen, dass wir die Umwandlung über (double)((string)Matrix[i][j]); nicht durch die Umwandlung über DoubleToString ersetzen können. In der Tat handelt es sich bei der vorliegenden Aufgabe nicht um einen Vergleich. Es handelt sich vielmehr um eine gewisse Zurücksetzung der Genauigkeit durch eine solche doppelte Umrechnung. Auf der einen Seite möchte ich in der Lage sein, Clipping über (String) zu wiederholen, auf der anderen Seite möchte ich in der Lage sein, die Clipping-Genauigkeit zu kontrollieren, wie DoubleToString tut.

Und nebenbei bemerkt, frage ich mich, ob diese Umwandlungen auf unterschiedliche Weise erfolgen und ihr eigenes, unabhängiges Leben führen.

Ich verstehe nicht, warum NormalizeDouble undDoubleToString nicht befriedigen Sie, Sie haben jede Präzision, die Sie wollen, oder Sie wollen einige Präzision, aber Sie wissen nicht, was es ist?

 

Ich stimme zu, dass die Aufgabe nicht völlig transparent ist. Ich versuche nämlich, eine Art Krücke für die Tests zusammenzustellen.

Angenommen, es gibt eine Zahl 1,0123456789e-50. Ich muss es mit einer gewissen Präzision runden, damit:

1. Standardmäßig funktioniert sie als Doppelkonvertierung über(string).

2. die Genauigkeit kann auf Wunsch kontrolliert werden.

Daher istNormalizeDouble nicht geeignet, es wird einfach diese Zahl null. Und DoubleToString erlaubt es nicht, das Ergebnis aus Schritt 1 zu wiederholen.

Das Problem ergibt sich aus der nächsten Frage. Wie ich oben geschrieben habe, gibt es eine Matrix. Die Inverse dieser Matrix wird berechnet. Manchmal (vielleicht aufgrund von Fehlern, die auf die begrenzte Genauigkeit von Double zurückzuführen sind) erweist sich die Matrix als entartet und die Inverse kann nicht berechnet werden. Aber wenn Sie die Genauigkeit ein wenig reduzieren, können Sie immer noch die Umkehrung berechnen. Deshalb wollte ich einige Tests durchführen und eine Statistik darüber erstellen, inwieweit das Ergebnis mit dem wahren Ergebnis übereinstimmt. Die doppelte Konvertierung über (string) löst das Problem in den meisten Fällen. Aber manchmal reicht das nicht aus, und ich würde gerne kontrollieren können, wie genau geschnitten wird. Und DoubleToString, selbst mit einer Genauigkeit von -16 bis 16, löst das Problem in den meisten Fällen nicht.

 

Können Sie mir bitte sagen, bitte.

Im Indikator wird die Reihenfolge der Reihen, z.B. close[], einmalig durch ArraySetAsSeries() oder auf andere Weise festgelegt?

Geschieht dies in OnCalculate() oder in OnInit()?

Ich bin auf eine verwirrende Situation gestoßen:

Order in close[], gesetzt durch AS_SERIES bei Eingabe beim ersten Tick, wechselt beim nächsten Tick spontan zu normal, d.h. !AS_SERIES.

Ich habe keinen Grund gefunden, dies im Code zu tun.

 
Yurixx:

Können Sie mir bitte sagen, bitte.

Im Indikator wird die Reihenfolge der Reihen, z.B. close[], einmalig durch ArraySetAsSeries() oder auf andere Weise festgelegt?

Geschieht dies in OnCalculate() oder in OnInit()?

Ich bin auf eine verwirrende Situation gestoßen:

Order in close[], gesetzt durch AS_SERIES bei Eingabe beim ersten Tick, wechselt beim nächsten Tick spontan zu normal, d.h. !AS_SERIES.

Ich habe den Grund dafür im Code nicht gefunden.

Und Sie werden das close[]-Array in OnInit() nicht sehen. Und keiner der anderen vordefinierten OnCalculate()-Parameter.

Daher die Schlussfolgerung - nur in OnCalculate().

 
Artyom Trishkin:

Und in OnInit() sehen Sie das Array close[] nicht. Und keiner der anderen vordefinierten OnCalculate()-Parameter.

Daher die Schlussfolgerung - nur in OnCalculate().

Ich bin zu demselben Schluss gekommen. )))

Es bleibt abzuwarten, ob es ausreicht, diesen Befehl einmal zu setzen, oder ob er bei jedem Tick ausgeführt werden sollte.