错误、漏洞、问题 - 页 434

 

小册子
你是对的。我犯了一个错误。
谢谢你的答复。

 
Silent:

MQL5参考手册 -标准库- 组织数据的类 - CArrayObj(在网站和帮助中)。

2.内存管理机制被禁用。

在这种情况下,CArrayObj不负责 内存的释放

修正了它,谢谢。
 

文件。静态变量 部分。

"......静态变量从程序执行的那一刻起就存在,并在调用专门的函数OnInit()之前 被初始化一次 "

检查专家顾问的代码。

void OnInit() {
  Print("OnInit() begin!");

  static bool init = true;
  if (init) {
    Print("Static initialized!");
    init = false;
  } 

  Print("OnInit() end!");
}

将EA "放置 "在图表上。

2011.06.27 20:10:56     Тест (EURUSD,H1)        OnInit() begin!
2011.06.27 20:10:56     Тест (EURUSD,H1)        Static initialized!
2011.06.27 20:10:56     Тест (EURUSD,H1)        OnInit() end!

在不从图表中删除EA的情况下,我们改变图表周期。

2011.06.27 20:11:00     Тест (EURUSD,M30)       OnInit() begin!
2011.06.27 20:11:00     Тест (EURUSD,M30)       OnInit() end!

它应该像这样工作吗?

实际上,我把文档中的信息理解为在任何一次调用OnInit()函数时都会强制初始化静态变量,不管是由重新编译还是符号的变化或其他原因造成的...

事实证明,我错了。请启发我:这一规则的例外情况是什么?

 

当输入参数被改变时,还是一样的 "混乱"。

然而,当账户被改变时,它被正确处理--静态变量被重新初始化。

我想知道如何在不删除专家(REASON_CHARTCHANGE)的情况下改变图表符号?

Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Причины деинициализации
Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Причины деинициализации
  • www.mql5.com
Стандартные константы, перечисления и структуры / Именованные константы / Причины деинициализации - Документация по MQL5
 
voix_kas:

文件。静态变量 部分。

"......静态变量从程序执行的那一刻起就存在,并在调用专门的函数OnInit()之前 被初始化一次 "

检查专家顾问的代码。

将EA "放置 "在图表上。

在不从图表中删除EA的情况下,我们改变图表周期。

它应该像这样工作吗?

是的,它应该工作。

程序(其代码)已经被加载过一次,只进行了一次热的重新初始化(Deinit/Init,没有代码卸载)。在这种情况下,开发者自己必须照顾到环境的正确初始化。

 
Renat:

是的,它应该这样工作。

程序(它的代码)已经被加载过一次,只是做了一次热的重新初始化(Deinit/Init,没有代码卸载)。在这种情况下,开发者必须关注环境的正确初始化。

首先,你的评论显然与文档中的定义相矛盾:在调用OnInit()之前先初始化一次。那么你应该在文档中明确说明这个定义:"......在调用OnInit()之前初始化一次首先 调用OnInit()"。
其次,你的评论显然与账户变更的情况相矛盾,在这种情况下,MT显然会强行终止专家顾问,并再次恢复。

关于静态变量 是否应该在每次(而不仅仅是第一次)调用OnInit()时被强制重新初始化的基本问题,可以提出来考虑/表决吗?

 

一般来说,事情的发展很有趣。
乍一看,我以为OnDenit函数是一种析构器,而OnInit是专家顾问的构造器。
事实上,事实证明,OnInit是一个多重事件(在专家的生命周期内)。那么不清楚的是,如果我们知道EA不会终止其操作(例如,在改变图表周期的情况下),为什么我们需要明确地生成OnDenit事件?

还有一个问题。
REASON_CHARTCHANGE去初始化的原因 是图表的符号或周期已经改变。
请解释如何在不删除图表上的EA的情况下改变图表符号?

 
voix_kas:

还有一个问题。
取消初始化的 原因 REASON_CHARTCHANGE - 图表符号或周期已被改变。
请解释如何在不删除图表上的EA的情况下改变图表符号?

图表SetSymbolPeriod()
 
voix_kas:

事实上,这很有趣。
根据我的直觉,我认为OnDenit函数是一种析构器,OnInit是专家顾问的构造器。
事实上,事实证明,OnInit是一个多重事件(在一个专家顾问的生命周期内)。那么不清楚的是,如果我们知道EA不会终止其操作(例如,在改变图表周期的情况下),为什么我们需要明确地生成OnDenit事件?

还有一个问题。
REASON_CHARTCHANGE去初始化的原因- 图表的符号或周期已被改变。
请解释如何在不删除图表上的EA的情况下改变图表符号?

在MT4中,一切都以同样的方式调用。而且不知道专家是否完成了它的工作(为此在OnDeinit参数中下降了,尽管可能的OnInit触发的原因也很容易知道)。

2.这很简单,在终端设置中允许专家顾问在符号和周期变化时进行交易。

然后在市场概览中选择另一个符号,用鼠标把它 "扔 "到图表上。

在任何情况下,EA在改变符号/周期后的正常初始化 "不会被删除"(它将 "热重启",正如Renat在下面所说)。 如果我们从一个简单的层面来看,专家顾问将被允许在某些终端设置下进行交易。

耶德尔金
图表SetSymbolPeriod()
另一个选择,但是是程序性的。:)
 
voix_kas:

首先,你的评论明显与文档中的定义相矛盾:它们在调用OnInit()之前被初始化一次。那么你应该在文档中明确说明这个定义:"......在调用OnInit()之前初始化一次首先 OnInit()调用"。

是的,这应该在文档中更精确地定义。


其次,你的评论明显与账户变更的情况相矛盾,在这种情况下,MT显然是强行终止了EA,并再次恢复。

是的,当账户被改变时,专家顾问显然会从内存中卸载自己,并执行冷重启。我们是故意这样做的。


我们是否可以引入/表决一个基本问题,即在每次(而不仅仅是第一次)调用OnInit()时强制重新初始化静态变量 的必要性?

不幸的是,没有。这只能通过冷重启专家顾问来解决。