Ошибки, баги, вопросы - страница 2504
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Vict:
ЗЫ: ну и тут много фанатов скорости, если начнут всё ровнять по уму, то должны полететь ещё быстрее, в теории по крайней мере.
В общем-то я такого даже не ожидал:
Код немного переусложнён - я пытался попасть на тот элемент, который не вмещается в кеш-линию и долбить прямо по нему, но не вышло (при большом желании получилось бы наверное, но надоело), а код сильно править не стал. Но так это даже больше впечатляет - всего лишь одно из 16ти сложений выполняется над элементом непопадающим в кеш-линию, тем не менее это даёт ощутимый результат.
ЗЫ: более объективно в данном случае делать RIGHT_ALIGNED через вставки двух short, а не удалением единственного (так добьёмся двух обновлений кеш-линии для обоих случаев). Так ускорение будет скромнее, но всё равно весомо около 1.5 раза.
Кстати в mql значение pack по умолчанию 1 вроде как.
Судя по предыдущему посту, возможно есть смысл всем структурам и классам явно прописывать 8.
Не получается побороть ошибку.
Для демонстрации ошибки взял зигзаг из поставки метатрейдера. Добавил в код дополнительные буферы, взятые из моей программы. Никаких манипуляций с дополнительными буферами не предусмотрено в данном коде. Они просто для демонстрации ошибки.
Вывел данный зигзаг на график EURUSD таймфрейм H1. Закрыл терминал. Из истории удалил все сформированные таймсерии по EURUSD. То есть удалил все файлы *.hcc и *.hc по валютной паре EURUSD. Это сделано для того, чтобы при загрузке терминала началась загрузка файлов .hcc и формирование файлов .hc с чистого листа.
После запуска терминала на графике EURUSD наблюдается множество артефактов. И вот эти артефакты побороть не получается.
Код модифицированного зигзага в виде текста и в виде файла прикладываю.
Предупреждаю, что задание параметров зигзага оставил через #propert.
Все остальные буферы не задаю через #propert, так как у меня все, в том числе и буферы для зигзагов, изменяются программно динамически.
Просьба разработчикам терминала помочь исправить данную ошибку.
Картинка с артефактами:
Не получается побороть ошибку.
Для демонстрации ошибки взял зигзаг из поставки метатрейдера. Добавил в код дополнительные буферы, взятые из моей программы. Никаких манипуляций с дополнительными буферами не предусмотрено в данном коде. Они просто для демонстрации ошибки.
Вывел данный зигзаг на график EURUSD таймфрейм H1. Закрыл терминал. Из истории удалил все сформированные таймсерии по EURUSD. То есть удалил все файлы *.hcc и *.hc по валютной паре EURUSD. Это сделано для того, чтобы при загрузке терминала началась загрузка файлов .hcc и формирование файлов .hc с чистого листа.
После запуска терминала на графике EURUSD наблюдается множество артефактов. И вот эти артефакты побороть не получается.
Код модифицированного зигзага в виде текста и в виде файла прикладываю.
Предупреждаю, что задание параметров зигзага оставил через #propert.
Все остальные буферы не задаю через #propert, так как у меня все, в том числе и буферы для зигзагов, изменяются программно динамически.
Просьба разработчикам терминала помочь исправить данную ошибку.
Картинка с артефактами:
Инициализировать нужно все буферы.
Если нет значения в буфере на баре, то это нужно явно прописать в буфере. Т.е., если рассчитанное значение должно быть выведено в буфер - записываем его в буфер, иначе - записываем пустое значение.
В общем-то я такого даже не ожидал:
Запуски у себя не показали заметной разницы.
Если вместо
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Ошибки, баги, вопросы
Vict, 2019.07.09 07:17
Data data[32768];сделать
то происходит замедление в 6 раз!
Инициализировать нужно все буферы.
Если нет значения в буфере на баре, то это нужно явно прописать в буфере. Т.е., если рассчитанное значение должно быть выведено в буфер - записываем его в буфер, иначе - записываем пустое значение.
Извините, пропустил инициализацию. У меня в программе она есть а в примере пропустил.
В аттаче файл с инициализацией. Эффект тот же.
Вопрос к разработчикам остается. Просьба устранить данную ошибку.
-------------
На мой взгляд, происходит следующее. При запуске программы вместе с терминалом размер таймсерий или равен нулю, или какое-то минимальное значение имеет.
Инициализация производится на имеющемся кусочке истории. А при увеличении размера таймсерий под массивы буферов задействуются участки памяти, которые не прошли через инициализацию. И в результате имеем такой эффект.
Пытался устранять этот эффект через события терминала. Все равно на доли секунды артефакты появляются. А это плохо. Такую программу нельзя выпускать в свет.
Исправить можно так. После выделения памяти под буферы сразу очищать эту память. Но как это сделать? Со стороны разработчика приложений для терминала я не нашел такой возможности.
давний баг в редакторе:
- сохраняем файл под новым именем (например: name_v1.2)
- ставим курсор на какую-нибудь переменную (или вызов функции)
- нажимаем alt+g
- открывается старый файл и редактирование перескакивает в него (
В общем-то я такого даже не ожидал:
Код немного переусложнён - я пытался попасть на тот элемент, который не вмещается в кеш-линию и долбить прямо по нему, но не вышло (при большом желании получилось бы наверное, но надоело), а код сильно править не стал. Но так это даже больше впечатляет - всего лишь одно из 16ти сложений выполняется над элементом непопадающим в кеш-линию, тем не менее это даёт ощутимый результат.
ЗЫ: более объективно в данном случае делать RIGHT_ALIGNED через вставки двух short, а не удалением единственного (так добьёмся двух обновлений кеш-линии для обоих случаев). Так ускорение будет скромнее, но всё равно весомо около 1.5 раза.
Простите, но где тут использование выравнивания? Пример вообще о другом.
П. С. Выкладывать код без комментариев и в сыром виде это неуважение к собеседникам.
Правильно было замечено, выравнивание было добавлено для использования объектов структур MQL в сторонних библиотеках, в частности dotnet.
Именно при добавлении поддержки dotnet библиотек и было добавлено выравнивание полей структур/классов pack.
Если говорить коротко и просто, то работает оно так:
Для каждого из типов (char, short, int, ...) есть свой allignment (1, 2, 4, байта соответственно) по умолчанию.
Для поля структуры выбирается минимальное из двух выравниваний: по-умолчанию и заданное пользователем (через pack)
При этом, размер объекта с упаковкой устанавливается таким образом, чтобы адресация к полю объекта в массиве всегда была "правильным" ( заданным через pack, по умолчанию на 1 байт )
Именно из-за последнего создаётся ложное впечатление, что pack выравнивает размер структуры - это не так, выравниваются адреса полей, что и влечёт за собой выравнивание размера структуры.
Например
Результат 16, чтобы адресация к первому полю d всегда была выравненной на 8 байт
Запуски у себя не показали заметной разницы.
Довёл до ума первоначальную идею (в первом коде неправильно считал адреса). Если не затруднит, то интересно будет посмотреть на результат у вас.
По своей сути с/без WRONG_ALIGNED происходит одно и то же - на каждом while пишем в две соседние кеш-линии (запись в pad всегда в правильный адрес), разница лишь в том, что при WRONG_ALIGNED случаются случаи(не всегда), когда одна из записей в ar происходит в uint, который не попадет целиком в кеш-линию, у меня стабильная разница около 1.5 раз.