Agent testera nie widzi twoich plików
Tester uruchamia eksperta w osobnym katalogu agenta. Pliki, biblioteki i dane, które działają na wykresie, potrafią tam zniknąć bez sensownego komunikatu.
2 fragmenty kodu z tej strony przeszły przez kompilator MetaEditor build 6090, 2026-08-05.
Ekspert działa na wykresie bez zarzutu. Ten sam ekspert w testerze zgłasza, że nie może wczytać pliku albo biblioteki. Kod się nie zmienił, ustawienia też. Zmieniło się miejsce, w którym program został uruchomiony.
Gdzie właściwie działa tester
Tester nie uruchamia eksperta w katalogu danych terminala. Uruchamia go w agencie — osobnym procesie z własnym, odrębnym drzewem katalogów. Wygląda ono podobnie do MQL5, ale jest puste poza tym, co tester świadomie tam skopiował.
Kopiowane są: skompilowany ekspert, wskaźniki wywoływane przez iCustom, biblioteki wymienione w #import i pliki wskazane jawnymi dyrektywami.
Nie są kopiowane: zawartość MQL5\Files, zależności bibliotek DLL, ustawienia terminala ani nic, co program otwiera dopiero w czasie działania.
Pliki danych
Ekspert czytający konfigurację z MQL5\Files w testerze znajdzie pusty katalog. Rozwiązaniem jest katalog wspólny — jeden dla wszystkich terminali i widoczny również dla agentów.
int uchwyt = FileOpen("ustawienia.csv",
FILE_READ | FILE_CSV | FILE_ANSI | FILE_COMMON, ';');
if(uchwyt == INVALID_HANDLE)
{
PrintFormat("Nie moge otworzyc pliku, blad %d", GetLastError());
PrintFormat("Katalog wspolny: %s", TerminalInfoString(TERMINAL_COMMONDATA_PATH));
return;
}Flaga FILE_COMMON kieruje operację do katalogu wspólnego, którego ścieżkę zwraca TERMINAL_COMMONDATA_PATH. Wypisanie jej w dzienniku przy błędzie oszczędza kwadransa szukania.
Biblioteki DLL
Tu komunikat jest wyjątkowo mylący. W dzienniku widać, że biblioteka została przekazana agentowi, a chwilę później, że nie da się jej wczytać:
file added: Libraries\MojaBiblioteka.dll. 36374 bytes loaded
cannot load 'C:\...\Agent-127.0.0.1-3000\MQL5\Experts\MojaBiblioteka.dll' [126]Numer w nawiasie to kod Windows: moduł nie został odnaleziony. Skoro plik został skopiowany, brzmi to bez sensu — dopóki nie wie się, że 126 dotyczy też zależności. Twoja biblioteka trafiła do agenta, ale biblioteki, z których ona sama korzysta, już nie. Windows nie potrafi wczytać modułu, którego zależności brakuje, i zgłasza dokładnie ten sam błąd co przy braku pliku.
Trzy wyjścia, w kolejności rozsądku:
- Zbudować bibliotekę statycznie, bez zależności zewnętrznych.
- Skopiować zależności do katalogu agenta ręcznie — działa, ale trzeba powtarzać przy każdym agencie i po każdej aktualizacji.
- Zrezygnować z biblioteki w testowanej ścieżce kodu i wstawić atrapę, gdy program działa w testerze.
bool wTesterze = (bool)MQLInfoInteger(MQL_TESTER);
bool wOptymalizacji = (bool)MQLInfoInteger(MQL_OPTIMIZATION);
bool wTrybieWizualnym = (bool)MQLInfoInteger(MQL_VISUAL_MODE);
if(wTesterze)
Print("Dzialamy w testerze - pomijam polaczenie zewnetrzne.");Wskaźniki własne
iCustom w testerze działa, ale wskaźnik musi być skompilowany, a jego nazwa podana dokładnie tak jak w katalogu. W testerze nie ma podpowiedzi ani listy — literówka w ścieżce kończy się INVALID_HANDLE i przerwaniem testu, bo OnInit zwraca wartość różną od zera.
To jest najczęstsza przyczyna komunikatu o zatrzymaniu testu zaraz po starcie. Zanim zaczniesz szukać w kodzie, sprawdź, czy wskaźnik w ogóle jest skompilowany — patrz iCustom.
Dziennik agenta jest osobny
Wpisy z Print w testerze nie trafiają do zakładki Eksperci terminala, tylko do dziennika agenta. Widać je w zakładce Dziennik okna testera, a pełny plik leży w katalogu agenta, w podkatalogu logs. Przy optymalizacji każdy agent ma własny plik i to jest jedyne miejsce, gdzie da się zobaczyć, co poszło nie tak w konkretnym przebiegu.