2024年6月3日发(作者:)
精品文档 你我共享
如何从 MQL5 (MQL4) 访问 MySQL 数据库
介绍
MQL 与数据库的交互问题并非新事物,但它们依然是相关的。利用数据库可以极大增强
MetaTrader 的可塑性: 存储并分析价格历史,从一个交易平台拷贝交易至另一个平台,提供实
时报价/交易,在服务器端定期进行深度分析计算,使用 web 技术监视并远程控制账户。
总之,有许多种应用尝试从 MQL 和 MySQL 的组合之中获益,一些方案已经在代码库里出现。
例如 "MySQL 包装 - 用于 MetaTrader 4 的链接库" 就是这样的项目,许多程序员开始自己开
发,在将来还可扩充。我认为,这种解决方案的缺点之一是分配特殊数组用来从数据库中读数据。
另一个项目 "MySQL 日志 1 - 用于 MetaTrader 4 的 EA" 更加专业,它不使用包装来访问标准
链接库 。因此,它不能在 MetaTrader4 编译版 600+ 上工作,由于 char 字符类
型已经被 wchar_t 替代,且使用 int 类型替代了 TMYSQL 结构指针,导致在项目中产生内存
泄漏 (内存分配不能控制/释放)。
另一个有趣的项目是 "EAX_Mysql - MySQL 链接库 - 用于 MetaTrader 5 的链接库"。它是十分
出色的实现。不过作者列出了一些缺点,在使用时有强制限制。
任何人若需要在他们的项目中使用数据库,有两个选项: 要么开发自己的解决方案,并了解它的
每一个部分,或者使用/改编任何第三方解决方案,了解如何使用它们并检测是否会阻碍他们的
项目。
在我开发一个相当复杂的自动交易时,就要面对这样的必要性和两个选项。依照现有项目经过搜
索,且研究了很多的解决方案后,我意识到,已发现的实施方案均无助于把我的自动交易提升到
“专业水平”。
此外,也有些荒谬的方案,例如: 使用标准 执行 DML/DDL 操作 (插入/更新/删除
数据, 在数据库中创建/废弃对象), 以及将数据检索 (SELECT) 的实现作为 HTTP 请求 (使用
) 与 MySQL 服务器端的 web 服务器上的 PHP 脚本通信。而 SQL 查询被写在 PHP 脚
本中。
换句话说,要运行该项目,一定需要保证下述所有部件准备妥当,配置好并运行:MySQL 服务
器,Apache/ IIS Web 服务器,在服务器端的 PHP/ASP 脚本... 大量技术的组合。当然,在某
些情况下,这是可以接受的,但当唯一的任务就是从数据库中查询数据 - 那么这些全无意义。
此外,支持如此累赘的方案也耗费时间。
大部分的方案在插入数据,创建对象等等操作时没有问题。问题在于数据查询,因为数据将会被
返回调用环境。
我认为出于此目的而使用数组是不切实际的和不方便的,简单的原因就是在主程序的开发/调试/
支持过程中,数据库查询是可以变化的,而您也要正确控制为数组分配的内存.. 那么,这些可
以,而且必须要避免。
腹有诗书气自华
精品文档 你我共享
下文讨论的 MQL <-> MySql 的接口基于 Oracle PL/SQL, MS SQL T-SQL, AdoDB 等产品内使用
的典型方式- 使用游标。这个接口的开发目标是易于编程和维护,再加上最少元部件。它作为
DLL 包装器实现,连接标准链接库 ,且接口函数集合作为一个 .mqh 文件。
1. MQL <-> MySQL 接口
在 MetaTrader 终端之间交互 (通过 MQL 程序) 可以在如下元部件的帮助下实现:
1. 接口库 . 使用 #include 语句将它加到项目工程里,并且可以按照您的喜好
进行修改。
它包含的指令用于导入 动态库的函数,以及调用它们和处理错误的函数。
2. 动态库。这是一个包装器,用来访问标准库 的功能。
此外, 链接库处理操作的结果并共享访问数据库的连接和游标。这意味着您可以
在同一时间创建和使用多个连接 (来自一个或多个 MQL 程序), 保持少量的打开游标, 查询一
个或多个数据库。互斥则用于分隔访问共享资源。
3. 标准动态链接库 是本地访问驱动器。您可以从任何 MySql 数据库的发布位置
C:WindowsSytem32 或 <终端>MQL5Libraries (对于 MetaTrader 4 在 <终
端>MQL4Libraries) 中拷贝它。
事实上,它负责发送查询到数据库并接收检索结果。
让我们来详述要点,诸如: 打开/关闭连接, 执行 DML/DDL 查询和数据检索。
1.1. 打开和关闭连接
该 MySqlConnect 函数已经实现了打开与 MySQL 数据库的连接:
类型 名称 参数 描述
该功能已实现与数据库的连接并返回一个连接标识符。这个 ID 在数据
库查询时需要。
int MySqlConnect
在连接失败情况下,则返回值 "-1"。对于错误详情,检查变
量
MySQLErrorNumber
和
MySqlErrorDescription
。
典型地,这个函数在 MQL 程序处理
OnInit()
事件时调用。
腹有诗书气自华
发布评论