错误、漏洞、问题 - 页 1999

 
Alexey Viktorov:

让我们以一个指标缓冲区数组为例:当初始化一个指标时,缓冲区的长度为零。有什么可以用零来初始化?当另一个索引被添加时,它是否被强制归零,然后填充一些数值?这个归零或填充EMPTY_VALUE 是为了什么?而如果有必要指定PLOT_EMPTY_VALUE而不是0或 EMPTY_VALUE,或者强制指定一个,但我们需要另一个......无论你如何切割它,你最终都是在浪费时间......。

还有一个自定义阵列...数组被声明为一些不同于零的数据, EMPTY_VALUE。那么,用东西强行初始化它的目的是什么?

所以事实证明,在大多数情况下,性能会受到影响。

我显然与生活脱节了。在我看来,指标缓冲区的长度总是等于柱状图的数量。而在MT5中拒绝初始化导致屏幕上显示垃圾。事实证明,明确的初始化是强制性的。而且,不清楚为什么它只是从核心部分(如MT4)转移到MQL程序员。我还没有看到任何真正的论据,说在某种程度上可以在没有初始化的情况下加速,而仍然得到垃圾的显示。

我不是说什么自定义动态数组--确实有一个规则:分配它的人,要负责正确的清理。ArrayInitialize在很多情况下都很有用。这不是速度的问题,而是程序的正确性。优先考虑:快速和/或纠正。通常,一些正确性和数据准备的检查需要额外的时间(即使是最小的),但你不能没有它 - 奇迹永远不会发生。

 
Stanislav Korotky:

我不是在说自定义动态数组的事情--这个规则真的适用于那里:谁分配了它,谁就有责任正确地清理它。

不要侮辱数组。

#property strict

void OnStart()
{
  uchar Array[];
  
  const int Size = ArrayResize(Array, 10000);
  
  bool Res = false;
  
  for (int i = 0; (i < Size) && (!Res); i++)
    Res = Array[i];
    
  Print(Res);
}

在MT4中,它将总是返回false,因为没有垃圾--全是0。在MT5中是这样的。

因此,MT4测试器中的相同代码,在不同的运行中总是显示相同的结果。在MT5测试器中,它不会。

 
fxsaber:

在MT4中,它将总是返回false,因为没有垃圾,它就全是0。在MT5中是这样的。

这是在测试MT4将数组填 满零吗?那么我们必须记住,如果ArrayResize使用第三个参数与储备,那么随后在储备内的重新分配将不会初始化任何东西。会有垃圾。我建议做明确的初始化,这样你就不会在以后意外地得到惊喜,就像在引发这次讨论的优化例子中那样。

对于那些因为初始化而担心刹车的人来说,我敢说,通常有很多其他地方和技术可以在更大程度上提高效率。

 
Stanislav Korotky:

这是对MT4用零填充阵列 的测试吗?那么你必须记住,如果ArrayResize使用第三个参数的储备,那么在储备内的后续重新分配将不会初始化任何东西。会有垃圾。

将不会有垃圾。

我建议做明确的初始化,这样你就不会在以后意外地感到惊讶,就像在引发这次讨论的优化例子中那样。

这将不会保存

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

虫子,虫子,问题

fxsaber, 2017.09.12 11:18

即使我写得很完美(没有犯错--我没有),拿别人的库(有时没有源代码--在市场上) 来用也很正常,希望它写得很称职。而且没有任何保险,在那之后你会在测试器中遇到不同的结果。而找到真正的原因将非常困难。而修复它有时是不可能的。

目标是,从运行到运行,结果是可重复的--相同的,即使有错误。

 
fxsaber:

将不会有垃圾。



那我们应该纠正文件吗?

用表达式ArrayInitialize(array, init_val)初始化一个数组并不意味着用相同的值初始化为这个数组分配的储备元素ArrayResize()函数随后在当前保留范围内增加数组的大小时,其值未被定义且多半不等于init_val元素被添加到数组的末端

 
Stanislav Korotky:

那我们是否需要纠正文件?

用表达式ArrayInitialize(array, init_val)来初始化一个数组并不意味着为这个数组分配的储备元素被初始化为相同的值ArrayResize()随后在当前保留的范围内增加数组的大小时,元素被添加到数组的末端,这些元素的值没有被定义,而且,大多数情况下,不等于init_val

你不知道,因为在MT4的文档中根本没有这样的内容。


想到一些数学库(Include/Math--7Mb的源代码)没有在一个/两个地方初始化,就觉得很可怕!这就是为什么我们要把它作为一个数学库。在MT5测试器中出现不同的单次运行,而在MT4中出现相同的单次运行,如何挖出这个错误呢?

 
Stanislav Korotky:

我一定是落后于时代了。在我看来,指标缓冲区的长度总是等于柱状图的数量。而在MT5中拒绝初始化导致屏幕上显示垃圾。事实证明,明确的初始化是强制性的。而且,不清楚为什么它只是从核心部分(如MT4)转移到MQL程序员。我还没有看到任何真正的论据,说在某种程度上可以在没有初始化的情况下加速,而仍然得到垃圾的显示。

我不是说什么自定义动态数组--确实有一个规则:分配它的人,要负责正确的清理。ArrayInitialize在很多情况下都很有用。这不是速度的问题,而是程序的正确性。优先考虑:快速和/或纠正。通常,一些正确性和数据准备的检查需要额外的时间(尽管是最小的),但你不能没有它 - 奇迹发生了。

你没有注意到这句话

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

虫子、虫子、问题

Alexey Viktorov, 2017.09.12 10:50

让我们以指标的缓冲区数组为例:当初始化指标时,缓冲区的长度为零。有什么可以用零来初始化?当另一个索引被添加时,它被强制归零,然后被填入一些值?这个归零或填充EMPTY_VALUE 是为了什么?而如果有必要指定PLOT_EMPTY_VALUE而不是0或 EMPTY_VALUE,或者强制指定一个,但我们需要另一个......无论你如何切割它,你最终都是在浪费时间......。

还有一个自定义阵列...数组被声明为一些不同于零的数据, EMPTY_VALUE。那么,为什么要强行用东西来初始化呢?

所以事实证明,在大多数情况下,它影响了性能。



而在OnCalculate中这样做是没有意义的。为什么我们需要用一些东西来初始化数组,然后用公式中的一些值来填充它?当你添加一个栏,分别是一个数组单元格时,用一些东西填充它,然后立即用公式中的一个值或一个空值,这有什么意义?

 
Alexey Viktorov:

而它在OnCalculate中已经没有意义了。为什么我们需要用一些东西来初始化数组,然后立即用公式中的一些值来填充它?当你添加一个条形图,并且分别是一个数组单元格时,用一些东西填充它,然后立即用公式中的一个值或一个空值,这有什么意义?

只有新的数组元素 被初始化。而重点仍然是一样的--即使代码中有错误(往往不是你自己的),各次运行的结果都是一样的。我在上面举了一个数学库的例子。

这些垃圾是邪恶的。

 
fxsaber:

不要,因为MT4的文档中根本没有。

那我从哪里得到的呢?到这里 来。

ArrayInitialize - Операции с массивами - Справочник MQL4
ArrayInitialize - Операции с массивами - Справочник MQL4
  • docs.mql4.com
ArrayInitialize - Операции с массивами - Справочник MQL4
 
Stanislav Korotky:

那我从哪里得到的呢?到这里 来。

所以这不是ArrayResize的问题,而是ArrayInitialize的问题。ArrayResize保证了MT4中的零点。


出于兴趣,我在我所有的MT5的资料中查看了我使用ArrayInitialize的频率。只有几次。似乎不到所有动态阵列的百分比。而在我使用它的地方,我不得不故意使用空值,所以我使用了一个较短的条目,而不是for。

原因: