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

MQL5 / Błędy

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 4806

Co 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.

Tak nie
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ą.

Tak
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);

Powiązane