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

 
Andrey Dik:

我已经写得很清楚了--保持转移到副本所需的数据始终是最新的,你不需要只在启动时做,始终保持最新。


安德烈,你是在开玩笑还是真的不明白,你所有的实际数据都存储在指标中的变量和数组中,在改变TF后变得无关紧要,因为指标副本及其所有细节都被删除。当然,在专家顾问中,一切都很简单,因为不存在重新初始化。
 
Nikolai Semko:

你一定是在开玩笑,或者你不明白,你所有的实际数据都存储在指标中的变量和数组中,在改变TF后变得无关紧要,因为指标副本及其所有细节都被删除。当然,在专家那里,一切都很简单,因为不存在重新初始化。

不,我没有。

你不明白我在说什么。

例如,有某个数据集需要转移到指标的另一个副本(无论是扔在图表上的另一个指标,还是TF变化时的指标新副本,这都不重要)。该指标计算一些东西,每次它计算一些东西,而这些东西将应用于其他指标,这个指标应该更新。每一次。这个数据库可以存储在不同的地方,取决于数据量和所需的数据传输速率。在对数据进行修改后,只要有必要,就需要更新这些数据,而不是只在取消初始化时更新。这就是诀窍。这并不复杂。这不是在指标的局部变量 中存储数据,而是在每次数据被重新计算时重置/更新数据。

但对于图形对象来说,这非常简单。

 
Nikolai Semko:

当然,在专家顾问系统中,一切都很简单,因为没有重新初始化。
在Expert Advisors中,有 "重新初始化",但所有的本地变量 都会被保存,但我在上面写了一些别的东西--当每次改变本地数据时,有必要将其转移到外部存储器中,而不是只在取消初始化时才保存。
 
Andrey Dik:

不,我没有。

你不明白我在说什么。

例如,有某个数据集需要转移到指标的另一个副本(无论是扔在图表上的另一个指标,还是TF变化时的指标新副本,这都不重要)。该指标计算一些东西,每次它计算一些东西,而这些东西将应用于其他指标,这个指标应该更新。每一次。这个数据库可以存储在不同的地方,取决于数据量和所需的通信速度。在对数据进行修改后,只要有必要,就需要更新这些数据,而不是只在取消初始化时更新。这就是诀窍。这并不复杂。这不是在本地 指标变量中存储数据,而是在每次数据被重新计算时重置/更新数据。

而对于图形对象,这很简单。 甚至不需要解释。


没有什么是复杂的,这是非常值得商榷的。试着在一个简单的挥舞机的例子上真正复制我在 这个产品 中实现的东西。在腕轮中,你用鼠标改变周期,然后,当你改变TF时,变化应该被保存,你可以在窗口中使用几个指标。而且你会看到,没有什么复杂的东西。而如果你需要传递一个数组。你会看到它是多么 "简单"。也许我自己也会这么想,如果我还没有实施的话。
 
Nikolai Semko:

关于没有什么是困难的,这是非常值得商榷的。试着在一个简单的清障车的例子上真正复制我在 这个产品 中实现的东西。在腕轮中,你用鼠标改变周期,然后,当你改变TF时,变化应该被保存,而且有可能在窗口中使用几个指标。而且你会看到,没有什么复杂的东西。而如果你需要传递一个数组。你会看到它是多么 "简单"。

我最近才知道,在重新初始化过程中,EA的所有变量都被保留,也就是说,我写EA的方式和指标一样,假设程序对其他程序一无所知,因为它只有它们的init和deinit,程序一定不知道其他程序的init和deinit。

这就是为什么我从不依赖程序的ininit和deinit的时间一致性来卸载和再次运行,我过去从不依赖它在某个时候会发生变化(在1580年它已经发生变化)。依靠没有记录的错误和平台的未来会适得其反。

在我的实践中,也有一些产品根据用户的行为动态地改变可视化,应用一切--从事件到交换文件。图表上的指标通常比1多得多,5中的指标缓冲区是无限的,你可以在启动时作为参数创建它们。也就是说,我们是有创造力的人,我们需要有灵活的方法来解决我们的任务,同时牢记3种程序的具体情况,但平台开发人员关心的是其他问题,与平台的总体任务相比,这些问题比小困难更重要。

该平台确实有一些重要的缺陷,他们对这些缺陷谈得不多或根本不谈,它比 "init和deinit "这个牵强的问题重要得多。

 
Slawa:

如果时间框架向下切换,那么首先在最低(新)时间框架上OnInit,然后在最高(旧)时间框架上OnDeinit。

如果开关向上,那么反之亦然。首先在较低的(旧)时间框架上OnDeinit,然后在较高的(新)时间框架上OnInit。

在这里我们应该记住,缓存的处理是从最低的时间段到最高的时间段。

这实在是太可怕了。应用程序员不应该考虑这种系统性的东西。平台可以按照自己的意愿在内部处理缓存,但在MQL层面上,它应该透明地将一切都引向一个单一的事件合同,而没有潜在的副作用。所有关于所谓的效率考虑和每个人都可以自己解决这个问题的提法都是根本站不住脚的。可以有效和方便地做到这两点(一般排除踩到这个耙子的可能性),一劳永逸。
 
Stanislav Korotky:
这实在是太可怕了。 应用程序员决不能考虑这种系统性的东西。平台可以随心所欲地在内部处理缓存,但在MQL层面,它必须透明地将所有的东西纳入一个单一的事件合同,而没有潜在的副作用。所有关于所谓的效率考虑和每个人都可以自己解决这个问题的提法都是根本站不住脚的。可以有效而方便地做到这一点(完全消除了踩到这个耙子的可能性),一劳永逸。

这是正确的,他们不应该。因此,你运行总指挥,例如。为什么要求微软照顾到上传/下载TC拷贝到RAM的 "正确 "顺序?这是操作系统的问题吗?

操作系统关心的是,TC不会干扰其他TC,他们在RAM中做什么,交换文件或其他什么是他们的事。

"我想是的!"(c) Mimino, 1977年。

 
Nikolai Semko:

我想对上述内容进行总结和归纳。那么,在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说的那样,它不会使任务变得更容易,因为指标的旧副本的去初始化将在新副本的初始化之后进行。但不会有任何不确定性。

我们不得不希望开发者注意到这个问题,因为他们正在努力修复它。
我们正在等待一个新的建设。


我完全同意这个处理功能必须在文档中提及,否则新来的人将面临这个问题,并到论坛上寻找解决方案。(为什么,当你可以在终端和MQL文档中立即告诉他们时)。

同时在文件中补充说明,日志并不显示事件的全貌,而只是其中的一部分。请看完整的日志,了解完整的情况。

关于其余的,后来...

 
Nikolai Semko:

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

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

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

我希望开发商既然试图解决这个问题,就已经注意到了。
我们正在等待一个新的建设。

专家顾问在切换TF时工作正常,而这种情况下指标的工作方式非常不同。

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