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

MQL5 / Funkcje

iCustom

Tworzy uchwyt do wskaźnika własnego. Trzy rzeczy muszą się zgadzać co do znaku: ścieżka, liczba parametrów i numer bufora.

int iCustom(string symbol, ENUM_TIMEFRAMES okres, string nazwa, ...);

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

Co zwraca

Uchwyt wskaźnika albo INVALID_HANDLE. Dalej pracujesz z nim tak samo jak z uchwytem iMA — przez CopyBuffer.

Podstawowe użycie
int uchwyt = iCustom(_Symbol, _Period, "MojWskaznik", 14, 3);

if(uchwyt == INVALID_HANDLE)
  {
   PrintFormat("Nie udało się utworzyć wskaźnika, błąd %d", GetLastError());
   return;
  }

Ścieżka

Liczona od katalogu MQL5\Indicators. Bez rozszerzenia .ex5.

Gdzie leży wskaźnikCo wpisać
MQL5\Indicators\MojWskaznik.ex5"MojWskaznik"
MQL5\Indicators\Moje\Trend.ex5"Moje\\Trend"
MQL5\Indicators\Examples\MACD.ex5"Examples\\MACD"

Podwójny ukośnik jest konieczny, bo pojedynczy rozpoczyna w łańcuchu sekwencję sterującą. Zapis "Moje\Trend" skompiluje się bez błędu i po prostu nie znajdzie pliku.

Parametry

Po nazwie podajesz parametry wejściowe wskaźnika, w tej samej kolejności, w jakiej są zadeklarowane jako input w jego kodzie. Można podać mniej niż wszystkie — reszta przyjmie wartości domyślne. Nie można podać więcej ani zmienić kolejności.

Wskaźnik z trzema parametrami input
//--- w kodzie wskaźnika:
//    input int    Okres    = 14;
//    input double Mnoznik  = 2.0;
//    input bool   Wygladz  = true;

int uchwyt = iCustom(_Symbol, _Period, "MojWskaznik", 20, 2.5, false);

Niezgodność typów jest cichym źródłem kłopotów: przekazanie 2 tam, gdzie wskaźnik oczekuje double, działa, ale przekazanie liczby tam, gdzie oczekuje bool, potrafi przesunąć całą listę.

Numery buforów

CopyBuffer bierze numer bufora, a nie jego nazwę. Numeracja odpowiada kolejności wywołań SetIndexBuffer w kodzie wskaźnika, licząc od zera. Bufory pomocnicze oznaczone INDICATOR_CALCULATIONS też zajmują numery.

Odczyt drugiego bufora wskaźnika własnego
double bufor[];
ArraySetAsSeries(bufor, true);

if(CopyBuffer(uchwyt, 1, 0, 3, bufor) < 3)
  {
   PrintFormat("Brak danych, błąd %d", GetLastError());
   return;
  }

Gdy nie wiesz, ile buforów ma wskaźnik, sprawdź w jego kodzie właściwość #property indicator_buffers. Odwołanie do nieistniejącego numeru zwraca -1 i kod błędu 4812.

Dlaczego dostaję same zera

Trzy najczęstsze przyczyny, w tej kolejności:

  1. Kopiowanie zaraz po utworzeniu uchwytu. Wskaźnik jeszcze się nie policzył — patrz 4806.
  2. Zły numer bufora. Bufor istnieje, ale jest pusty, bo służy do obliczeń pośrednich.
  3. Wartość pusta zamiast zera. Wiele wskaźników wypełnia nieużywane miejsca wartością EMPTY_VALUE, czyli DBL_MAX. Sprawdzaj to przed użyciem liczby w warunku.
Odrzucenie wartości pustej
if(bufor[1] == EMPTY_VALUE || !MathIsValidNumber(bufor[1]))
   return;

Powiązane