При повышении нагрузки на процессор становится критически важным все циклические операции, такие как for и while (while с большей вероятностью). Если загрузка процессора близка к 100% (например, агентами оптимизатора и другими нагрузками), то такие циклические операции приводят к зависанию программы MQL5 на чарте. Причем профилирование не может выявить проблемных мест в коде. Логического объяснения явлению не обнаружил.
К сожалению, не могу привести воспроизводимый пример, просто кто заинтересован - имейте ввиду. Намучался. Если есть в коде whilе, то держите в уме, что при загрузке процессора другими задачами (не касающиеся данной программы), то такая программа может вызывать нежданные висяки исполнения - программа (эксперт или скрипт, на индикаторах не пробовал) просто зависает и ничего не делает, при этом терминал работает нормально и отзывчиво.
Andrey Dik #: for и while (while с большей вероятностью). Если загрузка процессора близка к 100%
циклы сами по себе могут сделать нагрузку близкую к 100%.. например пустой цикл :-)
просто не надо цикле опрашивать состояние, оно не поменяется. Если в советнике есть "while не_пришёл_следующий_тик {...}" то вы делаете что-то не то и не так
циклы сами по себе могут сделать нагрузку близкую к 100%.. например пустой цикл :-)
просто не надо цикле опрашивать состояние, оно не поменяется. Если в советнике есть "while не_пришёл_следующий_тик {...}" то вы делаете что-то не то и не так
Нет, проблема выявлена в утилите, которая никак не обрабатывает цены и не запрашивает их. while прекрасно отрабатывает когда процессор не загружен полностью, но когда загружен - полный ступор, зависание утилиты. Есть ощущение, что исполнительная среда терминала на чарте приостанавливает работу программы. Я просто поделился наблюдением, кому-то, возможно, это будет полезным принять к сведению.
циклы сами по себе могут сделать нагрузку близкую к 100%.. например пустой цикл :-)
просто не надо цикле опрашивать состояние, оно не поменяется. Если в советнике есть "while не_пришёл_следующий_тик {...}" то вы делаете что-то не то и не так
не надо в событийно управляемом софте ( в советнике, где всё на обработчиках OnXXX ) делать циклы ожидания событий.
При работе с событиями - да, всё верно и понятно. Но проблема может возникнуть там, где её совсем не ожидаешь, например, в каких нибудь математических расчётах (в том же алглиб активно и повсеместно используются while).
Causes the calling thread to yield execution to another thread that is ready to run on the current processor. The operating system selects the next thread to be executed.
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Ошибка в \Inclide\Charts\Chart.mqh
метод CChart::VisibleBars(void)
#999 return((int)ChartGetInteger(m_chart_id,CHART_WIDTH_IN_BARS));
Должно быть return((int)ChartGetInteger(m_chart_id,CHART_VISIBLE_BARS));
На заметку разработчикам платформы MT5 и программистам MQL5.
При повышении нагрузки на процессор становится критически важным все циклические операции, такие как for и while (while с большей вероятностью). Если загрузка процессора близка к 100% (например, агентами оптимизатора и другими нагрузками), то такие циклические операции приводят к зависанию программы MQL5 на чарте. Причем профилирование не может выявить проблемных мест в коде. Логического объяснения явлению не обнаружил.
К сожалению, не могу привести воспроизводимый пример, просто кто заинтересован - имейте ввиду. Намучался. Если есть в коде whilе, то держите в уме, что при загрузке процессора другими задачами (не касающиеся данной программы), то такая программа может вызывать нежданные висяки исполнения - программа (эксперт или скрипт, на индикаторах не пробовал) просто зависает и ничего не делает, при этом терминал работает нормально и отзывчиво.
for и while (while с большей вероятностью). Если загрузка процессора близка к 100%
циклы сами по себе могут сделать нагрузку близкую к 100%.. например пустой цикл :-)
просто не надо цикле опрашивать состояние, оно не поменяется. Если в советнике есть "while не_пришёл_следующий_тик {...}" то вы делаете что-то не то и не так
циклы сами по себе могут сделать нагрузку близкую к 100%.. например пустой цикл :-)
просто не надо цикле опрашивать состояние, оно не поменяется. Если в советнике есть "while не_пришёл_следующий_тик {...}" то вы делаете что-то не то и не так
циклы сами по себе могут сделать нагрузку близкую к 100%.. например пустой цикл :-)
просто не надо цикле опрашивать состояние, оно не поменяется. Если в советнике есть "while не_пришёл_следующий_тик {...}" то вы делаете что-то не то и не так
Вот неправильные пчёлы:
А вот правильные:
Вот неправильные пчёлы:
А вот правильные:
когда ваши "правильные пчёлы" будут не в OnStart() а в OnTick() то принесут они отнюдь не мёд ;-)
будет ситуация близкая к описываемой Андреем, всё встанет колом.
не надо в событийно управляемом софте ( в советнике, где всё на обработчиках OnXXX ) делать циклы ожидания событий.
когда ваши "правильные пчёлы" будут не в OnStart() а в OnTick() то принесут они отнюдь не мёд ;-)
будет ситуация близкая к описываемой Андреем, всё встанет колом.
не надо в событийно управляемом софте ( в советнике, где всё на обработчиках OnXXX ) делать циклы ожидания событий.
А зачем делать в OnTick() зацикленные вещи? Что Вы мне прописные истины рассказываете?
не надо в событийно управляемом софте ( в советнике, где всё на обработчиках OnXXX ) делать циклы ожидания событий.
При работе с событиями - да, всё верно и понятно. Но проблема может возникнуть там, где её совсем не ожидаешь, например, в каких нибудь математических расчётах (в том же алглиб активно и повсеместно используются while).
А зачем делать в OnTick() зацикленные вещи? Что Вы мне прописные истины рассказываете?
это ты начал сыпать прописью про пчёл и разгрузку длинных циклов переключением контекста (слипом)..там кстати можно было обойтись https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-switchtothread