MQL4 + базы данных?

 

Привет, коллеги!

Нужно научить советник работать с простой базой данных для централизованного хранения котировок, спреда и настроек/параметров. Это нужно, чтобы иметь единое центральное место, к которому будут обращаться все советники (30 пар открыто в одном терминале, на каждой установлен данный советник).


Понимаю, что в MQL 5 есть уже нативная возможность работы с базами. Знаю, есть третье-сторонние DLL для работы с базами для MQL4.

В первом случае - не могу я перейти на MQL5 - проект уже довольно большой на MQL4.

Во втором - документации мало - не понятно как работать с этой DLL - как данные записывать, считывать, проверять наличие таблиц?..


Нет ли более элегантного решения?

Может эту "нативную" работу с базами всё же можно вести из MQL4? Или может есть более качественно-задокументированные DLL для работы с SQLite?


Или может мне не нужна база, а можно обойтись работой с файлами?..


Как считаете? 

Заранее спасибо за советы!

SQLite: нативная работа с базами данных на SQL в MQL5
SQLite: нативная работа с базами данных на SQL в MQL5
  • www.mql5.com
Разработка торговых стратегий связана с обработкой больших объемов данных. Теперь прямо в MQL5 вы можете работать с базами данных с помощью SQL-запросов на основе SQLite. Важным преимуществом данного движка является то, что вся база данных содержится в единственном файле, который находится на компьютере пользователя.
 
Yevgen Drumachyk:

Привет, коллеги!

Нужно научить советник работать с простой базой данных для централизованного хранения котировок, спреда и настроек/параметров. Это нужно, чтобы иметь единое центральное место, к которому будут обращаться все советники (30 пар открыто в одном терминале, на каждой установлен данный советник).


Понимаю, что в MQL 5 есть уже нативная возможность работы с базами. Знаю, есть третье-сторонние DLL для работы с базами для MQL4.

В первом случае - не могу я перейти на MQL5 - проект уже довольно большой на MQL4.

Во втором - документации мало - не понятно как работать с этой DLL - как данные записывать, считывать, проверять наличие таблиц?..


Нет ли более элегантного решения?

Может эту "нативную" работу с базами всё же можно вести из MQL4? Или может есть более качественно-задокументированные DLL для работы с SQLite?


Или может мне не нужна база, а можно обойтись работой с файлами?..


Как считаете? 

Заранее спасибо за советы!

Я бы делал удалённую базу на веб-сервере, а оттуда забирал-бы через webrequest

Там образом имел-бы возможность получать настройки с любого места

Документация по MQL5: Сетевые функции / WebRequest
Документация по MQL5: Сетевые функции / WebRequest
  • www.mql5.com
WebRequest - Сетевые функции - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Yevgen Drumachyk:

Привет, коллеги!

Нужно научить советник работать с простой базой данных для централизованного хранения котировок, спреда и настроек/параметров. Это нужно, чтобы иметь единое центральное место, к которому будут обращаться все советники (30 пар открыто в одном терминале, на каждой установлен данный советник).


Понимаю, что в MQL 5 есть уже нативная возможность работы с базами. Знаю, есть третье-сторонние DLL для работы с базами для MQL4.

В первом случае - не могу я перейти на MQL5 - проект уже довольно большой на MQL4.

Во втором - документации мало - не понятно как работать с этой DLL - как данные записывать, считывать, проверять наличие таблиц?..


Нет ли более элегантного решения?

Может эту "нативную" работу с базами всё же можно вести из MQL4? Или может есть более качественно-задокументированные DLL для работы с SQLite?


Или может мне не нужна база, а можно обойтись работой с файлами?..


Как считаете? 

Заранее спасибо за советы!

Я бы использовал файлы. Мой опыт работы с реляционными СУБД давнишний, 80-90е годы (dbf, Clipper, FoxPro, InterBase) и многое, возможно, изменилось. По моим впечатлениям, применение универсальных СУБД, работающих с SQL запросами, по сравнению с применением своих файлов, влечет такие неприятности, как: невозможность сослаться на другую запись в этой же таблице; запрет хранения избыточной информации, пусть даже это важно для ускорения работы; генерацию первичных ключей для всех записей во всех таблицах с обязательным индексированием по ним; необходимость освоения дополнительного языка SQL с его JOIN, UNION и нетривиальными типами данных (decimal); невозможность судить об объеме данных по размеру файла, нужно верить какому-нибудь (чужому) счетчику.
 
Я использую одновременно и Sqlite и файлы в одном проекте. Каждый способ для своих целей. Для настроек удобнее текстовые файлы. БД удобна и быстра для массовых записей регулярного типа (у меня результаты оптимизации), но не годится для хранения котировок. Из-за последовательного поступления их с монотонным увеличением ключевого поля (время) дерево получается несбалансированным, и происходит постоянная перепись индекса, и это сильно замедляет работу. Так описывается в учебниках, сам не замерял.
Не знаю, зачем хранить котировки, если они уже есть в терминале. Но когда было надо, хранил в бинарном файле.

PS: для MT4 использовал dll прокладку для работы с официальной dll Sqlite. А она хорошо документирована. И mql4 код примеров и готовых проектов есть 
 
Yevgen Drumachyk:

Привет, коллеги!

Нужно научить советник работать с простой базой данных для централизованного хранения котировок, спреда и настроек/параметров. Это нужно, чтобы иметь единое центральное место, к которому будут обращаться все советники (30 пар открыто в одном терминале, на каждой установлен данный советник).


Понимаю, что в MQL 5 есть уже нативная возможность работы с базами. Знаю, есть третье-сторонние DLL для работы с базами для MQL4.

В первом случае - не могу я перейти на MQL5 - проект уже довольно большой на MQL4.

Во втором - документации мало - не понятно как работать с этой DLL - как данные записывать, считывать, проверять наличие таблиц?..


Нет ли более элегантного решения?

Может эту "нативную" работу с базами всё же можно вести из MQL4? Или может есть более качественно-задокументированные DLL для работы с SQLite?


Или может мне не нужна база, а можно обойтись работой с файлами?..


Как считаете? 

Заранее спасибо за советы!

Здесь посмотрите.

Библиотека для работы с COM-объектами.
Библиотека для работы с COM-объектами.
  • www.mql5.com
Эта библиотека даёт возможность работать с COM-объектами, предоставленными некоторыми приложениями. Например: Excel, Word, Mathcad, Matlab. А также объект ADODB для работы с базами данных через драйвер ODBC. Библиотека работает и в MT4 и в MT5.
 

По поводу производительности работы со встроенным SQLite движком из SQLite: нативная работа с базами данных на SQL в MQL5.

Результаты выполнения даны в миллисекундах — чем меньше, тем лучше.

Название
Описание
 LLVM  
MQL5
Test 1
 1000 INSERTs
11572
8488
Test 2
 25000 INSERTs in a transaction
59
60
Test 3
 25000 INSERTs into an indexed table
102
105
Test 4
 100 SELECTs without an index
142
150
Test 5
 100 SELECTs on a string comparison
391
390
Test 6
 Creating an index
43
33
Test 7
 5000 SELECTs with an index
385
307
Test 8
 1000 UPDATEs without an index
58
54
Test 9
 25000 UPDATEs with an index
161
165
Test 10
 25000 text UPDATEs with an index
124
120
Test 11  INSERTs from a SELECT
84
84
Test 12
 DELETE without an index
25
74
Test 13
 DELETE with an index
70
72
Test 14  A big INSERT after a big DELETE
62
66
Test 15  A big DELETE followed by many small INSERTs
33
33
Test 16  DROP TABLE: finished
42
40

Скорость MQL5 исполнения на уровне LLVM/Clang 9.0, иногда даже быстрее за счет лучшей оптимизации.

В статье расмотрены особенности скорострельной работы с SQL базами. Плюс в MetaEditor 5 есть встроенный SQL Browser.

 
Edgar Akhmadeev:
БД [...] не годится для хранения котировок. Из-за последовательного поступления их с монотонным увеличением ключевого поля (время) дерево получается несбалансированным, и происходит постоянная перепись индекса, и это сильно замедляет работу. Так описывается в учебниках, сам не замерял. 

Сколько лет уже в голове эта информация. Наконец решил замерить. Запись с ключевым полем в инкрементном порядке не отличается по скорости от записи в случайном порядке. Похоже, SQLite далеко ушёл за это время.

Так что вполне можно хранить котировки, поступающие с линейно растущим ключевым полем типа datetime.

 

Спасибо всем за советы!

Решил всё же использовать файл. 

 
Yevgen Drumachyk:

Спасибо всем за советы!

Решил всё же использовать файл. 

индексировать(сортировать записи базы в базе данных) файлы как будете?

допустим нужно выбрать только часть записей. Вы будете лопатить весь файл?

Ведь SQL часть работы делает сам и выдает только ответы на запрос

 
Renat Akhtyamov #:

индексировать(сортировать записи базы в базе данных) файлы как будете?

допустим нужно выбрать только часть записей. Вы будете лопатить весь файл?

Ведь SQL часть работы делает сам и выдает только ответы на запрос

Добрый день, @Renat Akhtyamov, 

В данном конкретном случае мне нужно сохранять совсем не много данных. Один небольшой файл с каждого открытого в терминале графика. Я просто сохраняю последних 100 значений спреда, не больше. Чтобы потом брать средний пред и сравнивать с ним текущий и таким образом определять - на сколько сейчас спред завышен/занижен/нормальный.

Но при решении бОльших задач - согласен - база данных удобнее. Но опять же - у меня проект на MLQ4, а он, как я понял, не имеет возможности работы с локальными базами данных, у которых нет сервера БД (как это умеет MQL5). Поэтому мой выбор тут пал на файлы, что для данного случая вполне приемлемо.

 
Yevgen Drumachyk #:

Но при решении бОльших задач - согласен - база данных удобнее. Но опять же - у меня проект на MLQ4, а он, как я понял, не имеет возможности работы с локальными базами данных, у которых нет сервера БД (как это умеет MQL5).

да, в MQL5 уже встроено - ... для sqlite3 сервер не нужен (это файловая БД)...

но можно, вероятно, поискать и для MQL4 - не тестировала

GitHub - dingmaotu/mql-sqlite3: SQLite3 binding for the MQL language (both 32bit MT4 and 64bit MT5)
GitHub - dingmaotu/mql-sqlite3: SQLite3 binding for the MQL language (both 32bit MT4 and 64bit MT5)
  • github.com
SQLite3 binding for the MQL language (both 32bit MT4 and 64bit MT5) - GitHub - dingmaotu/mql-sqlite3: SQLite3 binding for the MQL language (both 32bit MT4 and 64bit MT5)
Причина обращения: