Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
ЗадолУтомился снепшоты отлаживать. В итоге сделал идеально. Один советник - тишь и гладь. Два - замечательно. 20 - катастрофа: CPU под 100%. HistorySelect по много миллисекунд лагает.
Похоже, не предназначен MT5 для одновременной работы большого количества роботов.
Вы стресс-тест пишите или обычную работу экспертов?
Скорее всего именно многопотоковый стресс-тест в одну базу. Поэтому повторю:
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
MT5 и скорость в боевом исполнении
Renat Fatkhullin, 2020.09.16 12:47
Если я правильно понял, там не советник, а стресс-тестер на каждом символе. Это совершенно меняет дело. И показывает скрытие исходных условий.
То есть, на 8(4+HT) ядерном процессоре 16 потоков (+N рабочих потоков терминала параллельно) в безостановочном режиме и без задержек ломятся в один синхронизирующийся объект базы символов. Read / Write локи перемешаны, так как постоянно идет запись тиков.
Обычно в таком профиле в зависимости от крутости процессора и его шедулера потоков, каждый поток может провести в ожидании от 60% до 80% времени.
Причем вне зависимости от типа задач.
Если по факту устраиваете в 20 потоков безостановочную битву за один ресурс, то вариантов несколько:
Прочтите внимательно вставку. Если N потоков бьются в один синхрообъект, то пустое ожидание будет на уровне 60-80%.
И предел многопотоковой эффективности будет где-то на уровне 8-12 потоков. При увеличении количества потоков скорость выборки будет падать. На 2600k предел эффективности еще ниже.
Вы стресс-тест пишите или обычную работу экспертов?
Обычную
Скорее всего именно многопотоковый стресс-тест в одну базу. Поэтому повторю:
Если по факту устраиваете в 20 потоков безостановочную битву за один ресурс, то вариантов несколько:
Прочтите внимательно вставку. Если N потоков бьются в один синхрообъект, то пустое ожидание будет на уровне 60-80%.
И предел многопотоковой эффективности будет где-то на уровне 8-12 потоков. При увеличении количества потоков скорость выборки будет падать. На 2600k предел эффективности еще ниже.
Полностью кеширую историю. Но даже для этого требуется вызывать HistorySelect(0, INT_MAX).
В качестве эксперимента порезал все нужные для торговой логики обращения к истории. Нагрузка на CPU сильно уменьшилась.
В общем, если 20 роботов, то обращаться в них к истории - вызвать катастрофу лишь только одним Терминалом. Про несколько Терминалов даже говорить не приходится.
И такое ощущение, что синхрообъект - это не только история. SymbolInfoTick, CopyTicks и что-то еще, похоже.
В общем, у меня не получается запустить даже пять Терминалов с десятком роботов на каждом.
Посмотреть профилировщиком торможения - облом.
Обычную
Полностью кеширую историю. Но даже для этого требуется вызывать HistorySelect(0, INT_MAX).
В качестве эксперимента порезал все нужные для торговой логики обращения к истории. Нагрузка на CPU сильно уменьшилась.
В общем, если 20 роботов, то обращаться в них к истории - вызвать катастрофу лишь только одним Терминалом. Про несколько Терминалов даже говорить не приходится.
И такое ощущение, что синхрообъект - это не только история. SymbolInfoTick, CopyTicks и что-то еще, похоже.
В общем, у меня не получается запустить даже пять Терминалов с десятком роботов на каждом.
Посмотреть профилировщиком торможения - облом.
Нет доказательств, как и числовых данных.
1) Сколько раз в секунду каждый эксперт делает запросы HistorySelect?
2) Какие именно функции тормозят?
3) Логи?
4) Каков принцип работы роботов?
В общем, если 20 роботов, то обращаться в них к истории - вызвать катастрофу лишь только одним Терминалом. Про несколько Терминалов даже говорить не приходится.
Может, наоборот — каждый терминал будет поддерживать свой синхрообъект, и к нему не будет очереди из 20 советников?
Попробуйте запускать 1 робота на 1 терминале, интересно посмотреть на результат.
Может, наоборот — каждый терминал будет поддерживать свой синхрообъект, и к нему не будет очереди из 20 советников?
Попробуйте запускать 1 робота на 1 терминале, интересно посмотреть на результат.
К сожалению, результат этого эксперимента не ответит на вопрос, что делать?
К сожалению, результат этого эксперимента не ответит на вопрос, что делать?
Пересмотреть концепцию работы торгового робота
Добавлено
У меня на реале 3 терминала + 1 демо в котором работаю
В каждом терминале 42 робота, которые используют OnBoorEvent от 3-х - 4-х символов,
плюс каждые 0,5 сек. срабатывает таймер + каждый робот обращается к Глобальным переменным терминала,
при этом из 32 Гб ОЗУ используется 8,34 Гб, а ЦПУ - 6,7%
И ничего не тормозит, за исключением сервера ТМ5 в началах торговых сессий.
Нет доказательств, как и числовых данных.
1) Сколько раз в секунду каждый эксперт делает запросы HistorySelect?
2) Какие именно функции тормозят?
3) Логи?
4) Каков принцип работы роботов?
Мне очень сложно ответить на эти вопросы, потому что даже я сам не могу врубиться, что тормозит. Профилировщик даже не запустить. Свои замеры обманывают, потому что лаг идет уже от CPU. Уменьшение обращения к функциями окружения через снепшоты и кеширование, к сожалению, не дали ожидаемого эффекта. Жду профилировщик, который будет в состоянии скомпилировать советник.
А пока возился, нашел вот такую гадость в Тестере с историей торгов.
Результат
Этот баг с трудом заметил и больше часа пытался написать воспроизведение. Код дебильный, но показывает проблему. Есть ли что-то подобное не в Тестере, а в Терминале - не знаю.
Строка для поиска: Oshibka 013.
ЗЫ b2626 - исправлено.
Пересмотреть концепцию работы торгового робота
Только один робот, который торгует все символы?
Только один робот, который торгует все символы?
Разные роботы, но все построены приблизительно по одной схеме.
Одновременно задействовано в одном терминале 42 работа, а на трех - 126 это около 400 символов
Добавлено
Повторюсь (у меня)
Каждый робот использует OnBoorEvent от 3-х - 4-х символов,
плюс каждые 0,5 сек. срабатывает таймер + каждый робот обращается к Глобальным переменным терминала,
при этом из 32 Гб ОЗУ используется 8,34 Гб, а ЦПУ - 6,7%
И ничего не тормозит, за исключением сервера ТМ5 (или железо Открывашки) в началах торговых сессий.
Разные роботы, но все построены приблизительно по одной схеме.
Одновременно задействовано в одном терминале 42 работа, а на трех - 126 это около 400 символов
Добавлено
Повторюсь (у меня)
Каждый робот использует OnBoorEvent от 3-х - 4-х символов,
плюс каждые 0,5 сек. срабатывает таймер + каждый робот обращается к Глобальным переменным терминала,
при этом из 32 Гб ОЗУ используется 8,34 Гб, а ЦПУ - 6,7%
И ничего не тормозит, за исключением сервера ТМ5 (или железо Открывашки) в началах торговых сессий.
Вот странно, у меня все наоборот.
4 терминала, уменьшил количество советников до порядка 200, все OnBook повыкидывал, перешел обратно на OnTick, обновил железо, а проблемы все те же, что и у fxsaber.
Зато тормозов по утрам в Открытии давно уже нет. А какими они были! До 75 секунд доходило порой :)