文章 "SQLite: MQL5 原生 SQL 数据库操纵"

 

新文章 SQLite: MQL5 原生 SQL 数据库操纵已发布:

交易策略的研发与大数据处理相关联。 现在,您能够基于 SQLite 在 MQL5 中直接运用 SQL 查询来操纵数据库。 该引擎的重要特性在于整个数据库都被安置在用户 PC 上的单个文件中。

在 MetaEditor 中调试 SQL 查询

如果代码不成功,则所有操纵数据库的函数都将返回错误代码。 如果您遵循以下四个简单规则,操纵它们不会引发任何问题:

  1. 调用 DatabaseFinalize() 之后,应销毁所有查询控柄;
  2. 完毕前应利用 DatabaseClose() 关闭数据库;
  3. 应检查查询执行的结果;
  4. 如果发生错误,首先销毁查询,随后关闭数据库。

最困难的是,如果尚未创建查询,如何知晓错误是什么。 MetaEditor 允许打开 *.sqlite 文件,并利用 SQL 查询操纵。 我们以 company.sqlite 文件为例来看看如何完成此操作:

1. 打开终端公用文件夹中的 company.sqlite 文件。

2. 打开数据库后,我们可以在导航器中看到 COMPANY 数据表。 在其上双击。

3. 在状态栏中自动创建 “SELECT * FROM COMPANY” 查询。

4. 查询会自动执行。 也可以通过按 F9 或单击“执行”来执行。

5. 查看查询执行结果。

6. 如果出现问题,错误会显示在编辑器的日志当中。


SQL 查询允许获取数据表字段的统计信息,例如,总和和平均值。 我们进行查询,并检查它们是否运作。

作者:MetaQuotes

 

谁想出了办法,请展示这项任务的执行情况。

  1. 有两个终端。
  2. 需要将一个符号的实时报价从终端 1 传输到终端 2 的相应自定义符号
 
感谢您的文章和有用的应用实例。
 
fxsaber:

谁想出了这个办法,请展示一下这项任务的执行情况。

  1. 有两个终端。
  2. 需要将一个符号的实时报价从终端 1 传输到终端 2 的相应自定义符号。

在这项任务的框架内,我是否正确理解了在两种情况下(读取终端 2 的基数和向终端 1 的基数写入时)都必须通过交易机制 进行阻塞?


确定数据库已更新的最简便方法是什么?

 
fxsaber:

在这项任务的框架内,我是否正确理解了在两种情况下(读取终端 2 中的基数和向终端 1 中的基数写入时)都应通过事务机制 进行阻塞?

不,这是不同的锁定。如果在另一个 MQL5 程序或 MetaEditor 中已经打开了数据库,则在尝试修改时会出现 5124 错误。

 
Rashid Umarov:

不,这是一个不同的锁。如果底层已在另一个 MQL5 程序或 MetaEditor 中打开,则在尝试修改时会出现 5124 错误。

事实证明,数据交换 的可能性比通过文件少吗?

 
fxsaber:

与通过文件共享数据相比,共享数据的可能性似乎更小?

这取决于数据库实现本身

文件总是不方便--顺序访问,处理单个文件时也会遇到同样的问题

 
fxsaber:

与通过文件共享数据相比,共享数据的可能性似乎更小?

SQLite 不是服务器端数据库,而是嵌入式数据库。因此,它不能在不同进程中 同时 使用。

其目的是供 MQL5 内部使用,以及与其他系统共享(非同时使用)/传输。

内置内部数据库的优势在于,它可以在任何代理中使用,并允许您方便地在远程和策略测试器中 处理数据。


在一个终端中运行不同 MQL5 专家顾问的框架内,您可以共享相同的数据库。

 
Renat Fatkhullin:

SQLite 不是服务器端数据库,而是嵌入式数据库。因此,它无法在不同进程中提供共享和并发 使用。

在同一终端运行的不同专家中,可以共享同一个数据库。

我现在明白了,谢谢。

 

是否可以在 µl4 中使用 µl5 的描述?

函数和库操作是否兼容? 还是只适用于 µl5?

 
Chiripaha:

µl5 中描述的内容是否可以在 µl4 中使用?

函数和库操作是否兼容? 还是只适用于 µl5?

只有 MetaTrader 5 和 MQL5 支持本地 SQLite。

这不是一个库,而是与整个系统深度集成的标准 MQL5 功能,包括策略测试代理。