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

MQL5 / Funkcje

CopyBuffer

Kopiuje wartości z bufora wskaźnika do tablicy. Trzy argumenty liczbowe, które łatwo pomylić, i jeden brak, który daje ciche złe wyniki.

int CopyBuffer(int uchwyt, int numer_bufora, int pozycja_startowa, int ile, double &tablica[]);

2 fragmenty kodu z tej strony przeszły przez kompilator MetaEditor build 6090, 2026-08-05.

Co zwraca

Liczbę faktycznie skopiowanych elementów albo -1 przy błędzie. Wartość mniejsza od żądanej nie jest awarią — znaczy, że wskaźnik ma policzone mniej słupków, niż poprosiłeś. Zawsze sprawdzaj wynik.

Argumenty po kolei

numer_bufora — który bufor wskaźnika. Średnia krocząca ma jeden (0). MACD ma dwa: linia główna 0, sygnalna 1. Wstęgi Bollingera trzy: środkowa 0, górna 1, dolna 2. Numeracja odpowiada kolejności wywołań SetIndexBuffer w kodzie wskaźnika.

pozycja_startowa — od której świecy zacząć, licząc wstecz od bieżącej. Zero to świeca w budowie. Jedynka to ostatnia domknięta.

ile — ile wartości pobrać.

Kierunek indeksowania wyniku

To jest jedyna rzecz, przy której ta funkcja naprawdę boli. Wynik trafia do tablicy uporządkowanej od najstarszej do najnowszej, chyba że wcześniej wywołasz ArraySetAsSeries(tablica, true).

Ta sama operacja, dwa różne znaczenia indeksu
double bufor[];

//--- wariant A: jak na wykresie, [0] to świeca bieżąca
ArraySetAsSeries(bufor, true);
CopyBuffer(uchwyt, 0, 0, 3, bufor);
double ostatniaDomknieta = bufor[1];

//--- wariant B: bez ustawienia serii, [0] to najstarsza z trzech
CopyBuffer(uchwyt, 0, 0, 3, bufor);
double ostatniaDomknieta2 = bufor[1];   // to jest inna świeca niż wyżej
Dwie konwencje numeracji tych samych świecPrzy ustawieniu serii indeks zero oznacza świecę bieżącą, bez niego najstarszą ze skopiowanych.[7][0][6][1][5][2][4][3][3][4][2][5][1][6][0][7]ArraySetAsSeries(t, true)domyślnieterazupływ czasuTen sam kod, ta sama tablica, dwa różne znaczenia indeksu. Brak wywołania ArraySetAsSeries niedaje błędu ani ostrzeżenia.

Oba warianty się kompilują i wykonują. Różnica objawia się wyłącznie jako sygnały wchodzące w złych momentach. Jeśli chcesz zobaczyć te indeksy w ruchu, mamy wizualizator.

Minimalny poprawny wzorzec

Bezpieczny odczyt trzech ostatnich wartości
bool PobierzWartosci(const int uchwyt, double &wynik[], const int ile)
  {
   ArraySetAsSeries(wynik, true);

   int skopiowane = CopyBuffer(uchwyt, 0, 0, ile, wynik);
   if(skopiowane < ile)
     {
      PrintFormat("CopyBuffer: skopiowano %d z %d, błąd %d",
                  skopiowane, ile, GetLastError());
      ResetLastError();
      return false;
     }
   return true;
  }

Typowe błędy

ObjawPrzyczyna
zwraca -1, błąd 4806wskaźnik jeszcze nie policzony
zwraca -1, błąd 4807zły uchwyt, zwykle INVALID_HANDLE
zwraca 0 przy pracy na obcym symboluhistoria symbolu nie została jeszcze wczytana
sygnały spóźnione o kilkanaście świecbrak ArraySetAsSeries

Powiązane