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

MQL5 / Funkcje

CopyTicks

Kopiuje ticki do tablicy. Pierwsze wywołanie zwykle zawodzi, a połowa ticków nie zmienia ceny — o obu rzeczach trzeba wiedzieć zawczasu.

int CopyTicks(string symbol, MqlTick &ticks[], uint flagi = COPY_TICKS_ALL, ulong od_ms = 0, uint ile = 0);

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

Co zwraca

Liczbę skopiowanych ticków albo -1 przy błędzie. Ticki trafiają do tablicy struktur MqlTick, uporządkowanej od najstarszego do najnowszego.

To jedyny sposób, żeby zobaczyć, co działo się z ceną wewnątrz świecy — w miejscu, gdzie zwykła historia świec ma tylko cztery liczby.

Pierwsze wywołanie prawie zawsze zawodzi

Ticki nie są trzymane w terminalu na stałe. Pierwsze odwołanie do nich uruchamia synchronizację z serwerem i wraca, zanim dane dojdą. To nie jest błąd do obejścia pętlą — to normalny stan, który trzeba obsłużyć tak samo jak przy wskaźnikach.

Prawidłowa reakcja na brak danych
MqlTick ticks[];

int skopiowane = CopyTicks(_Symbol, ticks, COPY_TICKS_ALL, 0, 100);

if(skopiowane <= 0)
  {
   PrintFormat("Ticki jeszcze niedostepne, blad %d - sprobuje przy kolejnym ticku",
               GetLastError());
   ResetLastError();
   return;
  }

Flagi mówią, co się właściwie zmieniło

To jest część najczęściej pomijana, a decydująca o poprawności analizy. Tick nie zawsze oznacza zmianę ceny. Pole flags mówi, które wartości przyszły w tym konkretnym ticku.

FlagaZnaczenie
TICK_FLAG_BIDzmieniła się cena kupna
TICK_FLAG_ASKzmieniła się cena sprzedaży
TICK_FLAG_LASTzmieniła się cena ostatniej transakcji
TICK_FLAG_VOLUMEzmienił się wolumen
TICK_FLAG_BUYtick pochodzi z transakcji kupna
TICK_FLAG_SELLtick pochodzi z transakcji sprzedaży

Tick bez flagi BID ma pole bid wypełnione poprzednią wartością. Liczenie zmienności przez zliczanie ticków bez sprawdzania flag daje wynik zawyżony o wszystkie te, w których cena stała w miejscu.

Liczymy tylko rzeczywiste zmiany ceny kupna
int zmianCeny = 0;

for(int i = 0; i < skopiowane; i++)
   if((ticks[i].flags & TICK_FLAG_BID) == TICK_FLAG_BID)
      zmianCeny++;

PrintFormat("ticki: %d, w tym zmian ceny kupna: %d", skopiowane, zmianCeny);

Zakres czasu zamiast liczby

Gdy interesuje cię konkretny przedział — na przykład minuta wokół publikacji danych — właściwa jest CopyTicksRange, która przyjmuje początek i koniec w milisekundach.

Ticki z jednej minuty
datetime poczatek = D'2026.07.31 14:30';

MqlTick ticks[];
int skopiowane = CopyTicksRange(_Symbol, ticks, COPY_TICKS_ALL,
                                (ulong)poczatek * 1000,
                                (ulong)(poczatek + 60) * 1000);

for(int i = 0; i < skopiowane; i++)
   PrintFormat("%s.%03d  bid %.5f  ask %.5f",
               TimeToString(ticks[i].time, TIME_SECONDS),
               (int)(ticks[i].time_msc % 1000),
               ticks[i].bid, ticks[i].ask);

Znacznik time ma dokładność sekundy, time_msc — milisekundy. W spokojnym rynku różnica jest bez znaczenia, przy publikacji danych w jednej sekundzie mieści się kilkadziesiąt ticków i tylko time_msc pozwala je uszeregować.

Ile historii jest dostępne

Zależy od brokera i zwykle jest znacznie krótsza niż historia świec. Ticki starsze niż kilka miesięcy bywają niedostępne, a przy instrumentach spoza głównej oferty — nieobecne w ogóle. Kod zakładający, że ticki są zawsze, zawiedzie na pierwszym egzotycznym symbolu.

Nie proś też o wszystko naraz. Wywołanie bez podanej liczby przy aktywnym instrumencie potrafi wciągnąć ogromną tablicę i zająć pamięć, której nie zamierzałeś oddać.

Powiązane