如何在 MQL4 中将项目添加到数组?

问题描述 投票:0回答:2

我正在尝试在 MQL4 中创建一个数组,并且在每个价格变动时我都想向 array[0] 添加一个新值并将其余项目推回原处,因此旧的 array[0] 变为 array[1] 并且array[1] 变为 array[2] 等等。我希望能够无限次地执行此操作,每个刻度一次。然后我可以使用 array[1] 访问前一个刻度的值,但我也可以访问其当前值 array[0]。谢谢!

arrays mql4
2个回答
1
投票

MQL4 中可以有一个基元数组,这里的问题是您必须在每次报价时都复制它们,这会浪费时间和资源。如果您想保存一些更高级的数据(比如说

MqlTick
),您必须将其存储为结构体或创建一个类并保存类。复制所有对象应该是毫无意义的,这就是为什么你应该考虑应用
CList
CArrayObj
并将对象添加到末尾。简单的魔法将有助于调用索引为 0 的元素:

#include <Arrays\ArrayObj.mqh>
class CTick : public CObject{
   public: double m_bid, m_ask;
   CTick(const double bid,const double ask):m_bid(bid),m_ask(ask){}
};
CArrayObj *listOfTicks;
CTick *getTickByShift(const int shift=0)
   {
    return listOfTicks.At(listOfTicks.Total()-1-shift));
   }
int OnInit(){
    listOfTicks=new CArrayObj();
    return(1);
}
void OnTick(){
   listOfTicks.Add(new CTick(Bid,Ask));
   //example of accessing ticks 0 and 3, keep in mind you do not have 3 at start!
   double bid0=getTickByShift(0).m_bid;
   double ask3=getTickByShift(3).m_ask;
}
void OnDeinit(const int reason){delete listOfTicks;}

如果您确实需要无限数量的操作 - 可能 2^31-1 对您来说就足够了,为了加快速度,您可能会想到

listOfTicks.Step(1000);
有 1000 个空槽并且不调整大小(=将所有槽复制到新位置)每个刻度的数组。


0
投票

我做了这个本机解决方案(不需要库),您只需全局声明数组,然后每当您想要推送新值时调用该函数。

double Array[] = {};
int MaxArraySize = 100;

void PushElement(double value){

   double tempArray[];
   int count = ArraySize(Array); if(count > MaxArraySize){count = MaxArraySize;}
   ArrayCopy(tempArray, Array, 1, 0, count);    
   tempArray[0] = value;        
   ArrayCopy(Array, tempArray, 0, 0, WHOLE_ARRAY);      

} 

确保将变量 MaxArraySize 设置为所需的数组限制。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.