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

MQL5 / Pułapki

Przeoptymalizowanie

Dlaczego najlepszy wynik optymalizacji jest zwykle najgorszym wyborem i jak sprawdzić, czy parametry opisują rynek, czy szum.

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

Optymalizator w MetaTraderze przechodzi tysiące kombinacji parametrów i podaje najlepszą. Kłopot polega na tym, że najlepszą na tych konkretnych danych — a dane historyczne zawierają zarówno prawidłowości, jak i przypadkowy szum. Im więcej parametrów stroisz, tym pewniej dopasujesz się do szumu.

Skąd wiadomo, że to szum

Sprawdź kształt otoczenia, nie sam szczyt. Jeśli okres średniej 34 daje świetny wynik, a 33 i 35 dają wyniki fatalne, to nie jest odkrycie — to przypadek. Prawdziwa prawidłowość nie znika przy zmianie parametru o jeden. Szukaj płaskowyżu: obszaru, w którym cała grupa sąsiednich wartości zachowuje się podobnie, i bierz jego środek, nawet jeśli szczyt leży gdzie indziej.

Wykres optymalizacji w zakładce Wykres optymalizacji pokazuje to wprost. Powierzchnia z jednym ostrym pikiem to sygnał ostrzegawczy. Szeroki grzbiet to sygnał, że coś tam może być.

Policz stopnie swobody. Im więcej parametrów, tym więcej danych potrzeba, żeby wynik cokolwiek znaczył. Strategia z ośmioma strojonymi parametrami przetestowana na dwustu transakcjach nie mówi nic — kombinacji jest więcej niż obserwacji. Dwa, trzy parametry i kilkaset transakcji to minimum, przy którym warto w ogóle patrzeć na wynik.

Sprawdź, czy działa poza okresem strojenia. Podziel dane na dwie części, optymalizuj na pierwszej, testuj na drugiej — bez żadnych poprawek. Jeśli wynik na drugiej połowie jest wyraźnie gorszy, dopasowałeś się do pierwszej. MetaTrader ma do tego wbudowany mechanizm: pole Forward w ustawieniach testera dzieli okres automatycznie.

Czego kryteria optymalizacji nie mówią

Domyślnym kryterium jest zysk. To najgorszy możliwy wybór, bo premiuje przebiegi z jedną szczęśliwą transakcją. Bezpieczniejsze są kryteria uwzględniające zmienność wyniku i liczbę transakcji, ale żadne nie zastąpi spojrzenia na krzywą kapitału i na rozkład pojedynczych wyników.

Trzy liczby, które warto sprawdzić przed jakąkolwiek inną:

  • Liczba transakcji. Poniżej stu wynik jest opowieścią, nie statystyką.
  • Udział największej transakcji w zysku. Jeśli jedna transakcja odpowiada za większość wyniku, testujesz pojedyncze zdarzenie.
  • Najdłuższa seria stratna. To ona decyduje, czy realnie wytrzymasz przy tej strategii, a nie zysk końcowy.

Własna funkcja oceny

OnTester pozwala zwrócić własne kryterium optymalizacji. To dobre miejsce, żeby odrzucać przebiegi, które nie spełniają warunków wstępnych, zamiast oglądać je potem w tabeli wyników.

Odrzucenie przebiegów o zbyt małej liczbie transakcji
double OnTester()
  {
   double transakcje = TesterStatistics(STAT_TRADES);
   if(transakcje < 100)
      return(0.0);

   double zysk = TesterStatistics(STAT_PROFIT);
   double obsuniecie = TesterStatistics(STAT_EQUITY_DD);

   if(obsuniecie <= 0.0)
      return(0.0);

   //--- zysk na jednostkę obsunięcia, karany za małą liczbę transakcji
   return(zysk / obsuniecie * MathSqrt(transakcje / 100.0));
  }

To jest przykład konstrukcji, nie zalecane kryterium. Sens ma tylko taki wzór, który wynika z tego, co dla ciebie znaczy „lepiej" — a to jest decyzja, nie obliczenie.

Powiązane