Bars i iBarShift — z MQL4 na MQL5
Bars przestało być zmienną i stało się funkcją z dwoma wariantami. iBarShift istnieje, ale ma jeden argument więcej i to on decyduje o zachowaniu przy luce.
4 fragmenty kodu z tej strony przeszły przez kompilator MetaEditor build 6090, 2026-08-05.
Bars
W MQL4 Bars była zmienną globalną — liczbą świec na bieżącym wykresie. W MQL5 to funkcja i ma dwa warianty.
int ile = Bars;//--- wszystkie dostępne świece danego instrumentu i okresu
int ile = Bars(_Symbol, _Period);
//--- świece z zadanego przedziału czasu
int ostatniTydzien = Bars(_Symbol, _Period,
TimeCurrent() - 7 * 24 * 3600, TimeCurrent());Wewnątrz wskaźnika nie wywołuj Bars w ogóle — liczbę świec dostajesz jako argument rates_total funkcji OnCalculate.
iBarShift
Ta funkcja istnieje w obu językach i robi to samo: zamienia czas na numer świecy. Różni się czwartym argumentem.
datetime kiedy = D'2026.03.12 10:00';
int numer = iBarShift(_Symbol, _Period, kiedy); // exact = false
int dokladny = iBarShift(_Symbol, _Period, kiedy, true); // exact = trueexact | Gdy świeca o tym czasie istnieje | Gdy jej nie ma (luka, weekend) |
|---|---|---|
false (domyślnie) | numer tej świecy | numer najbliższej wcześniejszej |
true | numer tej świecy | -1 |
Domyślne false jest wygodne, ale cicho zwraca sąsiada. Jeśli piszesz kod, który sprawdza „co się działo dokładnie o 10:00", i o 10:00 nie było notowań, dostaniesz świecę z 9:45 i nikt cię o tym nie poinformuje. Przy analizie reakcji na publikacje danych to jest różnica między wynikiem a artefaktem.
int numer = iBarShift(_Symbol, _Period, kiedy, true);
if(numer < 0)
{
Print("O tej godzinie nie było notowań.");
return;
}
double zamkniecie = iClose(_Symbol, _Period, numer);Kierunek numeracji
iBarShift zwraca numer w konwencji szeregu czasowego: zero to świeca bieżąca, liczby rosną w przeszłość. Ta sama konwencja co w iClose i iTime. We wskaźniku, gdzie tablice domyślnie idą w drugą stronę, trzeba to przeliczyć:
int indeks = rates_total - 1 - numer;