Есть пара важных дополнений (и предложений к усовершенствованию:))
1. Автор пользует функцию sqlite_open(), но есть еще и более гибкая функция sqlite_open_v2(), которая умеет работать с флагами открытия, а значит: - управлять разграничением доступа к файлу БД; - создавать временные in-memory базы; - работать с БД по URI, а не только в локальной файловой системе и т.д.
#define SQLITE_OPEN_READONLY 0x00000001 /* Ok for sqlite3_open_v2() */ #define SQLITE_OPEN_READWRITE 0x00000002 /* Ok for sqlite3_open_v2() */ #define SQLITE_OPEN_CREATE 0x00000004 /* Ok for sqlite3_open_v2() */ #define SQLITE_OPEN_DELETEONCLOSE 0x00000008 /* VFS only */ #define SQLITE_OPEN_EXCLUSIVE 0x00000010 /* VFS only */ #define SQLITE_OPEN_AUTOPROXY 0x00000020 /* VFS only */ #define SQLITE_OPEN_URI 0x00000040 /* Ok for sqlite3_open_v2() */ #define SQLITE_OPEN_MEMORY 0x00000080 /* Ok for sqlite3_open_v2() */ #define SQLITE_OPEN_MAIN_DB 0x00000100 /* VFS only */ #define SQLITE_OPEN_TEMP_DB 0x00000200 /* VFS only */ #define SQLITE_OPEN_TRANSIENT_DB 0x00000400 /* VFS only */ #define SQLITE_OPEN_MAIN_JOURNAL 0x00000800 /* VFS only */ #define SQLITE_OPEN_TEMP_JOURNAL 0x00001000 /* VFS only */ #define SQLITE_OPEN_SUBJOURNAL 0x00002000 /* VFS only */ #define SQLITE_OPEN_MASTER_JOURNAL 0x00004000 /* VFS only */ #define SQLITE_OPEN_NOMUTEX 0x00008000 /* Ok for sqlite3_open_v2() */ #define SQLITE_OPEN_FULLMUTEX 0x00010000 /* Ok for sqlite3_open_v2() */ #define SQLITE_OPEN_SHAREDCACHE 0x00020000 /* Ok for sqlite3_open_v2() */ #define SQLITE_OPEN_PRIVATECACHE 0x00040000 /* Ok for sqlite3_open_v2() */ #define SQLITE_OPEN_WAL 0x00080000 /* VFS only */
2. Я пользовался(юсь) sqlite для решения задачи ускорения оптимизации советника в тех случаях, когда он использует "тяжелый" в расчетах индикатор. Логичным решением в такой ситуации выглядит сохранение показаний индикатора за период оптимизации в базе данных при первом прогоне, а при последующих - непосредственная добыча уже рассчитанных показаний из БД. Так вот, если пользоваться движком sqlite в "дефолтном виде", процесс посылки множества INSERT и SELECT запросов начинает занимать ооочень много времени. Практическим путем было установлено, что выход состоит в использовании либо 1) in-memory базы данных, что не всегда хорошо, если мы хотим оставить данные на потом и 2) #pragma-директив движка SQL.
Второй вариант боле предпочтителен, так как избавляет от необходимости дампа базы данных из RAM на диск. Делается это так: обязательно перед созданием первой таблицы в базе данных необходимо отправить ей следующие запросы:
"PRAGMA temp_store = MEMORY;" "PRAGMA page_size = 65536;" "PRAGMA cache_size = 16384;" "PRAGMA journal_mode = OFF;" "PRAGMA locking_mode = EXCLUSIVE;" "PRAGMA synchronous = OFF;"
Ну, а после этого уже можно
"CREATE TABLE IF NOT EXISTS"
и т.д.
Всем удачи!
Есть пара важных дополнений (и предложений к усовершенствованию:))
1. Автор пользует функцию sqlite_open(), но есть еще и более гибкая функция sqlite_open_v2(), которая умеет работать с флагами открытия, а значит: - управлять разграничением доступа к файлу БД; - создавать временные in-memory базы; - работать с БД по URI, а не только в локальной файловой системе и т.д.
2. Я пользовался(юсь) sqlite для решения задачи ускорения оптимизации советника в тех случаях, когда он использует "тяжелый" в расчетах индикатор. Логичным решением в такой ситуации выглядит сохранение показаний индикатора за период оптимизации в базе данных при первом прогоне, а при последующих - непосредственная добыча уже рассчитанных показаний из БД. Так вот, если пользоваться движком sqlite в "дефолтном виде", процесс посылки множества INSERT и SELECT запросов начинает занимать ооочень много времени. Практическим путем было установлено, что выход состоит в использовании либо 1) in-memory базы данных, что не всегда хорошо, если мы хотим оставить данные на потом и 2) #pragma-директив движка SQL.
Второй вариант боле предпочтителен, так как избавляет от необходимости дампа базы данных из RAM на диск. Делается это так: обязательно перед созданием первой таблицы в базе данных необходимо отправить ей следующие запросы:
Ну, а после этого уже можно
и т.д.
Всем удачи!
Данные показаний индикаторов при прогоне тестера по своей природе являются простым массивом, потоком с последовательным доступом, поэтому сохранять и читать его в SQL базе является избыточным и не рациональным.
То же самое можно сказать и о предложенном автором статьи, в качестве примера применения SQLite, списка торговых операций.
Поэтому нужно отдавать себе отчет, что эффективность использования реляционных, многосвязных моделей данных, в первую очередь зависит от решаемых задачь, а в указанных примерах ИМХО, это м.б. разве что "притянуто за уши".
Данные показаний индикаторов при прогоне тестера по своей природе являются простым массивом, потоком с последовательным доступом, поэтому сохранять и читать его в SQL базе является избыточным и не рациональным.
Читай еще раз, хоть это избыточно и не рационально: для оптимизации советника
Возможность использования есть и это хорошо. Другое дело что SQLite не стоит использовать для серьезных проектов. Во всяком случае я бы не рекомендовал. Сам сталкивался не раз с проблемой коллизий на ней. Скажем, если торговый робот прикреплен к различным чартам, а использует одну базу, причем обращение происходит к одной таблице общего назначения (скажем регистрация/изменение сессий, аккаунтов), то в любом случае вы получите ошибку типа "таблица заблокирована". И не важно что транзакции все завершены, курсоры все закрыты и БД открыта была в shared режиме. Эта проблема известна и разработчикам SQLite.
Как по мне, так из файловых БД с поддержкой SQL лучше MS Access. Как ни ругайте мелкомягких, но я от SQLite ушел на MS Access и вовсе не жалею. OleDB драйвер Jet 4.0 ставится даже с Win98, так что проекты работают на всех OC Windows.
Прежде всего, сердечное спасибо за вашу работу!
Я портировал его на mql4 с успехом! (некоторые #property strict, решают ошибки компиляции).
Поскольку я использую 32-битную платформу, мне пришлось закомментировать и удалить некоторые 64-битные функции импорта. Терминал использует раннее связывание, поэтому 64-битная dll также пытается загрузиться во время загрузки программы. (хотя она не используется, только 32bit.dll).Это привело к ошибке.
Но в любом случае, мне нравится ваша реализация! ( Хотел бы я написать такую хорошую программу, как ваша).
Скрипт не рабочий, из "коробки" не работает
курите мануал, если не понимаете что и как делать

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Опубликована статья SQL и MQL5: Работаем с базой данных SQLite:
Данная статья рассчитана на программистов, проявившим интерес к использованию SQL в своих проектах. В статье читателям представляется функциональность SQLite, а также рассматриваются ее преимущества. Статья не требует знание функций SQLite, но минимальные знания SQL приветствуются.
Многие разработчики задумывались над необходимостью использовать в своих проектах базы данных для хранения информации, но каждый раз останавливались, зная, какими дополнительными затратами времени сопровождается установка SQL-сервера. Если для программистов выполнить это не так сложно (или СУБД уже установлена для других целей), то для обычного пользователя данная операция вызовет много вопросов, либо вообще отобьет желание устанавливать софт.
В таком случае программист просто не связывается с СУБД, понимая, что кроме него этим решением воспользуются единицы. В конечном итоге в ход идет работа с файлами (часто не одним при разрозненности данных): использование CSV, реже XML или JSON, либо запись бинарных данных с жестким размером структуры и т.п.
Но, как оказывается, есть отличная альтернатива SQL-серверу! При этом не нужно устанавливать дополнительный софт, вся работа идет локально в вашем проекте, но при этом вы используете всю мощь языка SQL. Имя этой альтернативы - SQLite.
Цель данной статьи - обеспечить быстрый старт в использовании SQLite. Поэтому я не буду углубляться в тонкости и всевозможные наборы параметров или флагов функций, а создам легкую обвертку-коннектор, которая выполняет SQL команды, и на примерах покажу ее применение.
Необходимые условия для работы со статьей:
Автор: o_O