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

 

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

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

 
Sergey Efimenko:

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

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

给我一个代码例子,以充分理解这个问题。
 
Alexander Voronkov:
给我一个例子代码,以充分理解这个问题。

这个工作很好。

Buffer[i]=GetValue(i);
BufferMA=iMAOnArray(Buffer,0,PeriodMA,0,MethodMA,i);
BufferBMA[i]=iBandsOnArray(Buffer,0,PeriodBands,DevBands,0,MODE_MAIN,i)

这样做效果并不好。

Buffer[i]=GetValue(i);
BufferMA=iMAOnArray(Buffer,300,PeriodMA,0,MethodMA,i);
BufferBMA[i]=iBandsOnArray(Buffer,300,PeriodBands,DevBands,0,MODE_MAIN,i) 。

 
Sergey Efimenko:

这个工作很好。

Buffer[i]=GetValue(i)。
BufferMA=iMAOnArray(Buffer,0,PeriodMA,0,MethodMA,i)。
BufferBMA[i]=iBandsOnArray(Buffer,0,PeriodBands,DevBands,0,MODE_MAIN,i) 。

这在正常情况下是行不通的。

Buffer[i]=GetValue(i)。
BufferMA=iMAOnArray(Buffer,300,PeriodMA,0,MethodMA,i)。
BufferBMA[i]=iBandsOnArray(Buffer,300,PeriodBands,DevBands,0,MODE_MAIN,i) 。

为了节省时间,只计算最后300个(图表上的条形图) ,使用for()if() 操作符。
 
Alexander Voronkov:
为了节省时间,只计算最后300个(图表上的条形) ,使用for()if() 操作符的值。

我怎么能说得这么婉转呢?你知道你在说什么吗?你有没有在你的代码中使用过标题中提到的函数,并试图计算一个数组的一部分而不是整个数组?好吧,试试吧,也许你会 "直观地 "理解我们在说什么。你的提议在计算条形图或其他可以明确指定计数多少的情况下是有意义的,但对于 使用这些函数的数组来说 则没有意义。上面的代码部分是绝对相同的,唯一的区别是在第一种情况下,我计算的是整个数组,而在第二种情况下,我只计算其中的300个值,但这些值是在数组的末端计算的,而引用是用在开头。也许我没有把情况描述清楚,但如果你把代码附在一些指标上并比较结果,就会有助于看到这一点...

PS 关于 "自写 "版本的替代函数类似物是清楚的,但我想通过一种语言来获得所需的结果。

 
Sergey Efimenko:

我怎么能说得这么婉转呢?你知道你在说什么吗?你有没有在你的代码中使用过标题中提到的函数,并试图计算一个数组的一部分而不是整个数组?好吧,试试吧,也许你会 "直观地 "理解我们在说什么。你的提议在计算条形图或其他可以明确指定计数多少的情况下是有意义的,但对于 使用这些函数的数组来说 则没有意义。上面的代码部分是完全相同的,唯一的区别是在第一种情况下,我计算的是整个数组,而在第二种情况下,我只计算其中的300个值,但这些值是在数组的末端计算的,而引用是用在开头。也许我没有把情况描述清楚,但如果你把代码附在一些指标上并比较结果,就会有助于看到这一点...

PS 关于 "自写 "的替代函数类似物是清楚的,但我想通过一种语言来获得预期的结果。

只要告诉它是什么,就可以了。

所以我误解了你的意思。

 
难道没有人使用这些功能并面临这种情况吗?
 
Sergey Efimenko:

这个工作很好。

Buffer[i]=GetValue(i)。
BufferMA=iMAOnArray(Buffer,0,PeriodMA,0,MethodMA,i)。
BufferBMA[i]=iBandsOnArray(Buffer,0,PeriodBands,DevBands,0,MODE_MAIN,i) 。

这在正常情况下是行不通的。

Buffer[i]=GetValue(i)。
BufferMA=iMAOnArray(Buffer,300,PeriodMA,0,MethodMA,i)。
BufferBMA[i]=iBandsOnArray(Buffer,300,PeriodBands,DevBands,0,MODE_MAIN,i) 。

你期望的结果是什么,它应该如何正常工作?
 
Alexey Viktorov:
你期望的结果是什么,它应该如何正常工作?
你的意思是,我期待什么?我在上面写到,我需要最后(当前)的300个实际值,而不是最初(初始)的300个,此外,我在偏移量299-0处访问一个数组,但我得到的数据偏移量是从 "数组结束 "到 "数组结束-300 "的值(在我的例子中是从4999到4700),这意味着,在偏移量299的值应该在偏移量4999,同样,偏移量0的值,应该在偏移量4700。当减少数组计算的数量时,重要的不是得到最初的历史数据,而是得到当前的数据;问题是计算最古老的数值,而不计算当前的数值的目的是什么?
 
Sergey Efimenko:
你的意思是我期待什么?我写道,我需要300个最新(当前)的实际值,而不是300个第一(初始)值,此外,我在偏移量300-0处访问一个数组,但在 "数组末端 "到 "数组末端-300 "的偏移量处获得数据(在我的例子中是从4999到4700),即在偏移量300处有一个值,应该在偏移量4999,同样在偏移量0处有一个值,应该在偏移量4700。当减少数组计算的数量时,重要的是获得当前的数据而不是初始的历史数据,问题是在不计算当前值时,计算最古老的值有什么用?

ArraySetAsSeries()有帮助吗?

我曾经面对过这样的事情--赢不了,所以我放弃了。我没有用iMAOnArray()来做。

 
Artyom Trishkin:

ArraySetAsSeries()有帮助吗?

我曾经面对过这样的事情--赢不了,所以我放弃了。我没有用iMAOnArray()来做。

这就是问题所在--数组最初是一个 "串行 "缓冲区。问题在于限制计算的数量,正如我已经写过的,使用整个数组的计算时,数据是正常的,但在初始化时,终端会变慢,在使用不同时间段的几个指标时更难,更不用说为这样的指标优化EA 了;这个问题属于MT4的内部性质,即唯一的解决办法是使用我自己的指定函数的类似物,但我想避免它们

PS 我也使用了我自己的iMAOnArray的类似物,但将不仅仅是我拥有源代码。 虽然可以使用库和iBands也是必要的,但偏差的计算将不得不做。一般来说,标准函数的情况就是这样,这很可惜。