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

MQL5 / Błędy

bład wykonania 4807

4807 — ERR_INDICATOR_WRONG_HANDLE

Uchwyt wskaźnika przestał być ważny albo nigdy taki nie był. Najbardziej podstępna przyczyna jest trzecia i wygląda tak: uchwyt powstaje

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

2026-08-03 10:47:29.913  Ekspert (EURUSD,M5)  CopyBuffer zwrocilo -1, blad 4807

Co ten kod znaczy

CopyBuffer dostał liczbę, która nie wskazuje na żaden istniejący wskaźnik.

Skąd się bierze

  • uchwyt równy INVALID_HANDLE, bo tworzenie zawiodło i nikt tego nie sprawdził
  • uchwyt zwolniony przez IndicatorRelease, a potem użyty
  • uchwyt skopiowany z obiektu, który już nie istnieje
  • zmienna uchwytu niezainicjowana

Co z tym zrobić

Najbardziej podstępna przyczyna jest trzecia i wygląda tak: uchwyt powstaje w konstruktorze obiektu, obiekt jest tymczasowy, jego destruktor wywołuje IndicatorRelease — a kopia uchwytu, którą trzymasz gdzie indziej, wskazuje już na nic.

Uchwyt zwolniony przez destruktor obiektu tymczasowego
class CWskaznik
  {
private:
   int               m_uchwyt;
public:
                     CWskaznik(const int okres)
     { m_uchwyt = iMA(_Symbol, _Period, okres, 0, MODE_EMA, PRICE_CLOSE); }
                    ~CWskaznik(void)
     { if(m_uchwyt != INVALID_HANDLE) IndicatorRelease(m_uchwyt); }

   int               Uchwyt(void) const { return m_uchwyt; }
  };

//--- obiekt tymczasowy ginie w tej samej linii, a razem z nim uchwyt
int uchwyt = CWskaznik(20).Uchwyt();     // od tej chwili uchwyt jest martwy

Odróżnienie 4807 od 4806 jest kluczowe dla diagnozy: 4806 znaczy „uchwyt dobry, danych jeszcze nie ma" i wystarczy poczekać, 4807 znaczy „uchwyt zły" i czekanie nic nie da.

Powiązane