Cykl życia bota w MT5: OnInit, OnTick, OnTimer, OnDeinit
W skrócie: bot w MT5 nie ma własnej pętli. Terminal sam wywołuje jego funkcje: raz przy starcie, potem przy zdarzeniach (tik, timer, transakcja), na końcu przy zdjęciu. Najwięcej kłopotów robią dwie rzeczy: bot wczytuje się od nowa częściej, niż się spodziewasz, a tiki mogą się gubić, gdy poprzednie wywołanie jeszcze trwa.
Start: OnInit
Po wrzuceniu bota na wykres terminal woła OnInit. Tu bot wczytuje ustawienia, tworzy uchwyty wskaźników, sprawdza
symbol i odtwarza stan. Jeśli zwróci błąd inicjalizacji, bot się nie uruchamia i w zakładce Experts widać powód.
Dlatego w OnInit sprawdzam wszystko, co może pójść źle: czy symbol ma historię, czy dane wejściowe mają sens,
czy konto pozwala na handel. Bot, który ruszył z błędnym inputem, robi więcej szkody niż bot, który się nie uruchomił.
Praca: OnTick, OnTimer i reszta
OnTick wywoływany jest przy nowym tiku symbolu wykresu. Funkcja działa w jednym wątku: dopóki się nie zakończy,
kolejne tiki tego bota nie wywołują nowego przebiegu. Przy ciężkich obliczeniach część tików przepada. Dla bota
na świecy to zwykle bez znaczenia, dla zarządzania pozycją (BE, trailing) już tak. Dlatego ciężką logikę robię raz
na nową świecę, a w tiku tylko tanie sprawdzenia (opis: nowa świeca w EA).
Gdy rynek stoi (weekend, przerwa dobowa), tików nie ma i OnTick milczy. Jeśli bot ma coś robić niezależnie od
tików, na przykład zamknąć pozycję o 22:45 albo sprawdzić stan co minutę, używa OnTimer, uruchamianego
przez ustawienie timera w OnInit. Timer działa też bez ruchu ceny. Do tego dochodzi OnTradeTransaction,
wołany przy zdarzeniach handlowych (zlecenie, deal), którego używam do aktualizacji stanu po zamknięciu pozycji.
Koniec: OnDeinit i powód zdjęcia
OnDeinit dostaje kod powodu. Najczęstsze: bot zdjęty z wykresu, wykres zamknięty, terminal zamknięty, zmiana
symbolu lub interwału, zmiana parametrów, ponowna kompilacja, zmiana konta. Tu zwalniam uchwyty wskaźników, usuwam
obiekty z wykresu i zapisuję stan, który ma przeżyć.
Pułapka: zmiana interwału wykresu albo parametrów to nie “przełączenie”, tylko pełne zdjęcie bota i założenie od
nowa, czyli OnDeinit, potem OnInit. Wszystko, co trzymałem w zmiennych bota, znika. Jeżeli licznik strat z dnia
albo flaga “blokada do końca dnia” żyje tylko w pamięci, po kliknięciu innego interwału bot o niej nie wie.
Stan, który musi przetrwać, trzymam poza zmiennymi bota: w zmiennych globalnych terminala, w pliku albo odtwarzam
z historii transakcji. Tak samo przy restarcie terminala (opis i skutki awarii zasilania:
zmienne globalne gasną przy utracie zasilania).
Czego bot nie powinien robić
Nie usuwam bota samego z siebie funkcją usunięcia eksperta. Gdy warunki handlu są złe (limit dzienny, drawdown), bot dalej działa, tylko blokuje nowe wejścia i pozostaje gotowy do zarządzania otwartą pozycją. Zdjęty bot nie zamknie nic, a ktoś na telefonie może nie zauważyć, że pozycja została bez opieki. Różnicę opisuję w artykule wyłączenie bota kontra blokada handlu.
Checklista
- Czy
OnInitsprawdza symbol, historię i sensowność inputów i kończy się błędem, gdy coś jest nie tak? - Czy ciężkie obliczenia są raz na świecę, a nie w każdym tiku?
- Czy rzeczy czasowe (zamknięcie o ustalonej godzinie) mają timer, a nie liczą na tik?
- Czy stan, który ma przeżyć zmianę interwału i restart, leży poza zmiennymi bota?
- Czy
OnDeinitzwalnia uchwyty wskaźników i obiekty z wykresu? - Czy bot blokuje handel, zamiast się sam usuwać?
Powiązane
- Bot nie otwiera pozycji: 15 najczęstszych przyczyn
- Różnice Tester kontra live w kodzie bota
- Aktualizacja bota bez utraty ustawień
- Pojęcia: słowniczek, skorowidz
Źródła
- Dokumentacja MQL5, “Event Handling Functions” i “Reasons for deinitialization”, docs.mql5.com (sprawdzone 15.11.2026).
Ostrzeżenie: artykuł ma charakter edukacyjny i nie jest poradą inwestycyjną. Wyniki z przeszłości nie gwarantują przyszłych. Handel na rynkach finansowych wiąże się z ryzykiem utraty kapitału.