MT版本存档。 - 页 4

 
Roman:

在这种情况下,我们不能做检查吗?

不幸的是,这次检查并没有产生任何结果...

 
Roman:

通过举一个IsStopped()的例子,我只是想回答第一部分。
有时有必要提前完成对某一事件的处理,而有时则像你的情况一样紧急。
请阅读文档中关于这个函数IsStopped() 的描述,也许它能带来一些想法。
但在你看来,这是来自另一个方向。如果是来自另一个主题,对不起,可能是猜的。
但正如他们所说,在可能的建议中,并解决了问题。
确定的解决方案不会告诉任何人,因为没有人知道他代码的所有逻辑,可能也不会深入研究。

罗曼,你又一次没有把话全部引用完。而你在所有突出的人中突出了它。

好吧,好吧,让我们说开始强制关机。而且我需要让这个终止事件一直执行到结束,而且计算的复杂性超过3秒。那我怎样才能防止终止程序,让它运行到最后?这正是问题所在。谈话的内容不是如何终止,而是如何防止错误地调用终止。或者不是阻止,而是推迟到某一时刻,特别是推迟到事件处理完成。

 
Сергей Таболин:

这里是对你的选择的检查。结果是这样的信息。

这是个死胡同...

因此,建议的方案是

bool                 tester_stop = false;                 // флаг проверки выхода по TesterStop
.......
void OnTick()
{
//--- пропустить бесполезные проходы оптимизации
   if(!check_init && (MQLInfoInteger(MQL_OPTIMIZATION) || MQLInfoInteger(MQL_TESTER)))
   {
      if(недопустимый параметр)          tester_stop = TesterStop();
........
}
double OnTester()
{
   if(tester_stop) return(-99999999999.99);

将以完全相同的方式进行计算。而你将再次得到一个 "僵局"。但僵局不在mql,而是在你的头脑中。这不是做编程的方法。在你对代码抱有任何期望之前,想象自己处于一个白痴的位置,像计算机一样盲目地把整个代码走几遍。确保在特定情况下,执行必须通过。在特定情况下应接收哪些参数。然后开始执行,并检查我们是否得到我们所期望的。如果没有,那么我们必须找出我们在调试过程中得到的东西。

不可能是别的。而且绝对不可能对代码片段进行调试。

 
Alexey Viktorov:

罗曼,你又一次没有把话全部引用完。而你在所有突出的人中突出了。

好吧,好吧,让我们说一个强制终止被触发了。而且我需要触发这个终止的事件一直执行到结束,而且计算的复杂性超过3秒。那我怎样才能防止程序终止,让它运行到最后?这正是问题所在。谈话的内容不是如何终止,而是如何防止错误地调用终止。或者不是阻止,而是推迟到某一时刻,特别是推迟到事件处理完成。

我们必须等待计算完成。

不幸的是,mql并不包含像await这样的函数。
我们可以尝试用Sleep() 进行实验,但是slip并不是终止的明确标志,所以它并不太适合。
尝试创建另一个条件,如果(计算被执行),那么我们将已经开始强制终止。

 
Alexey Viktorov:

所以我提议的方案是

将以完全相同的方式进行计算。而你将再次得到一个 "僵局"。但僵局不在mql,而是在你的头脑中。你不能去做这样的编程。在你对代码抱有任何期望之前,想象自己处于一个白痴的位置,像计算机一样盲目地把整个代码走几遍。确保在特定情况下,执行必须通过。在特定情况下应接收哪些参数。然后开始执行,检查我们是否得到了我们所期望的。如果没有,那么我们必须找出我们在调试过程中得到的东西。

不可能是别的。但你不能逐个片段地调试代码。

好吧,这就是问题所在,更新前一切都在工作,现在我只是不知道该怎么办。

此外,所有的代码原则上都是开放的。

此外,我想开一个主题来讨论我的OnTester()版本的改进,就在这里。

结果发现,问题不在这里,而是在改变了的TesterStop() 的执行。它实际上与OnTester()没有直接联系,但它破坏了我的心情......

我现在要试试别的东西...

 
Сергей Таболин:

这就是问题所在,在更新之前一切都在工作,但现在我就是不知道该怎么做。

此外,在原则上,所有的代码都是开放的。

此外,我已经想开一个主题,讨论我的OnTester()版本的改进,现在就在这里。

结果发现,问题不在这里,而是在改变了的TesterStop()的执行。它实际上与OnTester()没有直接联系,但它破坏了我的心情......

我现在要试试别的东西...

你已经给了一个以前的建设的链接。替换文件并检查它们。然后你可以告诉大家现在哪种构建方式可行。如果它不工作,这意味着没有导致现在出现问题的这部分代码的参数只是相同。

 
Alexey Viktorov:

所以给了你一个以前建造的链接。替换文件并检查。然后你可以告诉大家现在哪种构建方式可行。如果它不工作,这意味着不导致这部分代码的参数,即现在出现问题的地方,只是相同的。

我就是这样试的。把2007年的建设放在那里,所有这些问题都消失了。我专门翻看了优化后的整个日志。我发现了4个(只有4个!)除以0的错误。那些是在没有交易时发生的。当然,这需要修复,但它对整个优化结果没有影响!"。但新的建设造成了惊人的错误,使优化成为不可能。

现在,关于@Roman的 提示。

谢谢你,这是个好主意。但在我的案例中,它似乎对TesterStop()毫无用处,因为TesterStop()要求测试必须已经通过了某个未知的百分比。而在文件中却没有一个字提到这一点。

但用ExsprtRemove()时效果不错。对于这个函数来说,有多少测试通过并不重要。但我们不得不将整个工作代码包裹在if中。

   if(!IsStopped())
   {
      тут рабочий код
   }

好吧,我设法用拐杖修复了代码。再次感谢。

P.S. 其实我不得不为另一个拐杖做一个拐杖。有趣的))))

 
Сергей Таболин:

P.S. 实际上不得不为另一个拐杖做一个拐杖。这很有趣 ))))

我不认为没有任何选择。如果你喜欢对拐杖编程,我无权阻止。斯拉瓦就这一问题作了回答。

关于交易、自动交易系统和策略测试的论坛

虫子、虫子、问题

斯拉瓦, 2019.06.16 14:04

立即停止专家顾问意味着内存损坏。在 专家顾问立即停止后,可能有未释放的内存块。因此,只有在客户终端或测试员代理被终止时,并且只有在专家顾问不处理停止标志并继续执行时,才会使用专家顾问的立即停止。

TesterStop给出了终止测试的命令。这意味着在当前处理程序OnInit, OnTick, OnTimer, OnChartEvent完成后,将不再处理测试器的事件,因为处理周期已经结束。而是调用OnTester和OnDeinit。

也许,你在之前的构建中使用了一个错误。现在这个错误已经被修复,我们必须寻找一个合适的解决方案。
 
Сергей Таболин:

我就是这样试的。把2007年的建设放在那里,所有这些问题都消失了。我专门翻看了优化后的整个日志。我发现了4个(只有4个!)除以0的错误。那些是在没有交易时发生的。当然,这需要修复,但它对整个优化结果没有影响!"。但新的建设造成了惊人的错误,使优化成为不可能。

现在,关于@Roman的 提示。

谢谢你,这是个好主意。但在我的案例中,它似乎对TesterStop()毫无用处,因为TesterStop()要求测试必须已经通过了某个未知的百分比。而在文件中却没有一个字提到这一点。

但用ExsprtRemove()时效果不错。对于这个函数来说,有多少测试通过并不重要。但我们不得不将整个工作代码包裹在if中。

好吧,我设法用拐杖修复了代码。再次感谢。

P.S. 其实我不得不为另一个拐杖做一个拐杖。有趣的))))

这不是一个拐杖,而是开发者的推荐做法。
我在while循环的描述中发现了这个函数

while(!IsStopped())
{

}

这就是为什么我有一个想法:如果这个函数可以检查程序强制终止的事实,为什么不把它用于TesterStop()。
遗憾的是,它对TesterStop()不起作用,我们现在会知道这个问题。
但是,我们可以公平地问一下开发者,IsStopped()函数是否必须对TesterStop()函数起作用?
也许这是个错误?

但最主要的是问题的解决。

 
Alexey Viktorov:

我不相信没有选择。如果你喜欢对拐杖进行编程,我无权干涉。斯拉瓦就这一问题作出答复

也许,你已经使用了开发人员在以前的构建中的一个失误。现在这个bug被修复了,我们必须寻找一个合适的解决方案。

我明白一切,我不需要拐杖。而我不得不在这里 寻找一个拐杖,读它是为了什么

也许。但我不记得有人抱怨过这个问题。