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

MQL5 / Inżynieria

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.

Plik dostępny także w testerze
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:

  1. Zbudować bibliotekę statycznie, bez zależności zewnętrznych.
  2. Skopiować zależności do katalogu agenta ręcznie — działa, ale trzeba powtarzać przy każdym agencie i po każdej aktualizacji.
  3. Zrezygnować z biblioteki w testowanej ścieżce kodu i wstawić atrapę, gdy program działa w testerze.
Wykrycie, że działamy 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.

Powiązane