代码之家  ›  专栏  ›  技术社区  ›  user9098929

MetaEditor/MQL4 ExpertAdviser:局部变量声明多次?

  •  1
  • user9098929  · 技术社区  · 7 年前

    我在看一些旧的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 在第8行中。

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

    我的问题是:

    1. . MetaEditor中是否有允许局部变量多次声明的选项?

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

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

    2 回复  |  直到 7 年前
        1
  •  0
  •   user3666197    7 年前

    开场白:

    MQL4的世界正在演变。人们可能会试图回避这一事实,但最终,令人失望的是,避免进化的尝试迟早会徒劳无功。

    由于需要对跨越几十年的代码库进行重新设计,我可以告诉您许多关于哪些有效,哪些无效的故事。


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

    如果只需要从中吸取一点,那么千万不要试图“绕过”New-MQL4,而是要检查代码并重构“旧代码”——这是一种更安全的生存方式(更长的时间)。

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

    广告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行中的任何一行转义,本地there声明的变量 double myVar 只是不再存在了,这种行为基本上是正确的(“旧的”编译器版本在容忍有效性溢出范围的几年中容忍了一种危险的副作用习惯,所以现在是清理规则的时候了,以达到公平的C/s标准。


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

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

    最好不要安装与代理无关的MT4,请始终访问代理的支持并获取安装包&经纪人的帮助。这是您在合同中签署的业务关系,所以在您要在一张表上交易您的资金时,请保留这些条件,这些表是根据设定的条款操作的&条件一些代理有平台定制的方法,因此可以从与服务器端自动化相匹配的自定义设置中获益。

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

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

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

        2
  •  0
  •   Daniel Kniaz    7 年前
    1. 代码可能以“严格”或非严格模式运行。 strict意味着变量必须在其作用域内声明,而非strict-您现在所面临的所有混乱。 所以把 #property strict 在文件的开头
    2. 在某处打开演示帐户并在那里安装mt4。只有通过经纪人的网站注册,或者通过mt4(例如Alpari)打开的无限制和演示,演示才能有效30天