MQL4“未声明的标识符” - 我该如何解决这个问题?

时间:2016-02-29 18:19:16

标签: variables algorithmic-trading mql4

我目前正在尝试学习一种名为 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:为什么会出现以下错误消息?

error

Q2:您是否可以在 if(){...} 声明中定义变量?

Q3:如果没有,我如何定义一个取决于其他因素的变量?

我的意思是,假设我想定义变量 var ,以便 var = a 或< strong> var = b 取决于a > b是否。{/ p>

问题4:如果不是使用if(){...}语句,我将如何执行此操作,如上所示?

3 个答案:

答案 0 :(得分:3)

如果该语言与c ++类似,则应在if之前定义变量,例如:

  double uwick1 = 0;
  if(bod1 >=0)
  {
     uwick1 = High[1]-Close[1];

答案 1 :(得分: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);

此代码应按您期望的方式工作。

答案 2 :(得分:0)

虽然 MQL4 可能看起来像C语言,但请注意它不是(+
它有一对编译模式,它们具有非常不同的代码执行相同的源代码... ...所以魔鬼隐藏在细节中))

关于相似性的初步说明可能并将在未来引发许多麻烦。

忘记 C

焦虑的汇编程序指令值得重复 #ASSUME NOTHING

  

string 不是string,而是 struct 的特例,差异列表会增加。

MQL4 根本不是C语言。

越快意识到,越好。

首先,
语言的执行模型从属于三个非常不同的模型:
- 在 MQL4 Script - 与异步外部 FxMarketEventSTREAM 断开连接 - 在 MQL4 Expert Advisor 中 - 代码执行由边缘触发FxMarketEventSTREAM
- 在 MQL4 Custom Indicator 中 - 代码执行是(sub)-batch-run一次由FxMarketEventSTREAM边缘触发

这是C语言没有内置的东西。

第二次,语言语法不断发展(更好的说,它悄然发展),新的约束开始应用。解决这个问题的唯一方法是在每次更新的每次更新上重读 MQL4文档。通过这一步骤可以避免不必要的意外(编辑后仍然有更多的惊喜仍然可见 - 针说,提供的文档的某些部分显然是错误的,有些仍然清楚,直到你编译符合&#34; -code,它被编译器/解析器拒绝。最糟糕的情况是,通过编译器/解析器阶段,通过编译器/解析器阶段神奇地传递&#34;并且在运行时仍然导致你做噩梦,其中残缺的代码做了奇怪的事情,仍然通过所有编译/执行限制,但产生破坏(确定,另一个故事,但发布了关于MQL4 - 生态系统风险和危险区域的完整警告 - 所以忘记C语言,你的最残酷的敌人在MetaQuotes语言修订版内(新 - MQL4.56789...)进化)

新增 - MQL4.56789已引入双重编译模式 - #strict&#34;旧&#34;

其中一项 &#34;新&#34; 更改(导致少数人*年代码重新设计的成本)是有限的变量范围。除了双重全局范围的变量构造之外,&#34; New&#34; - MQL4.56789开始了#34; frame&#34;声明变量的可见性,以便&#34;外部&#34; &#34;外部&#34;这个变量的构造函数,符号不再存在,因此未定义,因为您的编译时错误报告。

  

Q1:已解决,if(){...}else{...}是两对声明的限制(括号内的部分{...}是两个相邻的范围,其中double s被定义为&amp;&#34;可见&#34;)并且您在{...} - 区域之外的原始代码试图引用一个符号,该符号不是已知的#34;在声明范围之外,编译器必须将其报告为 "- undefined identifier" ,因为它不知道标识符应该代表什么。

Q2:是的,可以在if(){...}语句中定义变量。这些变量仍然定义在内部&#34;他们的范围{...} - 外部区块。可以从另一个体系结构功能中获益 - 声明修饰符 static 。这将在代码运行时环境的整个生命周期内以及代码执行路径重新进入变量{...}时 - 可见范围内维护此类已定义变量值的代码执行时持久性,它的价值)每次重新进入时仍然会重新存储以供重复使用。

  

Q3 + Q4: 声明变量是一个非常重要的步骤,值的分配是另一个。话虽如此,一旦尝试在一个步骤中声明+赋值,就会发现问题。依赖关系可能会给编译器带来问题 - 在之前的某些MQL4中 - 构建就是这种情况 - 编译器被要求解决一个不可思议的问题,当赋值依赖时(在其他变量上,如你命名它在一些在编译时不可用的操作/值。您的动机是明确且可行的,但是请尝试使用对语法规范以及代码编译和代码执行状态之间的主要差异的这种小级别洞察来设计代码。

  

后记:不要惊慌失措&amp;享受算法交易的世界。