MetaEditor / MQL4 ExpertAdviser:多次本地变量声明?

时间:2018-02-21 11:26:51

标签: mql4 metatrader4 mql5 metatrader5

我正在查看一些旧的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中的编译过程失败了:

  第8行

'myVar' - variable already defined

如果我删除第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安装程序。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

序幕:

MQL4的世界在不断发展。人们可能试图绕过这个事实,但最后,在一个人自己的失望中,避免进化的尝试迟早会徒劳无功。

由于需要重新设计代码库,需要跨越几十年的几十个人,我可以告诉你很多关于什么有效,哪些无效的故事。

“旧代码”v / s a - MQL4.56789

如果只考虑一件事,不要试图“绕过”New-MQL4,而是重新审视代码并重构“旧代码” - 这是一种更安全的生存方式(更长的方式)。 / p>

是的,有机会(零权证,暂时只剩下几个机会)新的编译器版本仍然能够生成代码的可执行版本,但是已经有一套新的规则已经进入城市,游戏不会持续很长时间。

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

如果编译器的新版本定义任何变量仅相对于其有效范围声明,那么认真的程序员应该将此作为一般原则。上面的代码实际上还有其他问题,正确地固定在有效范围内:

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 ,则在存在本地声明的变量时,它将不会“可见”,穿着相同的名字。

最后,让代码执行从第8行或第14行进一步转义,本地声明的变量double myVar已经不再存在了,这种行为主要是正确的(并且“旧的”编译器发布在容忍有效范围溢出的多年期间,我们容忍一种危险的副作用习惯,所以现在是清理规则的最佳时机,以达到公平的C / S标准。

Ad 3)语言从MQL5收到很多,即使没有在MQL4中使用

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

最好永远不要安装与Broker无关的MT4,总是去你的Broker's Support并获得安装包&来自您的经纪人的帮助。这是您在合同中签订的业务关系,因此请保留这些字符串,因为您要在根据设定条款和条款运营的表格上交易您的资金。条件。一些经纪人拥有平台定制的手段,因此他们的自定义设置可以与其服务器端自动化相匹配。

这更像是R& D努力的经济问题。 (可以在IDE编辑器MQL4帮助中阅读很多关于从MQL5域注入的语言组件)。这是产品设计策略的自然意志,而不是双线的双重努力。毫无疑问,帮助文件有许多细节可以改进和更好地维护,这里的常识是接受事实并重新学习新引入的功能对MQL4代码库保持中立以及新的东西可能实际上有助于一个很多方面,旧的编译器功能很短。

如果有人反对某些编译器/平台重新设计步骤不好,我会同意单线程,平台关键,可能阻塞,集中执行所有 CustomIndicator -s只在一个SPoF线程中。

但是C'est La Vie,直到系统架构师不会审查这个SPoF,该平台仍然容易受到此功能的影响,但球在球场的另一边,并且必须在那里实施更改