Init()和DeInit()执行顺序 - 页 13 1...67891011121314151617181920...28 新评论 Dmitry Fedoseev 2017.04.13 15:26 #121 Andrey Dik:...有几个人已经要求提供一个具体的例子,说明在MT5的指标执行范式中存在问题的任务。是否会有或不会有一个明确的例子,而不是凭空吸出来的?有一个指标确实是先有初始值,然后再有脱敏值。但是当时间框架被切换时,第二个指标实例被创建,它的init可能比前一个(未启动的)实例的deinit提前执行。最明显的例子是--切换时间框架时保存用户参数--我们在deinit中保存参数,在init中读取它们。如果新实例的init在前一个实例的deinit之前被触发,参数将不会被保存。实际上,被移除的实例的deinit大多在新实例的init之前被触发,但如果时间框架切换得非常快,或者数据被加载,就会发生故障。 Forester 2017.04.13 15:31 #122 Slawa:现在想象一下,不是有一个单一的事件队列,而是每个符号周期都有一个队列。有多少个符号周期,就有多少个队列。现在提出处理这些队列的顺序。在我看来,队列应该与图表相联系。无论用户是改变了一个符号、TF还是只是关闭了它,所有的指标都应该完全完成,然后是EA,处理所有指令的定义(无论它们做什么,写入全局变量、文件、删除对象、与DLL交互、向互联网发送东西),完成后从内存中卸载 - 在一个新的TF或符号上运行新的实例,对前一个实例一无所知,但能够正确读取保存的前一个实例的信息。 这可能会慢一点,但这将是正确的事情。我赞成正确工作的程序,而不是快速和错误的程序。如果新实例的启动时间较早,那么事实证明deinit根本没有必要,甚至是有害的,因为它会误导程序员,因为他们希望能保存一些东西,然后再算上它。如果我们让它保持原样,那么就在帮助中加上--这个函数的结果将不会被下一个人知道 这个函数的结果不会被下一个实例知道,也就是说,没有人会在这个函数中做什么。甚至更好的是--删除它,如果事件的自然顺序是非常困难的,需要你做数百小时的工作。 Yuriy Zaytsev 2017.04.13 16:20 #123 Slawa:如果时间框架切换下降,那么首先 在较低的(新 )时间框架上 OnInit, 然后 在较高的(旧) 时间框架上 OnDeinit。如果开关上升,则反之亦然。首先我们在较低的(旧)时间框架上启动OnDeinit,然后在较高的(新)时间框架上启动OnInit。在这里我们应该记住,缓存的处理是从最低的时间段到最高的时间段。非常奇怪的逻辑! 我应该怎么做?如果在DeInit中会有一些参数被写入磁盘,那么在下一次指标启动时应该在OnInit中读取并拾取这些参数,即使它是在较低的时间段启动的。我想我需要写一个简短的测试来检查它。事实上,如果函数切换到一个较低的时间框架,逻辑就会更加完善。 总的来说,静态变量 不能保存在指标中是很遗憾的,同时,专家顾问对静态变量的处理也很好。 Andrey Dik 2017.04.13 18:07 #124 Ihor Herasko:1.你怎么称呼桌面应用程序?我有一种感觉,MT5不是一个桌面应用程序...2)这不是我编造的。这就是目前的主题。重点是,MT5可以为尚未DeInit的指标执行Init。是的,它是。你没有读过这个主题吗?3.尝试每秒多次更新同一个文件,并分享你的感受。4.这与在名字上加1有什么关系?这是关于有来自同一指标的图形对象,但不同的副本,在屏幕上同时出现的事实。技术上没有冲突。对于看到屏幕上的懊恼的用户来说,会有一个冲突,直到旧的副本被删除。 5.让我告诉你一个大秘密:每个终端副本有一个DLL的副本。你不能使用它们的多个副本。1.我们说的不是MT5,我们说的是指标(如脚本和专家),它们不在操作系统中运行,而是在一个特殊的安全环境中。2.你是在自相矛盾。如果重新计算的速度如此之快(一秒钟几次),那么在一个新的指标副本中进行新的重新计算是没有问题的。在这种情况下,在设定的时间后定期重置运行数据是有意义的(你可以使用ontimer或自定义计数器来实现)。如果计算时间长,就越有必要在计算后保存数据,以避免在不可抗力的情况下丢失数据(母亲从插座上拔下插头,"避免通话")。3.旧的副本将在不到一秒钟的时间内被删除,随之而来的是它的graphobjects。什么样的白痴会以如此高的频率切换TF,以至于会观察到闪烁?- 所以呢,dll不可能在不到一秒钟的时间内从副本中删除。4.那么,数据库可能很忙,这很正常。你不必担心,你只需在一秒钟内重复这个请求,比如说。正如你所看到的--没有问题,你只需要正确处理MT终端中的程序,记住它们不是桌面应用程序,它们在一个特殊的保护环境中运行。 Andrey Dik 2017.04.13 18:09 #125 Dmitry Fedoseev:有一个指标确实是先有初始值,然后再有脱敏值。但是当时间框架被切换时,第二个指标实例被创建,它的init可能比前一个(未启动的)实例的deinit提前执行。最明显的例子是--切换时间框架时保存用户参数--我们在deinit中保存参数,在init中读取它们。如果新实例的init在前一个实例的deinit之前被触发,参数将不会被保存。实际上,被移除的实例的deinit是在新实例的init之前被触发的,但是如果时间框架切换得非常快或者数据被加载,就会发生故障。 我们又来了...为什么要 "很快地转换时间框架"!?你们中是否有人真的 "通过按下按钮快速打开(或关闭)电脑 "的权力? Dmitry Fedoseev 2017.04.13 18:12 #126 Andrey Dik: 我们又来了...为什么要 "很快地转换时间框架"!?你们中是否有人 "通过按下按钮快速打开(或关闭)电脑 "电源? 为什么?是刑法禁止还是宪法禁止? Andrey Dik 2017.04.13 18:31 #127 Dmitry Fedoseev: 为什么?是刑法禁止还是宪法禁止?交流电有很多东西是不禁止的,比如把手指伸进插座。举个例子,需要频繁切换TF,以至于物体开始闪烁。- 不要举出催眠效果的例子,因为它可以通过更有效的方法实现。 Dmitry Fedoseev 2017.04.13 19:29 #128 Andrey Dik:有很多事情是监管机构没有禁止的,比如把手指伸进插座。举个例子,需要经常切换TF,以至于物体开始闪动。- 不要举出催眠效果的例子,因为它可以通过更有效的方法实现。 因为插座和插头是 由理智的设计师设计的,而不是白痴。在电压一侧是插座,而不是插头。此外,插座上的孔非常大,以至于你无法将手指放进去。但你可以在自己家里用自己的方式做--让插头伸出墙外,插座挂在电线上。毕竟,你明白,也不会用手去触摸从墙上伸出来的插头。 Andrey Dik 2017.04.13 19:42 #129 Dmitry Fedoseev: 因为插座和插头是由明智的设计师设计的,而不是白痴。在电压一侧是插座,而不是插头。此外,插座上的孔非常大,以至于你无法将手指放进去。但你可以在自己家里用自己的方式做--让插头伸出墙外,插座挂在电线上。你明白,也不会用手去触摸从墙上突出的插头。好的。插座是一个不幸的例子。那就再来一次吧--从阳台上跳下去!空调是否禁止从阳台上跳下去?- 不是吗?- 那么你为什么不为了肾上腺素而练习呢?所有的目标都必须通过合理的手段来实现,否则目标就不是合理的。 Andrey Dik 2017.04.13 19:45 #130 Dmitry Fedoseev:安德烈-迪克举个例子,需要频繁地切换TF,以至于物体开始闪烁。- 不要举出催眠效果的例子,因为它可以通过更有效的方法实现。 1...67891011121314151617181920...28 新评论 原因: 取消 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
...
有几个人已经要求提供一个具体的例子,说明在MT5的指标执行范式中存在问题的任务。是否会有或不会有一个明确的例子,而不是凭空吸出来的?
有一个指标确实是先有初始值,然后再有脱敏值。但是当时间框架被切换时,第二个指标实例被创建,它的init可能比前一个(未启动的)实例的deinit提前执行。
最明显的例子是--切换时间框架时保存用户参数--我们在deinit中保存参数,在init中读取它们。如果新实例的init在前一个实例的deinit之前被触发,参数将不会被保存。
实际上,被移除的实例的deinit大多在新实例的init之前被触发,但如果时间框架切换得非常快,或者数据被加载,就会发生故障。
现在想象一下,不是有一个单一的事件队列,而是每个符号周期都有一个队列。有多少个符号周期,就有多少个队列。
现在提出处理这些队列的顺序。
在我看来,队列应该与图表相联系。无论用户是改变了一个符号、TF还是只是关闭了它,所有的指标都应该完全完成,然后是EA,处理所有指令的定义(无论它们做什么,写入全局变量、文件、删除对象、与DLL交互、向互联网发送东西),完成后从内存中卸载 - 在一个新的TF或符号上运行新的实例,对前一个实例一无所知,但能够正确读取保存的前一个实例的信息。
这可能会慢一点,但这将是正确的事情。我赞成正确工作的程序,而不是快速和错误的程序。
如果新实例的启动时间较早,那么事实证明deinit根本没有必要,甚至是有害的,因为它会误导程序员,因为他们希望能保存一些东西,然后再算上它。如果我们让它保持原样,那么就在帮助中加上--这个函数的结果将不会被下一个人知道 这个函数的结果不会被下一个实例知道,也就是说,没有人会在这个函数中做什么。甚至更好的是--删除它,如果事件的自然顺序是非常困难的,需要你做数百小时的工作。
如果时间框架切换下降,那么首先 在较低的(新 )时间框架上 OnInit, 然后 在较高的(旧) 时间框架上 OnDeinit。
如果开关上升,则反之亦然。首先我们在较低的(旧)时间框架上启动OnDeinit,然后在较高的(新)时间框架上启动OnInit。
在这里我们应该记住,缓存的处理是从最低的时间段到最高的时间段。
非常奇怪的逻辑! 我应该怎么做?如果在DeInit中会有一些参数被写入磁盘,那么在下一次指标启动时应该在OnInit中读取并拾取这些参数,即使它是在较低的时间段启动的。
我想我需要写一个简短的测试来检查它。事实上,如果函数切换到一个较低的时间框架,逻辑就会更加完善。
总的来说,静态变量 不能保存在指标中是很遗憾的,同时,专家顾问对静态变量的处理也很好。1.你怎么称呼桌面应用程序?我有一种感觉,MT5不是一个桌面应用程序...
2)这不是我编造的。这就是目前的主题。重点是,MT5可以为尚未DeInit的指标执行Init。是的,它是。你没有读过这个主题吗?
3.尝试每秒多次更新同一个文件,并分享你的感受。
4.这与在名字上加1有什么关系?这是关于有来自同一指标的图形对象,但不同的副本,在屏幕上同时出现的事实。技术上没有冲突。对于看到屏幕上的懊恼的用户来说,会有一个冲突,直到旧的副本被删除。
5.让我告诉你一个大秘密:每个终端副本有一个DLL的副本。你不能使用它们的多个副本。1.我们说的不是MT5,我们说的是指标(如脚本和专家),它们不在操作系统中运行,而是在一个特殊的安全环境中。
2.你是在自相矛盾。如果重新计算的速度如此之快(一秒钟几次),那么在一个新的指标副本中进行新的重新计算是没有问题的。在这种情况下,在设定的时间后定期重置运行数据是有意义的(你可以使用ontimer或自定义计数器来实现)。如果计算时间长,就越有必要在计算后保存数据,以避免在不可抗力的情况下丢失数据(母亲从插座上拔下插头,"避免通话")。
3.旧的副本将在不到一秒钟的时间内被删除,随之而来的是它的graphobjects。什么样的白痴会以如此高的频率切换TF,以至于会观察到闪烁?- 所以呢,dll不可能在不到一秒钟的时间内从副本中删除。
4.那么,数据库可能很忙,这很正常。你不必担心,你只需在一秒钟内重复这个请求,比如说。
正如你所看到的--没有问题,你只需要正确处理MT终端中的程序,记住它们不是桌面应用程序,它们在一个特殊的保护环境中运行。
有一个指标确实是先有初始值,然后再有脱敏值。但是当时间框架被切换时,第二个指标实例被创建,它的init可能比前一个(未启动的)实例的deinit提前执行。
最明显的例子是--切换时间框架时保存用户参数--我们在deinit中保存参数,在init中读取它们。如果新实例的init在前一个实例的deinit之前被触发,参数将不会被保存。
实际上,被移除的实例的deinit是在新实例的init之前被触发的,但是如果时间框架切换得非常快或者数据被加载,就会发生故障。
我们又来了...为什么要 "很快地转换时间框架"!?你们中是否有人 "通过按下按钮快速打开(或关闭)电脑 "电源?
为什么?是刑法禁止还是宪法禁止?
为什么?是刑法禁止还是宪法禁止?
交流电有很多东西是不禁止的,比如把手指伸进插座。
举个例子,需要频繁切换TF,以至于物体开始闪烁。- 不要举出催眠效果的例子,因为它可以通过更有效的方法实现。
有很多事情是监管机构没有禁止的,比如把手指伸进插座。
举个例子,需要经常切换TF,以至于物体开始闪动。- 不要举出催眠效果的例子,因为它可以通过更有效的方法实现。
因为插座和插头是由明智的设计师设计的,而不是白痴。在电压一侧是插座,而不是插头。此外,插座上的孔非常大,以至于你无法将手指放进去。但你可以在自己家里用自己的方式做--让插头伸出墙外,插座挂在电线上。你明白,也不会用手去触摸从墙上突出的插头。
好的。插座是一个不幸的例子。
那就再来一次吧--从阳台上跳下去!空调是否禁止从阳台上跳下去?- 不是吗?- 那么你为什么不为了肾上腺素而练习呢?
所有的目标都必须通过合理的手段来实现,否则目标就不是合理的。
安德烈-迪克
举个例子,需要频繁地切换TF,以至于物体开始闪烁。- 不要举出催眠效果的例子,因为它可以通过更有效的方法实现。