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

MQL5 / Inżynieria

Pamięć i wskaźniki: MQL5 to nie C++

Składnia przypomina C++, ale zarządzanie pamięcią działa inaczej. Kiedy obiekt ginie sam, a kiedy zostaje w pamięci do zamknięcia terminala.

1 fragment kodu z tej strony przeszedł przez kompilator MetaEditor build 6090, 2026-08-05.

Programiści przechodzący do MQL5 z języków takich jak C++ lub C# często łapią się na tym, że traktują zarządzanie pamięcią w MQL5 zbyt lekko. Składnia przypomina C++, a słowa kluczowe new i delete sugerują pełną kontrolę nad alokacją. Jednak MQL5 posiada własny mechanizm zarządzania pamięcią, który przypomina bardziej środowiska zarządzane (np. .NET) z elementami " inteligentnych wskaźników". Zrozumienie tej różnicy jest kluczowe, aby uniknąć wycieków pamięci i błędów dostępu (Access Violation).

Obiekty automatyczne vs Dynamiczne

W MQL5 obiekt zadeklarowany lokalnie (na stosie) jest niszczony automatycznie po wyjściu z zakresu ważności. Problem pojawia się, gdy używamy wskaźników (*). W C++ wskaźnik to surowy adres w pamięci. W MQL5 wskaźnik to w rzeczywistości uchwyt (handle) zarządzany przez maszynę wirtualną terminala.

Pamięć i wskaźniki: MQL5 to nie C++Składnia przypomina C++, ale zarządzanie pamięcią działa inaczej. Kiedy obiekt ginie sam, a kiedy zostaje w pamięci do zamknięcia terminala. C++ (Surowe wskaźniki) Programista zarządza cyklem życia (new/delete) ! Wycieki pamięci MQL5 (Uchwyty) Terminal śledzi referencje Wymaga jawnego delete ok Bezpieczeństwo

Pokrewne problemy i błędy początkujących

Najczęstszym błędem jest założenie, że jeśli wskaźnik przestanie istnieć, obiekt zostanie usunięty (Garbage Collection). W MQL5 tak nie jest. Jeśli stworzysz obiekt przez new, a nie usuniesz go przez delete, pamięć pozostanie zajęta aż do usunięcia wykresu lub wyłączenia terminala.

class CMyStrategy {
public:
    CMyStrategy() { Print("Konstruktor"); }
    ~CMyStrategy() { Print("Destruktor"); }
};

void OnTick() {
    // BŁĄD: Wyciek pamięci przy każdym ticie!
    CMyStrategy *strategy = new CMyStrategy();
    
    // POPRAWNIE: Obiekt automatyczny, usunięty po zakończeniu OnTick
    // CMyStrategy strategy_auto; 
}
    

Funkcja CriticalError i architektura

Kolejnym problematycznym aspektem jest sposób obsługi krytycznych błędów. W C++ można użyć wyjątków (try/catch). MQL5 nie obsługuje wyjątków w tradycyjnym sensie. Zamiast tego, błędy krytyczne (np. błędny wskaźnik) powodują natychmiastowe zatrzymanie eksperta (EA) z odpowiednim kodem błędu w logach. Używaj bloków sprawdzających (ang. defensive programming), aby zapobiec zatrzymaniu strategii na środku sesji.