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

MQL5 / Inżynieria

Buildy MetaTradera i zgodność kodu

MetaQuotes nie publikuje listy nowych funkcji języka. Kod z nowszą funkcją nie skompiluje się starszym edytorem, a preprocesor MQL5 nie pozwala tego obejść.

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

Pytanie wraca na forum regularnie: natrafiłem na funkcję, której wcześniej nie widziałem — gdzie znaleźć listę tego, co doszło w ostatnim buildzie?

Odpowiedź jest niewygodna: takiej listy nie ma. Ogłoszenia o aktualizacjach opisują zmiany w platformie, dokumentacja języka jest aktualizowana po cichu, a nowe funkcje pojawiają się w niej bez adnotacji, od kiedy istnieją.

Ma to praktyczne konsekwencje, jeśli twój kod ma trafić do kogoś innego.

Preprocesor nie pomoże

W C i C++ pisze się #if WERSJA >= 5. W MQL5 to nie zadziała — preprocesor obsługuje wyłącznie #ifdef i #ifndef, czyli sprawdzenie, czy makro jest zdefiniowane. Nie ma porównywania liczb, więc nie da się warunkowo skompilować fragmentu w zależności od builda.

Skutek jest taki, że brak funkcji to błąd kompilacji, nie działania. Użytkownik ze starszym MetaEditorem dostaje komunikat o nieznanym identyfikatorze i nie ma pojęcia, że problemem jest wersja.

Stałe, które są dostępne
//--- build kompilatora, ustalany w chwili kompilacji
PrintFormat("kompilator: %d", __MQLBUILD__);

//--- build terminala, w ktorym kod aktualnie dziala
PrintFormat("terminal: %d", (int)TerminalInfoInteger(TERMINAL_BUILD));

__MQLBUILD__ mówi, czym skompilowano plik .ex5. TERMINAL_BUILD mówi, gdzie ten plik teraz działa. To dwie różne liczby i obie bywają potrzebne.

Minimalna wersja jako świadoma decyzja

Skoro nie da się tego rozwiązać przy kompilacji, rozwiąż to przy starcie — czytelnym komunikatem zamiast dziwnego zachowania.

Odmowa uruchomienia na zbyt starym terminalu
#define WYMAGANY_BUILD 3800

int OnInit()
  {
   int build = (int)TerminalInfoInteger(TERMINAL_BUILD);

   if(build < WYMAGANY_BUILD)
     {
      PrintFormat("Ten ekspert wymaga MetaTradera w wersji %d lub nowszej. "
                  "Masz %d - zaktualizuj terminal.", WYMAGANY_BUILD, build);
      return INIT_FAILED;
     }

   return INIT_SUCCEEDED;
  }

Numer wymaganego builda warto powtórzyć w opisie programu, żeby był widoczny przed uruchomieniem:

#property description "Wymaga MetaTradera 5 build 3800 lub nowszego."
#property version     "1.03"

Jak w praktyce ustalić, od kiedy funkcja istnieje

Skoro nie ma changelogu, zostają trzy sposoby, w tej kolejności skuteczności:

Kompilacja na starszym edytorze. Najpewniejszy i najbardziej kłopotliwy: trzeba mieć starszą wersję. Jeśli utrzymujesz kod dla innych, jedna zainstalowana starsza platforma w wirtualnej maszynie oszczędza wielu pytań od użytkowników.

Ogłoszenia o aktualizacjach. Zmiany w języku pojawiają się w nich nieregularnie, ale trafiają tam te większe. Warto przeglądać przy okazji aktualizacji, a nie szukać wstecz.

Data w dokumentacji. Część stron dokumentacji wymienia build, w którym funkcja się pojawiła. Nie wszystkie, ale sprawdzenie kosztuje chwilę.

Odbicie tego w twoich plikach źródłowych

Wersję i build warto zapisywać przy każdym pliku, który publikujesz. Nie dla porządku, tylko dlatego, że przy zgłoszeniu „u mnie nie działa" pierwsze pytanie brzmi zawsze tak samo.

Nagłówek, który odpowiada na pierwsze pytanie
//+------------------------------------------------------------------+
//| MojEkspert.mq5                                                    |
//| Skompilowany: MetaEditor build 4755, 2026-08-02                  |
//| Wymaga: terminal build 3800+                                     |
//+------------------------------------------------------------------+

Tak samo robimy w tym serwisie: pod każdym artykułem z kodem stoi numer builda kompilatora i data sprawdzenia. Jeśli kiedyś przestanie się kompilować, będzie wiadomo, od czego zacząć.

Powiązane