DB = MySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag);
在调用每个 tick????? 时不会产生很大的负载吗?
在初始化时连接数据库,然后使用标识符进行访问不是更合理吗?
尤金,谢谢你的文章。关于 DBMS 的资料很有意思。
我有这样一个问题。
我的系统是 MetaTrader5,x64,975 版本。
在运行脚本 "MySQL-001 "时,我遇到了错误:
RL 1 12:41:22.443 MySQL-001 'C:\Program Files\MetaTrader5\MQL5\libraries\MQLMySQL.dll' is not 64-bit version PG 1 12:41:22.474 MySQL-001 (AUDCAD.e,M1) Cannot load 'C:\Program Files\MetaTrader5\MQL5\libraries\MQLMySQL.dll' DK 2 12:41:23.677 MySQL-001 (AUDCAD.e,M1) Cannot call 'cMySqlVersion', '..\libraries\MQLMySQL.dll' is not loaded ID 2 12:41:23.677 MySQL-001 (AUDCAD.e,M1) unresolved import function call
据我所知,原因是系统试图加载 64 位库...
适用于 Metatrader 5 的库版本 - x64
- 项目 MQLMySQL.DLL 已针对 x64 重新编译(源代码未更正)。
- 标准 LibMySQL.DLL 取自最新的 MySQL 稳定版 v5.6.21 x64。
实际上,对于那些试图在 MT5 x64 下运行项目的用户,只需替换 MQL5\Libraries 目录中的内容即可。MQL 程序的源代码无需更正或重新编译。
再次感谢 Denis (denkir) 的意见,我忘了 x64 用户。
我读着读着就流泪了。我并不反对作者。我希望他能正确对待批评。总之
1.如果不使用包装器也能正常工作,为什么还要以另一个 DLL 的形式编写包装器?MQL 语言还没有发展到可以编写这种往往会变成耙子的拐杖的阶段。
2.2. 为什么所有这些工作的结果都不是编写一个具备所有必要功能的类,而不是消除作者所提到的前辈们的缺点呢?
3.我想特别指出这一点:
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);";
其实,一切都简单得多:
string SQL="INSERT INTO EURUSD(Ask,Bid) VALUES (1.3601,1.3632),(1.3621,1.3643),(1.3605,1.3629);";
总的来说,这篇文章的写作风格是 "看我能做什么!",而不是 "看一看,学一学应该怎么做"。
我读着读着就流泪了。我并不反对作者。我希望他能正确对待批评。总之
1.如果不使用包装器也能正常工作,为什么还要以另一个 DLL 的形式编写包装器?MQL 语言还没有发展到可以编写这种往往会变成耙子的拐杖的阶段。
2.2. 为什么所有这些工作的结果都不是编写一个具备所有必要功能的类,而不是消除作者所提到的前辈们的缺点呢?
3.我想特别指出这一点:
其实,一切都简单得多:
总的来说,这篇文章的写法是 "看我能做什么!",而不是 "看一看,学一学应该怎么做"。
我会按顺序回答。
我必须说,这个项目是很久以前开始的,当时 MQL 语言还没有发展到现在的阶段,MQL4 没有类,没有结构。
软件解决方案必须同时适用于 MQL4 和 MQL5,而且从 MQL4 过渡到 MQL5(如有必要)的成本必须最低。该项目直到最近才最终完成。
这就是为什么该项目没有作为一个类来实施。您想要一个类吗?没问题 - 写出来!没有人禁止你。
现在是 3 个 INSERT 而不是 1 个。我这样写(版权归我所有)的原因如下:
- 它不违反公认的 SQL'92、SQL'2000 标准(你的变体--语法的特殊性正是 MySQL 的批量插入);
- 新手程序员 更容易阅读和理解;
- 演示执行 3 条 INSERT 指令,而不是 1 条。
多语句可以包括任何 DML/DDL/DCL 操作,您的示例仅限于对一个表进行 INSERT 操作。
附注:本文采用 "拿了就用 "的写作风格。
谢谢!我会深入研究您的解决方案,它可能比只依赖 MQL 更稳定。
仅供参考,我不久前为 MT4 版本 600+ 写了一个仅 MQL4 的桥接器: https://www.mql5.com/zh/code/11114
- 投票: 12
- 2014.02.10
- Sergey
- www.mql5.com
谢谢!我会深入研究您的解决方案,它可能比只依赖 MQL 更稳定。
仅供参考,我不久前为 MT4 版本 600+ 写了一个仅 MQL4 的桥接器:https://www.mql5.com/zh/code/11114。
感谢您花时间阅读这篇文章。我也查看了 您的(https://www.mql5.com/zh/code/11114),我在很久以前(MT4 版本 600 之前)就找到了这样的解决方案,我喜欢让 MQL 和 MySQL 保持友好的想法。但有一点我不想使用数组从数据库获取数据。这就是我为 MT4 和 MT5 创建此解决方案的原因。
另外,我忘了在文章中添加基于 x64 的项目,因此您可以在讨论区下载。源代码中没有任何改动,只是针对 x64 重新编译了 DLL。
祝你好运
尤金
- 投票: 12
- 2014.02.10
- Sergey
- www.mql5.com
新文章 如何从 MQL5 (MQL4) 访问 MySQL 数据库已发布:
本文描述开发一个在 MQL 与 MySQL 之间的接口。它讨论了现有的可行解决方案,并采用更便捷的途径来实现与数据库协同工作的链接库。本文包括功能的详尽描述,接口结构,例程,以及一些使用 MySQL 时的特性。作为软件解决方案,本文附件中包含了用于 MQL4 和 MQL5 语言的动态库,文档和脚本例程。
介绍
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 程序) 可以在如下元部件的帮助下实现:
作者:Eugeniy Lugovoy