如何从MQL5(MQL4)访问MySQL数据库

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

如何从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 ⽂件。

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 替换(参见/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 ⼦句)。

腹有诗书⽓⾃华
以下接⼝函数⽤于数据检索:
打开游标:
腹有诗书⽓⾃华
腹有诗书⽓⾃华
想象⼀下您打开了⼀个游标,并忘记关闭它。

设想,每次即时报价到达,处理OnTick()事件时,数据都要通过游标检索,并且每次都打开⼀个新游标,并为其分配内存(客户端与服务器端两者相同)。

在某⼀时刻,服务器将拒绝服务,因为到达打开游标限制,并且导致缓存区溢出。

当然,这有点夸张,这样的结果可能在与libmysql.dll 直接⼯作的时候出现。

不过,MQLMySQL.DLL 动态链接库为游标分配内存,并将在超出了允许的限制时拒绝打开新游标。

当执⾏实际任务时,保持2-3 个打开游标就⾜够了。

每个游标可以处理⼀个笛卡尔尺⼨的数据; 并发使⽤⼆⾄三个游标(嵌套,例如,⼀个参数依赖于另⼀个游标) 可覆盖⼆⾄三个维度。

对于⼤多数任务这是完全正常的。

此外,为了实现复杂的数据检索,您可以随时使⽤这些对象来代表数据库(视图),在服务器端创建它们,并从MQL 代码⾥发送查询,就如同数据表⼀样。

1.4. 附加信息
下⾯提到的可以作为附加特征:
1.4.1. 从⼀个 .INI ⽂件中读取数据
腹有诗书⽓⾃华
为了得到服务器IP 地址,执⾏以下语句:
该INI ⽂件被放置于C:\MetaTrader5\MQL5\Experts 并且称为"MyConnection.ini",您可以访问MYSQL段落的Server键值。

在⼀个INI ⽂件中您可以保存多个您的项⽬中⽤到的服务器设置。

1.4.
2. 问题区域追踪
在接⼝库中提供了追踪模式,可以启⽤该模式来调试MQL 程序中任意位置的SQL 查询。

在问题区域指定如下:
或是
如果您在MQL 程序开始启⽤追踪,并且未禁⽤它,则所有数据库调⽤都将被记录。

⽽记录被保持在终端的控制台⾥(使⽤Print 命令)。

2. 例程
这⼀段提供了⼀些连接和使⽤已开发的链接库的例程。

参阅它们并评估软件解决⽅案的可⽤性。

例程MySQL-003.mq5出⽰如下: 连接数据库(连接参数保存在 .ini ⽂件), 创建数据表, 插⼊数据(也⽤到复合语句) 以及从数据库断开连接。

腹有诗书⽓⾃华
腹有诗书⽓⾃华
例程MySQL-004.mq5出⽰从数据表中检索数据,该表通过"MySQL-003.mq5" 脚本创建。

以上例程包含在实际项⽬中运⽤的典型错误处理。

事实上,在MQL 程序中使⽤的每个查询,都应该在任意MySQL 客户端上进⾏调试(PHPMyAdmin中,DB Ninja,MySQL 控制台)。

我个⼈使⽤并推荐专业数据库开发软件Quest TOAD 的MySQL 版本。

结论
本⽂并未详细介绍MQLMySQL.DLL 如何在Microsoft Visual Studio 2010 (C/C++) 环境⾥开发与实现。

该软件解决⽅案是专为特别应⽤设计,并且在多种MQL 软件开发领域,有超过100 种成功实现(来⾃创建复杂的交易系统⾄Web 发布)。

适⽤于MQL4 和MQL5 的链接库版本附加在下⾯。

附件也包括⼀个zip ⽂件,内有MQLMySQL.DLL 的源代码;
⽂档也包括在存档中;
若使⽤该例程, 不要忘记在⽂件\Scripts\MyConnection.ini 中指定您的数据库连接参数。

出师表
两汉:诸葛亮
先帝创业未半⽽中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。

然侍卫之⾂不懈于内,忠志之⼠忘⾝于外者,盖追先帝之殊遇,欲报之于陛下也。

诚宜开张圣听,以光先帝遗德,恢弘志⼠之⽓,不宜妄⾃菲薄,引喻失义,以塞忠谏之路也。

宫中府中,俱为⼀体;陟罚臧否,不宜异同。

若有作奸犯科及为忠善者,宜付有司论其刑赏,以昭陛下平明之理;不宜偏私,使内外异法也。

侍中、侍郎郭攸之、费祎、董允等,此皆良实,志虑忠纯,是以先帝简拔以遗陛下:愚以为宫中之事,事⽆⼤⼩,悉以咨之,然后施⾏,必能裨补阙漏,有所⼴益。

将军向宠,性⾏淑均,晓畅军事,试⽤于昔⽇,先帝称之⽈“能”,是以众议举宠为督:愚以为营中之事,悉以咨之,必能使⾏阵和睦,优劣得所。

腹有诗书⽓⾃华
亲贤⾂,远⼩⼈,此先汉所以兴隆也;亲⼩⼈,远贤⾂,此后汉所以倾颓也。

先帝在时,每与⾂论此事,未尝不叹息痛恨于桓、灵也。

侍中、尚书、长史、参军,此悉贞良死节之⾂,愿陛下亲之、信之,则汉室之隆,可计⽇⽽待也。

⾂本布⾐,躬耕于南阳,苟全性命于乱世,不求闻达于诸侯。

先帝不以⾂卑鄙,猥⾃枉屈,三顾⾂于草庐之中,咨⾂以当世之事,由是感激,遂许先帝以驱驰。

后值倾覆,受任于败军之际,奉命于危难之间,尔来⼆⼗有⼀年矣。

先帝知⾂谨慎,故临崩寄⾂以⼤事也。

受命以来,夙夜忧叹,恐托付不效,以伤先帝之明;故五⽉渡泸,深⼊不⽑。

今南⽅已定,兵甲已⾜,当奖率三军,北定中原,庶竭驽钝,攘除奸凶,兴复汉室,还于旧都。

此⾂所以报先帝⽽忠陛下之职分也。

⾄于斟酌损益,进尽忠⾔,则攸之、祎、允之任也。

愿陛下托⾂以讨贼兴复之效,不效,则治⾂之罪,以告先帝之灵。

若⽆兴德之⾔,则责攸之、祎、允等之慢,以彰其咎;陛下亦宜⾃谋,以咨诹善道,察纳雅⾔,深追先帝遗诏。

⾂不胜受恩感激。

今当远离,临表涕零,不知所⾔。

腹有诗书⽓⾃华。

相关文档
最新文档