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

MQL5 / Kurs / Lekcja 3 z 7

Cykl życia eksperta

Co dokładnie dzieje się między podpięciem eksperta pod wykres a jego zdjęciem, i dlaczego zmienne globalne przeżywają zmianę parametrów.

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

Ekspert nie jest programem, który biegnie od góry do dołu. Jest zbiorem funkcji obsługi zdarzeń, które terminal wywołuje wtedy, kiedy uzna za stosowne. Twoje zadanie sprowadza się do napisania, co ma się stać przy każdym z tych zdarzeń.

Cykl życia eksperta w MQL5Kolejność wywołań funkcji zdarzeniowych od podpięcia eksperta pod wykres do jego zdjęcia, z pętlą OnTick i powrotem po zmianie parametrów.Podpięcie pod wykresterminal ładuje program i ustawiaparametry wejścioweOnInit()raz: uchwyty wskaźników, kontrolaparametrów i pozwoleńINIT_FAILED zdejmuje eksperta zwykresu,INIT_PARAMETERS_INCORRECTotwiera okno parametrówgdy zwrócono INIT_SUCCEEDEDOnTick()przy każdej zmianie ceny symboluwykresutick, który przyjdzie w trakciewykonywania poprzedniego,zostaje pominiętyzdjęcie, zmiana parametrów, rekompilacjaOnDeinit(powod)zwolnienie uchwytów i usunięcieobiektów z wykresukolejny tickpo zmianieparametrówOnTimer, OnTradeTransaction i OnChartEvent przychodzą niezależnie od tej pętli, między wywołaniamiOnTick.

Trzy funkcje, od których się zaczyna

Szkielet eksperta
int OnInit()
  {
   //--- jednorazowe przygotowanie: uchwyty wskaźników, kontrola parametrów
   return INIT_SUCCEEDED;
  }

void OnTick()
  {
   //--- wywoływana przy każdej zmianie ceny symbolu wykresu
  }

void OnDeinit(const int powod)
  {
   //--- sprzątanie: zwolnienie uchwytów, usunięcie obiektów z wykresu
  }

OnInit wykonuje się raz — po podpięciu eksperta pod wykres, po zmianie parametrów, po zmianie symbolu lub okresu wykresu i po ponownym uruchomieniu terminala. Jej wartość zwrotna ma znaczenie:

ZwracaneSkutek
INIT_SUCCEEDEDekspert startuje normalnie
INIT_FAILEDekspert zostaje zdjęty z wykresu
INIT_PARAMETERS_INCORRECTterminal pokazuje okno parametrów z komunikatem

INIT_PARAMETERS_INCORRECT jest niedoceniane. Jeśli ktoś wpisze okres średniej równy zero, lepiej pokazać mu okno z parametrami niż w ciszy liczyć bzdury.

Kontrola parametrów przy starcie
input int OkresSredniej = 20;

int OnInit()
  {
   if(OkresSredniej < 2)
     {
      Print("Okres średniej musi wynosić co najmniej 2.");
      return INIT_PARAMETERS_INCORRECT;
     }
   return INIT_SUCCEEDED;
  }

OnTick nie znaczy „co sekundę"

OnTick wywołuje się przy zmianie ceny symbolu, na którego wykresie stoi ekspert. W nocy na egzotycznej parze może to być raz na minutę, przy publikacji danych — kilkadziesiąt razy na sekundę. Nie ma tu żadnego stałego rytmu.

Trzy konsekwencje:

  • Kod w OnTick musi być szybki. Kolejny tick, który przyjdzie w trakcie wykonywania poprzedniego, zostanie pominięty — nie kolejkuje się.
  • Nie licz czasu przez zliczanie ticków.
  • Jeśli decyzja ma zapadać raz na świecę, musisz to jawnie wymusić. Jak — w następnej lekcji.

Kiedy potrzebujesz działania niezależnego od napływu cen, użyj czasomierza:

Zdarzenie co 60 sekund
int OnInit()
  {
   EventSetTimer(60);
   return INIT_SUCCEEDED;
  }

void OnTimer()
  {
   //--- wykonuje się co minutę, także wtedy gdy rynek stoi
  }

void OnDeinit(const int powod)
  {
   EventKillTimer();
  }

Co przeżywa, a co ginie

Zmienne globalne i zmienne static zachowują wartość między kolejnymi wywołaniami OnTick. Nie zachowują jej między kolejnymi uruchomieniami eksperta — a zmiana parametru w oknie ustawień jest właśnie takim ponownym uruchomieniem.

Argument powod w OnDeinit mówi, co się właściwie stało: REASON_PARAMETERS (zmiana parametrów), REASON_CHARTCHANGE (zmiana symbolu lub okresu), REASON_REMOVE (zdjęcie z wykresu), REASON_RECOMPILE. Przy REASON_PARAMETERS zwykle nie chcesz kasować obiektów z wykresu, bo za chwilę i tak je odtworzysz.

Kolejność przy starcie

  1. Terminal ładuje program i ustawia parametry wejściowe.
  2. Wywołuje OnInit.
  3. Jeśli OnInit zwróciło INIT_SUCCEEDED, ekspert czeka na zdarzenia.
  4. Przy każdej zmianie ceny — OnTick. Przy zdarzeniach handlowych — OnTrade i OnTradeTransaction. Przy działaniu myszy lub klawiatury na wykresie — OnChartEvent.
  5. Na koniec OnDeinit.

Pierwszy OnTick przychodzi dopiero wtedy, gdy zmieni się cena. Jeśli podepniesz eksperta w weekend, nie wykona się ani razu — i to nie jest błąd w kodzie.

Zadanie

Napisz eksperta, który w OnInit wypisze nazwę symbolu i okres wykresu, w OnTick policzy ticki i co setny wypisze ich liczbę, a w OnDeinit wypisze powód zakończenia jako liczbę. Podepnij go, zmień jeden parametr i zobacz w zakładce Eksperci, że licznik zaczyna od nowa.