Robot działający tylko w wizualnym testerze MT5 wymaga sprawdzenia, czy decyzja zależy od danych, czy od elementu narysowanego na wykresie. Obiekt graficzny nie powinien zastępować jawnej wartości sygnału. Zanim zmienisz strategię, porównaj tryby, wersje, dane i pierwszą różnicę w logu. Poniższy przykład nie uruchamia MT5: pokazuje własny model oddzielający liczbę od niedostępnego odczytu. Brak danych zachowujemy jako nieznany stan, bez podmieniania go na zero i bez otwierania pozycji.

Co rzeczywiście różni tryb wizualny?

Dokumentacja testera MQL5 podaje, że poza wizualnym testem obiekty graficzne nie są rysowane, a odwołanie do właściwości utworzonego obiektu daje wartości zerowe. Ograniczenie nie dotyczy trybu wizualnego. To opisana semantyka platformy, nie wynik eksperymentu przeprowadzonego przez nas na Twoim robocie. Nie wyciągaj z niej wniosku, że każda różnica między testami ma tę samą przyczynę.

Jeśli robot odczytuje cenę linii lub stan przycisku jako wejście do decyzji, zapisz ten etap oddzielnie od wskaźnika lub danych ceny. Najpierw ustal, czy wartość w ogóle istnieje w danym trybie. Własny warunek „odczyt niedostępny” pozwala zatrzymać diagnozę przed obliczeniem, zamiast przepuszczać techniczne zero jako cenę. Sama obecność wykresu nie potwierdza gotowości całego zestawu danych strategii.

Jak odróżnić liczbę sygnału od obiektu?

Własna symulacja bez zleceń. Deklarujemy dodatni sygnał liczbowy 1,1050 i próg 1,1040. Warunek to „sygnał większy od progu”. Porównujemy bezpośrednią liczbę z odczytem obiektu oznaczonym jako niedostępny. Nie są to kwotowania ani logi z MT5; symboliczne stany przyjęliśmy dla pokazania przepływu danych.

Brak wejścia nie jest zerową ceną

Brak wejścia nie jest zerową cenąWłasna symulacja: sygnał 1,1050 przekracza próg 1,1040. Niedostępny obiekt daje w naszym modelu null, więc nie oceniamy warunku.Jawna liczba1,1050Próg: 1,1040Niedostępny obiektnullBrak wejściaWynik modelutrue / unknownBez żadnego zleceniaWartość i dostępność sprawdzamy oddzielnie.Własny model — liczby hipotetyczne.
Własna symulacja: sygnał 1,1050 przekracza próg 1,1040. Niedostępny obiekt daje w naszym modelu null, więc nie oceniamy warunku.
Ten sam próg, różne rodzaje wejścia do warunku
ŚcieżkaWejścieOcena
Jawny sygnał liczbowy1,10501,1050 > 1,1040: warunek spełniony w modelu.
Obiekt niedostępnynull, czyli brak wartościNie oceniamy warunku.
Błędne podstawienie0 zamiast braku wartości0 > 1,1040: pozornie zwykły wynik fałszywy.

Ostatni wiersz ilustruje błędny wariant porównawczy. Podstawowa ścieżka narzędzia zachowuje brak odczytu jako null, a osobny wariant pokazuje skutek zastąpienia go zerem. Zero i null odpowiadają na różne pytania: pierwsze jest liczbą, drugie oznacza brak wejścia. Przy warunku odwrotnym „sygnał mniejszy od progu” podstawione zero mogłoby nawet pozornie spełnić kryterium. Z tego powodu nie naprawiaj programu dodaniem przypadkowej wartości zastępczej.

Oddziel dane od obiektu wykresu

Własny przykład dydaktyczny. Analiza działa lokalnie w przeglądarce: nie łączy się z rachunkiem ani API, nie wysyła wpisanych danych i nie zapisuje ich trwale. Nie wpisuj haseł ani danych osobowych.

To symulacja własnej reguły, nie test programu w MT5. Używamy dodatnich liczb z kropką, 10⁻⁸–10⁸, do 15 cyfr. Model oznacza brak odczytu jako null; osobno pokazuje błąd zamiany braku na zero. Nie ustala przyczyny błędu Twojego EA.

W narzędziu możesz zmienić dwie dodatnie, skończone wartości. Otrzymasz ocenę jawnej liczby, a ścieżka niedostępnego obiektu pozostanie bez wyniku porównania. Strona nie odczytuje wykresu, nie wykonuje testu platformy i nie generuje sygnału inwestycyjnego. To demonstracja, dlaczego diagnoza powinna odróżniać „warunek fałszywy” od „warunku nie można ocenić”.

Jak zapisać tryb programu bez wykonywania transakcji?

W MQL5 flagi MQL_TESTER, MQL_VISUAL_MODE i MQL_OPTIMIZATION opisują środowisko programu. Numer wersji terminala odczytuje TERMINAL_BUILD. Zapisuj wynik odczytu, zamiast wpisywać słowo „tester” na podstawie wyglądu okna. Ten zapis nie potwierdza jeszcze identyczności danych czy parametrów.

Poniższy mały, oddzielny robot diagnostyczny zapisuje konfigurację w OnInit i ma pusty OnTick. Nie zawiera wysyłania ani modyfikowania zleceń. Sygnaturę inicjalizacji opisuje OnInit, a zapis formatowany — PrintFormat. Skopiuj go do osobnego pliku MQ5, skompiluj w MetaEditor i porównaj rzeczywiste logi własnego terminala.

#property strict
int OnInit()
{
   PrintFormat("tester=%d visual=%d optimization=%d build=%d symbol=%s period=%d",
      (int)MQLInfoInteger(MQL_TESTER),
      (int)MQLInfoInteger(MQL_VISUAL_MODE),
      (int)MQLInfoInteger(MQL_OPTIMIZATION),
      (int)TerminalInfoInteger(TERMINAL_BUILD),
      _Symbol, (int)_Period);
   return INIT_SUCCEEDED;
}
void OnTick() {}

W istniejącym robocie nie twórz drugiego OnInit ani nie zastępuj jego inicjalizacji tym fragmentem. Dodanie zapisu wymaga zachowania obecnego przepływu programu. Dokumentacja testera wskazuje również wyjątek dla PrintFormat w OnInit przy optymalizacji; nie zakładaj, że brak wydruków ze wszystkich innych etapów dowodzi braku ich wykonania.

Jak znaleźć pierwszą różnicę zamiast porównywać sam zysk?

Przygotuj kartę pary uruchomień: tryb wizualny i niewizualny, wersja terminala i programu, parametry, symbol i interwał, model generowania ticków, żądany i faktyczny początek, zestaw danych, koszty oraz stan startowy. Zachowaj również pliki ustawień i identyfikatory wersji. Jeśli te deklaracje są różne, nie przypisuj całej zmiany wyłącznie oknu wykresu. W porównaniu pomaga porównywarka zapisów dwóch backtestów.

Znajdź najwcześniejszy moment, gdy jedna ścieżka ma inną wartość: powodzenie pobrania, czas danych, gotowość wskaźnika, sygnał, warunek lub decyzję. Zapis „zysk 120 zamiast 80” nie identyfikuje tego etapu. Oryginalnych logów nie przerabiaj; obok zrób małą tabelę zgodnych i różnych zdarzeń. Nie dopisuj wartości, których program wcześniej nie rejestrował.

W logu dodaj identyfikator obserwacji i informację, które wejście było żądane. Ułatwi to dopasowanie dwóch sekwencji bez zgadywania, czy podobne ceny pochodzą z tego samego etapu testu.

Co poprawić w konstrukcji sygnału?

Obliczenie powinno zwracać jawną wartość i status dostępności danych, a warstwa graficzna może ją wyświetlać. Wtedy wyłączenie rysowania nie jest celową zmianą źródła wejścia. Sprawdzaj ten sam moduł na kilku kontrolnych danych, również dla niedostępnego odczytu i wartości równej progowi. To nie gwarantuje identycznych wyników całego testera: pozostają wersje, dane, koszty i inne zależności kodu.

„Ten limit nie dotyczy testowania w trybie wizualnym.” — MetaQuotes, dokumentacja testera MQL5, fragment o obiektach graficznych, tłumaczenie; dostęp 13 października 2026.

Jeżeli nie masz kodu źródłowego robota, przekaż autorowi kartę uruchomień i pierwszy udokumentowany punkt rozbieżności. Nie zamieniaj bezpieczeństwa programu na serię prób zleceniami rzeczywistymi. Ogólne przygotowanie prób opisuje poradnik backtestów MT4 i MT5.

Co zrobić jutro

  1. Wypełnij kartę dwóch trybów. Zachowaj wersję programu, terminala, parametry, dane i zakres dla jednej pary uruchomień. Oznacz niepotwierdzone pola. Nie traktuj tego samego pliku EA jako dowodu, że pozostałe ustawienia również się zgadzają.
  2. Rozdziel brak wartości od zera. Przejdź przez nasz model z sygnałem 1,1050 i progiem 1,1040, a następnie ustaw równe liczby. Sprawdź, że niedostępny obiekt pozostaje null, niezależnie od wyniku porównania jawnych wartości.
  3. Zapisz pierwszy etap rozbieżności. Na odrębnej konfiguracji demo lub w testerze zbierz niehandlujące wpisy i porównaj ich sekwencję. Ustal, czy zmieniło się wejście, jego dostępność czy warunek. Opis diagnostyczny nie potwierdza rentowności robota ani nie jest poradą inwestycyjną.

Sprawdź, czy rozumiesz

Jedno krótkie ćwiczenie

Około 3 min · możesz spróbować ponownie

Próg wynosi 1,1040. Odczyt obiektu jest niedostępny. Jak nasza symulacja ocenia warunek większe od progu?

  • Zastąpić brak zerem i zwrócić false.
  • Zachować null i nie oceniać warunku.
  • Użyć liczby z poprzedniego wykresu.
Sprawdź odpowiedź i wyjaśnienie

Zachować null i nie oceniać warunku.

Tak. To jawna semantyka naszego modelu, nie twierdzenie o zwracaniu null przez funkcję MT5.

Następny temat: Ten sam backtest, inny wynik — jak znaleźć różnicę? →

Następnie porównaj pozostałe deklaracje środowiska, danych i kosztów obu uruchomień.