Kompilacja EA z linii poleceń (MetaEditor CLI)
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,
-
/portabledla terminala w trybie portable (albo/includez 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
- OHLC kontra prawdziwe tiki
- Zaokrąglenie lota - realne ryzyko inne niż zakładane
- Zmienne globalne terminala giną przy utracie zasilania
- Pojęcia z artykułu: słowniczek, skorowidz
Źródła
- MetaQuotes, pomoc MetaEditora, kompilacja z linii poleceń i integracja z innymi edytorami: metatrader5.com/en/metaeditor/help
Ostrzeżenie: handel CFD i forex wiąże się z wysokim ryzykiem utraty kapitału. Artykuł ma charakter edukacyjny i nie jest rekomendacją inwestycyjną.