您现在的位置是:主页 > MT5交易平台 >
如何从 MQL5 (MQL4) 访问 MySQL 数据库
2022-05-14 05:34MT5交易平台 人已围观
简介如何从 MQL5 (MQL4) 访问 MySQL 数据库 MQL 与数据库的交互题目并非新事物,但它们如故是闭连的。诈欺数据库 能够极大巩固 MetaTrader 的可塑性: 存储并阐发价值史册,从一个买卖平台拷贝买...
如何从 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 文献。
正在 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 数据库的连结: 类型 名称 参数 刻画
应该当心的是, MySQL 数据库正在硬件毛病时, 收集堵塞或超时 (若永远间无盘查发送到数据库), 可能自行紧闭连结。 开采者时时诈欺 OnTick() 事宜写数据至数据库。然而,当周末惠临,墟市闭市,连结已经正在“悬 挂”。正在此环境下, MySQL 将超时紧闭 (省缺是 8 小时)。 而周一,当墟市开市,体系察觉连结舛误。因而,剧烈倡议每隔一段期间就查抄连结,而且 /或 者从头连结效劳器,期间间隔应稍小于 MySQL 效劳器成立中指定的超时数值。 1.2. 施行 DML/DDL 盘查 DML 操效率于数据独霸 (数据独霸发言)。数据独霸包含以下语句凑集 : INSERT, UPDATE 和 DELETE。 DDL 操效率于数据界说 (数据界说发言)。这些包含创筑 (CREATE) 数据库对象 (外, 视图, 存 储流程, 触发器, 等等) 以及篡改 (ALTER) 和删除 (DROP)。 这些不是一齐的 DML/DDL 语句, 其它, DCL (数据限定发言) 用于分开数据访候 , 但咱们不会 深化研商 SQL 的特点。全部这些号召都能够应用 MySqlExecute 接口函数施行: 类型 名称 参数 刻画
行为一个 SQL 盘查, 您也能够应用 USE 号召采选数据库。 我思指挥一下应用复合语句的盘查。 它是 SQL 号召凑集,分开字符 ;。 要启用复合语句形式,掀开数据库连结时应领导 CLIENT_MULTI_STATEMENTS 记号:
正在这个片断中,诈欺单次移用数据库,3 个条件将被插入 EURUSD 外中。存储正在 SQL 变量中 的每个盘查,通过 ; 分开。 这种办法可用来一再插入/更新/删除;需要的号召凑集组合到一个 包 中,从而减轻了收集流 量,并普及数据库的功能。 正在 MySQL 中,INSERT 语法对特地统治很是卓异。 比如,假设义务是搬动价值史册,该当创筑一个对应钱银对的外,其主键是日期型,由于柱线的 日期和期间都是独一的。其它,该当查抄是否随便特定的柱线数据都存正在于数据库中 (普及数据 转移的牢固性)。关于 MySQL 不必要这项查抄, 由于 INSERT 语句支撑 ON DUPLICATE KEY。 单纯来说, 假设测验插入数据 , 且外中仍旧有一个纪录带有相通日期和期间 , 则 INSERT 语句 可 以 被 忽 视 , 或 此 行 被 UPDATE 替 换 ( 参 睹 。 1.3. 数据检索 SQL SELECT 语句用于从数据库中检索数据。下面的操作序列用于检索数据并返回检索的结果: 1. 绸缪 SELECT 语句。 2. 掀开逛标。 3. 获取盘查回的行数。 4. 轮回获取结果的每一行。 5. 正在轮回内将数据赋值给 MQL 变量。 6. 紧闭逛标。 当然,这是常用筹备,以是并非每种环境都必要一齐操作。比如,假设您谋划确认外中存正在一行 数据 (服从随便准绳), 这关于绸缪盘查足够了, 掀开逛标, 获得行数并紧闭逛标。本相上,强制 片面是 - 绸缪 SELECT 语句,掀开和紧闭逛标。 什么是逛标?它是针对一片具有逻辑联系的内存区域的援用, 实质上 - 结果数值的凑集。当您 发送 SELECT 盘查, 数据库为结果分派内存并创筑行指针,您能够诈欺其正在数据行之间搬动。 因而,能够按次序访候服从盘查界说的部队的每一行。 (SELECT 语句的 ORDER BY 子句)。 以下接口函数用于数据检索: 掀开逛标: 类型 名称 int MySqlCursorOpen 参数 刻画
这个函数为 SELECT 盘查掀开一个逛标, 若获胜则返回逛标标识符。 不然, 函数返回 -1 。 为 了 查 找 错 误 原 因 , 使 用 变
全部 MySQL 返回的数据都有当地外达格式 (不单外达为字符串)。 因而,应用这些函数,您能够将所选的数据转换为所需的类型。独一缺乏的是,正在 SELECT 清 单中, 用列编号 (肇始编号为 0) 代替了它的名字。 然而, 当开采一个运用次第时, 绸缪 SELECT 语句并获取结果简直都正在一个页面,以是当您规章数据获取逻辑时,您能够看到 SELECT 盘查。 因而,您总能领略正在 SELECT 清单中的字段数目 ( 这种格式也同样合用于访候 AdoDB 的数 据)。好了,这片面能够正在自此篡改。它对计划中的功用开采只是略有影响。 紧闭逛标: 类型 名称 参数 刻画
紧闭逛标是一个症结操作。 不要忘却紧闭逛标。 遐思一下您掀开了一个逛标,并忘却紧闭它。设思,每次即时报价达到,统治 OnTick() 事宜时, 数据都要通过逛标检索,而且每次都掀开一个新逛标,并为其分派内存 (客户端与效劳器端两者 相通)。正在某偶尔刻,效劳器将拒绝效劳,由于达到掀开逛标局限,而且导致缓存区溢出。 当 然 , 这 有 点 夸 张 , 这 样 的 结 果 可 能 正在 与 libmysql.dll 直 接 工 作 的 时 候 出 现 。 不 过 , MQLMySQL.DLL 动态链接库为逛标分派内存,并将正在跨越了应承的局限时拒绝掀开新逛标。 当施行实质义务时,依旧 2-3 个掀开逛标就足够了。每个逛标能够统治一个笛卡尔尺寸的数据; 并发应用二至三个逛标 (嵌套,比如,一个参数依赖于另一个逛标) 可笼盖二至三个维度。关于
大无数义务这是统统寻常的。其它,为了完成杂乱的数据检索,您能够随时应用这些对象来代外 数据库 (视图),正在效劳器端创筑它们,并从 MQL 代码里发送盘查,就宛若数据外相同。 1.4. 附加音信 下面提到的能够行为附加特色:
时时正在 MQL 代码(或正在 EA、目标、剧本的参数)中直接保留相闭数据库连结的音信(效劳器 的 IP 地方, 端口, 用户名, 口令, 等等)是不睬性的,由于效劳器也许会搬动,它的地方也会 动态变更,等等。正在这种环境下您将必要篡改 MQL 代码。因而,全部这些数据该当最好被存储 正在准绳 .INI 文献里,而只将它的名称写正在 MQL 次第中。然后,应用 ReadINI 函数来读取连 接参数,并应用它们。 比如,INI 文献包罗以下音信:
正在接口库中供给了追踪形式,能够启用该形式来调试 MQL 次第中随便名望的 SQL 盘查。 正在题目区域指定如下:
假设您正在 MQL 次第出手启用追踪,而且未禁用它,则所少睹据库移用都将被纪录。而纪录被保 持正在终端的限定台里 (应用 Print 号召)。
这一段供给了极少连结和应用已开采的链接库的例程。参阅它们并评估软件处理计划的可用性。 例程 MySQL-003.mq5 出示如下: 连结数据库 (连结参数保留正在 .ini 文献), 创筑数据外, 插 入数据 (也用到复合语句) 以及从数据库断开连结。
下一篇:没有了
广告位 |