文章 "SQL 与 MQL5: 与 SQLite 数据库集成"

 

新文章 SQL 与 MQL5: 与 SQLite 数据库集成已发布:

本文的目的,是那些打算在他们的项目中使用 SQL 的开发者。它解释了 SQLite 的功能和优势。本文不需要特别的 SQLite 函数知识, 当然对 SQL 的最小理解将是有益的。

许多开发者考虑在他们的项目中使用数据库,目的是进行数据存储,但他们还在对此犹豫,知道安装 SQL 服务器需要多少额外时间。然而对程序员来讲这不是很难 (如果数据库管理系统 (DBMS) 已经因其它目的而安装), 它对一般用户确实是个问题,以至最终对此安装灰心。

许多开发者认识到这样做会导致他们的工作仅有少数人使用,所以他们选择不处理 DBMS。结果, 他们转而使用文件 (经常会处理多于一个文件, 使用多种数据变种): CSV, 较少的 XML 或 JSON, 或限定结构的尺寸的二进制文件, 等等。

然而,事实证明,有一个极好的 SQL 服务器替代者!而你甚至不需要安装额外的软件,因为您的项目一切都在本地完成,同时还允许您使用 SQL 的强大功能。我们来讨论 SQLite。

本文目的是令您快速开始应用 SQLite。因此我不再罗嗦参数集和函数标志等细微之处,而是创建一个轻量连接包装来执行 SQL 命令,并演示它的使用。

继续阅读本文,您需要:

  • 有一个好心情 ;)
  • 展开文章附件中的存档文件至 MetaTrader 5 客户端文件夹
  • 安装任何方便的 SQLite 的观察器 (如 SQLiteStudio)
  • 加入官方文档 SQLite http://www.sqlite.org 至收藏

作者:o_O

 

有几个重要的补充(和改进建议:): 1.)

1.作者使用了 sqlite_open()函数,但还有一个更灵活的函数 sqlite_open_v2(),它可以使用打开标志,这意味着:- 控制数据库文件的访问分界;- 创建临时内存数据库;- 通过 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 */
#define  SQLITE_OPEN_EXCLUSIVE        0x00000010  /* 仅适用于 VFS */
#define  SQLITE_OPEN_AUTOPROXY        0x00000020  /* 仅适用于 VFS */
#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 */
#define  SQLITE_OPEN_TEMP_DB          0x00000200  /* 仅适用于 VFS */
#define  SQLITE_OPEN_TRANSIENT_DB     0x00000400  /* 仅适用于 VFS */
#define  SQLITE_OPEN_MAIN_JOURNAL     0x00000800  /* 仅适用于 VFS */
#define  SQLITE_OPEN_TEMP_JOURNAL     0x00001000  /* 仅适用于 VFS */
#define  SQLITE_OPEN_SUBJOURNAL       0x00002000  /* 仅适用于 VFS */
#define  SQLITE_OPEN_MASTER_JOURNAL   0x00004000  /* 仅适用于 VFS */
#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 */

2.我一直在使用 sqlite 来解决在使用计算量 "很大 "的指标时加速EA 优化的 问题。在这种情况下,合理的解决方案是在第一次运行时将优化期间的指标读数保存在数据库中,并在后续运行时直接从数据库中提取已经计算过的读数。因此,如果以 "默认形式 "使用 sqlite 引擎,发送大量 INSERT 和 SELECT 查询会耗费大量时间。在实践中,我们发现出路在于:1)使用内存数据库,但如果我们想将数据留待以后使用,这并不总是好办法;2)使用 SQL 引擎的 #pragma-directives。

第二种方法更可取,因为它无需将数据库从 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"

等等。

祝大家好运!

 
alsu:

有几项重要的补充(以及改进建议:))

作者使用了 sqlite_open()函数,但还有一个更灵活的 sqlite_open_v2()函数,可以使用打开标志,这意味着:- 控制数据库文件的访问分界;- 创建临时内存数据库;- 通过 URI 使用数据库,而不仅仅是在本地文件系统中,等等。

2.我一直在使用 sqlite 来解决在使用计算量 "很大 "的指标时加速EA 优化的 问题。在这种情况下,合理的解决方案是在第一次运行时将优化期间的指标读数保存在数据库中,并在后续运行时直接从数据库中提取已经计算过的读数。因此,如果以 "默认形式 "使用 sqlite 引擎,发送大量 INSERT 和 SELECT 查询会耗费大量时间。实际上,我们发现出路在于:1)使用内存数据库,但如果我们想将数据留待以后使用,这并不总是好办法;2)使用 SQL 引擎的 #pragma 指令。

第二种方法更可取,因为它无需将数据库从 RAM 转储到磁盘。具体方法如下:在数据库中创建第一个表之前,应向其发送以下查询:

好了,之后就可以

等等。

祝大家好运!

运行测试器时读取的指标数据本质上是一个简单数组,是一个顺序访问的流,因此在 SQL 基础上保存和读取是多余的,也是不合理的。

文章作者以 SQLite 应用为例提出的交易操作列表也是如此。

因此,我们必须认识到,使用关系型多链路数据模型的效率主要取决于所要解决的任务,而在这些示例中,IMHO 可能只是 "揠苗助长"。

 
有一种名为 MonetDB 的列式 SQL DBMS。这是一个免费的 DBMS,设计用于以列存储数据,该数据库具有良好的速度和可靠性。如果我没记错的话,任何 SQL DBMS 都可以按照主题中介绍的方式连接到 MT。
 
revers45:

测试仪运行期间的指标读数数据本质上是一个简单数组,是一个串行访问流,因此在 SQL 库中保存和读取这些数据是多余的,也是不合理的。

再读一遍,尽管多余且不合理: 优化智能交易系统


 

使用 SQLite 是可行的,而且效果很好。另外,SQLite 不适用于严肃的项目。无论如何,我都不推荐使用它。我自己就不止一次遇到过它的碰撞问题。例如,如果一个交易机器人连接到不同的图表,但使用的是同一个基础,而地址指向一个通用表(例如注册/更改会话、账户),那么在任何情况下都会出现类似 "表已锁定 "的错误。即使所有事务都已完成,游标都已关闭,数据库也是在共享模式下打开的,也无济于事。SQLite 开发人员也知道这个问题。

在我看来,MS Access 是支持 SQL 的最好的文件数据库。不管你如何责骂小软件公司的人,但我离开 SQLite 转而使用 MS Access,我一点也不后悔。即使在 Win98 中也安装了 OleDB 驱动程序 Jet 4.0,因此项目可以在所有 OC Windows 上运行。

 
很棒的想法和文章,我没有想到这一点。不过,如果能在 mql5 中提供本地支持就更好了,这样就可以在 Market 的产品 中使用。
 

首先热烈感谢您的工作!

我成功地将它移植到了 mql4!(一些#property strict 解决了编译错误)。

由于我使用的是 32 位平台,我不得不注释并删除一些与 64 位相关的导入函数。终端使用早期绑定,因此 64 位 dll 也会 在程序加载时 尝试 加载。(尽管没有使用它,只使用了 32bit.dll)。这导致了错误。

无论如何,我喜欢你的实现方法!(真希望我能写出像你这么好的程序)。

 
我使用的是 64 位版本的 MetaTrader 5,但无法让代码正常工作。我试着删除 对 32 位代码的引用,但仍出现 "Sqlite3_32.dll "无法加载的错误。您能告诉我代码中是否有引用此 dll 的地方吗?我需要让它工作于 64 位。
 

该脚本不工作,开箱即用,将此类项目 扔进垃圾桶。

控制台显示 https://s.mail.ru/9dWTNLqx6RT2/img-2015-11-10-20-15-44.png

В таблице https://s.mail.ru/QZyK6HwhMvo9/img-2015-11-10-20-16-18.png

Код https://s.mail.ru/2ooLdMg5MrHP/img-2015-11-10-20-16-56.png

 
delphiec:

该脚本不工作,开箱即用。

如果不明白要做什么和怎么做,请阅读手册。