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

MQL5 / Z MQL4 na MQL5

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.

MQL4
int ile = Bars;
Dwa warianty w MQL5
//--- 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.

Numer świecy zawierającej podany moment
datetime kiedy = D'2026.03.12 10:00';

int numer = iBarShift(_Symbol, _Period, kiedy);          // exact = false
int dokladny = iBarShift(_Symbol, _Period, kiedy, true);  // exact = true
exactGdy świeca o tym czasie istniejeGdy jej nie ma (luka, weekend)
false (domyślnie)numer tej świecynumer najbliższej wcześniejszej
truenumer 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.

Świadome sprawdzenie, czy świeca istnieje
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ć:

Przeliczenie na indeks tablicy wskaźnika
int indeks = rates_total - 1 - numer;

Powiązane