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 4807Co 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 martwyOdróż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.