Init()和DeInit()执行顺序 - 页 9

 
Nikolai Semko:
当然,谢谢你的代码。但EA在任何情况下都是好的,因为当我改变TF时,它们不会重新初始化变量,而指标会。如果你真的想帮忙提供 建议,请不要那么匆忙地再 "跑 "一次。

尼古拉斯,我碰到了这个话题,甚至在我写第一个帖子的时候。而且我没有发现任何关于EA在时间框架变化时如何表现的讨论。 是的--这个话题主要是关于指标的,而作者在他的帖子中写道:"一个指标 或专家顾问是书面的"。

我已经举了一个例子,我检查过了,它在专家顾问的框架内是可行的。 但是你--然后你责备我不周到,然后你让我重新阅读这个主题,然后你讨论--什么是合理或不合理的。此外,你可以阅读第一页

不清楚我们说的是专家顾问还是指标。 你甚至没有在你的帖子中明确说你说的是一个指标。

看到你的帖子的一个例子。

Nikolai Semko:
那么,就这样了?
我一直在试验并充分使用这个原因代码(REASON_CHARTCHANGE)。但是,如果所有的变量都被设置为初始状态,而且OnDeinit是在新TF的OnInit之后执行的,这有什么用呢?

从我刚才的发言中可以看出,这些变量在指标中被初始化了吗?

读你帖子的人可能会认为在专家顾问中也会发生同样的事情。

----

这个问题的答案是:"当你改变TF时,不会发生变量的重新初始化,而在指标中会发生"。

Andrey Dik:
你可以在某个地方保存变量值,例如在globals中。

如果你想使用OnInit方法,你必须以同样的方式读取和恢复这些值。

------------

如果你只对改变指标的TF的问题感兴趣--这并不意味着其他人,包括我,对改变EA的TF的选项不感兴趣。

我不能 对指标给出建议 ,因为我不知道如何在实践中做到这一点,但我将饶有兴趣地观察建议的解决方案。

我了解到,开发人员正在阅读这个话题,甚至已经在Build 1580中纠正了一些东西。 也许他们会提供解决方案。

 
Slawa:

你没有读过我写的东西几遍吗?

指标中没有办法。你不能从一开始就 指标 做到这一点。因为你必须下载一个全新的指标及其所有后果。


谢谢你的诚实回答。

5中一直都是这样的。也许现在是修复它的时候了?

做到正确的顺序真的这么难吗?在开始时节省时间,然后转化为对每一次勾选无尽检查

我已经习惯了MT5的OOP范式,我知道耙子在哪里,如何固定拐杖来绕过这些耙子,当然如果没有新的耙子的话。事实证明,删除一个对象并创建一个新对象比改变几个参数更容易。

同样,在汽车中,与其更换机油和继续行驶,不如把车扔掉,再做一辆新车。

让我想起了一部动画片。


下载视频
 

你能告诉我吗?

我决定写一个程序,该程序

1.在内部输出8条线

2.在DeInite上再输出8行。

我在测试器中运行了它(我运行了2天,得到了它)。

由于某些原因,它有选择地不能记录某些行。

这也是为了加快事情 的进展吗?


------------------------------------------------------------------------------------------

问题被清除了,因为完整的日志有所有的信息

------------------------------------------------------------------------------------------

在文件中,有必要添加

1.日志没有显示程序员所期望的所有信息

--------,看到完整的日志是非常必要的!!!

附加的文件:
Log2.txt  2 kb
ERROR_2.mq5  2 kb
 

我想对上述内容进行总结和归纳。那么,在MT5的1580版本(目前的1571版本)发布之前,我们有什么?

在指标中,与专家顾问不同,当TF发生变化时,由于"指标的新副本被创建,它不知道关于前一个副本的任何事情",所有变量都被重新初始化,此外,旧TF的OnDeinit和新TF的OnInit的执行顺序是不可预测的,无论TF是 "上升 "还是 "下降"(实践,与Slava先生提到的 相反)。在这方面,程序员有一些问题和不确定因素。
另外,在OnDeinit中规定删除这个对象也是合乎逻辑的。当TF被改变时,如果首先执行新TF的OnInit,它检查对象是否存在,结果发现它已经存在,而且它没有被创建,因为它已经被创建了。然后执行旧TF的OnDeinit,对象被删除。程序员正处于震惊状态。我的物品在哪里,为什么会消失?当下次改变TF时,当OnInit和OnDeinit的顺序不同时,他将会更加困惑,因为对象没有被删除。它被删除了,它没有被删除....经过长时间的研究,将开始向服务台提出,在论坛上提出关于旧的新主题。
这只是最简单的情况。会有其他人,因为这个功能在文档中没有描述,你只能在论坛上读到它。
如果你想创建一些特殊的东西,并将一些参数从指标的旧副本传递到新副本,当你改变TF时,你不能使用OnDeinit,因为初始化和去初始化操作的顺序是不可预测的。在我看来,这种情况下最好的解决方案是使用以下工具:
基于像素阵列的ResourceCreateResourceReadImage,但这是相当麻烦的,你需要照顾资源冲突,如果你在一个窗口中使用几个相同的指标,每次你想发送的数据的另一份需要保存在一个非重新初始化的资源中,因为TF可能改变的时间对应用程序来说并不清楚。我很久以前就实现了这一点(例如在这个产品 中),所以我知道我在说什么。通过文件和终端的全局变量实现数据传输是不太成功的解决方案(IMHO)。

如果新的Build 1580会像Slava说的那样,它不会使任务变得更容易,因为指标的旧副本的去初始化将在新副本的初始化之后进行。但不会有任何不确定性。

我希望开发人员注意到这个问题,因为他们正在努力解决一些问题。
我们等待着新的建设。

 

所有的图形对象都是参照当前TF来命名的。在初始化时我们创建,在非初始化时我们删除。在指示器的运行过程中,根据需要进行修改。

这里有一个问题吗?没问题。从指标启动的那一刻起,直到其卸载的那一刻,一切都很正常。

我们换上了TF。它的走向并不重要,向上或向下。指标的一个副本被启动。这相当于该指标是在这个TF上首次推出的事实。

这里有一个问题吗?没有任何问题。旧副本将负责删除其对象,而新副本将根据当前的时间框架创建新对象。

我做错了什么?为什么我没有看到问题?

 
Andrey Dik:

所有的图形对象都是参照当前TF来命名的。在初始化时我们创建,在非初始化时我们删除。在指示器的运行过程中,根据需要进行修改。

这里有一个问题吗?没问题。从指标启动的那一刻起,直到其卸载的那一刻,一切都很正常。

我们换上了TF。它的走向并不重要,向上或向下。指标的一个副本被启动。这相当于该指标是在这个TF上首次推出的事实。

这里有一个问题吗?没有任何问题。旧副本将负责删除其对象,而新副本将根据当前的时间框架创建新对象。

我做错了什么?为什么我没有看到问题?

如果你知道这个没有记录的特性,而且你只处理最简单的情况--用图来处理,就没有问题。对象。我是说那些不知道这个功能的人,我想这个论坛上只有很少一部分程序员会看这个话题,我只是可怜他们的时间来弄清所有的细微差别。在我了解本质之前,我也曾遇到过这种情况。
 
Nikolai Semko:
如果你意识到这个没有记录的特性,并且只处理最简单的情况--用图来处理,就没有问题。对象。我是说那些不知道这个功能的人,我想这个论坛上只有很少一部分程序员会看这个话题,我只是可怜他们的时间来弄清楚所有的细微差别。在我了解本质之前,我也曾遇到过这种情况。

我从来没有听说过这个主题中描述的那些细微差别,但我从来没有遇到过这里描述的问题。

如果你想把一些东西转移到指标的另一个副本中,你不需要做deinit--在所有指标的生命周期中保持转移的数据是最新的--例如在终端的主要变量中,那么无论指标卸载 的原因是什么(更换TF,妈妈拔掉了插头 "这样它就不会在大家睡觉时发出嗡嗡声",地震,地球磁极的变化等等。等),指标的下一次运行(包括TF变化时的拷贝)将从这个神奇的数据源中获得所有必要的信息(对于全球规模的不幸情况,你可以将数据保存在云驱动器上)。

伙计们,一点问题都没有。

 
Andrey Dik:

所有的图形对象都是参照当前TF来命名的。初始化时,创建,非初始化时,删除。在指标的运行过程中,我们根据需要进行修改。

这里有一个问题吗?没问题。从指标启动的那一刻起,直到其卸载的那一刻,一切都很正常。

我们换上了TF。它的走向并不重要,向上或向下。指标的一个副本被启动。这相当于该指标是在这个TF上首次推出的事实。

这里有一个问题吗?没有任何问题。

有一个问题:不同指标的对象同时存在。"对不起,我们有暂时的技术问题"(但这将在几秒钟内解决,当旧指标DeInit发生时)。

旧的副本将负责删除其对象,而新的副本将创建其新的对象,根据当前的TF来命名它们。

我做错了什么?为什么我没有看到任何问题?

这是一个狭隘的观点。这就是你看不到的原因。拓宽一下你的视野。第一个问题发生在处理文件时,因为不清楚前一个指标是否有时间在文件中保存数据。终端的全局变量 中的一些标志将必须被创建。新的指标副本将不得不等待旧的副本来重置累积的数据。顺便说一下,问题是这种同步只在OnCalculate()中可以实现。如果在周末发生开关,又该怎么办呢?新的副本要到星期一才开始?哦,是的,我们可以把它放在一个计时器上!我听说可以用大炮射杀麻雀,弹弓是个不错的方法。

这些仍然是简单的问题。在使用多线程DLL时,尽量考虑到这个逻辑。现在,有趣的事情开始了。好吧,我们会变得更强大))))

 
Andrey Dik:

我从来没有听说过这个主题中描述的那些细微差别,但我从来没有遇到过这里描述的问题。

如果你想把一些东西转移到指标的另一个副本中,你不需要做deinit--在所有指标的生命周期中保持转移的数据是最新的--例如在终端的主变量中,那么无论指标卸载 的原因是什么(更换TF,我妈妈拔掉了插头 "这样它就不会在大家睡觉的时候发出嗡嗡声",地震,地球磁极的变化等等。等),下次启动指标(包括TF变化时的拷贝)将从这个神奇的数据源获得所有必要的信息(对于全球规模的不幸情况,有可能将数据保存在云磁盘上)。

伙计们,一点问题都没有。

我明天再回答。好吗?开车很容易。
 
Ihor Herasko:

有一个问题:不同指标的对象同时存在。"对不起,我们有暂时的技术问题"(但它们将在几秒钟内被修复,当旧指标DeInit发生时)。

视野狭窄。这就是你看不到的原因。拓宽一下你的视野。在处理文件时已经出现了第一个问题,因为不清楚前一个指标是否已经设法将数据保存到文件中。终端的全局变量 中的一些标志将必须被创建。新的指标副本将不得不等待旧的副本来重置累积的数据。顺便说一下,问题是这种同步只在OnCalculate()中可以实现。如果在周末发生开关,又该怎么办呢?新的副本要到星期一才开始?哦,是的,我们可以把它放在一个计时器上!我听说可以用大炮射杀麻雀,弹弓是个不错的方法。

这些仍然是简单的问题。在使用多线程DLL时,尽量考虑到这个逻辑。现在,有趣的事情开始了。好吧,我们会变得更强大)))。

我已经写得很清楚了--保持你所需要的复制数据始终是最新的。 你不必只在启动时做,你必须始终保持最新的数据。

所有其他情况都是由于暴躁而设计的。

如果在同一时间运行同一指标有问题,那么每次都创建唯一的对象,并与TF相连接,如果已经有对象,则在名称上加1。

没有人举出一个案例,说明由于目前终端与指标的工作方式,问题是无法解决的。这些问题是由不正确的指标工作引起的。

一般来说,许多人似乎不明白有3种类型的项目是有原因的(第4种即将推出)。