Неожиданная внутренняя ошибка - страница 2

 
Alexey Viktorov:

Так не проверял, но профилировщик не врёт.


Убрал эти две строки и всё затикало как положено.

Видимо разработчикам надо обратить на это внимание.

Ноль вписать вместо ChartID() пробовал?
 
Vitaly Muzichenko:

Что именно убрали, ObjectFind и ChartRedraw?

Какая именно тупила, или обе?

Поочерёдно убирал. И только убрав обе, индикатор стал работать. Но это-же не правильно. Пусть можно обойтись без принудительного обновления графика, а как можно создавать объект не проверив его наличие? Умышленно создавать ошибки???

 
Artyom Trishkin:
Ноль вписать вместо ChartID() пробовал?

Пробовал. Эффект нулевой.

 
Причина в этом

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Новая версия платформы MetaTrader 5 build 1930: Плавающие окна графиков и .Net библиотеки в MQL5

fxsaber, 2019.01.09 16:08

// Зависание Терминала на десятки секунд при переключении на другой торговый сервер
int OnCalculate( const int, const int, const int, const double &[] )
{
  for (int i = 0; i < 10; i++)
    ChartRedraw();
  
  return(0);
}
Можно просто нажать на "Обновить", чтобы увидеть, что чарт с индикатором завис.
 
Alexey Viktorov:

Поочерёдно убирал. И только убрав обе, индикатор стал работать. Но это-же не правильно. Пусть можно обойтись без принудительного обновления графика, а как можно создавать объект не проверив его наличие? Умышленно создавать ошибки???

Спасибо за ответ!

Тогда действительно нужно призывать разработчиков оптимизировать.

 

"Примечание

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


Посмотрите, что еще вы делаете с графиком, в том числе асинхронного. Вызовом этой функции вы фактически принудительно все синхронизируете. Как и вызовом ChartRedraw


Т.е. если вас считаются какието сложные или многочисленные индикаторы - вызов это функции вероятно будет ждать, пока все досчитаются. А если внутри индикаторов тоже есть вызовы синхронных  функций, то результат будет зависеть, от реализации перекрестных синхронизаций в MQL

 
fxsaber:
Причина в этом

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

 
fxsaber:
Причина в этом

Нет. Причина найдена. Профилировщик не врёт.

 
Sly007:

"Примечание

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


Посмотрите, что еще вы делаете с графиком, в том числе асинхронного. Вызовом этой функции вы фактически принудительно все синхронизируете. Как и вызовом ChartRedraw

Но если ПОЛНОСТЬЮ процитировать примечание, то можно заметить и такую оговорку

Примечание

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

Но в данном случае количество объектов назвать "большим" как-то язык не поворачивается.
 

вы 8 (!!) раз на тик вызываете ChartRedraw, конечно оно тормозит. Я бы на месте терминала тоже матерился :-)

да и алгоритм тоже как-бы помягче сказать..не быстрый :-)

методы лечения:

- считать пооптимальнее (всё можно в один проход посчитать). Опционально

- создавать объекты заранее и не проверять их наличие на каждом чихе. Можно пересоздавать поймав CHARTOBJECT_DELETE

- сохранять прежние значения и лезть в объекты только если поменялись данные

- ChartRedraw вызывать только при крайней необходимости. Он вообще по большому счёту там ненужен. Вы же не анимацию какую делаете - он сам перерисует.