Новая версия платформы MetaTrader 5 build 3620: улучшения веб-терминала, поддержка ONNX и ускоренное умножение матриц в MQL5 - страница 3
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Если бы изначально были запрещены все Copy-функции, кроме CopyRates, то подобных проблем, которые пользователи сами себе создают, не было бы.
А так получилось мнимое расширение/удобство функционала с вводом Copy-функций, вместо низкоуровневого подхода.
С SYMBOL_BID/ASK-свойствами такая же история.
Если бы изначально были запрещены все Copy-функции, кроме CopyRates, то подобных проблем, которые пользователи сами себе создают, не было бы.
А так получилось мнимое расширение/удобство функционала с вводом Copy-функций, вместо низкоуровневого подхода.
С SYMBOL_BID/ASK-свойствами такая же история.
Проблемы несинхронизованных данных нет при использовании CopyXXX функций с указанием начального времени бара, надеюсь не нужно объяснять почему.
Именно поэтому, реализацию вариантов CopySeries для запроса данных по времени пока отложили, сосредоточившись на более важных задачах
Не использую CopyRates, чтобы сэономить несколько сот Мб ОЗУ на каждом символе.
Никакой экономии с Copy-функциями нет, т.к. в них идет вызов CopyRates. Первая функция, где иначе:
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Бета-версия платформы MetaTrader 5 build 3600: улучшения веб-терминала и ускоренное умножение матриц в MQL5
Ilyas, 2023.03.05 09:42
CopySeries - полностью самостоятельная функция и не использует для совей работы CopyRates.
Никакой экономии с Copy-функциями нет, т.к. в них идет вызов CopyRates. Первая функция, где иначе:
Экономная она или нет - не знаю.речь была про пиковую нагрузку на ОЗУ из-за промежуточных внутренних временных MqlRates массивов, которые конечно же быстро очищаются.
Ну Ок. Соглашусь в том, что если бы была только одна функция CopyRates(), я бы не сильно расстроился.
Но все равно, в данных момент лично для меня удобнее пользоваться отдельными функциями CopyXxxx с точки зрения произовдительности и задействия ресурсов компьютера(выгода незначительная, но есть).
Если бы была функция CopySeries() с временными границами, то использовал бы её из-за более лаконичного кода.
Я тут немного 4ку затрону. Но это часть моего вопроса по 5ке.
Из справки по ArrayCopySeries:
"Реального распределения памяти под массив данных и копирования не происходит. При обращении к такому массиву производится перенаправление доступа."
Из справки по ArrayCopyRates:
"При использовании первой формы вызова происходит виртуальное копирование таймсерии в массив структур MqlRates. Это означает, что если данные таймсерии обновились, то повторное копирование не требуется - массив rates_array[] по-прежнему будет ссылаться на актуальную версию таймсерии и данные будут корректными всегда."
Если я правильно понял (не факт), то в обеих случаях массив просто ссылается на какие-то внутренние данные терминала и никакого копирования не происходит. Как передача массива по ссылке в функцию.
На сколько я помню, терминал перестает обновлять данные по символу/таймфрейму, когда они какое-то время не запрашиваются из программ и нет открытых графиков по ним.
У меня логика такая. Зачем мне копировать нужное количество данных только при необходимости? Обычно эти данные нужны непосредственно перед отправлением торговых приказов. То есть в самый ответственный момент я рискую вместо котировок получить "подожди, грузятся..."
Если эксперт использует данные других символов/таймфреймов, я сразу объявляю для них динамические массивы в глобальной области. И с помощью вышеупомянутых функций делаю так, что бы они всегда ссылались на актуальные данные. И на всякий пожарный я вызываю эти функции с каждым тиком - копирования же не происходит, правда? Таким образом я убиваю сразу 2 зайца: и всегда поддерживаю данные в актуальном состоянии (так как они постоянно запрашиваются экспертом), и в любой момент могу получить нужные мне значения для любого бара.
Вот выдрал из эксперта простенький пример для работы с D1 и W1:
Вопрос по 5ке. Можно ли там сослаться, а не копировать?
Просьба. Обосрите Укажите, пожалуйста, на ошибки в моих рассуждениях и на недостатки этого метода для 4ки.
P.S. Эта штука может и медленная, но надежная - ни разу еще не подводила. Для меня это плата производительностью за спокойный сон. Хотя, я не исследовал, на сколько она медленная.
речь была про пиковую нагрузку на ОЗУ из-за промежуточных внутренних временных MqlRates массивов, которые конечно же быстро очищаются.
Эти временные промежуточные массивы во внутренней реализации Copy-функций. Грубо говоря, MQ за пользователей написали эти функции, вместо того, чтобы оформить в виде стандартной библиотеки.
Но все равно, в данных момент лично для меня удобнее пользоваться отдельными функциями CopyXxxx с точки зрения произовдительности
Любая старая Copy-функция не должна работать быстрее CopyRates. Поэтому вызов CopyRates выгоднее нескольких вызовов Copy-функций.
Эти временные промежуточные массивы во внутренней реализации Copy-функций. Грубо говоря, MQ за пользователей написали эти функции, вместо того, чтобы оформить в виде стандартной библиотеки.
Любая старая Copy-функция не должна работать быстрее CopyRates. Поэтому вызов CopyRates выгоднее нескольких вызовов Copy-функций.
CopyXXX вообще не использует CopyRates(), почему вы так думаете?
В среднем CopyRates() примерно в 2 раза медленнее, чем CopyXXX().
Данные уже кэшированы.
Холодный запуск.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Новая версия платформы MetaTrader 5 build 1930: Плавающие окна графиков и .Net библиотеки в MQL5
Renat Fatkhullin, 2018.12.10 19:31
Новые результаты после сегодняшних оптимизаций, которые будут доступны в следующей бета-версии на днях:
По горячему в CopyRates MT5 обогнал MT4 на 2 мс. оптимизация удалась.
Я забыл сразу объяснить важную особенность хранения данных баров в МТ5. В МТ5 бары хранятся в виде отдельных массивов Open, High, Low, Close, Volume. Это означает, что для создания MqlRates бара в функции CopyRates нам нужно собирать структуру ценового бара из множества массивов.
Это заведомо дороже, чем просто выдать готовый бар, как это доступно в MT4. Но и это мы сделали быстрее.
Почему у нас разделены массивы данных в МТ5? Потому что так эффективнее работать и особенно для отдельных функций CopyClose, CopyHigh, High[], Low[] и тд. Очень много мест, где используются конкретные показатели без необходимости обращений ко всему бару.
Давайте сравним скорость доступа CopyHigh в обоих системах. Сразу будем проверять горячие кеши:
Вот тут явно видно преимущество Метатрейдер 5: в 3.5 раза быстрее выдает данные отдельных таймсерий.
Совет: не копируйте бары в пятерке, если нужно иметь только один показатель. Не переводите один в один код из четверки.
Любая старая Copy-функция не должна работать быстрее CopyRates. Поэтому вызов CopyRates выгоднее нескольких вызовов Copy-функций.
Ну как же не должна, если заполняемый массив MqlRates в несколько раз больше, чем, например массив double того же размера.
время заполнение более большого массива, естественно будет больше, чем время заполения меньшего.
Например я, как правило, использую размер массива 131072 (2^17) элементов
Это 131072 *60байт = 7864320 байт (для MqlRates) против 131072*8байт = 1048576 байт (для double).
Разница времени заполнения будет , думаю, в сотни микросекунд.
ЗЫ Я понимаю, что в ОЗУ уже сидит полный MqlRates массив, но из него как раз происходит копирование (реальное, не по ссылке) или в пользовательский MqlRates массив, или же в double или datetime массивы.