滚动(静态)数组?

时间:2018-02-04 12:30:12

标签: mql5

根据ticks per secondticksLastSecond),我现在想计算最后一分钟每秒的平均值刻度。为此,我需要一个 滚动 数组,其中size = 60我假设,每秒将数组元素向前推送最新的ticksLastSecond值(最好是在数组的开头(0)和最老的一个。怎么能实现这一目标?

非常感谢提前!

2 个答案:

答案 0 :(得分: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);
}

也可以保持平均值的计算值,然后加上最后一个,先减去 - 这将加速甚至更多,想想回溯测试的情况。 这可能会更好地放入一个结构。

同样但更容易使用CArrayIntCArrayObj - 在这种情况下,您不必担心大小,请使用方法Add()DeleteRange(0,size-1)进行循环: Total() and在(ⅰ);

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

答案 1 :(得分: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));

列表不是在数组中复制,删除,插入...项,而是仅修改指向上一项和下一项的指针。因此,它的计算效率更高。