mql5语言的特点、微妙之处以及技巧 - 页 204

 
Andrey Khatimlianskii:

没有人保证其他事件处理程序会被打断(或不运行)。

在警报之后,deinit和init都会发生,对吗?

是的,正在进行彻底的重启。只是计时器(即使是第二个)被扑倒了--这是一个特点,不是一个错误。

 
fxsaber:

这个顾问在账户之间切换时发出警报。根据规则,它似乎不应该这样做

然而,这是因为计时器的原因而发生的。

这种特殊性可以用来解决配方简单,但实施复杂的 问题。

// Если произошла смена счета, советник выгружается.

const bool Init = EventSetMillisecondTimer(1);

void OnTimer()
{
  static const long Account = AccountInfoInteger(ACCOUNT_LOGIN);
  
  if (Account != AccountInfoInteger(ACCOUNT_LOGIN))
    ExpertRemove();
}
 
fxsaber:

这一特点可用于解决配方简单但实施复杂的 问题。

为什么我们不能在每个On-function的输入处检查账户变化?

为什么要有一个毫秒级的计时器?如果在运行期间发生重新登录,它无论如何也不会中断程序的执行。

 
Andrey Khatimlianskii:

为什么你不能在每个On-function的输入处检查帐户的变化?

为什么要有一个毫秒级的计时器?如果在运行过程中发生了重新登录,它无论如何不会中断程序的执行。

试试吧。在上面的链接中,有一个关于这个话题的长篇讨论。

 
fxsaber:

是的,正在进行彻底的重启。只是计时器(甚至是第二个计时器)会被撞坏--这是一个特点,不是一个错误。

在ExpertRemove()命令之后,停止标志被简单地提高,EA继续工作直到下一个tick。在一个新的刻度线上,当停止标志升起时,EA将被卸载。这意味着,在新的勾选到来之前,所有的开机功能都继续在正常模式下工作。

相应地,如果我们不能以编程方式获得这个标志的状态(我还没有专门找过这个功能),那么我们就需要有一个全局定制的标志。我们在ExpertRemove()命令前设置我们自己的标志,并在每个On-function中检查它。如果旗帜被设定,我们将离开。那么定时器将不会执行写在里面的代码。

或者,也许我搞错了,问题是不同的?

 
Artyom Trishkin:

在ExpertRemove()命令之后,停止标志被简单地设置,EA继续工作直到下一个tick。在一个新的刻度线上,如果停止标志被设置,EA将被卸载。这意味着,在新的勾选到来之前,所有的开机功能都继续在正常模式下工作。

相应地,如果我们不能以编程方式获得这个标志的状态(我还没有专门找过这个功能),那么我们就需要有一个全局定制的标志。我们在ExpertRemove()命令前设置我们自己的标志,并在每个On-function中检查它。如果该标志被设置,我们就离开。那么定时器将不会执行写在里面的代码。

或者是我弄错了,问题是不同的?

我不知道你所描述的是什么问题。

 
Artyom Trishkin:

在ExpertRemove()命令之后,停止标志被简单地设置,EA继续工作直到下一个tick。如果在一个新的tick 上提出停止标志,EA就会被卸载。这意味着,在新的勾选到来之前,所有的开机功能都继续在正常模式下工作。

相应地,如果我们不能以编程方式获得这个标志的状态(我还没有专门找过这个功能),那么我们就需要有一个全局定制的标志。我们在ExpertRemove()命令前设置我们自己的标志,并在每个On-function中检查它。如果旗帜被设定,我们将离开。那么定时器将不会执行写在里面的代码。

或者是我弄错了,问题是不同的?

不是在新的蜱虫上,而是在下一次返回时。

把ExpertRemove()放在OnInit()中,并在调试中一步步地检查。

 
Alexey Viktorov:

不是在新的蜱虫上,而是在下一次返回时。

把ExpertRemove()放在OnInit()中,在调试中逐步检查。

是的,我的错误。任何下一个事件将不会被执行。我已经很久没有在帮助中寻找我不需要的功能了 :)

 
fxsaber:

我不知道你所描述的是什么问题。

答案的含义并不清楚。这并不重要。

 
Artyom Trishkin:

答案的含义并不清楚。

ExpertRemove没有被调用