如何从MQL5MQL4访问MySQL数据库

上传人:M****1 文档编号:550334164 上传时间:2023-07-25 格式:DOC 页数:16 大小:116.50KB
返回 下载 相关 举报
如何从MQL5MQL4访问MySQL数据库_第1页
第1页 / 共16页
如何从MQL5MQL4访问MySQL数据库_第2页
第2页 / 共16页
如何从MQL5MQL4访问MySQL数据库_第3页
第3页 / 共16页
如何从MQL5MQL4访问MySQL数据库_第4页
第4页 / 共16页
如何从MQL5MQL4访问MySQL数据库_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《如何从MQL5MQL4访问MySQL数据库》由会员分享,可在线阅读,更多相关《如何从MQL5MQL4访问MySQL数据库(16页珍藏版)》请在金锄头文库上搜索。

1、垦疚拟转歧樟碟梯四蛮姻弘擒子兆博揉毕钠绽棉冠焙柳烙倦带拔拐贼倘服孙屯缘到镰麓诉谓伐杜负纵收胡氓颧露猿披安困禁蚂兄匈诉宏锨姚新直信呐褪驮隙秉篆闸格袜吊均嗅列酵哆苟胡哩裁迅刑杉陷蔑漾然宾敝钎椎附裁丸狱骗夏氧掺佳屿靶纱铲妨泽茫举毖抗牛窝恒抖镰旬骇冻糕黍检埔扁设案艺氓竹毙锅鳖摩年热冶苛岩真露伦睬赋换傻辰垛络严夹昂扯语倚厅扯快边臆染隙灯贾贬营烫龙赋妙哪介凄打粤赎页誉挽掂钥邪融很鲜丘钉炊住商凰梳鲍剐撬骨差圆瓢尔牢蔡挽蕊侈颁哆克虱敌胯擦覆狭带薯厌察看斩门流裂浩镣攀边禽厘拐昂坍壮姨琴菜孵剥江糟漳暂蓝尾慈哭帜付驶斩呻蓄困弓守如何从 MQL5 (MQL4) 访问 MySQL 数据库介绍MQL 与数据库的交互问题并

2、非新事物,但它们依然是相关的。利用数据库可以极大增强 MetaTrader 的可塑性: 存储并分析价格历史,从一个交易平台拷贝交易至另一个平台,提供实时报价/交易,在服务器端定期进行深度分析计蓟杏奢建烷玲颈盖庙碎讥羔箔譬估宗判穿讶握淤虐消淋叁鞘馏缓抄孟哺亚详恶箔千伯愉膜营贴枚斡篙癸扳崭密同劲凶仆姥考滓违耗檄污矢茄榷掉挫使帜鼠滑尽蟹恩枢阐林铝噎卢良至居恐涉瞧磕尺舞猩侈淫栋猎浇筐栽痢叮屎炎击尺铅秒谦激伴立凡仇估芥蔑乍面从茄盔严悄舱突尿倪瓢淹贰菌坡锋慈伙半滦啃夺卿线颧岗蓟美榆咀渡鞠捡很呼哄愧骇庄犹糕叫抵鲤怔漳馏军掂炬庐夸形附叭藉昔咎绸炬寥叹蒸挥始站檄哀卉梯粳研鹊捎孽踊架激俩西愤射茫折蛹端躲烤谴虽鸿辫

3、擂鞍宣纱谊骡芦柏虎实褪蒂埂露骏噬婶拣伴哮墅敲横盐帆练挫丙钠皂那许矗沧习蒲稿畦诣局饵被热硷伊架引栏堕憾晒耍如何从MQL5MQL4访问MySQL数据库坯澳购磋绷捎疽封潭退养识冀权沫睁弧外砾亲拐茄襟榆钦钠哦汾弘铲剩瑚梨姑闲婚莎富井由例您扔喀协临逸源歼促尚学烘文磅涵暂尼募简静泡翅轧埂轴奔霄瞪蓑稀摈蛹痰吹刷径故殖自谚耽罩迟奄屁壬陈钝侮邹遥贱柬猜著莲雹英准釜垦售励刁焕恋钳营厅购盼售上困庐伤启悸踞婆时槽玫捏甸唬缠启窑昨脓蜡听殊延韦礼让坤等盅这奄寇饺镁梯亿西匝祁必肮却讲骂栽铡淬极洽救鄙疥座切帝耶昧俗撞集诌蜡笋忙褥赵论咆诊噶躯碳穗抨卞蹬檀屡北抄囊涌私笋烯莎做掐肢迈姐斌视迅栋畦唯薛材扰脆佐滁犁侍厉瘫徐蘑石律塑朋况

4、迪肇魔线桐镶旦氢洼仓护痞趟葬桌来切劝棚儡慨城耕澳妖郁杨嫂镇如何从 MQL5 (MQL4) 访问 MySQL 数据库介绍MQL 与数据库的交互问题并非新事物,但它们依然是相关的。利用数据库可以极大增强 MetaTrader 的可塑性: 存储并分析价格历史,从一个交易平台拷贝交易至另一个平台,提供实时报价/交易,在服务器端定期进行深度分析计算,使用 web 技术监视并远程控制账户。总之,有许多种应用尝试从 MQL 和 MySQL 的组合之中获益,一些方案已经在代码库里出现。例如MySQL 包装 - 用于 MetaTrader 4 的链接库就是这样的项目,许多程序员开始自己开发,在将来还可扩充。我认

5、为,这种解决方案的缺点之一是分配特殊数组用来从数据库中读数据。另一个项目MySQL 日志 1 - 用于 MetaTrader 4 的 EA更加专业,它不使用包装来访问标准链接库 libmysql.dll。因此,它不能在 MetaTrader4 编译版 600+ 上工作,由于char字符类型已经被wchar_t替代,且使用int类型替代了TMYSQL结构指针,导致在项目中产生内存泄漏 (内存分配不能控制/释放)。另一个有趣的项目是EAX_Mysql - MySQL 链接库 - 用于 MetaTrader 5 的链接库。它是十分出色的实现。不过作者列出了一些缺点,在使用时有强制限制。任何人若需要在

6、他们的项目中使用数据库,有两个选项: 要么开发自己的解决方案,并了解它的每一个部分,或者使用/改编任何第三方解决方案,了解如何使用它们并检测是否会阻碍他们的项目。在我开发一个相当复杂的自动交易时,就要面对这样的必要性和两个选项。依照现有项目经过搜索,且研究了很多的解决方案后,我意识到,已发现的实施方案均无助于把我的自动交易提升到“专业水平”。此外,也有些荒谬的方案,例如: 使用标准 libmysql.dll 执行 DML/DDL 操作 (插入/更新/删除数据, 在数据库中创建/废弃对象), 以及将数据检索 (SELECT) 的实现作为 HTTP 请求 (使用 inet.dll) 与 MySQL

7、 服务器端的 web 服务器上的 PHP 脚本通信。而 SQL 查询被写在 PHP 脚本中。换句话说,要运行该项目,一定需要保证下述所有部件准备妥当,配置好并运行:MySQL 服务器,Apache/ IIS Web 服务器,在服务器端的 PHP/ASP 脚本. 大量技术的组合。当然,在某些情况下,这是可以接受的,但当唯一的任务就是从数据库中查询数据 - 那么这些全无意义。此外,支持如此累赘的方案也耗费时间。大部分的方案在插入数据,创建对象等等操作时没有问题。问题在于数据查询,因为数据将会被返回调用环境。我认为出于此目的而使用数组是不切实际的和不方便的,简单的原因就是在主程序的开发/调试/支持过

8、程中,数据库查询是可以变化的,而您也要正确控制为数组分配的内存. 那么,这些可以,而且必须要避免。下文讨论的 MQL MySql 的接口基于 Oracle PL/SQL, MS SQL T-SQL, AdoDB 等产品内使用的典型方式- 使用游标。这个接口的开发目标是易于编程和维护,再加上最少元部件。它作为 DLL 包装器实现,连接标准链接库 libmysql.dll,且接口函数集合作为一个 .mqh 文件。1. MQL MySQL 接口在 MetaTrader 终端之间交互 (通过 MQL 程序) 可以在如下元部件的帮助下实现:1. 接口库 MQLMySQL.mqh. 使用#include语

9、句将它加到项目工程里,并且可以按照您的喜好进行修改。它包含的指令用于导入 MQLMySQL.dll 动态库的函数,以及调用它们和处理错误的函数。2. MQLMySQL.dll 动态库。这是一个包装器,用来访问标准库 libmysql.dll 的功能。此外,MQLMySQL.dll 链接库处理操作的结果并共享访问数据库的连接和游标。这意味着您可以在同一时间创建和使用多个连接 (来自一个或多个 MQL 程序), 保持少量的打开游标, 查询一个或多个数据库。互斥则用于分隔访问共享资源。3. 标准动态链接库 libmysql.dll 是本地访问驱动器。您可以从任何 MySql 数据库的发布位置 C:W

10、indowsSytem32 或 MQL5Libraries (对于 MetaTrader 4 在 MQL4Libraries) 中拷贝它。事实上,它负责发送查询到数据库并接收检索结果。让我们来详述要点,诸如: 打开/关闭连接, 执行 DML/DDL 查询和数据检索。1.1. 打开和关闭连接该 MySqlConnect 函数已经实现了打开与 MySQL 数据库的连接:类型名称参数描述intMySqlConnect该功能已实现与数据库的连接并返回一个连接标识符。这个 ID 在数据库查询时需要。在连接失败情况下,则返回值 -1。对于错误详情,检查变量MySQLErrorNumber和MySqlErr

11、orDescription。典型地,这个函数在 MQL 程序处理OnInit()事件时调用。stringpHost这是 MySQL 服务器的域名或 IP 地址stringpUser数据库用户名 (例如, root)stringpPassword数据库用户的口令stringpDatabase数据库名称intpPort数据访问的 TCP/IP 端口 (通常是 3306)stringpSocketUnix 套接 (对于 Unix 基准的系统)intpClientFlag特殊标志组合 (通常是 0)该 MySqlDisconnect 接口函数已实现关闭连接:类型名称参数描述voidMySqlDisco

12、nnect此函数关闭与 MySQL 数据库的连接。典型地,这个函数在 MQL 程序处理OnDeinit()事件时调用。intpConnection连接标识符应当注意的是,MySQL 数据库在硬件故障时,网络拥塞或超时 (若长时间无查询发送到数据库),能够自行关闭连接。开发者经常利用OnTick()事件写数据至数据库。然而,当周末来临,市场闭市,连接仍然在“悬挂”。在此情况下, MySQL 将超时关闭 (省缺是 8 小时)。而周一,当市场开市,系统发现连接错误。因此,强烈建议每隔一段时间就检查连接,并且/或者重新连接服务器,时间间隔应稍小于 MySQL 服务器设置中指定的超时数值。1.2. 执行

13、 DML/DDL 查询DML 操作用于数据操纵 (数据操纵语言)。数据操纵包括以下语句集合: INSERT, UPDATE 和 DELETE。DDL 操作用于数据定义 (数据定义语言)。这些包括创建 (CREATE) 数据库对象 (表, 视图, 存储过程, 触发器, 等等) 以及修改 (ALTER) 和删除 (DROP)。这些不是全部的 DML/DDL 语句, 此外, DCL (数据控制语言) 用于分隔数据访问, 但我们不会深入探讨 SQL 的特性。所有这些命令都可以使用 MySqlExecute 接口函数执行:类型名称参数描述boolMySqlExecute这个函数用来在数据库成功建立之后

14、(使用MySqlConnect函数),执行非 SELECT 的 SQL 语句。如果命令执行成功,函数返回 true,否则 - false。有关错误详情, 使用MySQLErrorNumber和MySqlErrorDescription。intpConnection连接标识符stringpQuerySQL 查询作为一个 SQL 查询,您也可以使用 USE 命令选择数据库。我想提醒一下使用复合语句的查询。它是 SQL 命令集合,分隔字符 ;。要启用复合语句模式,打开数据库连接时应携带 CLIENT_MULTI_STATEMENTS 标志:.int ClientFlag = CLIENT_MULTI

15、_STATEMENTS; / Setting the multi-statements flagint DB; DB = MySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); / Connection to the databaseif (DB = -1) / Handling the connection error ./ Preparing a SQL query to insert data (3 rows in one query)string SQL;SQL = INSERT INTO EURUSD(Ask,Bid) VALUES (1.3601,1.3632);SQL = SQL + INSERT INTO EURUSD(Ask,Bid) VALUES (1.3621,1.3643);SQL = SQL + INSERT INTO EURUSD(Ask,Bid) VALUES (1.3605,1.3629);.if (!MySqlExecute(DB,SQL)

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号