MQL4 "undeclared identifier" - 我该如何解决这个问题?
MQL4 "undeclared identifier" - how can I fix this issue?
我目前正在尝试学习一种名为 MQL4
的编程语言,用于编写交易算法。它非常紧密地基于 C++/C/C#
,因此了解这些语言的任何人都应该能够帮助我解决这个问题。
我正在尝试创建一个非常简单的程序,它会告诉我最后一个周期烛台的上下影线(灯芯)的长度。为此,我尝试使用以下代码:
double bod1 = Close[1] - Open[1];
double absbod1 = MathAbs( bod1 );
if( bod1 >= 0 )
{
double uwick1 = High[1] - Close[1];
double lwick1 = Open[1] - Low[ 1];
}
else
{
double uwick1 = High[ 1] - Open[1];
double lwick1 = Close[1] - Low[ 1];
}
Alert( "Lower Wick: " , lwick1 , " Upper Wick: " , uwick1 );
Q1:为什么会报如下错误信息?
Q2: 不能在 if(){...}
语句中定义变量吗?
Q3:如果不是,我如何定义一个依赖于其他因素的变量?
我的意思是,假设我想定义变量 var 使得 var = a OR var = b 取决于是否 a > b
.
Q4: 如果不使用 if(){...}
语句,我会怎么做,如上所示?
如果该语言类似于 c++,那么您应该在 if 块之前定义您的变量,例如:
double uwick1 = 0;
if(bod1 >=0)
{
uwick1 = High[1]-Close[1];
在类似于 C++ 的语言中,块中定义的变量仅存在于该块中。
所以在你的代码中:
double bod1 = Close[1]-Open[1];
double absbod1 = MathAbs(bod1);
if(bod1 >=0)
{
double uwick1 = High[1]-Close[1];
double lwick1 = Open[1]-Low[1];
}
else
{
double uwick1 = High[1]-Open[1];
double lwick1 = Close[1]-Low[1];
}
Alert("Lower Wick: " , lwick1 , " Upper Wick: " , uwick1);
uwick1
变量在 if
块中定义,然后超出范围。另一个 uwick1
变量在 else
块中定义,然后超出范围。最后,Alert
调用引用了一个 uwick1
变量,但范围内没有任何具有该名称的变量。
如果在之前定义变量条件:
double bod1 = Close[1]-Open[1];
double absbod1 = MathAbs(bod1);
double uwick1;
double lwick1;
if(bod1 >=0)
{
uwick1 = High[1]-Close[1];
lwick1 = Open[1]-Low[1];
}
else
{
uwick1 = High[1]-Open[1];
lwick1 = Close[1]-Low[1];
}
Alert("Lower Wick: " , lwick1 , " Upper Wick: " , uwick1);
此代码应按您预期的方式工作。
虽然
MQL4
可能看起来像C语言,
注意它不是
( +
它有一对编译模式
,它们对相同的源代码
有非常不同的代码执行...所以魔鬼隐藏在细节中
)
你最初关于相似性的笔记可能并且会在以后造成很多麻烦。
忘记 C
.
一个 anxient 汇编程序指令值得重复 #ASSUME NOTHING
string
is not a string
, but a special case of struct
and the list of differences grows.
MQL4
根本就不是C语言
越早意识到越好。
首先,
语言的执行模型从属于三个非常不同的模型:
- 在 MQL4 Script
-- 与异步外部断开连接 FxMarketEventSTREAM
- 在MQL4 Expert Advisor
-- 代码执行由 FxMarketEventSTREAM
边缘触发- 在 MQL4 Custom Indicator
-- 代码执行是 (sub )-batch-运行 一旦被 FxMarketEventSTREAM
边缘触发
这是C语言none内置的
其次,
语言语法在进化(更确切地说,它在蠕变)并且新的约束开始应用。解决这个问题的唯一方法是从字面上重新阅读 MQL4
文档 每个更新 ,是的,在每个和每次更新。人们可以通过这一步避免不必要的惊喜(编译后还有更多惊喜仍然可见 - 不用说,提供的文档的某些部分显然是错误的,有些仍然清晰,直到你编译 "compliant"-code 和它被 compiler/parser 拒绝了。最坏的情况出现了,神奇地 "pass"-通过 compiler/parser 阶段并继续让你在 运行 时间做噩梦,在那里残缺的代码确实奇怪的事情,仍然通过了所有 compilation/execution 限制,但产生了严重破坏 (当然,另一个故事,但张贴是为了完全警告 MQL4
-生态系统风险和危险区域 - 所以忘掉 C 语言吧,你最残忍的敌人在 MetaQuotes 语言修订版 ( New-MQL4.56789...
) evolution )
New-MQL4.56789
引入了双重编译模式——一个#strict
和一个"old"
其中一个 "New" 更改(已导致数人 * 年的代码库成本重新设计)是一个有限的变量范围。除了双重全局范围的变量构造之外,"New"-MQL4.56789
开始 "frame" 声明变量的可见性,以便 "outside" 这种变量的 "outer" 构造函数,符号不复存在,因此未定义,如您的编译时错误报告。
Q1: is solved, the if(){...}else{...}
were the limits for both pair of declarations ( bracketed parts {...}
were the two, adjacent scopes, where double
s were defined & "visible" ) and your original code, outside of the {...}
-zone tried to reference a symbol, that was not "known" outside the declaration-scope, so the compiler had to report that as "- undefined identifier"
as it had no clue what the identifier should stand for.
Q2: 是的,可以在 if(){...}
语句中定义变量。这些变量仍然定义 "inside" 它们的范围 {...}
-outer-block。人们可能会受益于另一种架构特性——声明修饰符 static
。这将在代码 运行 时间环境的整个生命周期内以及每当代码执行路径重新进入变量的 {...}
可见性时,保持此类定义变量值的代码执行时间持久性范围,它的价值)在每次重新进入时仍然重新存储以供重新使用。
Q3+Q4: Declaring a variable is a principally important step and assigment of a value is another one. Having said this, one may observe problems once trying to declare+assign values in one single step. There a dependency may create problems for compiler -- in some previous MQL4
-Builds this was the case -- that compiler was asked to solve an undecideable problem, when the assignment was dependent ( on other variable(s), as you name it ) on some operations / values that were not available at compile-time. Your motivation is clear and doable, however please try to design your code with this little level insights into the syntax-specifications and the principal differences between a code-compilation and a code-execution states.
Epilogue: Don't panic & Enjoy the worlds of algorithmic trading.
我目前正在尝试学习一种名为 MQL4
的编程语言,用于编写交易算法。它非常紧密地基于 C++/C/C#
,因此了解这些语言的任何人都应该能够帮助我解决这个问题。
我正在尝试创建一个非常简单的程序,它会告诉我最后一个周期烛台的上下影线(灯芯)的长度。为此,我尝试使用以下代码:
double bod1 = Close[1] - Open[1];
double absbod1 = MathAbs( bod1 );
if( bod1 >= 0 )
{
double uwick1 = High[1] - Close[1];
double lwick1 = Open[1] - Low[ 1];
}
else
{
double uwick1 = High[ 1] - Open[1];
double lwick1 = Close[1] - Low[ 1];
}
Alert( "Lower Wick: " , lwick1 , " Upper Wick: " , uwick1 );
Q1:为什么会报如下错误信息?
Q2: 不能在 if(){...}
语句中定义变量吗?
Q3:如果不是,我如何定义一个依赖于其他因素的变量?
我的意思是,假设我想定义变量 var 使得 var = a OR var = b 取决于是否 a > b
.
Q4: 如果不使用 if(){...}
语句,我会怎么做,如上所示?
如果该语言类似于 c++,那么您应该在 if 块之前定义您的变量,例如:
double uwick1 = 0;
if(bod1 >=0)
{
uwick1 = High[1]-Close[1];
在类似于 C++ 的语言中,块中定义的变量仅存在于该块中。
所以在你的代码中:
double bod1 = Close[1]-Open[1];
double absbod1 = MathAbs(bod1);
if(bod1 >=0)
{
double uwick1 = High[1]-Close[1];
double lwick1 = Open[1]-Low[1];
}
else
{
double uwick1 = High[1]-Open[1];
double lwick1 = Close[1]-Low[1];
}
Alert("Lower Wick: " , lwick1 , " Upper Wick: " , uwick1);
uwick1
变量在 if
块中定义,然后超出范围。另一个 uwick1
变量在 else
块中定义,然后超出范围。最后,Alert
调用引用了一个 uwick1
变量,但范围内没有任何具有该名称的变量。
如果在之前定义变量条件:
double bod1 = Close[1]-Open[1];
double absbod1 = MathAbs(bod1);
double uwick1;
double lwick1;
if(bod1 >=0)
{
uwick1 = High[1]-Close[1];
lwick1 = Open[1]-Low[1];
}
else
{
uwick1 = High[1]-Open[1];
lwick1 = Close[1]-Low[1];
}
Alert("Lower Wick: " , lwick1 , " Upper Wick: " , uwick1);
此代码应按您预期的方式工作。
虽然
MQL4
可能看起来像C语言,
注意它不是
( +
它有一对编译模式
,它们对相同的源代码
有非常不同的代码执行...所以魔鬼隐藏在细节中
)
你最初关于相似性的笔记可能并且会在以后造成很多麻烦。
忘记 C
.
一个 anxient 汇编程序指令值得重复 #ASSUME NOTHING
string
is not astring
, but a special case ofstruct
and the list of differences grows.
MQL4
根本就不是C语言
越早意识到越好。
首先,
语言的执行模型从属于三个非常不同的模型:
- 在 MQL4 Script
-- 与异步外部断开连接 FxMarketEventSTREAM
- 在MQL4 Expert Advisor
-- 代码执行由 FxMarketEventSTREAM
边缘触发- 在 MQL4 Custom Indicator
-- 代码执行是 (sub )-batch-运行 一旦被 FxMarketEventSTREAM
这是C语言none内置的
其次,
语言语法在进化(更确切地说,它在蠕变)并且新的约束开始应用。解决这个问题的唯一方法是从字面上重新阅读 MQL4
文档 每个更新 ,是的,在每个和每次更新。人们可以通过这一步避免不必要的惊喜(编译后还有更多惊喜仍然可见 - 不用说,提供的文档的某些部分显然是错误的,有些仍然清晰,直到你编译 "compliant"-code 和它被 compiler/parser 拒绝了。最坏的情况出现了,神奇地 "pass"-通过 compiler/parser 阶段并继续让你在 运行 时间做噩梦,在那里残缺的代码确实奇怪的事情,仍然通过了所有 compilation/execution 限制,但产生了严重破坏 (当然,另一个故事,但张贴是为了完全警告 MQL4
-生态系统风险和危险区域 - 所以忘掉 C 语言吧,你最残忍的敌人在 MetaQuotes 语言修订版 ( New-MQL4.56789...
) evolution )
New-MQL4.56789
引入了双重编译模式——一个#strict
和一个"old"
其中一个 "New" 更改(已导致数人 * 年的代码库成本重新设计)是一个有限的变量范围。除了双重全局范围的变量构造之外,"New"-MQL4.56789
开始 "frame" 声明变量的可见性,以便 "outside" 这种变量的 "outer" 构造函数,符号不复存在,因此未定义,如您的编译时错误报告。
Q1: is solved, the
if(){...}else{...}
were the limits for both pair of declarations ( bracketed parts{...}
were the two, adjacent scopes, wheredouble
s were defined & "visible" ) and your original code, outside of the{...}
-zone tried to reference a symbol, that was not "known" outside the declaration-scope, so the compiler had to report that as"- undefined identifier"
as it had no clue what the identifier should stand for.
Q2: 是的,可以在 if(){...}
语句中定义变量。这些变量仍然定义 "inside" 它们的范围 {...}
-outer-block。人们可能会受益于另一种架构特性——声明修饰符 static
。这将在代码 运行 时间环境的整个生命周期内以及每当代码执行路径重新进入变量的 {...}
可见性时,保持此类定义变量值的代码执行时间持久性范围,它的价值)在每次重新进入时仍然重新存储以供重新使用。
Q3+Q4: Declaring a variable is a principally important step and assigment of a value is another one. Having said this, one may observe problems once trying to declare+assign values in one single step. There a dependency may create problems for compiler -- in some previous
MQL4
-Builds this was the case -- that compiler was asked to solve an undecideable problem, when the assignment was dependent ( on other variable(s), as you name it ) on some operations / values that were not available at compile-time. Your motivation is clear and doable, however please try to design your code with this little level insights into the syntax-specifications and the principal differences between a code-compilation and a code-execution states.
Epilogue: Don't panic & Enjoy the worlds of algorithmic trading.