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

 
Alexey Viktorov:

不,弗拉基米尔。这有点不对。

在这种情况下,你应该将ArraySetAsSeries(array, false);应用于一个有三百个元素的数组,其中iMAOnArray()被认为是。但我们最好使用CopyOpen() 而不是数组的填充循环。

根据我的理解,在这个变体中,最好是将

任务设置的方式,我就是这样演示的。结果非常好。而且进一步说,你可以自己动手 :)
 
Alexey Viktorov:

不,弗拉基米尔。这有点不对。

在这种情况下,你应该将ArraySetAsSeries(array, false);应用于一个有三百个元素的数组,其中iMAOnArray()被认为是。但我们最好使用CopyOpen() 而不是数组的填充循环。

根据我的理解,在这个变体中,最好是将

所以给我看一下代码的 "工作 "变体,原始的源代码在这里,你试图把它削减到12个元素,而不是要求的300个元素,最终应该产生3个指标缓冲区,用指定的数据在地下室中显示至少300个元素。然后,当一个新的条形图到来时,分别是301和然后的值,但不要忘记,在这种情况下,如果你用0作为计算的限制,只有新的条形图会被重新计算,第二个缓冲区的平均数(平滑)类型不一定是SMA,可以是4种可用的任何一种。
 
Sergey Efimenko:

这就是问题所在。如果我不需要计算整个数组,而只需要计算最后N个元素。

我不太理解限制时计算这些函数的逻辑。我有一个时间序列数组(指标缓冲区之一),如果我让元素的数量等于0,没有问题,所有的东西都被计算出来了,但是如果我以相同的偏移量减少参与计算的元素的数量,我只能得到主要的。简单地说,有一个5000个元素的数组(图表上的条形图),为了节省时间,我需要只计算最后的300个,但当我在第二个参数中指定了300的值时,我得到了主要的5000-4700个元素,但在偏移量300-0上,进一步的数值在调用时不会改变。 使用这个参数的意义何在?

鬼知道。忘掉它吧。如果你需要加快计算速度,请减少循环中计算的项目数量。

if(prev_calculated==0)limit=300; else ...; 

两种情况之一:要么不可能,要么你需要一些秘密的时间序列组合,而不是时间序列,计算方向。

 
Dmitry Fedoseev:

他妈的知道。忘了它吧。如果你想加快计算速度,请减少循环中要计算的元素数量。

两种情况之一:要么不可能,要么你需要一些秘密的时间序列组合,而不是时间序列,计算方向。

是的,正如我之前已经写过的,只有一种可能--使用你自己的上述函数的类似物,它可以用来计算至少一个元素。

矛盾的情况是,如果我们做一个类似的模板,在任何指标(价格线)上叠加平均线或布林线,不会有这样的减缓所有历史条的初始计算,就像在代码中使用这些函数时,重新启动终端或切换TF时,所以不清楚,在这些函数中需要这么长时间的计算。

 
Dmitry Fedoseev:

他妈的知道。忘了它吧。如果你想加快计算速度,请减少循环中要计算的元素数量。

两种情况之一:要么不可能,要么你需要一些秘密的时间序列组合,而不是时间序列,计算方向。

我也用了这样的结构。

if (limit > 300)limit=300;

顺便说一下,"MovingAverages.mqh "的速度"iMAOnArray "两倍,即使是旧版本

https://www.mql5.com/ru/forum/79988

Использование MovingAverages.mqh в MQL4
Использование MovingAverages.mqh в MQL4
  • www.mql5.com
При вызове в советнике индикатор работает корректно, но если его поместить в тело условного оператора "if", то советник не открывает сделок, хотя логика советника остается та же.
 
Sergey Efimenko:

是的,正如我之前写的那样,只有一个选择--使用我们自己的上述函数的类似物,其中至少有一个元素是可以计算的。

矛盾的是,如果我们通过将MA和布林带附加到任何指标(价格线)来做一个类似的模板,我们不会看到所有历史条的初始计算速度如此缓慢,就像在代码中使用这些函数时,重新启动终端或切换TF时一样,所以不清楚在这些函数中需要这么长时间来计算。

使用iMAOnArray时 也会变慢吗?不应该有这样的事情。就像你一样,StdOnArray(或BandsOnArray,我不记得了)出现了滞后,开发者在很长一段时间内都没有承认这个错误的存在。然后突然间,它被修复了,而且工作得很快。谁知道呢,也许这个错误又回来了。如果iMAOnArray()也会导致明显的减速,那就是一个错误。似乎几个月前就有过这样的讨论......但显然,它仍然在那里。

 
Dmitry Fedoseev:

使用iMAOnArray 的速度也会变慢?它不应该是这样的。就像你曾经的情况一样,StdOnArray的速度变慢了,开发人员在很长一段时间内都没有承认这个错误。然后他们突然修复了它,而且工作得很快。谁知道呢,也许这个错误又回来了。如果iMAOnArray()也会导致明显的减速,那就是一个错误。似乎几个月前就有关于这个问题的讨论......。但显然,它仍然在那里。

很难判断它是否 "减慢了很多 "或可以接受,因为一切都取决于图表长度(条数),问题是为了优化,我们只需要计算一点,但限制计算长度事实上是不可能的。
 
Sergey Efimenko:
很难判断是否太慢,因为这完全取决于图表的长度(条数),问题是对于优化,你只需要计算一点点,你不能通过实际计算来限制计算的长度。
MovingAverages.mqh 上做计算,非常快
 
forexman77:
MovingAverages.mqh 做计算,它的计算速度会非常快
如果你不对所有数组进行计算,而只对其最后一部分(当前值)进行计算,那么这个库的计算是正确的?此外,这只是问题的一半,但iBandsOnArray呢?
 
Sergey Efimenko:
所以给我看一下代码的 "工作 "变体,原始代码在这里,你试图削减到12个显示元素,而不是我要求的300个,最终应该有3个指标缓冲区的指定数据,这样至少有300个元素被显示在地下室。然后,当一个新的条形图到来时,分别是301和然后的值,但不要忘记,在这种情况下,如果你用0作为计算的限制,只有新的条形图会被重新计算,第二个缓冲区的平均数(平滑)的类型不一定是SMA,可以是4个可用的任何一个。

给你。

//+------------------------------------------------------------------+
//|                                         Test300AsSeriesFalse.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 3
#property  indicator_color1 clrYellow
#property  indicator_color2 clrGreen
#property  indicator_color3 clrRed
double Buffer[];
double BufferMA[];
double BufferBMA[];
bool firstrun=true;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   firstrun=true;
   SetIndexBuffer(0,Buffer,INDICATOR_DATA);
   SetIndexBuffer(1,BufferMA,INDICATOR_DATA);
   SetIndexBuffer(2,BufferBMA,INDICATOR_DATA);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
   int i, limit;
   limit = rates_total-prev_calculated-1;
   double buffer[];

   for(i = limit; i >= 0; i--)
     {
      Buffer[i]=open[i];
       ArrayCopy(buffer, Buffer, 0, i, 12);
      BufferMA[i] = iMAOnArray(buffer, 300, 12, 0, MODE_SMA, 0);
      BufferBMA[i] = iBandsOnArray(buffer, 300, 12, 2.0, 0, MODE_UPPER, 0);
      int x=0;
     }
   return(rates_total);
}
//+------------------------------------------------------------------+