c'è un bug in mt5 ObjectDelete? - pagina 3

 
Fernando Carreiro:
Quale build hai usato? Dato che sembra esserci un possibile bug nell'ultima build con la funzione"ObjectDelete()", potrebbe essere che ci siano problemi anche con la "ObjectFind()"!

MT5: Build 1495 (09 dicembre 2016)

 
honest_knave:

MT5: build 1495 (09 dicembre 2016)

Ho eseguito il tuo codice sulla build 1491 e ho ottenuto risultati simili:

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:

Ho eseguito il tuo codice sulla build 1491 e ho ottenuto risultati simili:

Coerentemente strano. Forse c'è una buona spiegazione del perché...?
 
honest_knave:

Questo potrebbe essere semantico piuttosto che un bug.

Lo scopo di ObjectDelete è di "rimuovere l'oggetto con il nome specificato".

Alla fine dell'esecuzione della funzione, c'è un oggetto chiamato "Oggetto inesistente" ancora sul grafico? No... quindi è un successo?

Guardandola in un altro modo, ObjectDelete ha rimosso un oggetto chiamato "Oggetto non esistente"? No... quindi questo è un fallimento?

Misurate il successo dal risultato o dall'azione intrapresa?

Forse ci si aspetterebbe un falso se l'oggetto chiamato rimane sul grafico dopo l'esecuzione della funzione. Altrimenti, è stato un successo.

Forse quello che dici è vero, ma siccome stiamo migrando da MQL4 a MQL5 ci aspettiamo di vedere lo stesso risultato o almeno un risultato che sia chiaramente scritto nel valore di ritorno del riferimento.

passando questo primo problema, ho testato la funzione ObjectMove, e di nuovo sto ottenendo anche il risultato TRUE! questo va oltre la tua spiegazione che perché l'oggetto non è disponibile alla fine quindi il vero è corretto.

con ObjectMove su un oggetto che non è disponibile dovrebbe restituire 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:

Ciao, sto scrivendo un indicatore in MQL5, ma qualsiasi cosa io scriva come nome di stringa ObejectDelete restituisce true! anche su un grafico vuoto senza oggetti!


Leggi la descrizione delle funzioni degli oggetti

Questo è il gruppo di funzioni destinate a lavorare con gli oggetti grafici relativi a qualsiasi grafico specificato.

Le funzioni che definiscono le proprietà degli oggetti grafici, così come le operazioni ObjectCreate() e ObjectMove() per la creazione e lo spostamento degli oggetti lungo il grafico sono effettivamente utilizzate per inviare comandi al grafico . Se queste funzioni vengono eseguite con successo, il comando viene incluso nella coda comune degli eventi del grafico. I cambiamenti visivi nelle proprietà degli oggetti grafici sono implementati quando si gestisce la coda degli eventi del grafico.

Significa che il comando "Elimina questo oggetto" è stato accettato con successo. Puoi controllare il risultato del tuo comando tramite GetLastError(). Provate - quale codice viene restituito?
 
Rashid Umarov:

Leggi la descrizione delle funzioni dell'oggetto

Significa che il comando "Elimina questo oggetto" è stato accettato con successo. Puoi controllare il risultato del tuo comando con GetLastError(). Prova - quale codice viene restituito?

Ho cambiato il codice in questo modo:

int ObjCount = ObjectsTotal(ChartID(),/*0=sottofinestra principale*/0,/*tutti gli objectTypes*/-1);

ResetLastError();

bool deleteResult=ObjectDelete(ChartID(), "oggetto non esistente");

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

ecco il risultato:

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

ERR_SUCCESSO

0

L'operazione è stata completata con successo


quindi non restituisce errore per scoprire ad esempio che non poteva accedere a quell'oggetto. ma in MT4 restituisce l'errore.

 
Farzin Sadeghi:

ERR_SUCCESSO

0

L'operazione è stata completata con successo


quindi non restituisce errore per scoprire ad esempio che non poteva accedere a quell'oggetto. ma in MT4 restituisce l'errore.

OK. Come ho scoperto non si solleva alcun errore in questo caso in MQL5 perché queste operazioni sono asincrone. Quindi hai 2 opzioni:

  • controllare se l'oggetto esiste prima di cancellarlo
  • provare a cancellarlo in ogni caso e non preoccuparsi se l'oggetto è assente
 
Rashid Umarov:

OK. Come ho scoperto non solleviamo alcun errore in questo caso in MQL5 perché queste operazioni sono anisocrone. Quindi hai 2 opzioni:

  • controllare se l'oggetto esiste prima di cancellarlo
  • provare a cancellarlo in ogni caso e non preoccuparsi se l'oggetto è assente
In questo modo non c'è bisogno di controllare il risultato di ObjectDelete o ObjectMove in MQL5! Non è meglio tornare a come era in MQL4?
 
Rashid Umarov:

OK. Come ho scoperto non solleviamo alcun errore in questo caso in MQL5 perché queste operazioni sono asincrone. Quindi hai 2 opzioni:

  • controllare se l'oggetto esiste prima di cancellarlo
  • provate a cancellarlo in ogni caso e non preoccupatevi se l'oggetto è assente

Come potrebbe restituire false in questo caso?

Ladocumentazione di ObjectDelete() dice:

Valore di ritorno

Restituisce true se la rimozione ha avuto successo, altrimenti restituisce false.

La documentazione dovrebbe essere più chiara, non dice "vero se il comando è accettato".

Se vogliamo essere sicuri che un oggetto sia cancellato, dovremo controllare se esiste dopo il comando di cancellazione, non ha senso.

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:

Come potrebbe restituire false in questo caso?

Ladocumentazione di ObjectDelete() dice:

La documentazione dovrebbe essere più chiara, non dice "vero se il comando è accettato".

Sarà fissato in questo modo

Valore di ritorno

Restituiscetrue se il comando viene messo nella coda comune degli eventi del grafico , altrimenti restituisce false.