bład wykonania 4806
4806 — ERR_INDICATOR_DATA_NOT_FOUND
Uchwyt wskaźnika istnieje, ale terminal jeszcze nie policzył jego wartości. Najczęściej przy pierwszych ticku po starcie.
4 fragmenty kodu z tej strony przeszły przez kompilator MetaEditor build 6090, 2026-08-05.
2026-08-02 09:15:02.114 Ekspert (EURUSD,M15) CopyBuffer zwrócił -1, kod błędu 4806Co ten kod znaczy
Żądane dane nie zostały znalezione. Uchwyt jest poprawny, wskaźnik istnieje, ale bufor, z którego chcesz kopiować, jeszcze nie ma wartości pod wskazanymi indeksami.
Trzy sytuacje, w których to występuje
1. Kopiowanie za wcześnie. Utworzenie uchwytu przez iMA czy iCustom zleca terminalowi policzenie wskaźnika, ale nie czeka na wynik. Wywołanie CopyBuffer w tym samym OnInit prawie zawsze kończy się tym błędem.
int OnInit()
{
int uchwyt = iMA(_Symbol, _Period, 20, 0, MODE_SMA, PRICE_CLOSE);
double bufor[];
CopyBuffer(uchwyt, 0, 0, 10, bufor); // -1, błąd 4806
return INIT_SUCCEEDED;
}Rozwiązanie: uchwyt w OnInit, kopiowanie w OnTick, i wyjście z funkcji, gdy danych jeszcze nie ma. Przy drugim albo trzecim ticku będą.
void OnTick()
{
double bufor[];
ArraySetAsSeries(bufor, true);
int skopiowane = CopyBuffer(uchwyt, 0, 0, 3, bufor);
if(skopiowane < 3)
{
ResetLastError();
return; // spróbujemy przy następnym ticku
}
//--- dalej normalna logika
}2. Za krótka historia. Wskaźnik o okresie 200 na wykresie, który ma wczytane 150 słupków, nie policzy nic. Terminal dociąga historię asynchronicznie — przy pracy na innym symbolu niż wykres bieżący może to potrwać kilka sekund.
3. Wskaźnik na obcym symbolu lub okresie. Odwołanie do wskaźnika na instrumencie, którego nie ma w oknie Rynek, wymaga najpierw jego wybrania:
if(!SymbolSelect("GBPUSD", true))
Print("Nie udało się dodać symbolu do okna Rynek.");Jak odróżnić brak danych od zepsutego uchwytu
Jeśli błąd nie znika po kilkudziesięciu tickach, problem nie polega na czekaniu. Sprawdź, czy uchwyt nie jest INVALID_HANDLE i czy wskaźnik w ogóle liczy — BarsCalculated(uchwyt) zwraca liczbę policzonych słupków albo -1:
int policzone = BarsCalculated(uchwyt);
PrintFormat("Wskaźnik policzył %d słupków", policzone);