Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 6. - Seite 156

 

1) Warum wird bei der Deklaration von int err=0 nicht sofort initialisiert?

2) Ich habe es nicht überprüft, aber laut Dokumentation wird err in einer Variablen gespeichert, die bei Verwendung der Funktion GetLastError() automatisch auf Null gesetzt wird,

und ändert sich auch immer, wenn einige Funktionen (meist Terminalfunktionen) verwendet werden

3) Dies ist der Grund, warum GetLastError() den Wert 0 anzeigte, nachdem es sich auf eine nicht existierende Ticketnummer in OrderSelect bezog:

"Die anderen Funktionen ändern den Wert der Variablen last_error unter keinen Umständen. ................., OrderSelect, ...................."

 
hoz:

Oft würde ich eine Variable wie diese innerhalb von Funktionen deklarieren:

Weiter drinnen rufe ich sie bereits unter einer bestimmten Bedingung auf, um zu sehen, ob es einen Fehler gibt. Nun, das ist nicht nur bei mir so, sondern auch an vielen anderen Stellen des Codes, auf die ich gestoßen bin. Es ist sozusagen eine typische Situation. Ich habe mir heute überlegt, dass es nicht logisch ist, in jeder Funktion, in der man Fehler kontrollieren will, jedes Mal die gleiche Variable zu deklarieren. Ich habe darüber nachgedacht und bin zu dem Schluss gekommen, dass es einfacher ist, einmal global zu deklarieren und es im Init zu initialisieren. Das geht so:

Und außerdem, wenn Sie die err-Variable in Benutzerfunktionen aufrufen müssen, weil Sie wissen, dass sie bereits einen Wert hat. Wenn also diese Variable err in jeder Funktion am Ende aller Berechnungen aufgerufen wird, die für die Ausgabe des Fehlercodes verantwortlich ist, und GetLastError() aufruft, dann ist doch alles korrekt, oder?

Aber wenn man diese Variable nicht am Ende einer Funktion aufruft (der Kette der Codeausführung folgend), wird sie nicht zurückgesetzt, und es könnte zu einer falschen Ausführung kommen, falls es einen Fehler in der vorherigen Ausführung gab, aber nicht in der aktuellen, aber der Fehlercode wird zuletzt zurückgegeben... Und um sie zurückzusetzen, müssen Sie diese Funktion GetLastError() aufrufen. D.h. hier hängt alles davon ab, ob es aufgerufen wurde oder nicht. Wenn Sie nicht sicher sind, dass es überall sein wird, ist es einfacher, es jedes Mal neu zu versichern und zurückzusetzen, oder?

Sie können den Fehler global deklarieren und ihn dann in start() vor dem Aufruf von GetLastError() zurücksetzen, z. B:

int err;
//------------------
int init() 
{
  // ...
  return(0);
}
//------------------
int start() 
{ 
  // ...
  RefreshRates();
  OrderClose(...);
  err=0;     // обнуление
  err=GetLastError();
  SomeErrFunction(err);
  // ...
return(0);
}
 
ALXIMIKS:

1) Warum wird bei der Deklaration von int err=0 nicht sofort initialisiert?


Probieren Sie es aus!:) Bei mir hat es nicht funktioniert. So wie ich es verstanden habe, ist die Initialisierung durch spezielle Funktionen in globalen Variablen nicht erlaubt. Allerdings scheint die Dokumentation nichts darüber zu sagen.
ALXIMIKS:

2) Ich habe es nicht überprüft, aber laut Dokumentation wird err in einer Variablen gespeichert, die bei Verwendung der Funktion GetLastError() automatisch auf Null gesetzt wird,

und ändert sich auch immer, wenn einige Funktionen (meist Terminalfunktionen) verwendet werden

Über die Nullstellung und schrieb oben, aber es geht, wenn nach Wert bekommt in LastError Variable(), dann müssen wir, um sie zurückzusetzen, die Funktion GetLastError aufrufen() um den Code des letzten Fehlers zurückzugeben und die Variable LastError zurückzusetzen. Andernfalls wird der Code des letzten Fehlers dauerhaft gespeichert, bis Sie GetLastError aufrufen() und kann folglich den Code des letzten Fehlers zurückgeben, wenn dieser nicht mehr existiert. (d.h. in einer anderen Funktion, um das Lesen des Protokolls oder den Ausdruck zu erschweren).
ALXIMIKS:

3) Dies ist der Grund, warum GetLastError() einen Wert von 0 an zeigte, nachdem es sich auf eine nicht vorhandene Ticketnummer in OrderSelect bezog:

"Die anderen Funktionen ändern den Wert der Variablen last_error unter keinen Umständen. ................., OrderSelect, ...................."

Dies liegt höchstwahrscheinlich nicht an OrderSelect(), sondern an einem anderen Fehler (in der Nähe derselben Funktion). Vor allem wird sie oft von vielen anderen Dingen beeinflusst.
 
paladin80:

Sie können err global deklarieren und es dann in start() auf Null setzen, bevor Sie GetLastError() aufrufen, z. B:

Wenn Sie es zu Beginn deklarieren und dann mehr als 1 Fehler im Code, dann ist die Logik bereits aus dem Ruder gelaufen. Es sei denn, GetLastError() wird ständig aufgerufen (theoretisch am Ende jeder Benutzerfunktion).
 
hoz:
dann gibt es bereits ein logisches Problem. Es sei denn, GetLastError() wird ständig aufgerufen(theoretisch am Ende jeder Benutzerfunktion).

Manchmal muss man öfters anrufen
 

Victor (hoz), ich verstehe nicht, warum Sie sich über den letzten Fehler aufregen.

Deklarieren Sie eine Funktion zur Fehlerbehandlung und rufen Sie sie bei Bedarf auf. Alles wird lokal sein und kann überall verwendet werden.

// Объявление:
void CommentError(int nLastCodeError, string sComment)
 {
  if (nLastCodeError != 0) Print(sComment, "  ", ErrorDescription(nLastCodeError));
 }

// Вызов:
void start()
 {
  CommentError(GetLastError(), "Ошибка в функции start()!");
 }
 
Zhunko:

Victor (hoz), ich verstehe nicht, warum Sie sich über den letzten Fehler aufregen.

Deklarieren Sie eine Funktion zur Fehlerbehandlung und rufen Sie sie bei Bedarf auf. Alles wird lokal sein und kann überall verwendet werden.


Das ist verständlich. Aber diese Funktion wird aufgerufen, wenn ich sie brauche, d.h. wenn ich prüfen will, ob ein Fehler vorliegt. Wenn aber vorher irgendwo ein Fehler aufgetreten ist und im Moment kein Fehler vorliegt, wird der vorherige Fehler zurückgegeben... Denn in Ihrer Funktion Vadim wird die Variable LastError durch den Aufruf von GetLastError() nicht auf Null gesetzt. Die Sache ist die...
 
hoz:

Das ist verständlich. Aber diese Funktion wird aufgerufen, wenn ich sie brauche, d.h. wenn ich prüfen will, ob ein Fehler vorliegt. Wenn aber vorher irgendwo ein Fehler aufgetreten ist und jetzt kein Fehler vorliegt, wird der vorherige Fehler zurückgegeben... Denn in Ihrer Funktion Vadim wird die Variable LastError durch den Aufruf von GetLastError() nicht auf Null gesetzt. Das ist der Punkt...

Sie sollte nicht auf Null zurückgesetzt werden. Es sollte zur Gewohnheit werden, nach Funktionen überall nach Fehlern zu suchen. Sie sollten den Anruf auch deaktivieren. Damit es im Kampfmodus nicht langsamer wird. D.h. es ist ein solcher Debugger.

Die Ausnahme sind natürlich Fehler, die analysiert werden müssen, um eine Entscheidung zu treffen.

 
hoz:

Das ist verständlich. Aber diese Funktion wird aufgerufen, wenn ich sie brauche, d.h. wenn ich prüfen will, ob ein Fehler vorliegt. Wenn aber vorher irgendwo ein Fehler aufgetreten ist und im Moment kein Fehler vorliegt, wird der vorherige Fehler zurückgegeben... Denn in Ihrer Funktion Vadim wird die Variable LastError durch den Aufruf von GetLastError() nicht auf Null gesetzt. Hier ist der Punkt...
Was hindert ihn daran, zuerst auf Null zu setzen (err=0;), dann die Aktion aufzurufen, dann err=GetLastError() zuzuweisen, sie zu behandeln und wieder err=0.
 
Wie berechnet man den Gewinnfaktor bei unterschiedlichen T/P und S/L? Es ist klar, wenn Take und Stop jeweils 20 Pips betragen, berechnen wir die Anzahl der gewinnbringenden und verlustbringenden Trades und teilen sie. Wie berechne ich, wenn ich einen TP von 40 Pips und den Stop von 30 Pips nehme? Wir werden es auf dieselbe Weise verwenden, wie wir es auch an derselben Stelle verwenden.