错误、漏洞、问题 - 页 1525

 
Yuri Evseenkov:

MT4。我想再次提请你注意全局 程序变量初始化的 特殊性。

关于交易、自动交易系统和策略测试的论坛

虫子,虫子,问题

Slawa, 2016.02.24 07:34

排队。该申请仅有两个小时的时间。

一般来说,这种问题应该在论坛上提出。因为很多人可能会受到影响。我冒昧地引用你的话,并立即作出回答

这是有计划的行为。事实上,它在文件中被明确描述

上传和下载涉及到对一切的完全重新初始化。

在五个国家,正如你正确地注意到的那样,情况是类似的。

这是真的,在历史上,这是在4中,我们在改变到新的MQL4时,一开始就改变了这种行为(让它表现得像专家一样,即像你所期望的那样)。但旧的指标出现了很多问题,这些指标是基于这种初始化的。我们被迫返回

在五人组中,由于架构的原因,立即出现了这种情况。当你改变参数时,带有旧参数的旧指标被销毁,并创建一个带有改变参数的新指标。


 
Alexey Kozitsyn:

谢谢。结论--引自文档:"......预定义函数OnInit(),其目的是正确初始化程序的所有全局变量静态 变量。"

所以将所有全局变量或数组归零或默认为OnInit()

События клиентского терминала - Программы MQL4 - Справочник MQL4
События клиентского терминала - Программы MQL4 - Справочник MQL4
  • docs.mql4.com
События клиентского терминала - Программы MQL4 - Справочник MQL4
 

1.我创建了一个形式的数组。

CArrayString list[5];

2.我尝试通过<Ctrl+Space>调用方法列表。

list[0].
方法列表没有出现。它应该是这样的吗?
 
Andrey Voytenko:

1.我创建了一个形式的数组。

2.我尝试通过<Ctrl+Space>调用代码中的方法列表。

方法列表没有出现。它应该是这样的吗?

让我试着做一个猜测。如果代码中除了没有指定方法/成员外,还有其他错误,则列表不一定会出现。

试过了。不,错误的假设。但反复按几下组合键还是有帮助的。

 

Alexey Kozitsyn:

但反复按几下组合键还是有帮助的。

不幸的是,你的食谱对我不起作用。
 
Andrey Voytenko:
不幸的是,你的食谱对我不起作用。
不,这是正确的,如果代码中有错误,开放成员/方法的列表就不会出现。但是,如果没有错误...那就麻烦了。
 

1.简单的代码。

uint a=50;
int b=-20;
Print(fmax(a,b));

结果:50

2.添加修改器输入。

input uint  a=50;
int b=-20;
Print(fmax(a,b));

结果: 4294967276

预期的结果是50。我哪里错了?

 
Andrey Voytenko:

1.简单的代码。

结果:50

2.我们添加一个修改器输入。

结果: 4294967276

我期待的结果是50。我哪里错了?

fmax比较了两个双数。所以它是这样的。

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.01"
#property script_show_inputs
//---
input uint a=50;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//uint a=50;
   int b=-20;
   Print("\"uint a=50\" as double:",DoubleToString((double)a,8));
   Print("\"int b=-20\" as double:",DoubleToString((double)b,8));
   Print(DoubleToString(fmax((double)b,(double)a),8));
  }
//+------------------------------------------------------------------+

和结果。

2016.03.03 16:00:24.821 Test (EURUSD,D1)        "uint a=50" as double:50.00000000
2016.03.03 16:00:24.821 Test (EURUSD,D1)        "int b=-20" as double:-20.00000000
2016.03.03 16:00:24.821 Test (EURUSD,D1)        50.00000000
附加的文件:
Test.mq5  2 kb
 
Karputov Vladimir:

fmax比较了两个双数。所以它是这样的。

在MQL中,一个隐含的类型转换被声明和执行。特别是uint -> double。

问题是为什么它在输入变量 时不能正常工作。

 
Andrey Voytenko:

1.简单的代码。

结果:50

2.添加输入修改器。

结果:4294967276。

我期待的结果是50。我哪里错了?

请给我完整的代码。

这里有两种可能性,都是错误的。

1.该代码在任何函数之外执行。

2.输入变量是在函数内声明的