Зависает Метатрейдер при небольших вычислениях.. В чём может быть дело?

Viktor Ternovskyi  
Здравствуйте, уважаемые форумчане. Попытаюсь вкратце описать проблему. Пишу мультивалютный советник с большим количеством инструментов. Раз в минуту по таймеру он проходит по списку инструментов и мониторит ситуацию на предмет интересных для алгоритма событий для входа. Когда инструментов штук 50 всё отлично. Когда подключаю пару сотен, начинает загружаться Процессор, причём что очень важно, загружается не сразу, а через минуту как наступает событие проверки советником инструментов и загрузка не понижается, то есть сам обход по всем инструментам занимает доли секунды, замерял специально от начала цикла до конца может уходить 5-10 сотых секунды. Но даже загрузка процессора не происходит скачкообразно, а поднимается и не падает, при увеличении инструментов до 500 загрузка ЦП поднимается почти до 100 процентов, при загрузке 4000+ инструментов виснет всё очень сильно, но сами просчёты алгоритма занимают поначалу около трёх секунд и потом уменьшаются до секунды+- при 4000 инструментов (включается либо кэширование либо оптимизация не знаю, но заметил последующие расчёты начинают занимать меньше времени), эти расчёты нужно совершать раз в минуту, можно и реже сделать в принципе, но проблема не в них, они занимают лишь несколько секунд из 60 каждой минуты. Но.. Процессор не работает скачкообразно на время работы алгоритма и не сбавляет обороты даже после долгого времени выключения советника, то есть Метатрейдер висит(загруженный) уже без советника пока я его не перезагружу. По этим наблюдениям я сделал предварительный вывод что это особенность работы Метатрейдера, а не алгоритма советника, хотя конечно могу ошибаться. Есть у кого соображения по этому поводу? Первое что приходит на ум это постоянная обработка Метатрейдером тех символов, которые были вызваны советником в первую минуту. Но я даже выключал их в MarketWatch и всё равно это не поменяло ситуацию, постоянная нагрузка на ЦП откуда-то берётся.
Vladimir Karputov  

Все зависит от компьютера - хотите работать в мультисимвольном режиме и обрабатывать по 2000-4000 символов, тогда Ваш выбор Core i7 (лучше Core i9), памяти минимум 32 Гб. Я не говорю о том, что память и диск должны быть быстрыми.


Например когда я обхожу 2000 символов (банально запрашиваю Copyrates за шесть баров) - я

MetaTrader 5 x64 build 2605 started for MetaQuotes Software Corp.
Windows 10 build 19041, Intel Core i7-9750H  @ 2.60GHz, 25 / 31 Gb memory, 1643 / 1861 Gb disk, IE 11, UAC, GMT+2
C:\Users\barab\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075

трачу 200 мс, а на другом

Core i3-9100F 3.6GHz, ОЗУ 8Gb

ПК на это уходит 3 минуты. 

Viktor Ternovskyi  
Vladimir Karputov:

Все зависит от компьютера - хотите работать в мультисимвольном режиме и обрабатывать по 2000-4000 символов, тогда Ваш выбор Core i7 (лучше Core i9), памяти минимум 32 Гб. Я не говорю о том, что память и диск должны быть быстрыми.


Например когда я обхожу 2000 символов (банально запрашиваю Copyrates за шесть баров) - я

трачу 200 мс, а на другом

ПК на это уходит 3 минуты. 

Я согласен с тем что Мощность ПК тоже играет роль. Но мне не понятно почему нагрузка на ЦП не скачкообразная при короткой работе алгоритма, а вырастает и становится постоянной. И почему она не падает даже после выгрузки советника с графика. Хочу понять чтоб определится со способом решения проблемы. Либо алгоритм менять, либо это особенность Метатрейдера, а может даже и Баг, тогда разработчикам думаю было бы интересно узнать об этом.

Dmi3  
Vladimir Karputov:

Все зависит от компьютера - хотите работать в мультисимвольном режиме и обрабатывать по 2000-4000 символов, тогда Ваш выбор Core i7 (лучше Core i9), памяти минимум 32 Гб. Я не говорю о том, что память и диск должны быть быстрыми.


Например когда я обхожу 2000 символов (банально запрашиваю Copyrates за шесть баров) - я

трачу 200 мс, а на другом

ПК на это уходит 3 минуты. 

На сколько сильно влияет на скорость работы терминала (не тестера) MT5 объем оперативной памяти?

Maxim Kuznetsov  
Vyktor Ternovskyi:
Здравствуйте, уважаемые форумчане. Попытаюсь вкратце описать проблему. Пишу мультивалютный советник с большим количеством инструментов. Раз в минуту по таймеру он проходит по списку инструментов и мониторит ситуацию на предмет интересных для алгоритма событий для входа. Когда инструментов штук 50 всё отлично. Когда подключаю пару сотен, начинает загружаться Процессор, причём что очень важно, загружается не сразу, а через минуту как наступает событие проверки советником инструментов и загрузка не понижается, то есть сам обход по всем инструментам занимает доли секунды, замерял специально от начала цикла до конца может уходить 5-10 сотых секунды. Но даже загрузка процессора не происходит скачкообразно, а поднимается и не падает, при увеличении инструментов до 500 загрузка ЦП поднимается почти до 100 процентов, при загрузке 4000+ инструментов виснет всё очень сильно, но сами просчёты алгоритма занимают поначалу около трёх секунд и потом уменьшаются до секунды+- при 4000 инструментов (включается либо кэширование либо оптимизация не знаю, но заметил последующие расчёты начинают занимать меньше времени), эти расчёты нужно совершать раз в минуту, можно и реже сделать в принципе, но проблема не в них, они занимают лишь несколько секунд из 60 каждой минуты. Но.. Процессор не работает скачкообразно на время работы алгоритма и не сбавляет обороты даже после долгого времени выключения советника, то есть Метатрейдер висит(загруженный) уже без советника пока я его не перезагружу. По этим наблюдениям я сделал предварительный вывод что это особенность работы Метатрейдера, а не алгоритма советника, хотя конечно могу ошибаться. Есть у кого соображения по этому поводу? Первое что приходит на ум это постоянная обработка Метатрейдером тех символов, которые были вызваны советником в первую минуту. Но я даже выключал их в MarketWatch и всё равно это не поменяло ситуацию, постоянная нагрузка на ЦП откуда-то берётся.

когда первый раз делаете проход по 100500 инструментов, MT синхронизует их данные с сервером и потом какое-то время пытается держать их синхронизованными. Как нормальная система реального времени. То есть он продолжает поддерживать соединения, получать/сохранять данные и прочие внутренние дела. Насколько понимаю отключение символа в MarketWatch не вызывает мгновенного отключения, а просто ставится галочка - "потом при случае корректно отключиться". К тому-же бывают "скрытые в Watch символы" - когда на них есть ордер/позиция и данные нужны, то символ просто скрывается, но не удаляется. 

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

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

Viktor Ternovskyi  
Maxim Kuznetsov:

когда первый раз делаете проход по 100500 инструментов, MT синхронизует их данные с сервером и потом какое-то время пытается держать их синхронизованными. Как нормальная система реального времени. То есть он продолжает поддерживать соединения, получать/сохранять данные и прочие внутренние дела. Насколько понимаю отключение символа в MarketWatch не вызывает мгновенного отключения, а просто ставится галочка - "потом при случае корректно отключиться". К тому-же бывают "скрытые в Watch символы" - когда на них есть ордер/позиция и данные нужны, то символ просто скрывается, но не удаляется. 

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

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

Примерно так и думал в этом направлении. Большое спасибо за ответ, хоть теперь понятно в чём проблема. А что значит разделить инструменты по разным сервисам? В двух словах..

Maxim Kuznetsov  
Vyktor Ternovskyi:

Примерно так и думал в этом направлении. Большое спасибо за ответ, хоть теперь понятно в чём проблема. А что значит разделить инструменты по разным сервисам? В двух словах..

Написать "Сервис" :-) Это что-то наподобии скрипта, но работает без привязки к чарту. Исполняется в отдельном потоке, но имеет свои неудобства, например как и в скриптах нет отдельных входов OnTimer OnTick и прочих. Зато в отдельном потоке и там можно гонять тяжёлые/длительные/массовые рассчёты.

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

Renat Fatkhullin  
Если работаете с большим количеством символов (сотни и тысячи), то ставьте 32-64 гб памяти.

Иначе терминал в попытках выжить в любых условиях будет постоянно выгружать историю на диск. У него задача выживать всегда.

И процессор с быстрым диском тоже обязательны.

При таких вопросах надо обязательно прикладывать полные детали железа, скриншоты таск менеджера и логи терминала. В логах часто пишется о нехватке памяти.
Viktor Ternovskyi  
Renat Fatkhullin:
Если работаете с большим количеством символов (сотни и тысячи), то ставьте 32-64 гб памяти.

Иначе терминал в попытках выжить в любых условиях будет постоянно выгружать историю на диск. У него задача выживать всегда.

И процессор с быстрым диском тоже обязательны.

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

Ясно, спасибо за информацию. Но я думаю ещё и продавать советник как доделаю, не хочу покупателям компы и VPS-ы грузить :)  Поэтому пошёл по пути фильтрации инструментов и отсеивания некачественных по ряду параметров чтоб уже не скармливать Метатрейдеру 100500 инструментов))