欢迎访问 外汇EA下载与MT4/MT5自动交易资源 - 聚合外汇EA、黄金EA、量化交易工具与自动化交易实战内容。
登录 注册

适用于 MQL4 的 MySQL 库,具有适当的内存管理 - 适用于 MetaTrader 4 的库

author emer | 878 人阅读 | 0 人评论 |

原始库文件 mql4-mysql.mqh 位于此处:https://www.mql5.com/en/code/11114。尊重原作者所做的工作(最初由拉塞尔,然后修改为韦德罗伊德卢金斯/ Sergey)并阅读原始代码的说明。

原来的mql4-mysql.mqh图书馆 内存管理存在严重问题。多个用户报告了问题(您可以在此处阅读:https://www.mql5.com/en/forum/28941)。

由于我想使用库作为我的项目的一部分,我根本无法承受内存的增加,这会导致系统崩溃。检查代码后,我设法将问题追溯到 FetchArray 函数,该函数允许用户从数据库读取和保存数据。内存未正确释放或分配,因此我对代码进行了一些更改以防止内存泄漏。

对改进后的库进行了测试,内存消耗保持稳定。测试持续了几个小时,包括数千个连接/数据读取,内存使用量增加极小(不到 10 MB),这可能是 MetaTrader 4 本身和指标运行的结果(不是 MetaTrader 4 终端的全新安装)。根据我之前的测试,原始库无法处理数据库中的几次读取,并且只能工作几分钟就崩溃了。测试是使用 EA 完成的,它要求每个价格变动的数据。

重要提示:例如,阅读库的原始描述!

整数     数据库连接 ID =0;

应该声明为局部变量,而不是全局变量。如果您将库与 EA 或指标一起使用,则需要进行本地声明。这样做是为了每次迭代时,变量内存地址都是不同的(由 MetaTrader 4 自动分配)并在循环后释放。

您还应该为每个特定任务打开连接。不建议为多个不同的请求保持连接打开。示例:我想从数据库读取几行并将其保存到数组中,我在函数中声明此过程。当函数被调用时,连接被建立,当数据被读取时,连接被关闭,之后函数返回XX数据。连接打开的时间最短。

始终记住关闭与 deinit_MySQL 的连接,如果不这样做,连接将会建立,随着时间的推移,您将达到运行数据库的服务器允许的最大连接数。服务器将会崩溃。

还应该实施适当的事务管理,以便两个或多个连接不会相互干扰。可能会导致读取数据违规,这将阻止您的 EA 工作。

带有 MySQL DB 的 Apache 服务器,供需要的人使用(免费软件):

如果您想要简单的数据库、服务器和数据库管理工具(它是免费且对用户友好的):https://www.apachefriends.org/index.html

阅读以下内容,了解如何设置数据库保护:http://robsnotebook.com/xampp-builtin-security

测试一下,请反馈。这是解决问题的唯一方法。

我可以写一篇论坛帖子,其中包含有关如何使用该库以及使用它需要什么的详细示例。

这是一个相当实质性的主题,所以只有在需要的时候我才会写它。如果您希望我编写用户手册,请发布请求。


附件下载

📎 mql4-mysql.mqh (10.56 KB)

Source: MQL5 #13712

🔐
请登录后参与评论
注册满12小时后评论,即可解锁附件下载
立即登录