Gibt es einen Fehler in mt5 ObjectDelete? - Seite 3

 
Fernando Carreiro:
Welches Build haben Sie verwendet? Da es in der neuesten Build einen möglichen Fehler mit der "ObjectDelete()" Funktion zu geben scheint, könnte es sein, dass es auch Probleme mit der "ObjectFind()" Funktion gibt!

MT5: Build 1495 (09. Dezember 2016)

 
honest_knave:

MT5: Build 1495 (09 Dez 2016)

Ich habe Ihren Code auf Build 1491 ausgeführt und ähnliche Ergebnisse erhalten:

2016.12.11 12:31:05.739 test (EURUSD.m,H1)      ObjectFind took 20126 μs
2016.12.11 12:31:05.739 test (EURUSD.m,H1)      ObjectDelete took 247 μs
 
Fernando Carreiro:

Ich habe Ihren Code mit Build 1491 ausgeführt und ähnliche Ergebnisse erhalten:

Durchgängig seltsam. Vielleicht gibt es eine gute Erklärung, warum...?
 
honest_knave:

Dies könnte eher ein semantisches Problem als ein Fehler sein.

Der Zweck von ObjectDelete ist es, "das Objekt mit dem angegebenen Namen zu entfernen".

Befindet sich am Ende der Ausführung der Funktion noch ein Objekt mit dem Namen "Nicht existierendes Objekt" im Diagramm? Nein... ist dies also ein Erfolg?

Anders gefragt: Hat ObjectDelete ein Objekt mit dem Namen "Non-existing Object" entfernt? Nein... ist das also ein Misserfolg?

Messen Sie den Erfolg am Ergebnis oder an der durchgeführten Aktion?

Vielleicht wäre ein False zu erwarten, wenn das genannte Objekt nach Ausführung der Funktion im Diagramm verbleibt. Ansonsten war es ein Erfolg.

Vielleicht stimmt das, was Sie sagen, aber da wir von MQL4 auf MQL5 umstellen, erwarten wir das gleiche Ergebnis oder zumindest ein Ergebnis, das eindeutig im Rückgabewert der Referenz angegeben ist.

Um dieses erste Problem zu umgehen, habe ich die Funktion ObjectMove getestet, und auch hier erhalte ich das Ergebnis TRUE! Dies geht über Ihre Erklärung hinaus, dass das Objekt am Ende nicht verfügbar ist, so dass das Ergebnis TRUE korrekt ist.

mit ObjectMove auf ein Objekt, das nicht verfügbar ist, sollte es false zurückgeben!

moveResult=ObjectMove(ChartID(), "not available trend line",1,time[4950],low[4980]);

Print(__LINE__,"-moveResult=",moveResult);

2016.12.11 17:22:39.367 Far-Test-ChangeTrendLine (EURUSD,H1) 44-moveResult=true

 
Farzin Sadeghi:

Hallo, ich schreibe einen Indikator in MQL5, aber was auch immer ich als String-Name schreibe, ObejectDelete gibt true zurück, sogar auf einem leeren Chart ohne Objekte!


Read Object Functions Beschreibung

Dies ist eine Gruppe von Funktionen für die Arbeit mit grafischen Objekten, die sich auf ein bestimmtes Diagramm beziehen.

Die Funktionen, die die Eigenschaften von grafischen Objekten definieren, sowie die Operationen ObjectCreate() und ObjectMove() zum Erstellen und Verschieben von Objekten im Diagramm werden eigentlich dazu verwendet, Befehle an das Diagramm zu senden. Wenn diese Funktionen erfolgreich ausgeführt werden, wird der Befehl in die gemeinsame Warteschlange der Diagrammereignisse aufgenommen. Visuelle Änderungen der Eigenschaften von grafischen Objekten werden bei der Bearbeitung der Warteschlange der Diagrammereignisse implementiert.

Das bedeutet, dass der Befehl "Dieses Objekt löschen" erfolgreich angenommen wurde. Sie können das Ergebnis Ihres Befehls mit GetLastError() kontrollieren. Probieren Sie es aus - welcher Code wird zurückgegeben?
 
Rashid Umarov:

Beschreibung der Objektfunktionen lesen

Das bedeutet, dass der Befehl "Dieses Objekt löschen" erfolgreich angenommen wurde. Sie können das Ergebnis Ihres Befehls mit GetLastError() kontrollieren. Probieren Sie es aus - welcher Code wird zurückgegeben?

Ich habe den Code folgendermaßen geändert:

int ObjCount = ObjectsTotal(ChartID(),/*0=Hauptteilfenster*/0,/*alle Objekttypen*/-1);

ResetLastError();

bool deleteResult=ObjectDelete(ChartID(), "nicht vorhandenes Objekt");

Print(__LINE__,"-",deleteResult," | ObjCount=",ObjCount," | LastError=",GetLastError());

hier ist das Ergebnis :

2016.12.12 12:38:43.373 Far-TestObjectDelete (EURUSD,H1) 38-true | ObjCount=0 | LastError=0

ERR_SUCCESS

0

Die Operation wurde erfolgreich abgeschlossen


Es wird also kein Fehler zurückgegeben, um z.B. herauszufinden, dass auf das Objekt nicht zugegriffen werden konnte. Aber in MT4 wird der Fehler zurückgegeben.

 
Farzin Sadeghi:

ERR_SUCCESS

0

Die Operation wurde erfolgreich abgeschlossen


Es wird also kein Fehler zurückgegeben, um z.B. festzustellen, dass auf das Objekt nicht zugegriffen werden konnte. Aber in MT4 wird der Fehler zurückgegeben.

OK. Wie ich herausgefunden habe, wird in MQL5 in solchen Fällen kein Fehler ausgegeben, da diese Operationen asynchron sind. Sie haben also 2 Möglichkeiten:

  • prüfen Sie selbst, ob das Objekt vor dem Löschen existiert
  • Versuchen Sie, es auf jeden Fall zu löschen und machen Sie sich keine Sorgen, wenn das Objekt nicht vorhanden ist
 
Rashid Umarov:

OK. Wie ich herausgefunden habe, wird in MQL5 in solchen Fällen kein Fehler ausgelöst, da diese Operationen anisochron sind. Sie haben also 2 Möglichkeiten:

  • Prüfen Sie selbst, ob das Objekt existiert, bevor Sie es löschen
  • versuchen Sie es auf jeden Fall zu löschen und machen Sie sich keine Sorgen, wenn das Objekt nicht vorhanden ist
Auf diese Weise hat es keinen Sinn, das Ergebnis von ObjectDelete oder ObjectMove in MQL5 zu überprüfen! Ist es nicht besser, es so zu machen, wie es in MQL4 war?
 
Rashid Umarov:

GUT. Wie ich herausgefunden habe, wird in solchen Fällen in MQL5 kein Fehler ausgelöst, da diese Operationen asynchron sind. Sie haben also 2 Möglichkeiten:

  • Prüfen Sie selbst, ob das Objekt existiert, bevor Sie es löschen
  • Versuchen Sie auf jeden Fall zu löschen und machen Sie sich keine Sorgen, wenn das Objekt nicht vorhanden ist.

Wie kann es in diesem Fall false zurückgeben?

In derDokumentation von ObjectDelete() steht:

Rückgabewert

Gibt true zurück, wenn der Löschvorgang erfolgreich war, andernfalls false.

Die Dokumentation sollte klarer sein, sie sagt nicht "true if the command is accepted".

Wenn wir sicher sein wollen, dass ein Objekt gelöscht wird, müssen wir prüfen, ob es nach dem Löschbefehl noch existiert, das ist unsinnig.

Documentation on MQL5: Object Functions / ObjectDelete
Documentation on MQL5: Object Functions / ObjectDelete
  • www.mql5.com
Object Functions / ObjectDelete - Reference on algorithmic/automated trading language for MetaTrader 5
 
Alain Verleyen:

Wie kann es in diesem Fall false zurückgeben?

In der Dokumentation von ObjectDelete() steht:

Die Dokumentation sollte klarer sein, sie sagt nicht "true if the command is accepted".

Wird auf diese Weise behoben werden

Rückgabewert

Gibt true zurück, wenn der Befehl in die gemeinsame Warteschlange der Diagrammereignisse gestellt wird , andernfalls false.
Grund der Beschwerde: