есть ли ошибка в mt5 ObjectDelete? - страница 3

 
Fernando Carreiro:
Какой билд вы использовали? Поскольку в последней сборке, похоже, есть возможная ошибка с функцией"ObjectDelete()", возможно, есть проблемы и с "ObjectFind()"!

MT5: Build 1495 (09 декабря 2016)

 
honest_knave:

MT5: Build 1495 (09 Dec 2016)

Я запустил ваш код на билде 1491 и получил аналогичные результаты:

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:

Я запустил ваш код на сборке 1491 и получил аналогичные результаты:

Последовательно странно. Возможно, есть хорошее объяснение, почему...?
 
honest_knave:

Это может быть скорее семантической ошибкой, чем ошибкой.

Цель ObjectDelete - "удалить объект с указанным именем".

В конце выполнения функции на графике остается объект с именем "Несуществующий объект"? Нет... значит, это успех?

Если посмотреть с другой стороны, удалил ли ObjectDelete объект с названием "Несуществующий объект"? Нет... значит, это неудача?

Вы оцениваете успех по результату или по выполненному действию?

Возможно, следует ожидать false, если после выполнения функции названный объект останется на графике. В противном случае, это был успех.

Возможно, то, что вы говорите, правда, но поскольку мы переходим с MQL4 на MQL5, мы ожидаем увидеть тот же результат или, по крайней мере, результат, который четко прописан в возвращаемом значении ссылки.

Минуя эту первую проблему, я протестировал функцию ObjectMove, и снова я получаю результат TRUE! Это выходит за рамки вашего объяснения, что поскольку объект недоступен в конце, то истина верна.

При использовании ObjectMove на объекте, который недоступен, должно возвращаться 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:

Здравствуйте, я пишу индикатор на MQL5, но что бы я не написал как строковое имя ObejectDelete возвращает true! даже на пустом графике без объектов!


Описание функций чтения объектов

Это группа функций, предназначенных для работы с графическими объектами, относящимися к любому заданному графику.

Функции, определяющие свойства графических объектов, а также операции ObjectCreate() и ObjectMove() для создания и перемещения объектов по графику фактически используются для отправки команд графику. При успешном выполнении этих функций команда включается в общую очередь событий графика. Визуальные изменения свойств графических объектов реализуются при обработке очереди событий графика.

Это означает, что команда "Удалить этот объект" успешно принята. Вы можете контролировать результат выполнения команды с помощью GetLastError(). Попробуйте - какой код возвращается?
 
Rashid Umarov:

Прочитать описание функций объекта

Это означает, что команда "Удалить этот объект" успешно принята. Вы можете контролировать результат вашей команды с помощью GetLastError(). Попробуйте - какой код возвращается?

Я изменил код таким образом :

int ObjCount = ObjectsTotal(ChartID(),/*0=основное подокно*/0,/*все типы объектов*/-1);

ResetLastError();

bool deleteResult=ObjectDelete(ChartID(), "несуществующий объект");

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

вот результат :

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

ERR_SUCCESS

0

Операция завершилась успешно


поэтому она не возвращает ошибку, чтобы выяснить, например, что не удалось получить доступ к объекту. но в MT4 она возвращает ошибку.

 
Farzin Sadeghi:

ERR_SUCCESS

0

Операция завершена успешно


поэтому он не возвращает ошибку, чтобы узнать, например, что он не смог получить доступ к этому объекту. но в MT4 он возвращает ошибку.

OK. Как я выяснил, в MQL5 мы не выдаем ошибку в таком случае, потому что эти операции асинхронны. Поэтому у вас есть 2 варианта:

  • проверить, существует ли объект перед удалением
  • попытаться удалить его в любом случае и не беспокоиться, если объект отсутствует
 
Rashid Umarov:

OK. Как я выяснил, в MQL5 мы не выдаем ошибку в таком случае, потому что эти операции анизохронны. Поэтому у вас есть два варианта:

  • проверить, существует ли объект перед удалением
  • попытаться удалить его в любом случае и не беспокоиться, если объект отсутствует
Таким образом, в MQL5 нет смысла проверять результат ObjectDelete или ObjectMove! Не лучше ли исправить это на то, что было в MQL4?
 
Rashid Umarov:

OK. Как я выяснил, в MQL5 мы не выдаем ошибку в таком случае, потому что эти операции асинхронны. Поэтому у вас есть 2 варианта:

  • проверить, существует ли объект перед удалением
  • Попробуйте удалить его в любом случае и не беспокойтесь, если объект отсутствует

Как это может вернуть false в этом случае?

Вдокументации к ObjectDelete() сказано:

Возвращаемое значение

Возвращает true, если удаление прошло успешно, иначе возвращает false.

Документация должна быть более ясной, в ней не сказано "true, если команда принята".

Если мы хотим быть уверены, что объект удален, мы должны проверить, существует ли он после команды delete, это бессмысленно.

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:

Как оно может возвращать false в этом случае?

Вдокументации ObjectDelete() сказано:

Документация должна быть более ясной, в ней не сказано "true, если команда принята".

Будет исправлено таким образом

Возвращаемое значение

Возвращает true, если команда помещена в общую очередь событий графика , иначе возвращает false.