MT4的iMAOnArray和iBandsOnArray元素数量对计算的影响 - 页 6

 

我没有建议使用计算器或Excell软件,因为这不是白白的。这有助于了解这玩意是如何运作的。只有当你已经有一个现成的数组时,你才能使用除0以外的元素数来计算。假设你有一个1000个元素的数组,你只需要对最后100个元素进行平均。我们有两个选择:将这100个元素转换成一个自定义数组并重新计算,或者使用从100到0的循环,不将元素数转换成0,而是转换成100。

但这里我们面临着改变数组大小的问题,这在指标中是不可避免的。

同样,我说的是限制计算元素数量的其他方法。那么,你可以设置条件iMAOnArray(),只有当(rates_total-i >= rates_total-100);并且只有最后100个条形会被重新计算,当新条形到来时一切都会好起来。

int i, limit;
   limit = prev_calculated == 0 ? rates_total-1 : rates_total-prev_calculated;

   for(i = limit; i >= 0; i--)
     {
      Buffer[i]=open[i];
      if(rates_total-i >= rates_total-100)
      BufferMA[i] = NormalizeDouble(iMAOnArray(Buffer, 0, 5, 0, MODE_LWMA, i), _Digits);
      
     }

return(rates_total);


 
Alexey Viktorov:

我没有建议使用计算器或Excell软件,因为这不是白白的。这有助于了解这玩意是如何运作的。只有当你已经有一个现成的数组时,你才能使用除0以外的元素数来计算。假设你有一个1000个元素的数组,而你只需要对最后100个元素进行平均。我们有两个选择:将这100个元素转换成一个自定义数组并重新计算,或者使用从100到0的循环,不将元素数转换成0,而是转换成100。

但这里我们面临着改变数组大小的问题,这在指标中是不可避免的。

同样,我说的是限制计算元素数量的其他方法。好吧,把条件设置为只有在(rates_total-prev_calculated-i >= 100)时才读取iMAOnArray();而且只有最后100个条形会被重新计算,当新条形到来时,一切都会好起来。


告诉我,你是一个程序员,还是把它作为一种爱好,或者出于需要?我不需要一个EXCEL或一张纸来了解它是如何工作的,Barabashka在前面的截图上演示了所有的 "困难"。让我们按顺序进行。

1.iMAOnArray(以及iBandsOnArray)可能有两个版本,它可能读取整个数组并正确操作(但在初级计算时速度减慢),或者它可能读取数组的一部分,但它只对初始元素进行操作,尽管事实上对最后的元素指定了移位。然而,我试图将计算限制在酒吧,我仍然需要计算所有的数组(即 "制动 "的初始版本),或者用复制缓冲区和重新计算这个缓冲区的所有元素来组成类似于你的变体,正如我在前面的帖子中所描述的,对于复杂的平滑方法来说,这并不能给出正确的结果,而且也会增加一般的数据处理时间。

2.你所描述的在指标中调整数组大小的问题,只发生在数组不是指标缓冲区之一的情况下,也就是说,你所描述的 "乱舞 "也有负面影响,因为回到主要的源代码中,问题只出现在缓慢的计算中,而且只在第一步。

3.你提供的变体是在100(N)条上只对部分数组进行重新计算,这又造成了一般生产力的损失,以及数组复制或不必要的重新计算所带来的不必要的麻烦。除了在你的截图上和上面的代码中,所有的计算都完成了(我怀疑是在内部数组的某个地方,这很可能是主要滞后发生的原因),否则这种平滑会使第一次填充的结果不同,而你只是没有在缓冲数组中填充它们。因为计算函数的数组大小参数中的0明确告诉它要读取所有数据,这就是问题所在。

唯一的办法是使用我自己的函数,它将以应有的方式工作,当新的条形图出现时,不会重新计算所有的数据(N部分),而只会读取它,尤其是我在许多产品中都有并使用这样的平均函数。这个论坛主题的问题是如何 "击败 "MT4的标准功能,而不降低处理速度和结果。如果我相信上面的信息,那么数组上的"标准偏差"的计算是不需要刹车的,或者作为退路,我可以自己写一个偏差计算,尤其是计算公式在这里的文档中大家都可以看到。

 

这么多字母...而这一切的目的只是为了不同意拟议的方案。

谢谢你的想法,至少我已经弄清楚了它的工作原理,否则我没有去研究这些复杂的功能,因为我不需要。

如果你不喜欢,就用自写的。

 
Alexey Viktorov:

这么多字母...而一切的目的只是为了不同意拟议的方案。

谢谢你的想法,至少我已经弄清楚了它的工作原理,否则我没有去研究这些复杂的功能,因为我不需要。

如果你不喜欢,就用自写的。

好吧,为什么不同意,解释一下,为什么没有必要这样做,因为写代码绑定到制动功能或代码创建额外的循环复制 - 并不总是正确的选择,虽然,有时,和不太费力:)
这不是 "喜欢"/"不喜欢 "的问题,而是在事实上,这些功能没有完全按照它应该的方式工作,因为事实上,创建类似物就像重新发明轮子,但在这种特殊情况下,我们不能没有它。

我在几页前就为自己做了结论,但你的方式,也许可以帮助别人理解,这种情况在这里已经解决了,我需要做什么来解决这个问题,这么多信:)

 

在后一种变体中没有复制或额外的循环。而你和Dimitri之前说的MODE_LWMA的计算方法不能正确地重新计算。

请看代码和截图。在截图中,MA周期5与代码中一样,MODE_LWMA方法,并注意计算的条数,注意MA和指标值与iMAOnArray()在地下室的重合。如果你想重新计算所有的条形图或只重新计算100条。如果没有变化,说明其他的计算很慢。

 
彻底的无奈!
 
Sergey Efimenko:

告诉我,你是一个程序员,还是把它作为一种爱好,或者出于需要...?

过去,他经常自己开始胡言乱语,说自己不是程序员,而是一个业余爱好者,所以可以被欺负。
 
Alexey Viktorov:

在后一种变体中没有复制或额外的循环。而你和Dimitri之前说的MODE_LWMA的计算方法不能正确地重新计算。

请看代码和截图。在截图中,MA周期5与代码中一样,MODE_LWMA方法,并注意计算的条数,注意MA和指标值与iMAOnArray()在地下室的重合。如果你想重新计算所有的条形图或只重新计算100条。如果没有变化,说明其他的计算很慢。

后者的变体与原始变体基本相同。正如我之前写的,在数组大小为0的情况下,它仍然被算作一个整体。甚至在创建论坛主题之前,我减少计算时间的第一个解决方案是限制条数,但不幸的是,这并不影响生产率;然后我开始试验iMAOnArray的数组长度,这时我才明白情况的复杂性。就在那时,也只有在那时,在尝试了几乎所有简单的变体,包括为不同的组合改变数组索引 后,我创建了这个主题。好了,之后我得到了一些答案,其中一些人确认其他人也试过,而且都得出了他们自己的功能。这就是为什么我问你的代码,最初知道会有效果:)无意冒犯 :)也许一些用户通过阅读这个主题会克服这个 "耙子"。:)
 
Dmitry Fedoseev:
过去,他自己也会开始胡言乱语,说自己不是程序员,而是一个业余爱好者,因此可以被欺负。

这更像是一个反问句 :)

PS 先生们,让我们彼此宽容吧。毕竟,我们都是为了一个原因--"宰割 "市场。:)因此,让我们心无旁骛地朝着这个目标前进。我们每个人都有自己的困难,和特点的看法,但只有在争议中诞生的真理,虽然正如拿破仑常说的:"要争论,知道你是错的 - 愚蠢的,要争论,知道你是对的意思。这就是为什么我从不争论。"

 
Sergey Efimenko:
后者的选择基本上与原来的没有区别。正如我已经写过的,当数组大小为0时,它仍然被完整地计算在内。我的第一个解决方案,甚至在创建论坛主题之前,是限制条数,但不幸的是,这并不影响生产力;然后我开始试验iMAOnArray的数组长度,这时我才看到情况的复杂性。就在那时,也只有在那时,在尝试了几乎所有简单的变体,包括为不同的组合改变数组索引 后,我创建了这个主题。好了,之后我得到了一些答案,其中一些人确认其他人也试过,而且都得出了他们自己的功能。这就是为什么我问你的代码,最初知道会有效果:)无意冒犯 :)也许一些用户通过阅读这个主题会克服这个 "耙子"。:)

你是说在if(rates_total-i >= rates_total-100);之后,当只剩下100条计算时,iMAOnArray()函数首先重新计算整个阵列?