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 doubles 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.