EN
Artykuły / 7.1 Instalacja i konfiguracja
Instalacja i konfiguracjaszkic

Zmienne globalne terminala MT5 giną przy utracie zasilania

14.11.20264 min czytania

W skrócie: zmienne globalne terminala (klawisz F3) służą botom do pamiętania stanu między restartami. MT5 zapisuje je na dysk tylko przy normalnym zamknięciu terminala. Po awarii prądu albo zabiciu procesu terminal wczytuje starą kopię, a bot pracuje dalej na danych sprzed kilku dni, bez żadnego błędu w logu.

Awaria prądu 9 listopada 2026

9 listopada 2026 około 20:25 jeden z moich komputerów stracił zasilanie. Działało na nim kilkanaście terminali z kontami prop i demo. Po włączeniu terminale wstały, boty się uruchomiły, w logach żadnych błędów.

Dopiero przegląd stanu pokazał problem. Na terminalach z kontami prop plik ze zmiennymi globalnymi miał datę z 5-8 listopada, czyli z ostatniego normalnego zamknięcia terminala. Boty wczytały liczniki sprzed kilku dni: wynik challenge, dzienne blokady, stan zabezpieczeń.

Na jednym koncie było gorzej. Zmiennych mojego bota na złoto (bot 2010_GoldAsiaEmaChannelBreakoutEA) w starym pliku w ogóle nie było, bo bot został tam wgrany po ostatnim zamknięciu terminala. Bot uznał, że zaczyna nowy challenge, i ustawił licznik na zero, choć konto było już w trakcie.

Jak MT5 trzyma zmienne globalne

Zmienna globalna terminala to nazwa i liczba, wspólna dla wszystkich botów w jednym terminalu. Bot zapisuje ją funkcją GlobalVariableSet() i odczytuje GlobalVariableGet(). Listę widać po naciśnięciu F3. Nieużywana zmienna znika po czterech tygodniach.

Te wartości żyją w pamięci terminala. Na dysk trafiają do pliku gvariables.dat w folderze bases terminala w dwóch sytuacjach: przy normalnym zamknięciu terminala i wtedy, gdy program wywoła GlobalVariablesFlush(). MT5 nie zapisuje ich okresowo. Terminal, który działa bez przerwy od dwóch tygodni, ma na dysku stan sprzed dwóch tygodni.

Skutek widać dopiero po twardym wyłączeniu: brak prądu, zawieszony Windows, restart po aktualizacji systemu bez zamknięcia programów, zabicie procesu w Menedżerze zadań.

Kto ucierpiał, a kto nie

Ciekawe było porównanie terminali po tej samej awarii. Boty, które po każdym wejściu w pozycję same wymuszały zapis, miały plik świeży, z chwili ostatniej transakcji. Boty, które tylko ustawiały zmienne, miały plik stary.

Najbardziej bolą rzeczy, które bot pamięta dłużej niż jeden dzień:

  • postęp challenge: saldo początkowe, najwyższe saldo, licznik dni,
  • blokada po przekroczeniu dziennego limitu straty,
  • blokada do ręcznego odblokowania po dużej stracie,
  • informacja, że częściowy zysk na pozycji został już zrealizowany.

Zgubiona blokada dzienna oznacza, że bot po restarcie może znowu handlować w dniu, w którym już przekroczył limit. Na koncie prop to prosta droga do utraty konta.

Poprawka w bocie

Po awarii dodałem wymuszony zapis wszędzie tam, gdzie bot zmienia stan, który ma przetrwać restart:

// Zapis stanu, który musi przetrwać awarię zasilania
void SaveDayLock(const string name, const double value)
  {
   GlobalVariableSet(name, value);
   GlobalVariablesFlush();   // od razu na dysk, bez czekania na zamknięcie terminala
  }

GlobalVariablesFlush() zapisuje cały plik, więc nie wywołuję go na każdym ticku, tylko przy zmianie stanu: blokada, nowy dzień, wejście w pozycję.

Druga zasada jest ważniejsza. Tam, gdzie się da, bot odtwarza stan z historii konta, a zmienna globalna jest tylko pomocą. Dzienny wynik liczę z transakcji od północy czasu serwera, więc po restarcie bot sam widzi, że limit został przekroczony, nawet gdy zmienna zginęła. Historia transakcji leży na serwerze brokera i awaria mojego komputera jej nie rusza.

Trzecia rzecz to log. Przy starcie bot pisze jedną linię, czy stan został odtworzony, czy zaczyna od zera, i z jaką wartością. Po każdej awarii czytam te linie na wszystkich terminalach.

Jak sprawdzić u siebie

  1. W folderze danych terminala (Plik, Otwórz folder danych) otwieram bases i patrzę na datę pliku gvariables.dat. Jeśli terminal działa od tygodnia, a plik ma tydzień, to stan botów jest tylko w pamięci.
  2. Naciskam F3 i sprawdzam, jakie zmienne trzymają moje boty.
  3. Na koncie demo robię próbę: zabijam proces terminala w Menedżerze zadań, uruchamiam ponownie i porównuję wartości z F3 oraz to, co bot napisał w logu przy starcie.

Zasilacz awaryjny (UPS) zmniejsza ryzyko, ale nie pomoże na zawieszony system ani wymuszony restart po aktualizacji Windows.

Checklista

  • wiem, które zmienne globalne bot musi pamiętać dłużej niż dzień,
  • po zmianie takiej zmiennej bot wywołuje GlobalVariablesFlush(),
  • stan dzienny (wynik, blokada) bot potrafi odtworzyć z historii transakcji,
  • bot loguje przy starcie, czy odtworzył stan, czy zaczął od zera,
  • po awarii albo zabiciu terminala sprawdzam te linie w logu, zanim zostawię bota samego.

Powiązane

Ostrzeżenie: handel CFD i forex wiąże się z wysokim ryzykiem utraty kapitału. Bot po awarii komputera może działać na nieaktualnym stanie, sprawdź go przed pozostawieniem bez nadzoru. Artykuł ma charakter edukacyjny i nie jest rekomendacją inwestycyjną.

Dalej w rozdziale

147

MT5 Portable: po co ten tryb i jak go używać

Przełącznik /portable sprawia, że MT5 trzyma wszystkie dane w swoim folderze, a nie w profilu Windows. Opisuję, co się zmienia, kiedy to się opłaca (kilka terminali, kopie, testy) i jakich błędów unikać.

154

Algo Trading ON/OFF: co blokuje, a co nie

Wyłączony przycisk Algo Trading odrzuca zlecenia z bota i z Pythona (kod 10027), ale nie wszystkie ścieżki. W moim teście zamknięcie pozycji przez serwer MCP terminala przeszło mimo Algo OFF. Gdzie jest granica.

156

Logi terminala i bota w MT5: gdzie są i jak je czytać

MT5 prowadzi osobne dzienniki dla terminala, dla botów i dla Testera, w trzech różnych folderach. Pokazuję, gdzie ich szukać, jak czytać zakładki Dziennik i Eksperci, kiedy log robi się szkodliwy i dlaczego logów nie czyszczę.