我正在尝试在 MQL4 中创建一个数组,并且在每个价格变动时我都想向 array[0] 添加一个新值并将其余项目推回原处,因此旧的 array[0] 变为 array[1] 并且array[1] 变为 array[2] 等等。我希望能够无限次地执行此操作,每个刻度一次。然后我可以使用 array[1] 访问前一个刻度的值,但我也可以访问其当前值 array[0]。谢谢!
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 个空槽并且不调整大小(=将所有槽复制到新位置)每个刻度的数组。
我做了这个本机解决方案(不需要库),您只需全局声明数组,然后每当您想要推送新值时调用该函数。
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 设置为所需的数组限制。