Fehler, Irrtümer, Fragen - Seite 1782

 
-Aleks-:

Welche davon funktionieren?

Die Regel, signifikante Ziffern zu verlieren und mit Zufallszahlen zu füllen, funktioniert

Das Ergebnis ist lang, aber in den Zwischenberechnungen von double und dort gehen signifikante Ziffern verloren

(Ziffern+1)*3-1=17

 
A100:

Die Regel, signifikante Ziffern zu verlieren und sie mit Zufallszahlen aufzufüllen, funktioniert

Das Ergebnis ist lang, aber in den Zwischenberechnungen von double und dort gehen signifikante Ziffern verloren

(Ziffern+1)*3-1=17

Ich danke Ihnen für die Informationen.

Allerdings ist die Information schwer zu erfassen - d.h. die Zahl kann so sein, aber man kann damit keine Berechnungen anstellen?

Hier ist ein Beispiel für einen Code, in dem eine Zeichenkette in eine Zahl umgewandelt wird

long CalcY=StringToDouble("111111111111111111");
Print ("CalcY=",CalcY);

Druckt die Zahl 11111111111111111104.

D.h. es gibt hier keine Berechnungen oder liege ich falsch?

Ist es möglich, diese Zahlen zu verarbeiten, oder handelt es sich um sprachliche Einschränkungen?

 
-Aleks-:

Es gibt hier also keine Berechnungen, oder irre ich mich?

Eine Berechnung ist eine beliebige Operation (in diesemFall eine Umrechnung). Für die angegebene Zahl gibt StringToDouble double mit Verlust der Genauigkeit zurück

StringToInteger gibt long zurück, aber weitere Funktionen, die mit double arbeiten, können nicht ohne Präzisionsverlust in Berechnungen verwendet werden, wie NormalizeDouble, MathPow

 
A100:

Berechnung - eine beliebige Operation (in diesem Fall eine Umwandlung). StringToDouble gibt double zurück - es gibt einen Verlust an Präzision

StringToInteger gibt long zurück, aber weitere Funktionen, die mit double arbeiten, können nicht ohne Präzisionsverlust in Berechnungen verwendet werden, wie NormalizeDouble, MathPow,

StringToInteger funktionierte, um die Zahl auszudrücken, aber dann wird es noch schlimmer, ich schätze, die Zahl muss für mathematische Operationen in ihre Bestandteile zerlegt werden...

long CalcZ=StringToInteger("111111111111111111");
Print ("CalcZ=",CalcZ);

double Test=CalcZ;
Print ("Test=",Test);

Test=1.111111111111111e+17

 

Auch dies ist im Helpdesk beschrieben

INT_MAX

Maximaler Wert, der durch den Typ int dargestellt werden kann

2147483647

Wie hat dann StringToInteger die Konvertierung durchführen und speichern Sie es in lange, wenn die Zahl größer als zulässig ist?

 
-Aleks-:

Wie hat dann StringToInteger konvertieren und speichern, um lange, wenn die Zahl größer als zulässig ist?

StringToInteger gibt ursprünglich long innerhalb vonLONG_MINLONG_MAX zurück (es könnte auch StringToColobok genannt werden)

 
A100:
StringToInteger gibt ursprünglich long zurück (es hätte genauso gut StringToBoob heißen können)

Das ist sicherlich richtig, aber die Hilfedatei ist so clever.

"

Konvertiert eine Zeichenkette, die eine Zeichendarstellung einer Zahl enthält, in eine int-Zahl(Ganzzahl).

"

Das war es, was mich in die Irre geführt hat.

Vielen Dank für die Informationen.

Ich nehme an, dass die obige Zahlendarstellung nicht in den grafischen Puffer passt?

 
-Aleks-:

Ich nehme an, dass die obige Zahl nicht in den grafischen Puffer passt?

Sie werden als B'1111111111111111111111111111111111' geschrieben

 
A100:

Ich behaupte (und schlage vor, dies zu überprüfen), dass, wenn der Zeitrahmen von M5 auf M15 geändert wird, kein M5-Deinit-Befehl an den ersten Indikator (und nur an diesen - in diesem Fall M5) gesendet wird und er nicht aus dem Diagramm entladen wird, bis der Benutzer den EA löscht

Glory hat Recht, und das Entladen funktioniert korrekt.

Beachten Sie, dass der Berechnungskern des Indikators in MT5 eine gemeinsam genutzte Ressource mit einem Nutzungszähler in einem eigenen Manager ist. Wenn verschiedene Programme oder Fenster den Indikator mit denselben Parametern verwenden, funktioniert tatsächlich nur eine Berechnungskopie mit dem Nutzungszähler. Dies spart eine Menge Geld, wenn ein Händler die gleichen Indikatoren in Charts und in einem Expert Advisor verwendet.

Der Indikatormanager ist so konzipiert, dass er Indikatoren physisch asynchron und mit einer Verzögerung löscht. Und in der Zwischenzeit wird eine neue Arbeitskopie mit neuen Parametern erstellt, die oft initialisiert wird, bevor die alte Kopie physisch gelöscht wird.
 
Renat Fatkhullin:
Der Indikatormanager ist so konzipiert, dass er Indikatoren physisch asynchron und mit einer Verzögerung entfernt. Und in der Zwischenzeit wird eine neue Arbeitskopie mit neuen Parametern erstellt, die häufig initialisiert wird, bevor die alte Kopie physisch gelöscht wird.

Vereinfachen wir den Indikator

//Test_i.mq5 //Индикатор
void Prn( string f, int i = -1 ) { Print( f, "->", StringSubstr( EnumToString( Period()), 7 ), (i == -1 ? "" : ":" + i )); }
void OnInit()                    { Prn( __FUNCTION__ );         }
void OnDeinit( const int reason ) { Prn( __FUNCTION__, reason ); }
int OnCalculate( const int, const int, const int, const double& [] ) { return 0; }

Hängen wir die Datei Test.mq5 an das M5-Diagramm an und ändern wir die Diagrammperiode von M5->M15

Ergebnis:

2017.02.06 00:54:20.897 OnInit->M5
2017.02.06 00:54:25.553 OnInit->M15

Frage: Wann wird OnDeinit->M5 aufgerufen?

Meine Antwort: Niemals!

Ihre Antwort oben: asynchron und mit Verzögerung

Dateien:
Test.mq5  1 kb