1

我正在查看一些旧的 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, version 中的编译过程5.00, build 1601失败,并显示:

'myVar' - variable already defined在第 8 行。

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

我的问题是:

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

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

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

4

2 回答 2

0
  1. 代码可能以“严格”或非严格模式运行。严格意味着必须在其范围内声明变量,非严格 - 您现在拥有的所有混乱。所以放在#property strict文件的开头
  2. 在某处开设一个模拟账户并在那里安装 mt4。演示有效期为 30 天,仅通过经纪人网站注册或从 mt4 无限打开演示(例如 - Alpari)
于 2018-02-21T12:50:58.123 回答
0

序幕:

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

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


一个“旧代码”v/sa-MQL4.56789

如果只应该从中汲取一点,永远不要试图“规避”New-MQL4,而是审查代码并重构“旧代码”——这是一种更安全的生存方式(更长的时间)。

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

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 标准。


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

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

最好永远不要安装与经纪商无关的 MT4,始终前往您的经纪商支持并从您的经纪商处获取安装包和帮助。这是您在合同中签署的业务关系,因此请保留这些字符串,因为您将在他们根据设定的条款和条件操作的桌子上交易您的资金。一些经纪人有平台定制的手段,所以宁愿从他们的定制设置中受益,这将与他们的服务器端自动化相匹配。

这更多的是研发工作的经济性问题。(可以在 IDE 编辑器 MQL4 帮助中阅读大量关于从 MQL5 域注入的语言组件)。这是产品设计策略的自然意志,不是双线加倍努力。毫无疑问,帮助文件有很多细节可以改进和更好地维护,这里的常识是接受事实并重新了解哪些新引入的功能对 MQL4 代码库保持中立,以及哪些新事物可能真正帮助一个人在很多方面,旧的编译器能力不足。

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

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

于 2018-02-21T14:36:34.923 回答