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

 
Andrey Dik:

...

有几个人已经要求提供一个具体的例子,说明在MT5的指标执行范式中存在问题的任务。是否会有或不会有一个明确的例子,而不是凭空吸出来的?

有一个指标确实是先有初始值,然后再有脱敏值。但是当时间框架被切换时,第二个指标实例被创建,它的init可能比前一个(未启动的)实例的deinit提前执行。

最明显的例子是--切换时间框架时保存用户参数--我们在deinit中保存参数,在init中读取它们。如果新实例的init在前一个实例的deinit之前被触发,参数将不会被保存。

实际上,被移除的实例的deinit大多在新实例的init之前被触发,但如果时间框架切换得非常快,或者数据被加载,就会发生故障。

 
Slawa:

现在想象一下,不是有一个单一的事件队列,而是每个符号周期都有一个队列。有多少个符号周期,就有多少个队列。

现在提出处理这些队列的顺序。

在我看来,队列应该与图表相联系。无论用户是改变了一个符号、TF还是只是关闭了它,所有的指标都应该完全完成,然后是EA,处理所有指令的定义(无论它们做什么,写入全局变量、文件、删除对象、与DLL交互、向互联网发送东西),完成后从内存中卸载 - 在一个新的TF或符号上运行新的实例,对前一个实例一无所知,但能够正确读取保存的前一个实例的信息。

这可能会慢一点,但这将是正确的事情。

我赞成正确工作的程序,而不是快速和错误的程序。

如果新实例的启动时间较早,那么事实证明deinit根本没有必要,甚至是有害的,因为它会误导程序员,因为他们希望能保存一些东西,然后再算上它。如果我们让它保持原样,那么就在帮助中加上--这个函数的结果将不会被下一个人知道 这个函数的结果不会被下一个实例知道,也就是说,没有人会在这个函数中做什么。甚至更好的是--删除它,如果事件的自然顺序是非常困难的,需要你做数百小时的工作。

 
Slawa:

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

如果开关上升,则反之亦然。首先我们在较低的(旧)时间框架上启动OnDeinit,然后在较高的(新)时间框架上启动OnInit。

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

非常奇怪的逻辑! 我应该怎么做?如果在DeInit中会有一些参数被写入磁盘,那么在下一次指标启动时应该在OnInit中读取并拾取这些参数,即使它是在较低的时间段启动的。

我想我需要写一个简短的测试来检查它。事实上,如果函数切换到一个较低的时间框架,逻辑就会更加完善。

总的来说,静态变量 不能保存在指标中是很遗憾的,同时,专家顾问对静态变量的处理也很好。
 
Ihor Herasko:

1.你怎么称呼桌面应用程序?我有一种感觉,MT5不是一个桌面应用程序...

2)这不是我编造的。这就是目前的主题。重点是,MT5可以为尚未DeInit的指标执行Init。是的,它是。你没有读过这个主题吗?

3.尝试每秒多次更新同一个文件,并分享你的感受。

4.这与在名字上加1有什么关系?这是关于有来自同一指标的图形对象,但不同的副本,在屏幕上同时出现的事实。技术上没有冲突。对于看到屏幕上的懊恼的用户来说,会有一个冲突,直到旧的副本被删除。

5.让我告诉你一个大秘密:每个终端副本有一个DLL的副本。你不能使用它们的多个副本。

1.我们说的不是MT5,我们说的是指标(如脚本和专家),它们不在操作系统中运行,而是在一个特殊的安全环境中。

2.你是在自相矛盾。如果重新计算的速度如此之快(一秒钟几次),那么在一个新的指标副本中进行新的重新计算是没有问题的。在这种情况下,在设定的时间后定期重置运行数据是有意义的(你可以使用ontimer或自定义计数器来实现)。如果计算时间长,就越有必要在计算后保存数据,以避免在不可抗力的情况下丢失数据(母亲从插座上拔下插头,"避免通话")。

3.旧的副本将在不到一秒钟的时间内被删除,随之而来的是它的graphobjects。什么样的白痴会以如此高的频率切换TF,以至于会观察到闪烁?- 所以呢,dll不可能在不到一秒钟的时间内从副本中删除。

4.那么,数据库可能很忙,这很正常。你不必担心,你只需在一秒钟内重复这个请求,比如说。

正如你所看到的--没有问题,你只需要正确处理MT终端中的程序,记住它们不是桌面应用程序,它们在一个特殊的保护环境中运行。

 
Dmitry Fedoseev:

有一个指标确实是先有初始值,然后再有脱敏值。但是当时间框架被切换时,第二个指标实例被创建,它的init可能比前一个(未启动的)实例的deinit提前执行。

最明显的例子是--切换时间框架时保存用户参数--我们在deinit中保存参数,在init中读取它们。如果新实例的init在前一个实例的deinit之前被触发,参数将不会被保存。

实际上,被移除的实例的deinit是在新实例的init之前被触发的,但是如果时间框架切换得非常快或者数据被加载,就会发生故障。

我们又来了...为什么要 "很快地转换时间框架"!?你们中是否有人真的 "通过按下按钮快速打开(或关闭)电脑 "的权力?
 
Andrey Dik:
我们又来了...为什么要 "很快地转换时间框架"!?你们中是否有人 "通过按下按钮快速打开(或关闭)电脑 "电源?

为什么?是刑法禁止还是宪法禁止?
 
Dmitry Fedoseev:

为什么?是刑法禁止还是宪法禁止?

交流电有很多东西是不禁止的,比如把手指伸进插座。

举个例子,需要频繁切换TF,以至于物体开始闪烁。- 不要举出催眠效果的例子,因为它可以通过更有效的方法实现。

 
Andrey Dik:

有很多事情是监管机构没有禁止的,比如把手指伸进插座。

举个例子,需要经常切换TF,以至于物体开始闪动。- 不要举出催眠效果的例子,因为它可以通过更有效的方法实现。

因为插座和插头 由理智的设计师设计的,而不是白痴。在电压一侧是插座,而不是插头。此外,插座上的孔非常大,以至于你无法将手指放进去。但你可以在自己家里用自己的方式做--让插头伸出墙外,插座挂在电线上。毕竟,你明白,也不会用手去触摸从墙上伸出来的插头。
 
Dmitry Fedoseev:
因为插座和插头是由明智的设计师设计的,而不是白痴。在电压一侧是插座,而不是插头。此外,插座上的孔非常大,以至于你无法将手指放进去。但你可以在自己家里用自己的方式做--让插头伸出墙外,插座挂在电线上。你明白,也不会用手去触摸从墙上突出的插头。

好的。插座是一个不幸的例子。

那就再来一次吧--从阳台上跳下去!空调是否禁止从阳台上跳下去?- 不是吗?- 那么你为什么不为了肾上腺素而练习呢?

所有的目标都必须通过合理的手段来实现,否则目标就不是合理的。

 
Dmitry Fedoseev:

安德烈-迪克

举个例子,需要频繁地切换TF,以至于物体开始闪烁。- 不要举出催眠效果的例子,因为它可以通过更有效的方法实现。

原因: