Новая версия платформы MetaTrader 5 build 1870: Добавление символов в Обзор рынка по ISIN - страница 9

 
Alexey Kozitsyn:

На обычных чартах ChartRedraw() принудительно происходит каждый тик.

Получается, на кастомных - тик не приводит к принудительному обновлению чарта!?

Или, может, просто тика на кастомном не было, потому видели удаленный объект?

Да, дело в тиках. На оффлайн-терминале и на обычных символах удаления не происходит.

Но речь не только об отображении объекта на чарте, но и о программном его наличии. Т.е. после любого количества успешных ObjectDelete объект все равно находится через ObjectFind.

 
fxsaber:


Но речь не об отображении объекта на чарте, а о программном его наличии. Т.е. после любого количества успешных ObjectDelete объект все равно находится через ObjectFind.

дело в том, что (https://www.mql5.com/ru/docs/objects)

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

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

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

может!

Спасибо! Придумать надо заплатку.

Чарт минутный - по идеи там больше 2000 баров...

Добавил: Или не в этом дело?
 
Aleksey Vyazmikin:

Спасибо! Придумать надо заплатку.

Чарт минутный - по идеи там больше 2000 баров...

Я там поторопился с ответом... Не заметил, что идет вычитание 1000.

 

Разработчикам - полная версия индикатора есть в заявке в сервисдеск ОткрытаНачата: 2018.05.15 15:15#2033625

Ранее там так же был баг, но с крашением терминала - я так и не понял, что от меня ждут...

 
Alexey Kozitsyn:

Я там поторопился с ответом... Не заметил, что идет вычитание 1000.

Понял.

 
Rashid Umarov:

дело в том, что (https://www.mql5.com/ru/docs/objects)

После ObjectDelete объект не просто виден, но может перемещаться мышкой, виден в списке CTRL+B со своими свойствами.

Но стоит после ObjectDelete сделать ObjectFind этого же объекта, как он исчезает и визуально и из списка CTRL+B.


Как наглядный пример ситуации, можно запустить этот индикатор с таким OnDeinit

void OnDeinit( const int )
{
  EventKillTimer();

  ObjectDelete(0, ObjName);
//  ObjectFind(0, ObjName); // Без этой строки объект останется полноценно жить на чарте (где нет NewTick-событий).

  if (Clock)
    delete Clock;
}
 
fxsaber:

После ObjectDelete объект не просто виден, но может перемещаться мышкой, виден в списке CTRL+B со своими свойствами.

Но стоит после ObjectDelete сделать ObjectFind этого же объекта, как он исчезает и визуально и из списка CTRL+B.


Как наглядный пример ситуации, можно запустить этот индикатор с таким OnDeinit

ObjectFind() - какая-то крайне медленная функция, от нее, по возможности, вообще лучше отказываться...

 
Alexey Kozitsyn:

ObjectFind() - какая-то крайне медленная функция, от нее, по возможности, вообще лучше отказываться...

Если вы посмотрите Примечание к https://www.mql5.com/ru/docs/objects/objectfind, то увидите

Функция использует синхронный вызов – это означает, что функция дожидается выполнения всех команд, которые были помещены в очередь графика перед её вызовом, и поэтому данная функция может быть затратной по времени. Нужно иметь это обстоятельство в виду, если ведется работа с большим количеством объектов на графике.

При переименовании графического объекта одновременно  формируются два события, которые можно обработать в эксперте или индикаторе функцией OnChartEvent():

  • событие удаления объекта со старым именем;
  • событие создания графического объекта с новым именем.
Документация по MQL5: Графические объекты / ObjectFind
Документация по MQL5: Графические объекты / ObjectFind
  • www.mql5.com
В случае удачи функция возвращает номер подокна (0 означает главное окно графика), в котором находится найденный объект. Если объект не найден, то функция возвращает отрицательное число. Чтобы получить дополнительную информацию об ошибке, необходимо вызвать функцию GetLastError(). Функция использует синхронный вызов – это означает, что функция...
 
fxsaber:

После ObjectDelete объект не просто виден, но может перемещаться мышкой, виден в списке CTRL+B со своими свойствами.

Но стоит после ObjectDelete сделать ObjectFind этого же объекта, как он исчезает и визуально и из списка CTRL+B.


Тоже указано в Примечании https://www.mql5.com/ru/docs/objects/objectdelete

При вызове ObjectDelete() всегда используется асинхронный вызов, поэтому функция возвращает только результат постановки команды в очередь графика. В этом случае true означает только то, что команда успешно поставлена в очередь, сам результат её выполнения неизвестен.

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


Документация по MQL5: Графические объекты / ObjectDelete
Документация по MQL5: Графические объекты / ObjectDelete
  • www.mql5.com
При вызове ObjectDelete() всегда используется асинхронный вызов, поэтому функция возвращает только результат постановки команды в очередь графика. В этом случае true означает только то, что команда успешно поставлена в очередь, сам результат её выполнения неизвестен. Для проверки результата выполнения можно использовать функцию ObjectFind...