Как добавить элемент в массив в MQL4? - PullRequest
0 голосов
/ 12 ноября 2018

Я пытаюсь создать массив в MQL4, и на каждом тике я хочу добавить новое значение в массив [0] и отодвинуть остальные элементы обратно, чтобы старый массив [0] стал массивом [1].] и массив [1] становится массивом [2] и так далее.Я хочу иметь возможность делать это неограниченное количество раз, один раз за тик.Затем я могу получить доступ к значению предыдущего тика, используя array [1], но я также могу получить доступ к его массиву текущих значений [0].Спасибо!

1 Ответ

0 голосов
/ 12 ноября 2018

Возможно иметь массив примитивов в 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_bid;
}
void OnDeinit(const int reason){delete listOfTicks;}

Если вам нужно действительно неограниченное количество операций - вероятно, вам будет достаточно 2 ^ 31-1, для ускорения вы можете подумать о listOfTicks.Step(1000); иметь 1000 пустых слотов и не изменять размер (= копировать все в новое место) массив каждый тик.

...