MetaEditor/MQL4 ExpertAdviser:局部变量声明不止一次?

MetaEditor/MQL4 ExpertAdviser: Local Variable Declaration More Than Once?

我正在查看一些旧的 MetaEditor4 / MQL4 代码,其中一个局部变量被声明了两次:

......
1 int start()                                     
2   {
3     if (1==2)
4       {
5          double myVar = 1;
6       } else
7       {
8          double myVar = 2;
9       }
10    return;                                      
11  }
.......

MetaEditor 版本 5.00, build 1601 中的编译过程失败:

'myVar' - variable already defined in line 8.

如果我删除第 8 行,编译会顺利进行。

我的问题是:

1。 MetaEditor 中是否有任何选项可以容忍局部变量的多重声明?

2。在以前版本的 MetaTrader Terminal 4 / MetaEditor 和 .MQ4 代码中:在这种情况下是否可以多次声明局部变量?

3。 MetaEditor 的版本为 5.00, build 1601,但代码的扩展名是 .mq4,它与 MetaTrader 终端软件 MetaTrader4(来自 FXCM)一起安装。因此我假设我仍然可以使用 .MQ4 代码。是否有机会从某处获得纯 MQL4 安装? 每当我安装 mt4(来自例如:mt4 download)时,它都会结束 使用 mt5 安装程序。

  1. 代码可能是 运行 和 'strict' 或 non-strict 模式。 strict 意味着变量必须在其范围内声明,non-strict - 你现在拥有的所有混乱。 所以把 #property strict 放在文件的开头
  2. 在某处开设一个模拟账户并在那里安装 mt4。只有通过经纪人的 web-site 注册或从 mt4(示例 - Alpari)
  3. 打开的无限制和演示,演示才能在 30 天内有效

序言:

MQL4 的世界不断发展。人们可能会试图规避这一事实,但最终,由于自己的失望,试图避免进化迟早会徒劳无功。

由于需要 re-engineer code-base 跨越几个人*几十年的规模,我可以告诉你很多关于什么有效,什么无效的故事。


一个"Old code"v/s一个-MQL4.56789

如果只应从中得出一件事,切勿尝试 "circumvent" New-MQL4,而是查看代码并重构 "Old code" - 这是一种更安全的生存方式(更长的时间)。

是的,有机会(零保证,table 上暂时只剩下一些机会)新的编译器版本将仍然能够生成代码的 executable 版本,但是鉴于城市已经有了一套新的规则,游戏不会持续太久。

Ad 1 + 2 )
编译器仍然容忍多个声明,但不能在一个范围内

如果新版本的编译器定义任何变量仅在其有效范围内声明,认真的程序员应该将此作为一般原则。上面的代码其实还有其他问题,右钉scope-of-validity:

2 ...
3 if (  1 == 2 ) {
4       ...
5       double myVar = 1; // myVar declared & known  |since HERE >
6       ...              //        masking any other,|known HERE :
7       ...             //                           |known HERE : 
8 } else               //                            |till  HERE . Undef further
9 {
10      ...
11      double myVar = 2; // myVar declared & known  |since HERE >
12                       //        masking any other,|known HERE :
13       ...            //                           |known HERE :
14 }                   //                            |till  HERE . Undef further

所以,如果有任何 _global_ 作用域变量具有相同的名称 myVar,它不会是 "visible"存在本地声明的变量,具有相同的名称。

最后,code-execution 从第 8 行或第 14 行进一步转义,本地声明的变量 double myVar 不再存在,这种行为基本上是正确的(并且 "older" 编译器版本容忍了 side-effects 的一种危险习惯,在容忍 scope-of-validity 溢出的这些年里,所以现在是清理规则的时候了,以满足C/S 标准的公平水平。


广告 3) 语言从 MQL5 中获得了很多,即使在 MQL4 中没有使用

是的,MetaEditor 会正确地将 MQL4 代码编译成 .mq4 code-execution 格式,这里没问题。甚至 auto-update 进程也开始独立于 MT4 终端平台(自动)更新(因此您会经常看到新的帮助文件出现并强制执行 re-compilation 所有可见的本地主机 .MQ4 资产更新为 .EX4 格式,所以“不要恐慌。

最好永远不要安装 Broker-agnostic MT4,请始终访问您的经纪商支持并从您的经纪商那里获取安装包和帮助。这是您在合同中签署的业务关系,因此请保留这些字符串,因为您将在 table 上交易您的资金,它们根据设定的条款和条件运作。一些经纪商有平台定制的方法,因此更愿意从与他们的 Server-side 自动化相匹配的自定义设置中受益。

更多的是研发工作的经济性问题。 (可以在 IDE 编辑器 MQL4 帮助中阅读很多关于从 MQL5 域注入的语言组件的信息)。这是自然而然的产品设计策略,不加倍努力就一个dual-line。毫无疑问,帮助文件中有许多细节可以改进和更好地维护,这里的常识是接受事实,re-learn 哪些新引入的功能对 MQL4 代码库保持中立,哪些新事物实际上可能在旧编译器功能不足的方面提供了很多帮助。

如果有人反对某些编译器/平台 re-design 步骤不好,我会同意 single-thread、platform-critical,可能会阻塞,集中执行所有 CustomIndicator-s在一个SPoF-thread.

但 C'est La Vie,在系统架构师不审查此 SPoF 之前,该平台将仍然容易受到此功能崩溃的影响,但球在球场的另一边,必须进行更改在那里实施。