Новая версия платформы MetaTrader 4 build 1350 - страница 13

 
Vladislav Andruschenko #:

Увы, понять проблему могут только те, кто постоянно с этим работает. 

Для всех остальных надо что-то доказывать, показывать, рисовать, разъяснять.... 

А времени то не хватает :-) 

Будет чудесно, если на эту проблему все таки обратят внимание.  Хотя я уже предполагаю ее исход ...... 

Боюсь, что она также утонет в сотнях сообщениях - попытках что-то доказать.... 

В индикаторах, если пытаться установить символ и период, равные текущему символу/периоду, то с большой долей вероятности можно получить клинч. Это есть в справке.

Т.е., не нужно вызывать из индикатора функции, так или иначе активирующие подгрузку данных с сервера, если эти данные совпадают с символом/периодом графика.

 
Artyom Trishkin #:

В индикаторах, если пытаться установить символ и период, равные текущему символу/периоду, то с большой долей вероятности можно получить клинч.

По коду видно, что меняется символ.

Это есть в справке.

У меня такого нет в справке:

ChartSetSymbolPeriod

Меняет значения символа и периода указанного графика. Функция работает асинхронно, то есть отдает команду и не ждет окончания ее выполнения. 
Отданная команда поступает в очередь сообщений графика и выполняется только после обработки всех предыдущих команд.



bool  ChartSetSymbolPeriod( 
   long             chart_id,     // идентификатор графика 
   string           symbol,       // имя символа 
   ENUM_TIMEFRAMES  period        // период 
   );
 

Параметры

chart_id

[in]  Идентификатор графика. 0 означает текущий график.

symbol

[in]  Символ графика. NULL oзначает символ текущего графика (к которому прикреплен эксперт)

period

[in]  Период графика (таймфрейм). Может принимать одно из значений значений перечисления ENUM_TIMEFRAMES. 0 означает период текущего графика.

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

Возвращает true в случае удачного помещения команды в очередь графика, иначе false. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Примечание

Смена символа/периода влечет за собой переинициализацию эксперта, прикрепленного к соответствующему графику. На оффлайновых графиках переинициализация не происходит, осуществляется только обновление графика (аналогично команде Refresh в терминале).

Смотри также

ChartSymbol(), ChartPeriod()
Возможно, это указано где-то в другой части справки?
 
Artyom Trishkin #:

В индикаторах, если пытаться установить символ и период, равные текущему символу/периоду, то с большой долей вероятности можно получить клинч. Это есть в справке.

Т.е., не нужно вызывать из индикатора функции, так или иначе активирующие подгрузку данных с сервера, если эти данные совпадают с символом/периодом графика.


Спасибо. Это знаем.

Но проблема в другом. @Ihor Herasko расписал все выше https://www.mql5.com/ru/forum/379526/page12#comment_25886415

От перемены мест слагаемых..... тут разницы нет, какой код использовать. 

Проблема с любым "маленьким/большим" кодом. 

И подгрузки данных с сервера здесь тоже нет - все давно загружен. 

Проблема с использованием ObjectDelete в эксперте и ChartSetSymbolPeriod в индикаторе на одном графике. 

Дело не в коде, дело в очевидном. 

Как я писал ранее - при таком раскладе - эксперт деинициализируется, но не инициализируется заново. 

Новая версия платформы MetaTrader 4 build 1350
Новая версия платформы MetaTrader 4 build 1350
  • 2021.11.15
  • www.mql5.com
В четверг 14 октября 2021 года будет выпущено обновление MetaTrader 4. В нем исправлен ряд ошибок и повышена стабильность работы платформы...
 
Ihor Herasko #:

По коду видно, что меняется символ.

У меня такого нет в справке:

Странно, но я сейчас тоже не нашёл упоминание клинча в справке. Но об этом точно было написано, и я даже делал отсылку к этому пояснению в справке в своей статье:


Сейчас там не нашёл ничего про клинч (может смотрел невнимательно). Но просто так я бы не отсылался к справке, если бы этого там не было.

Работа с таймсериями в библиотеке DoEasy (Часть 39): Индикаторы на основе библиотеки - подготовка данных и события таймсерий
Работа с таймсериями в библиотеке DoEasy (Часть 39): Индикаторы на основе библиотеки - подготовка данных и события таймсерий
  • www.mql5.com
В статье рассмотрим применение библиотеки DoEasy для создания мультисимвольных мультипериодных индикаторов. Подготовим классы библиотеки для работы в составе индикаторов и протестируем правильное создание таймсерий для их использования в качестве источников данных в индикаторах. Организуем создание и отсылку событий таймсерий.
 
Artyom Trishkin #:

Странно, но я сейчас тоже не нашёл упоминание клинча в справке. Но об этом точно было написано, и я даже делал отсылку к этому пояснению в справке в своей статье:


Сейчас там не нашёл ничего про клинч (может смотрел невнимательно). Но просто так я бы не отсылался к справке, если бы этого там не было.

Насколько помню(могу ошибаться), вопрос подымался на форуме и на него отвечал Slava со всеми разъяснениями. 

 
Vitaly Muzichenko #:

Насколько помню, вопрос подымался на форуме и на него отвечал Slava

если можно, дате хоть какие то ключевые слова по этому поводу для поиска ответа. 

 
Artyom Trishkin #:

Странно, но я сейчас тоже не нашёл упоминание клинча в справке. Но об этом точно было написано, и я даже делал отсылку к этому пояснению в справке в своей статье:


Сейчас там не нашёл ничего про клинч (может смотрел невнимательно). Но просто так я бы не отсылался к справке, если бы этого там не было.

Видимо, справка достаточно часто обновляется. В итоге даже на таком небольшом периоде, как 1 год, мы начинаем теряться в ее утверждениях. Только успевай за новыми веяниями ))

Если смотреть описание для пятерки, то там вообще есть прямое указание на то, чтобы использовать эту функцию в индикаторах для их собственного перерасчета:

Обновление графика в свою очередь запускает перерасчет индикаторов, прикрепленных к нему. Таким образом, вы можете рассчитать индикатор на графике даже при отсутствии тиков (например, в выходные дни).
 
Ihor Herasko #:

Проверил. Да, зависает. Но пример слишком неочевиден. Лучше сделать вот такую тестовую подборку.

Советник Test_Expert:

Индикатор Test:

Для воспроизведения:

  1. Запустить советник и индикатор на одном графике. 
  2. Произвести клик левой клавишей мыши на красном прямоугольнике (на одной из пяти его опорных точек). 
Получится, хоть и недолгое, но зависание. В журнале видно следующее:

Эксперт выполнял удаление объектов почти 10 секунд. Таким образом, проблема имеется. Возникает вопрос: что при этом произошло с индикатором? Ведь о его действиях в журнале ничего нет. Его объект бесследно исчез. Новые попытки запустить индикатор, не выгружая, ни к чему не приводят. Нужно только удалить индикатор с графика и присоединить заново.

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

а теперь поставьте в Деинит только одну строку Comment(""); остальные удалите.
Теперь эксперт ничего не удаляет и не мешает потоку индикаторов, но также висит)

 
Vladislav Andruschenko #:

если можно, дате хоть какие то ключевые слова по этому поводу для поиска ответа. 

Не смог найти, нашёл только старое

Возможно, услышим ответ здесь и сейчас

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2017.11.21
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы
 
Taras Slobodyanik #:

а теперь поставьте в Деинит только одну строку Comment(""); остальные удалите.
Теперь эксперт ничего не удаляет, но также висит)

Теперь зависание заканчивается гораздо быстрее (порядка секунды). Индикатор в итоге остается работоспособным.

Причина обращения: