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.
//--- 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.
#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.
//+------------------------------------------------------------------+
//| 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ąć.