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