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 安装程序。
- 代码可能是 运行 和 'strict' 或 non-strict 模式。
strict 意味着变量必须在其范围内声明,non-strict - 你现在拥有的所有混乱。
所以把
#property strict
放在文件的开头
- 在某处开设一个模拟账户并在那里安装 mt4。只有通过经纪人的 web-site 注册或从 mt4(示例 - Alpari)
打开的无限制和演示,演示才能在 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 之前,该平台将仍然容易受到此功能崩溃的影响,但球在球场的另一边,必须进行更改在那里实施。
我正在查看一些旧的 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 安装程序。
- 代码可能是 运行 和 'strict' 或 non-strict 模式。
strict 意味着变量必须在其范围内声明,non-strict - 你现在拥有的所有混乱。
所以把
#property strict
放在文件的开头 - 在某处开设一个模拟账户并在那里安装 mt4。只有通过经纪人的 web-site 注册或从 mt4(示例 - Alpari) 打开的无限制和演示,演示才能在 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 之前,该平台将仍然容易受到此功能崩溃的影响,但球在球场的另一边,必须进行更改在那里实施。