Przejdź do treści
MQL5 · MetaTrader 5 · po polsku
kod odczarowany

MQL5 / Z MQL4 na MQL5

Close[], High[], Time[] — z MQL4 na MQL5

Tablice Close, Open, High, Low i Time zniknęły. Zastąpiły je funkcje iClose oraz kopiowanie do własnej tablicy przez CopyRates.

3 fragmenty kodu z tej strony przeszły przez kompilator MetaEditor build 6090, 2026-08-05.

Stara postać

MQL4
double zamkniecie = Close[1];
double maksimum   = High[0];
datetime kiedy    = Time[1];

Tablice były zawsze dostępne, bez deklarowania czegokolwiek. W MQL5 ich nie ma i to jest jeden z pierwszych błędów kompilacji przy przepisywaniu kodu: 'Close' - undeclared identifier.

Nowa postać: pojedyncza wartość

Najprostszy odpowiednik to funkcje z rodziny iClose:

Odczyt pojedynczych wartości
double zamkniecie = iClose(_Symbol, _Period, 1);
double maksimum   = iHigh(_Symbol, _Period, 0);
datetime kiedy    = iTime(_Symbol, _Period, 1);

Sygnatura jest zawsze taka sama: symbol, okres, numer świecy. Zero to świeca w budowie, jedynka ostatnia domknięta.

MQL4MQL5
Close[i]iClose(_Symbol, _Period, i)
Open[i]iOpen(_Symbol, _Period, i)
High[i]iHigh(_Symbol, _Period, i)
Low[i]iLow(_Symbol, _Period, i)
Time[i]iTime(_Symbol, _Period, i)
Volume[i]iVolume(_Symbol, _Period, i)
BarsBars(_Symbol, _Period)

Nowa postać: wiele wartości naraz

Wywoływanie iClose w pętli po stu świecach jest wolne — każde wywołanie odpytuje terminal osobno. Gdy potrzebujesz wielu wartości, kopiuj je hurtem:

Sto ostatnich świec do własnej tablicy
MqlRates swiece[];
ArraySetAsSeries(swiece, true);

int skopiowane = CopyRates(_Symbol, _Period, 0, 100, swiece);
if(skopiowane < 100)
  {
   PrintFormat("Skopiowano tylko %d świec, błąd %d", skopiowane, GetLastError());
   return;
  }

double zamkniecie = swiece[1].close;
double maksimum   = swiece[1].high;
datetime kiedy    = swiece[1].time;

Struktura MqlRates zawiera komplet: time, open, high, low, close, tick_volume, spread, real_volume. Jedno wywołanie zamiast sześciu tablic.

We wskaźnikach jest inaczej

Wskaźnik dostaje dane jako argumenty OnCalculate i tam żadne kopiowanie nie jest potrzebne:

Nagłówek OnCalculate z gotowymi tablicami
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   //--- tablice są gotowe, ale domyślnie nie są szeregami
   ArraySetAsSeries(close, true);

   return(rates_total);
  }

Te tablice są najbliższym odpowiednikiem starych Close[] i High[] — z zastrzeżeniem, że kierunek indeksowania trzeba ustawić samemu.

Powiązane