Zmienne globalne terminala MT5 giną przy utracie zasilania
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
- W folderze danych terminala (Plik, Otwórz folder danych) otwieram
basesi patrzę na datę plikugvariables.dat. Jeśli terminal działa od tygodnia, a plik ma tydzień, to stan botów jest tylko w pamięci. - Naciskam F3 i sprawdzam, jakie zmienne trzymają moje boty.
- 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
- Dzienny limit straty
- Blokada handlu zamiast usuwania bota
- Maksymalny drawdown konta
- Pojęcia z artykułu: słowniczek, skorowidz
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ą.