Файл .sqlite можно включать в структуру ME проекта? для последующей упаковки в .ex5
Если да, то как будет вести себя программа .ex5, при увеличении размера файла .sqlite? в уже скомпилированной программе .ex5
Спасибо за новый функционал.
Считаю хорошую справку по новому функционалу залогом успеха в его освоении. Очень не хватает примеров по работе в самой справке.
Так же прошу обратить внимание на следующие недостатки, которые удалось обнаружить:
1) Описание функции DatabaseExecute не соответствует действительности, а скопирована с DatabasePrepare.
2) Неполное описание первого параметра функции DatabaseRead: int database, // хендл базы данных, полученный в DatabaseOpen;
Так как в DatabasePrepare предоставлена более полная информация: создает хендл запроса, который затем может быть исполнен с помощью DatabaseRead().
3) Функции DatabaseTransactionXXX действительно генерируют приведенные списки ошибок GetLastError() или они выполняют "followup error from a previous failure"?
4) Для функций DatabaseTransactionХХХ не предоставлена какая-либо информация о работе с nested transactions.
5) Опечатка в описании параметра функции DatabaseColumnName (должно быть "для получения имени поля")
string& name // ссылка на переменную для получения имени таблицы
Отличное ново-введение Ренат! Возник такой вопрос.
Файл .sqlite можно включать в структуру ME проекта? для последующей упаковки в .ex5
Если да, то как будет вести себя программа .ex5, при увеличении размера файла .sqlite? в уже скомпилированной программе .ex5
Скорее всего разрешим в ресурсы включать и эти файлы будут автоматически извлекаться на диск при первом запуске программы.
То есть, никакого распухания базы внутри ex5 не будет. С файлом можно работать только на диске.
Базы можно держать как на диске, так и только в памяти с помощью флага DATABASE_OPEN_MEMORY.
Правильно ли я понимаю, что это официальный механизм обмена данными между Терминалами MT5 (вместо убивающих SSD файлов) и между программами внутри Терминала (вместо ресурсов)?
Спасибо за новый функционал.
Считаю хорошую справку по новому функционалу залогом успеха в его освоении. Очень не хватает примеров по работе в самой справке.
Так же прошу обратить внимание на следующие недостатки, которые удалось обнаружить:
1) Описание функции DatabaseExecute не соответствует действительности, а скопирована с DatabasePrepare.
2) Неполное описание первого параметра функции DatabaseRead: int database, // хендл базы данных, полученный в DatabaseOpen;
Так как в DatabasePrepare предоставлена более полная информация: с оздает хендл запроса, который затем может быть исполнен с помощью DatabaseRead().
3) Функции DatabaseTransactionXXX действительно генерируют приведенные списки ошибок GetLastError() или они выполняют "followup error from a previous failure"?
4) Для функций DatabaseTransactionХХХ не предоставлена какая-либо информация о работе с nested transactions.
5) Опечатка в описании параметра функции DatabaseColumnName (должно быть "для получения имени поля")
string& name // ссылка на переменную для получения имени таблицы
Справка уже частично обновлена, посмотрите еще раз. Это пока первая версия справки и она будет дополняться.
В SQLite нет вложенных транзакций, так что не надо их пытаться делать.
Примеры представлены в топике, там вообще ничего сложного. Позже сделаем статью и класс-обертку в стандартной библиотеке.
Правильно ли я понимаю, что это официальный механизм обмена данными между Терминалами MT5 (вместо убивающих SSD файлов) и между программами внутри Терминала (вместо ресурсов)?
Хватит откровенные глупости про "убивающие SSD" от недалеких пользователей распространять.
Нет, это файловые базы - ими можно обмениваться, но рискованно одновременно обращаться из разных экспертов из-за потенциально монопольного доступа при одновременно открытых базах.
Открытые "только в памяти по флагу DATABASE_OPEN_MEMORY" базы доступны только конкретной программе и ни с кем не разделяются.
Области применения баз данных:
- Хранение настроек и состояний MQL5 программ
- Хранение массивных данных
- Использование подготовленных на стороне данных
Например, экспортировали данные из Метатрейдера в SQLite, в Питоне просчитали эти данные на готовых математических пакетах и положили результат тоже в SQlite формате.
Редактор баз данных в МЕ, ну очень удобно будет, спасибо.
Нет, это файловые базы - ими можно обмениваться, но рискованно одновременно обращаться из разных экспертов из-за потенциально монопольного доступа при одновременно открытых базах.
В Python есть библиотека Sqlite3Worker, для потокобезопасного ввода/вывода, при работе с базой из нескольких потоков.
Возможно есть смысл, подумать над портированием реализации в mql, для возможности асинхронной работы с базой из нескольких экспертов.
Ну, или позаимствовать идею, и реализовать свой асинхронный ввод/вывод.
В Python есть библиотека Sqlite3Worker, для потокобезопасного ввода/вывода, при работе с базой из нескольких потоков.
Возможно есть смысл, подумать над портированием реализации в mql, для возможности асинхронной работы с базой из нескольких экспертов.
Ну, или позаимствовать идею, и реализовать свой асинхронный ввод/вывод.
Вы табличку производительности видели выше? Там в MQL5 часто быстрее чем в С++ работает.
У нас все конечно же мультипотоково и все правильно.
Речь же совсем о другом - что произойдет, если разные программы/процессы независимо полезут в один и тот же файл базы данных. Не одна программа(MQL5), а несколько независимых, не знающих друг об друге и не использующие один и тот же database handle.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
В 2265 билде мы реализовали штатные функции работы с базами данных на основе SQLite 3.30.1:
Так как мы максимально ориентированы на производительность, то вот результаты тестов LLVM 9.0.0 vs MQL5. Время в миллисекундах, чем меньше, тем лучше:Базы можно держать как на диске, так и только в памяти с помощью флага DATABASE_OPEN_MEMORY. Обертывание массивных вставок/изменений в транзакции DatabaseTransactionBegin/Commit/Rollback ускоряет операции в сотни раз.
Скорость в MQL5 абсолютно такая же как в нативном С++ с одним из самых лучших компиляторов. Пакет бенчмарков для воспроизведения приложен.
Мы также реализовали уникальную функцию DatabaseReadBind, которая позволяет считывать записи сразу в структуру, что упрощает и ускоряет массовые операции.
Вот простой пример: