使用自定义指标时的EA加速理论(功能-iCustom)。 - 页 3

 
-Aleks-:
那么,必要指标的大杂烩会比单独使用指标工作得更快--关于报价的信息会被要求得更少?

不是必须的。确保计算结果不重复。如果两个指标的初步计算结果相同,应合并为一个。你不应该只是把所有的指标粘贴到一个。

在要求报价方面没有任何问题。它们不需要被要求,它们自己就会出现。

 

试着用一个时间延迟来重新计算指标。

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
 static datetime   prevtime;
  datetime per=15; //задержка секунд
   
   if((TimeCurrent()-prevtime)<per) 
   {
   return(rates_total); //прошло мало секунд - поэтому выходим
   }
 
//--- main cycle  
....................

prevtime=TimeCurrent();
return(rates_total);
 }

当在 "OHLSnaM1 "上测试时,几乎没有差别,也许在 "所有ticks "上测试会更快。

 

我对iCustom工作方式的印象(如果在过去两个月中没有任何改变的话)
从iCustom中调用该指标
一个可能的历史的所有缓冲区和存储在缓存中的结果将被计算,缓存将被绑定到参数和指标名称上

如果你下次调用相同的指标和相同的参数,用于第二个索引阵列--结果将从缓存中返回(+对新的历史数据的修正)。
如果你调用同一个指标,但只改变一个参数--对所有缓冲区可能的历史进行全面计算,并保存另一个缓冲区,但与新的参数绑定,将被执行。


你可以指定应该从专家顾问那里下载多少历史记录,如果你在指标中设置这样一个参数,但在这个调用中,你应该始终传递相同的数字--历史记录的大小。
(它将影响iCustom第一次调用的速度)。

如果可能的话,你可以尝试在指标中或通过指标参数删除不必要的缓冲区的计算,如在历史尺寸的例子中
(减少缓存大小 - 提高计算速度)

 

谢谢大家提供的信息。

我想澄清一下,如果在一个有5个图形缓冲区的指标中,不使用图形缓冲区,而是使用普通数组--通过图形缓冲区输出数据,就像我建议的那样,在优化过程中指标的速度会更快,因为为指标分配的内存会更少,因此用它工作的时间会更少?

如果进行了优化,每次都不改变指标设置,那么指标是否会被重新计算?

 
-Aleks-:

谢谢大家提供的信息。

我想澄清一下,如果在一个有5个图形缓冲区的指标中,不使用图形缓冲区,而是使用普通数组--通过图形缓冲区输出数据,就像我建议的那样,在优化过程中指标的速度会更快,因为为指标分配的内存会更少,因此用它工作的时间会更少?

如果进行了优化,每次都不改变指标设置,那么指标是否会被重新计算?

缓冲区是一个数组,只是方便显示数据。

在优化过程中,该指标每次都会被重新计算。

 
komposter:

缓冲区是一个数组,只是在显示数据时很方便。

我理解数组,但用于计算指标的数组可以小得多--通常是动态的。

例如,在1000条的历史中 -自定义指标 绘制了3条SMA - 5/8/10。

在标准情况下,我们将有一个近3000-10-8-5的图形缓冲区。

而如果我们用我的方法

为了计算SMA(5),我们需要一个大小为4条的数组(抱歉用了这个术语)。

为了计算SMA(8),我需要一个 大小为7条的数组(请原谅我的术语)

为了计算SMA(10),我们需要一个由9根 柱子组成的数组(抱歉用了这个术语)

和一个1000条的图表数组,结果是你需要1000+4+7+9,因为数组会直接覆盖它们。

我哪里错了?

 
-Aleks-:

谢谢大家提供的信息。

我想澄清一下,如果在一个有5个图形缓冲区的指标中,不使用图形缓冲区,而是使用普通数组--通过图形缓冲区输出数据,就像我建议的那样,在优化过程中指标的速度会更快,因为为指标分配的内存会更少,因此用它工作的时间会更少?

如果进行了优化,每次都不改变指标设置,那么指标是否会被重新计算?

更重要的是要明白,当你再次调用该指标时,它不会被重新加载到内存段(覆盖)。与之相比,其他一切都不算什么。
 
-Aleks-:

我理解数组,但用于计算指标的数组可以小得多--通常是动态的。

例如,在1000条的历史中 -自定义指标 绘制了3条SMA - 5/8/10。

在标准情况下,我们将有一个近3000-10-8-5的图形缓冲区。

而如果我们用我的方法

为了计算SMA(5),我们需要一个大小为4条的数组(抱歉用了这个术语)。

为了计算SMA(8),我需要一个 大小为7条的数组(请原谅我的术语)

为了计算SMA(10),我们需要一个由9根 柱子组成的数组(抱歉用了这个术语)

和一个1000条的图表数组,结果是你需要1000+4+7+9,因为数组会直接覆盖它们。

我哪里错了?

如果你需要在一个条上的值,你真的不需要一个缓冲区。指标也不是;)

如果你需要在每个条形上都有一个指标值,那么通常更经济的做法是计算所有数据,然后只额外计算新条形。
而且,并不是所有的算法都像SMA那样简单,它们根本不可能 "为5个柱子 "计算。至少看一看 "之 "字形。

最让我困惑的是,你没有尝试在实践中应用这些答案。似乎没有实际的任务,只有理论上的窍门。
那我就不明白为什么我参加了。

 

顺便说一下,MT4可以很好地应对只计算部分历史数据的情况,并且不消耗整个缓冲区的内存,如果循环经过最后1000个条形(即使有50000个条形 "在窗口")。

然而,我在MT5中遇到了这个问题 - 它为所有50000个条形图分配内存,即使只计算最后100个条形图。

 
komposter:

如果你需要在一个条上的值,你真的不需要一个缓冲区。指示器也没有;)

为什么是一个酒吧?我只是说,为了计算一个指标的价值,你很少需要知道它在整个时间历史中的所有指标。这就是为什么我写道,缓冲区(数组)将只用于计算,而3个MA的计算结果将被存储在一个图形缓冲区 中。

关于Zig-zag--这是我现在头疼的问题--它需要一些答案,但我要单独开一个主题。

康帕斯

最让我困惑的是,你没有尝试在实践中应用这些答案。感觉好像没有实际的任务,只有理论上的猜测。

那我就不明白我为什么要参加了。

问题是,我自己不是一个程序员--我的调查将帮助我起草需求说明。现在我正在开发一个指标,它将是EA引擎的一个组成部分--它有大量的缓冲区,所以我在考虑如何加快EA的速度,不是通过将指标整合到代码中,而是通过其他方法。

而且我还希望有人有兴趣在实践中尝试这样的算法--比较操作的速度 ...


康帕斯

顺便说一下,MT4完全可以只计算历史的一部分,不会占用整个缓冲区的内存,如果循环经过最后1000个柱子(即使在 "窗口 "中有50000个)。

然而,我在MT5中遇到了这个问题--它为所有50000个条形图分配了内存,即使我只计算最后100个条形图。

这是5的悲哀,难道开发商不解释一下这其中的神圣含义吗?