y a-t-il un bug dans mt5 ObjectDelete ? - page 3

 
Fernando Carreiro:
Quelle build avez-vous utilisée ? Comme il semble y avoir un bug possible dans la dernière build avec la fonction"ObjectDelete()", il se pourrait qu'il y ait aussi des problèmes avec la fonction "ObjectFind()" !

MT5 : Build 1495 (09 Dec 2016)

 
honest_knave:

MT5 : Build 1495 (09 Dec 2016)

J'ai exécuté votre code sur la build 1491 et j'ai obtenu des résultats similaires :

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:

J'ai exécuté votre code sur la version 1491 et obtenu des résultats similaires :

Constamment étrange. Peut-être y a-t-il une bonne explication à cela... ?
 
honest_knave:

Cela pourrait être sémantique plutôt qu'un bug.

Le but de ObjectDelete est de "supprimer l'objet portant le nom spécifié".

À la fin de l'exécution de la fonction, y a-t-il encore un objet appelé "Objet non existant" sur le graphique ? Non... alors est-ce un succès ?

D'un autre point de vue, ObjectDelete a-t-il supprimé un objet appelé "Objet non existant" ? Non... alors est-ce un échec ?

Mesurez-vous le succès par le résultat ou l'action entreprise ?

Peut-être qu'un faux serait attendu si l'objet nommé reste sur le graphique après l'exécution de la fonction. Sinon, c'est un succès.

Ce que vous dites est peut-être vrai, mais comme nous passons de MQL4 à MQL5, nous nous attendons à voir le même résultat ou du moins un résultat qui est clairement écrit dans la valeur de retour de la référence.

En passant ce premier problème, j'ai testé la fonction ObjectMove, et encore une fois, j'ai obtenu un résultat VRAI aussi ! Cela va au-delà de votre explication que parce que l'objet n'est pas disponible à la fin, le vrai est correct.

Avec ObjectMove sur un objet qui n'est pas disponible, il devrait retourner false !

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:

Bonjour, je suis en train d'écrire un indicateur en MQL5, mais quoi que j'écrive comme nom de chaîne ObejectDelete retourne vrai ! même sur un graphique vide sans objets !


Description de Read Object Functions

Il s'agit du groupe de fonctions destinées à travailler avec des objets graphiques relatifs à un graphique spécifié.

Les fonctions définissant les propriétés des objets graphiques, ainsi que les opérations ObjectCreate() et ObjectMove() pour créer et déplacer des objets le long du graphique sont en fait utilisées pour envoyer des commandes au graphique. Si ces fonctions sont exécutées avec succès, la commande est incluse dans la file d'attente commune des événements du graphique. Les modifications visuelles des propriétés des objets graphiques sont mises en œuvre lors du traitement de la file d'attente des événements du graphique.

Cela signifie que la commande "Supprimer cet objet" a été acceptée avec succès. Vous pouvez contrôler le résultat de votre commande par GetLastError(). Essayez-le - quel code est renvoyé ?
 
Rashid Umarov:

Lire la description des fonctions des objets

Cela signifie que la commande "Delete this object" a été acceptée avec succès. Vous pouvez contrôler le résultat de votre commande par GetLastError(). Essayez-le - quel est le code renvoyé ?

J'ai modifié le code de la façon suivante :

int ObjCount = ObjectsTotal(ChartID(),/*0=main subwindow*/0,/*all objectTypes*/-1) ;

Remise à zéro de la dernière erreur() ;

bool deleteResult=ObjectDelete(ChartID(), "objet non existant") ;

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

voici le résultat :

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

ERR_SUCCESS

0

L'opération s'est terminée avec succès


donc il ne retourne pas d'erreur pour savoir par exemple qu'il n'a pas pu accéder à cet objet. mais dans MT4 il retourne l'erreur.

 
Farzin Sadeghi:

ERR_SUCCESS

0

L'opération s'est terminée avec succès


Il ne renvoie donc pas d'erreur pour savoir, par exemple, qu'il n'a pas pu accéder à cet objet, mais dans MT4, il renvoie l'erreur.

OK. Comme je l'ai découvert, nous ne soulevons pas d'erreur dans ce cas dans MQL5 car ces opérations sont asynchrones. Vous avez donc 2 options :

  • vérifier vous-même si l'objet existe avant de le supprimer
  • essayer de le supprimer dans tous les cas et ne pas s'inquiéter si l'objet est absent.
 
Rashid Umarov:

OK. Comme je l'ai découvert, nous ne soulevons pas d'erreur dans ce cas dans MQL5 car ces opérations sont anisochrones. Vous avez donc 2 options :

  • vérifier vous-même si l'objet existe avant de le supprimer
  • essayer de le supprimer dans tous les cas et ne pas s'inquiéter si l'objet est absent.
De cette façon, il est inutile de vérifier le résultat d'ObjectDelete ou ObjectMove dans MQL5 ! Ne vaut-il pas mieux revenir à la façon dont c'était le cas dans MQL4 ?
 
Rashid Umarov:

OK. Comme je l'ai découvert, nous ne soulevons pas d'erreur dans un tel cas dans MQL5 car ces opérations sont asynchrones. Vous avez donc 2 options :

  • vérifier vous-même si l'objet existe avant de le supprimer
  • essayez de le supprimer dans tous les cas et ne vous inquiétez pas si l'objet est absent

Comment cela peut-il retourner false dans ce cas ?

La documentation de ObjectDelete() dit:

Valeur de retour

Retourne true si la suppression a réussi, sinon retourne false.

La documentation devrait être plus claire, elle ne dit pas "true if the command is accepted".

Si nous voulons être sûrs qu'un objet est supprimé, nous devrons vérifier s'il existe après la commande de suppression, c'est un non-sens.

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:

Comment peut-il retourner false dans ce cas ?

La documentation de ObjectDelete() dit:

La documentation devrait être plus claire, elle ne dit pas "vrai si la commande est acceptée".

Il sera corrigé de cette façon

Valeur de retour

Retourne vrai si la commande est placée dans la file d'attente commune des événements du graphique , sinon retourne faux.