首页 > 解决方案 > 如何在 MQL4 中将项目添加到数组中?

问题描述

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

标签: arraysmql4

解决方案


在 MQL4 中可以有一组原语,这里的问题是您必须在每个报价时都复制它们,这是浪费时间和资源。如果您想保存一些更高级的数据(比如说MqlTick),您必须将其存储为结构或创建一个类并保存类。复制所有对象应该是没有意义的,这就是为什么您应该考虑在末尾应用CListCArrayObj添加对象。简单的魔法将有助于调用索引为 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_bid;
}
void OnDeinit(const int reason){delete listOfTicks;}

如果您确实需要无限数量的操作 - 可能 2^31-1 对您来说就足够了,为了加快速度,您可能会想到listOfTicks.Step(1000);有 1000 个空槽并且不要在每个滴答声中调整数组的大小(=全部复制到新位置) .


推荐阅读