EN
Artykuły / 13.1 MQL5 od podstaw
MQL5 od podstawszkic

Kompilacja EA z linii poleceń (MetaEditor CLI)

14.11.20263 min czytania

W skrócie: MetaEditor kompiluje plik .mq5 jednym poleceniem, bez klikania. Przydaje się, gdy botów jest kilkanaście albo gdy kod pisze AI i trzeba od razu sprawdzić, czy się kompiluje. Trzy rzeczy psują pierwsze próby: brak przełącznika /portable, log zapisany w UTF-16 i to, że wynik trzeba samemu wyczytać z logu.

Polecenie

cd C:\MT5
MetaEditor64.exe /portable /compile:"MQL5\Experts\MojBot\MojBot.mq5" /log:"C:\MT5\compile.log"

/compile wskazuje plik źródłowy, /log plik, do którego trafi wynik. Okno edytora się nie otwiera, po kilku sekundach obok .mq5 pojawia się nowy .ex5. Ścieżki w przykładzie są przykładowe, podstaw swoje.

W logu na końcu jest jedna linia, która mówi wszystko:

Result: 0 errors, 0 warnings, 1342 msec elapsed

Wyżej są błędy i ostrzeżenia z nazwą pliku, numerem linii i kolumny, tak samo jak w zakładce Errors w edytorze.

Pułapka 1: bez /portable nie widzi własnych bibliotek

Terminal MT5 trzyma dane w jednym z dwóch miejsc. Zwykła instalacja używa folderu w profilu użytkownika (AppData\Roaming\MetaQuotes\Terminal\<długi identyfikator>). Tryb portable trzyma wszystko w folderze programu.

MetaEditor uruchomiony z linii poleceń bez /portable szuka plików #include w folderze z profilu. Jeśli moje biblioteki leżą w folderze programu, kompilator ich nie znajduje i wypisuje dziesiątki błędów typu “plik nie znaleziony” i “nieznany identyfikator”. Kod jest dobry, zła jest ścieżka.

Zasada: terminal uruchamiany jako portable kompiluję z /portable. Przy zwykłej instalacji przełącznik pomijam albo wskazuję folder danych przełącznikiem /include:"<folder z katalogiem MQL5>".

Pułapka 2: log jest w UTF-16

Plik logu MetaEditor zapisuje w kodowaniu UTF-16 LE. Notatnik otworzy go normalnie. Skrypt, który szuka w nim słowa Result, już niekoniecznie: grep i wiele narzędzi czyta plik jako UTF-8 i nie znajduje nic, bo między literami są bajty zerowe.

Rozwiązanie to konwersja przed czytaniem:

iconv -f UTF-16LE -t UTF-8 compile.log | grep "Result:"

W PowerShellu wystarczy Get-Content compile.log -Encoding Unicode.

Ta sama sprawa dotyczy plików źródłowych. Starsze wersje MetaEditora zapisywały .mq5 w UTF-16 i git pokazuje taki plik jako binarny, bez czytelnych różnic między wersjami. Swoje pliki trzymam w UTF-8.

Pułapka 3: wynik trzeba przeczytać

Nie polegam na tym, że polecenie “się wykonało”. Sprawdzam dwie rzeczy: linię Result: w logu i datę pliku .ex5. Jeśli kompilacja się nie uda, stary .ex5 zostaje na miejscu i tester albo terminal dalej używa poprzedniej wersji bota. Łatwo wtedy testować kod sprzed zmiany i dziwić się, że poprawka nic nie dała.

Prosty skrypt robi to za mnie: kompiluje, konwertuje log, wyciąga liczbę błędów i ostrzeżeń, a przy błędach wypisuje tylko linie z error.

Ostrzeżeń też nie zostawiam. “Possible loss of data due to type conversion” przy liczeniu lota bywa prawdziwym błędem, a nie kosmetyką.

Po co to wszystko

Przy jednym bocie F7 w edytorze wystarczy. Linia poleceń zaczyna się opłacać w trzech sytuacjach.

Wspólna biblioteka. Zmiana w klasie, której używa dwadzieścia botów, wymaga przekompilowania wszystkich. Pętla po folderach robi to w minutę i od razu widać, który bot przestał się kompilować.

Kod pisany z AI. Model językowy potrafi napisać kod, który wygląda poprawnie i się nie kompiluje. Gdy asystent sam uruchamia kompilację i czyta log, poprawia błędy od razu, zamiast oddawać mi kod “który powinien działać”.

Wdrożenie. Skrypt, który buduje paczkę z plikami .ex5 dla kilku terminali, zaczyna od kompilacji i przerywa przy pierwszym błędzie. Na konto nie trafia plik sprzed tygodnia.

Po kompilacji nowej wersji przenoszę też stare logi testera do archiwum, żeby wyniki dwóch wersji się nie mieszały.

Checklista

  • polecenie uruchamiane z folderu terminala, którego dotyczy,
  • /portable dla terminala w trybie portable (albo /include z właściwym folderem danych),
  • log konwertowany z UTF-16 przed szukaniem w nim tekstu,
  • sprawdzona linia Result: oraz data pliku .ex5,
  • zero błędów i zero ostrzeżeń przed testem,
  • po zmianie we wspólnej bibliotece kompilacja wszystkich botów, które jej używają.

Powiązane

Źródła

Ostrzeżenie: handel CFD i forex wiąże się z wysokim ryzykiem utraty kapitału. Artykuł ma charakter edukacyjny i nie jest rekomendacją inwestycyjną.

Dalej w rozdziale

299

Nowa świeca w EA: jak wykryć ją poprawnie i tanio

Większość botów liczy sygnał raz na świecę, ale wykrycie nowej świecy bywa źle napisane i potrafi zjadać blisko połowę czasu procesora. Pokazuję poprawny wzorzec, pułapki i pomiar z profilera.

304

Kodowanie plików MQL5: UTF-8 kontra UTF-16

MetaEditor potrafi zapisać kod w UTF-16, a wtedy git pokazuje plik jako binarny i diff jest nieczytelny. Jak to rozpoznać, skonwertować i zablokować hookiem.

305

Wersjonowanie EA i changelog: podbijam wersję przy każdej edycji

Przy flocie botów na wielu kontach najważniejsze pytanie brzmi: jaka dokładnie wersja tu działa? Pokazuję moją regułę wersji, osobny plik historii zmian i pułapkę z bibliotekami.