如何从MQL5(MQL4)访问MySQL数据库
如何从MQL5 (MQL4) 访问MySQL 数据库
介绍
MQL 与数据库的交互问题并⾮新事物,但它们依然是相关的。利⽤数据库可以极⼤增强MetaTrader 的可塑性: 存储并分析价格历史,从⼀个交易平台拷贝交易⾄另⼀个平台,提供实时报价/交易,在服务器端定期进⾏深度分析计算,使⽤web 技术监视并远程控制账户。
总之,有许多种应⽤尝试从MQL 和MySQL 的组合之中获益,⼀些⽅案已经在代码库⾥出现。
例如"MySQL 包装- ⽤于MetaTrader 4 的链接库"就是这样的项⽬,许多程序员开始⾃⼰开发,在将来还可扩充。我认为,这种解决⽅案的缺点之⼀是分配特殊数组⽤来从数据库中读数据。
另⼀个项⽬"MySQL ⽇志 1 - ⽤于MetaTrader 4 的EA"更加专业,它不使⽤包装来访问标准链接库libmysql.dll。因此,它不能在MetaTrader4 编译版600+ 上⼯作,由于char字符类型已经被wchar_t替代,且使⽤int类型替代了TMYSQL结构指针,导致在项⽬中产⽣内存泄漏(内存分配不能控制/释放)。
另⼀个有趣的项⽬是"EAX_Mysql - MySQL 链接库- ⽤于MetaTrader 5 的链接库"。它是⼗分出⾊的实现。不过作者列出了⼀些缺点,在使⽤时有强制限制。
任何⼈若需要在他们的项⽬中使⽤数据库,有两个选项: 要么开发⾃⼰的解决⽅案,并了解它的每⼀个部分,或者使⽤/改编任何第三⽅解决⽅案,了解如何使⽤它们并检测是否会阻碍他们的项⽬。
在我开发⼀个相当复杂的⾃动交易时,就要⾯对这样的必要性和两个选项。依照现有项⽬经过搜索,且研究了很多的解决⽅案后,我意识到,已发现的实施⽅案均⽆助于把我的⾃动交易提升到“专业⽔平”。
此外,也有些荒谬的⽅案,例如: 使⽤标准libmysql.dll 执⾏DML/DDL 操作(插⼊/更新/删除数据, 在数据库中创建/废弃对象), 以及将数据检索(SELECT) 的实现作为HTTP 请求(使⽤inet.dll) 与MySQL 服务器端的web 服务器上的PHP 脚本通信。⽽SQL 查询被写在PHP 脚本中。
换句话说,要运⾏该项⽬,⼀定需要保证下述所有部件准备妥当,配置好并运⾏:MySQL 服务器,Apache/ IIS Web 服务器,在服务器端的PHP/ASP 脚本... ⼤量技术的组合。当然,在某些情况下,这是可以接受的,但当唯⼀的任务就是从数据库中查询数据- 那么这些全⽆意义。此外,⽀持如此累赘的⽅案也耗费时间。
⼤部分的⽅案在插⼊数据,创建对象等等操作时没有问题。问题在于数据查询,因为数据将会被返回调⽤环境。
我认为出于此⽬的⽽使⽤数组是不切实际的和不⽅便的,简单的原因就是在主程序的开发/调试/⽀持过程中,数据库查询是可以变化的,⽽您也要正确控制为数组分配的内存.. 那么,这些可以,⽽且必须要避免。
腹有诗书⽓⾃华
下⽂讨论的MQL <-> MySql 的接⼝基于Oracle PL/SQL, MS SQL T-SQL, AdoDB 等产品内使⽤的典型⽅式- 使⽤游标。这个接⼝的开发⽬标是易于编程和维护,再加上最少元部件。它作为DLL 包装器实现,连接标准链接库libmysql.dll,且接⼝函数集合作为⼀个 .mqh ⽂件。
php远程连接mysql数据库1. MQL <-> MySQL 接⼝
在MetaTrader 终端之间交互(通过MQL 程序) 可以在如下元部件的帮助下实现:
1. 接⼝库MQLMySQL.mqh. 使⽤#include语句将它加到项⽬⼯程⾥,并且可以按照您的喜好进⾏修改。
它包含的指令⽤于导⼊MQLMySQL.dll 动态库的函数,以及调⽤它们和处理错误的函数。
2. MQLMySQL.dll 动态库。这是⼀个包装器,⽤来访问标准库libmysql.dll 的功能。
此外,MQLMySQL.dll 链接库处理操作的结果并共享访问数据库的连接和游标。这意味着您可以在同⼀时间创建和使⽤多个连接(来⾃⼀个或多个MQL 程序), 保持少量的打开游标, 查询⼀个或多个数据库。互斥则⽤于分隔访问共享资源。
3. 标准动态链接库libmysql.dll 是本地访问驱动器。您可以从任何MySql 数据库的发布位置C:\Windows\Sytem32 或<;终端>\MQL5\Libraries (对于MetaTrader 4 在<;终端>\MQL4\Libraries) 中拷贝它。
事实上,它负责发送查询到数据库并接收检索结果。
让我们来详述要点,诸如: 打开/关闭连接, 执⾏DML/DDL 查询和数据检索。
1.1. 打开和关闭连接
该MySqlConnect 函数已经实现了打开与MySQL 数据库的连接:
腹有诗书⽓⾃华
腹有诗书⽓⾃华
在这个⽚段中,利⽤单次调⽤数据库,3 个条⽬将被插⼊EURUSD 表中。存储在SQL 变量中的每个查询,通过";" 分隔。
这种⽅法可⽤来频繁插⼊/更新/删除;必要的命令集合组合到⼀个"包" 中,从⽽减轻了⽹络流量,并提⾼数据库的性能。
在MySQL 中,INSERT 语法对异常处理⼗分出⾊。
例如,如果任务是移动价格历史,应该创建⼀个对应货币对的表,其主键是⽇期型,因为柱线的⽇期和时间都是唯⼀的。此外,应该检查是否任意特定的柱线数据都存在于数据库中(提⾼数据迁移的稳定性)。对于MySQL 不需要这项检查, 因为INSERT 语句⽀持ON DUPLICATE KEY。
简单来说, 如果尝试插⼊数据, 且表中已经有⼀个记录带有相同⽇期和时间, 则INSERT 语句可以被忽视,或此⾏被UPDATE 替换(参见www.doczj/doc/6b5e3fbf0d22590102020740be1e650e52eacf8a.html /doc/refman/5.0/en/insert-on-duplicate.html)。
1.3. 数据检索
SQL SELECT 语句⽤于从数据库中检索数据。下⾯的操作序列⽤于检索数据并返回检索的结果:
1.准备SELECT 语句。
2.打开游标。
3.获得查询回的⾏数。
4.循环获取结果的每⼀⾏。
5.在循环内将数据赋值给MQL 变量。
6.关闭游标。
当然,这是常⽤规划,所以并⾮每种情况都需要全部操作。例如,如果您打算确认表中存在⼀⾏数据(按照任意标准), 这对于准备查询⾜够了, 打开游标, 得到⾏数并关闭游标。事实上,强制部分是- 准备SELECT 语句,打开和关闭游标。
什么是游标?它是针对⼀⽚具有逻辑关系的内存区域的引⽤, 实际上- 结果数值的集合。当您发送SELECT 查询, 数据库为结果分配内存并创建⾏指针,您可以利⽤其在数据⾏之间移动。因此,可以按顺序访问按照查询定义的队列的每⼀⾏。(SELECT 语句的ORDER BY ⼦句)。
腹有诗书⽓⾃华
以下接⼝函数⽤于数据检索:
打开游标:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论