há algum bug no mt5 ObjectDelete? - página 3

 
Fernando Carreiro:
Que construção você usou? Como parece haver um possível bug na última construção com a função"ObjectDelete()", pode haver também problemas com o "ObjectFind()"!

MT5: Construir 1495 (09 Dez 2016)

 
honest_knave:

MT5: Construir 1495 (09 Dez 2016)

Eu corri seu código no build 1491 e obtive resultados semelhantes:

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:

Eu corri seu código no build 1491 e obtive resultados semelhantes:

Consistentemente estranho. Talvez haja uma boa explicação para...?
 
honest_knave:

Isto poderia ser mais semântico do que um bug.

O objetivo do ObjectDelete é "remover o objeto com o nome especificado".

No final da execução da função, ainda há um objeto chamado "Objeto não-existente" no gráfico? Não... Então, este sucesso é um sucesso?

Olhando de outra forma, o ObjectDelete removeu um objeto chamado "Objeto Não Existente"? Não... então este fracasso é um fracasso?

Você mede o sucesso pelo resultado ou pela ação tomada?

Talvez um falso seria esperado se o objeto nomeado permanecesse no gráfico após a execução da função. Caso contrário, foi um sucesso.

Talvez o que você diz seja verdade, mas como estamos migrando de MQL4 para MQL5, esperamos ver o mesmo resultado ou pelo menos um resultado que esteja claramente escrito no valor de retorno da referência.

Passando este primeiro problema, testei a função ObjectMove, e novamente estou obtendo um resultado VERDADEIRO também! isto vai além de sua explicação de que, como o objeto não está disponível no final, então o verdadeiro está correto.

com ObjectMove em um objeto que não está disponível, ele deve retornar falso!

moveResult=ObjectMove(ChartID(), "linha de tendência não disponível",1,tempo[4950],baixo[4980]));

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

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

 
Farzin Sadeghi:

oi , estou escrevendo um indicador em MQL5, mas o que quer que eu escreva como nome de string ObejectDelete retorna verdadeiro ! mesmo em um gráfico vazio, sem objetos!


Leia a descrição das funções dos objetos

Este é o grupo de funções destinadas a trabalhar com objetos gráficos relacionados a qualquer gráfico especificado.

As funções que definem as propriedades dos objetos gráficos, assim como as operações ObjectCreate() e ObjectMove() para criar e mover objetos ao longo do gráfico são realmente usadas para enviar comandos para o gráfico . Se estas funções forem executadas com sucesso, o comando é incluído na fila comum dos eventos do gráfico. Mudanças visuais nas propriedades dos objetos gráficos são implementadas ao lidar com a fila de eventos do gráfico.

Isso significa que o comando "Apagar este objeto" foi aceito com sucesso. Você pode controlar o resultado de seu comando por GetLastError(). Experimente-o - qual código é retutado?
 
Rashid Umarov:

Ler Descrição das funções do objeto

Isso significa que o comando "Apagar este objeto" foi aceito com sucesso. Você pode controlar o resultado de seu comando por GetLastError(). Experimente-o - qual código é retutado?

Eu mudei o código desta forma :

int ObjCount = ObjectsTotal(ChartID(),/*0=subjanela principal*/0,/*todos os objetosTypes*/-1);

ResetLastError();

bool deleteResult=ObjectDelete(ChartID(), "objeto não existente");

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

aqui está o resultado :

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

ERR_SUCCESS

0

A operação foi concluída com sucesso


por isso não retorna o erro para descobrir, por exemplo, que não pôde acessar aquele objeto. mas no MT4 retorna o erro.

 
Farzin Sadeghi:

ERR_SUCCESS

0

A operação foi concluída com sucesso


por isso não retorna o erro para descobrir, por exemplo, que não pôde acessar aquele objeto. mas no MT4 retorna o erro.

OK. Como eu descobri, não levantamos nenhum erro em tal caso na MQL5 porque estas operações são assíncronas. Portanto, você tem 2 opções:

  • verifique você mesmo se o objeto existe antes de excluir
  • tente apagá-lo em qualquer caso e não se preocupe se o objeto estiver ausente
 
Rashid Umarov:

OK. Como descobri que não levantamos nenhum erro em tal caso na MQL5 porque estas operações são anisócronas. Portanto, você tem 2 opções:

  • verifique você mesmo se o objeto existe antes de apagar
  • tente apagá-lo em qualquer caso e não se preocupe se o obeto estiver ausente
Desta forma, não há uso do resultado de verificação do ObjectDelete ou ObjectMove na MQL5 ! não é melhor fixá-lo do jeito que costumava ser na MQL4 ?
 
Rashid Umarov:

OK. Como descobri que não levantamos nenhum erro em tal caso na MQL5 porque estas operações são assíncronas. Portanto, você tem 2 opções:

  • verifique você mesmo se o objeto existe antes de excluir
  • tente apagá-la em qualquer caso e não se preocupe se o objeto estiver ausente

Como poderia retornar falso neste caso?

A documentação ObjectDelete() diz:

Valor de retorno

Retorna verdadeiro se a remoção foi bem sucedida, caso contrário, retorna falso.

A documentação deve ser mais clara, ela não diz "verdadeiro se o comando for aceito".

Se quisermos ter certeza de que um objeto é excluído, teremos que verificar se ele existe após o comando de exclusão, não faz sentido.

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:

Como poderia retornar falso neste caso?

A documentação ObjectDelete() diz:

A documentação deve ser mais clara, ela não diz "verdadeiro se o comando for aceito".

Será fixado de tal forma

Valor de retorno

Retorna verdadeiro se o comando for colocado na fila comum dos eventos do gráfico , caso contrário, retorna falso.