1

基于每秒滴答数( ticksLastSecond),我现在想计算最后一分钟每秒的平均滴答声。为此,我需要一个大小为 60 的滚动数组,我假设每秒钟将数组元素向前推最新ticksLastSecond值(最好在数组的开头(0))和最旧的值。这怎么可能实现?

提前谢谢了!

4

2 回答 2

1

您可以使用数组,请记住以下几点:如果您需要 60 (x) 值的平均值,则您的数组的大小可能为 60(这是非常不切实际的:您需要每秒将元素 1 到 59 复制到 0 到 58 ) 或 120(每分钟复印一次)更多。所以,我认为120是首选,更多是没有必要的。

input int size = 60;
int array[];
ArraySize(array,2*size);
int cursor=0; //- shows position of the last element

void add(const int element){
   if(cursor>=2*size-1)resize();
   array[cursor++]=element;
}
void resize(){
   ArrayCopy(array,array,0,size);
   cursor=size;
}
//for array average: iMAOnArray() or manually:
double getAvg(){
   if(cursor+1<size)return 0;
   double sum=0;
   for(int i=0;i<size;i++){
      sum+=array[cursor-1-i];
   }
   return(sum/cursor);
}

也可以保留计算的平均值,然后最后加,先减——这将加快速度,考虑回测的情况。这一切都可能更好地放在一个结构中。

相同但更容易使用CArrayIntor CArrayObj- 在这种情况下,您不必担心大小、使用方法Add()DeleteRange(0,size-1), for 循环: Total() andAt(i);

另一种方法是在 mql5 中使用链表,可以轻松访问第一个和最后一个元素。它已经实现了,所以CLinkedList<T> : public ICollection 在这里试试

于 2018-02-04T13:43:43.697 回答
0

我认为使用列表更有效。

MQL5 提供了一系列处理列表的机制。例如,我要做的是声明一个 CList 并为具有必要属性的列表项创建一个类。在你的情况下,滴答声的时间。

#include <Arrays\List.mqh>
#include <Object.mqh>

int storedItems = 60;
CList *listTicks = new CList;

class listItem : public CObject {
    public:
        listItem(double n){value=n;};
        double getValue(){return value;};
    private:
        double value;
};

然后,在OnTick函数中,我会检查列表是否已满以删除头项。最后,我将在列表末尾插入新项目:

if(listTicks.Total() == storedTicks)
    listTicks.Delete(0);
listTicks.Add(new listItem(tick_time));

列表不会在数组中复制、删除、插入...项,而是仅修改指向上一项和下一项的指针。所以它的计算效率要高得多。

于 2019-06-30T20:00:04.900 回答