Ошибки, баги, вопросы - страница 3560

 
Теперь фон текста во всех списках белый. У меня тёмная тема оформления через wine на linux сломалась. Можно вернуть зависимость от системных цветов?
 

Ошибка в \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е, то держите в уме, что при загрузке процессора другими задачами (не касающиеся данной программы), то такая программа может вызывать нежданные висяки исполнения - программа (эксперт или скрипт, на индикаторах не пробовал) просто зависает и ничего не делает, при этом терминал работает нормально и отзывчиво.

 
Andrey Dik #:
for и while (while  с большей вероятностью). Если загрузка процессора близка к 100%

циклы сами по себе могут сделать нагрузку близкую к 100%.. например пустой цикл :-)

просто не надо цикле опрашивать состояние, оно не поменяется. Если в советнике есть "while не_пришёл_следующий_тик {...}"  то вы делаете что-то не то и не так

 
Maxim Kuznetsov #:

циклы сами по себе могут сделать нагрузку близкую к 100%.. например пустой цикл :-)

просто не надо цикле опрашивать состояние, оно не поменяется. Если в советнике есть "while не_пришёл_следующий_тик {...}"  то вы делаете что-то не то и не так

Нет, проблема выявлена в утилите, которая никак не обрабатывает цены и не запрашивает их. while прекрасно отрабатывает когда процессор не загружен полностью, но когда загружен - полный ступор, зависание утилиты. Есть ощущение, что исполнительная среда терминала на чарте приостанавливает работу программы. Я просто поделился наблюдением, кому-то, возможно, это будет полезным принять к сведению.
 
Maxim Kuznetsov #:

циклы сами по себе могут сделать нагрузку близкую к 100%.. например пустой цикл :-)

просто не надо цикле опрашивать состояние, оно не поменяется. Если в советнике есть "while не_пришёл_следующий_тик {...}"  то вы делаете что-то не то и не так

Вот неправильные пчёлы:


А вот правильные:


 
Artyom Trishkin #:

Вот неправильные пчёлы:


А вот правильные:


когда ваши "правильные пчёлы" будут не в OnStart() а в OnTick() то принесут они отнюдь не мёд ;-) 

будет ситуация близкая к описываемой Андреем, всё встанет колом. 

не надо в событийно управляемом софте ( в советнике, где всё на обработчиках OnXXX ) делать циклы ожидания событий. 

 
Maxim Kuznetsov #:

когда ваши "правильные пчёлы" будут не в OnStart() а в OnTick() то принесут они отнюдь не мёд ;-) 

будет ситуация близкая к описываемой Андреем, всё встанет колом. 

не надо в событийно управляемом софте ( в советнике, где всё на обработчиках OnXXX ) делать циклы ожидания событий. 

А зачем делать в OnTick() зацикленные вещи? Что Вы мне прописные истины рассказываете?

 
Maxim Kuznetsov #:

не надо в событийно управляемом софте ( в советнике, где всё на обработчиках OnXXX ) делать циклы ожидания событий. 

При работе с событиями - да, всё верно и понятно. Но проблема может возникнуть там, где её совсем не ожидаешь, например, в каких нибудь математических расчётах (в том же алглиб активно и повсеместно используются while).

 
Artyom Trishkin #:

А зачем делать в OnTick() зацикленные вещи? Что Вы мне прописные истины рассказываете?

это ты начал сыпать прописью про пчёл и разгрузку длинных циклов переключением контекста (слипом)..там кстати можно было обойтись https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-switchtothread

SwitchToThread function (processthreadsapi.h) - Win32 apps
SwitchToThread function (processthreadsapi.h) - Win32 apps
  • 2024.02.22
  • karl-bridge-microsoft
  • learn.microsoft.com
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.