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.
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.
| Flaga | Znaczenie |
|---|---|
TICK_FLAG_BID | zmieniła się cena kupna |
TICK_FLAG_ASK | zmieniła się cena sprzedaży |
TICK_FLAG_LAST | zmieniła się cena ostatniej transakcji |
TICK_FLAG_VOLUME | zmienił się wolumen |
TICK_FLAG_BUY | tick pochodzi z transakcji kupna |
TICK_FLAG_SELL | tick 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.
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.
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ć.