文章 "MQL5 编程基础: 终端中的全局变量" - 页 3

 
Dmitry Fedoseev:
可以通过全局变量 的前缀来解决这个问题。
可以通过前缀来解决,但这并不是一个好的解决方案 :-( 存在一个生成唯一前缀的问题,而在 F3 对变量的审查中,这简直是一团糟......变量确实缺少命名空间。如果我们必须从 DC、account、account、chart......生成一个前缀,并且记住名称的长度是有限的,那么我们就无法使用前缀做很多事情 :-)
 

适合初学者的好文章。

The GlobalVariableTemp() function creates a temporary global variable (that exists till the terminal is stopped). In a few years that I develop EAs on MQL5, I have never faced the need for such a variable. Moreover, the very concept of a temporary global variable contradicts the basic principle of their application — long-term data storage not affected by the terminal relaunches.

这并不是终端全局变量的唯一用途。它们还可用于在不同的 EA 或指标之间交换信息。因此,在这种情况下,只在内存中保存数据而不在终端重启时保留数据也是一种功能。

静态部分非常有趣,我有一个问题和一个评论。

在执行 OnTick() 函数期间,可能会发生某些 EA 从图表中移除,但 Mutex_Release() 函数并未执行的情况。

为什么 EA 会被移除,而 Mutex_Release() 函数却没有被执行?如果以正常方式(关闭图表、移除 EA 或关闭终端)从图表中移除 EA,绝不会停止执行流程。我是不是漏掉了什么?

因此,我的意见是,Mutex_Release()函数不被执行的唯一情况是 "硬 "停止、电源或硬件故障等,因此您的 mutex 全局变量完全可以使用 GlobalVariableTemp() 函数 创建为临时变量。

 

全局变量在策略测试期间是否有效?

例如,当指标将值存储到 GV 中并由 EA 读取时,策略测试器 是否会在模拟过程中及时获取这些值?

 
Admiral Thrawn:

全局变量在策略测试期间有效吗?

例如,当指标将值存储到 GV 中并由 EA 读取时,策略测试器 是否会在模拟过程中及时获取这些值?

可以。

 
"当计算机突然断电时,全局变量有可能消失"。

关闭 MT5 终端 bild 2361 后,我的全局变量 消失了。 GlobalVariablesFlush() 在 2 个不同的 MT5 终端上执行。胡说八道。终端是用 /portable 键启动的,也许这就是原因?

我试着手动创建,打开并关闭终端,似乎保存了。我把自动优化的结果写入了全局,而这是一个非常漫长的过程。因此,这种存储方式并不可靠。我必须添加一个程序,通过结构将全局变量写入文件。

Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Глобальные переменные создаются путем размещения их объявлений вне описания какой-либо функции. Глобальные переменные определяются на том же уровне, что и функции, т. е. не локальны ни в каком блоке. Область видимости глобальных переменных - вся программа, глобальные переменные доступны из всех функций, определенных в программе...
 
Konstantin Efremov:

关闭 MT5 终端 bild 2361 后,我的全局变量 消失了。 GlobalVariablesFlush() 在 2 个不同的 MT5 终端上执行。胡说八道。终端是用 /portable 键启动的,也许这就是原因?

我试着手动创建,打开并关闭终端,结果似乎是保存了。我把自动优化的结果写入了全局,这是一个非常漫长的过程。 因此,这种存储方式并不可靠。我必须添加一个程序,通过结构将全局变量写入文件。

在终端还是在测试器中?在 MT5 中是有区别的。

 
Dmitry Fedoseev:

在终端还是在测试仪中?MT5 中存在差异。

在终端上。

总的来说,我是用以下方法解决问题的。在处理智能交易系统自动优化的类中,除了创建全局变量外,我还将相同的数据写入每个货币对的文件中(每次启动类时都会删除初步文件,因为类仅在重新计算时才会调用,所以在任何情况下都必须更新数据)。这些文件是普通文本文件,文件名是为 Expert Advisor 的特定实例编码的。在初始化过程中,EA 会调用从文件中读取优化数据的功能,并创建或更新全局变量

这样做也很方便,因为这些文件可以备份,并在策略测试器中运行时使用(文件自然位于终端的公共文件夹中),因为测试器会创建自己的全局变量实例,而且自动优化本身就是一个漫长的过程,从文件中加载准备好的数据可以大大缩短测试时间。

Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Глобальные переменные создаются путем размещения их объявлений вне описания какой-либо функции. Глобальные переменные определяются на том же уровне, что и функции, т. е. не локальны ни в каком блоке. Область видимости глобальных переменных - вся программа, глобальные переменные доступны из всех функций, определенных в программе...
 
都看完了  受益匪浅,就是最后的部分有些复杂,临时变量还是有用的   我在EA中有操盘面板  面板中包括 开启移动止损功能按钮,临时变量就能记住变量的 数值  再切换周期中 我能获取原按钮状态  进行重画 谢谢你的文章
 

你好,德米特里、

我知道你的文章已经写了好几年了,但我还是想和你分享一些东西,希望也能提出一个问题!

您提到您还没有发现 Temp 全局变量的用途。 我正在开发的东西正是需要它。 我正在绞尽脑汁想办法通过全局变量实现共享 IO 完成端口句柄,特别是在崩溃或正常重启时。 我正在设计一个使用 Windows IO 完成端口的订单处理系统。由于我们可以在 MQL5 中创建 Win32 线程,我无法在创建 IOCP 服务器时创建线程池,所以我使用服务的变通方法是:

  1. 创建 IOCP 服务器,而不是创建线程(我们无法创建线程),我将 IOCP 句柄保存到全局变量中
  2. 然后,我打开至少 2 个其他服务,它们充当工作线程,从全局变量读取 IOCP 句柄,并向 IOCP 注册。

如果终端重新启动,不管是异常还是其他原因,我都希望 IOCP 句柄在终端启动时消失,这样我就可以创建一个新的 IOCP 句柄,以便重新启动。这样实现起来会更简洁。

我还想知道,全局变量的速度有多快,可靠性有多高?

感谢您的精彩文章,读来令人受益匪浅、

谢普


 
MetaQuotes:

新文章MQL5 编程基础:终端的全局变量 已发布:

作者: Dmitry FedoseevDmitry Fedoseev

这是 Python 集成将数据发送到 MLQ EA 和从 Python 发送到 MLQ EA 所需要的。这样,用 Python 开发的 EA 就可以在 Strategy Tester 中进行测试,除非有什么我不知道的不可能之处。