iCustom

Gibt das Handle des angegebenen Benutzerindikators zurück.

int  iCustom(
   string           symbol,     // Symbolname
   ENUM_TIMEFRAMES  period,     // Periode
   string           name        // Ordner/Name_des Benutzerindikators
   ...                          // Liste der Eingabeparameter des Indikators 
   );

Prameter

symbol

[in]  Symbolname des Instrumentes, dessen Daten für Berechnung des Indikators verwendet werden. NULL bedeutet das laufende Symbol.

period

[in]  Wert der Periode kann einer der Enumerationswerte ENUM_TIMEFRAMES sein, 0 bedeutet das laufende Timeframe.

name

[in]  Nutzerdefinierter Indikatorname. Wenn der Name mit dem umgekehrten Schrägstrich '\' beginnt, wird die EX5-Indikator-Datei relativ zum Stammverzeichnis des MQL5\Indikator-Indikators gesucht. Wenn also iCustom(Symbol(), Periode(), "\FirstIndicator"...) aufgerufen wird, wird der Indikator MQL5\Indicators\FirstIndicator.ex5 geladen. Wenn der Pfad die Datei nicht enthält, wird der Fehler 4802 (ERR_INDICATOR_CANNOT_CREATE) ausgeworfen.

Beginnt der Pfad nicht mit '\', wird der Indikator wie folgt gesucht und geladen:

  • Zuerst wird die EX5-Datei des Indikators in dem Ordner gesucht, in dem sich die EX5-Datei des aufrufenden Programms befindet. Liegt zum Beispiel CrossMA.EX5 EA in MQL5\Experts\MyExperts und sie enthält den Aufruf iCustom(Symbol(), Periode(), "SecondIndicator"...), wird in diesem Fall der Indikator hier MQL5\Experts\MyExperts\SecondIndicator.ex5 gesucht.
  • Wenn der Indikator nicht im gleichen Verzeichnis gefunden wird, erfolgt die Suche relativ zum Stammverzeichnis des Indikators MQL5\Indicators. Mit anderen Worten, es wird die Datei MQL5\Indicators\SecondIndicator.ex5 gesucht. Wenn der Indikator immer noch nicht gefunden wurde, gibt die Funktion INVALID_HANDLE zurück und der Fehler 4802 (ERR_INDICATOR_CANNOT_CREATE) wird ausgeworfen.

Wenn der Pfad zum Indikator auf ein Unterverzeichnis (z.B. MyIndicators\ThirdIndicator) zeigt, wird zunächst die Suche im aufrufenden Programmordner (der EA befindet sich in MQL5\Experts\MyExperts) in MQL5\Experts\MyExperts\MyIndicators\ThirdIndicator.ex5 durchgeführt. Wenn dies nicht erfolgreich ist, wird die Datei hier MQL5\Indicators\MyIndicators\ThirdIndicator.ex5 gesucht. Achten Sie darauf, den doppelten umgekehrten Schrägstrich '\\' als Trennzeichen im Pfad zu verwenden, z.B. iCustom(Symbol(), Punkt(), "MeineIndikatoren\\DritterIndikator"...)

...

[in] input-Parameter eines Benutzerindikators, die durch Kommas getrennt sind. Typ und Parameterfolge müssen entsprechen. Wenn Parameter nicht angegeben werden, werden Default-Werte verwendet.

Rückgabewert

Gibt das Handle des angegebenen technischen Indikators zurück, beim Misserfolg gibt INVALID_HANDLE zurück.

Hinweis

Benutzeranzeiger muss kompiliert werden (Datei mit Verbreitung  EX5) und sich im Verzeichnis MQL5/Indicators des Client-Terminals oder in einem eingebettetenen Verzeichnis befinden.

Die für Testenerforderliche Indikatoren werden automatisch aus Aufruf der Funktionen iCustom() bestimmt, wenn der entsprechende Parameter von der Konstantzeile vorgegeben ist. Für andere Fälle (Verwendung der Funktion IndicatorCreate() oder Verwendung einer nicht Konstantzeile im Parameter, der den Namen des Indikator vorgibt) ist diese Eigenschaft #property tester_indicator erforderlich :

#property tester_indicator "indicator_name.ex5"

Wenn die erste Aufrufform im Indikator verwendet wird, kann beim Ablauf des Benutzerindikators im Registerblatt "Parameters" Daten für seine Berechnung  angegeben werden. Wenn der Parameter "Apply to" explizit nicht ausgewählt ist, wird die Berechnung mit den Werten "Close" durchgeführt.

Auswahl der Zeitreihe fuer Indikatorberechnung

Beim Aufruf eines Benutzerindikators aus dem mql5-Programm kann Parameter Applied_Price oder handle eines anderen Parameters am letzten nach aller vom Benutzerindikator vorausgesehenen Eingabevariablen übertragen werden.

Sehen Sie auch

Programmeigenschaften, Zugang zu Zeitreihen und Indikatoren, IndicatorCreate(), IndicatorRelease()

Beispiel:

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//---- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input int MA_Period=21;
input int MA_Shift=0;
input ENUM_MA_METHOD MA_Method=MODE_SMA;
//--- indicator buffers
double         Label1Buffer[];
//--- handle des Benutzerindikators Custom Moving Average.mq5
int MA_handle;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
   ResetLastError();
   MA_handle=iCustom(NULL,0,"Examples\\Custom Moving Average",
                     MA_Period,
                     MA_Shift,
                     MA_Method,
                     PRICE_CLOSE // Schlusspreise verwenden
                     );
   Print("MA_handle = ",MA_handle,"  error = ",GetLastError());
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//--- Werte des Indikators Custom Moving Average in den Indikator-Puffer kopieren
   int copy=CopyBuffer(MA_handle,0,0,rates_total,Label1Buffer);
   Print("copy = ",copy,"    rates_total = ",rates_total);
//--- beim erfolglosen Versuch geben wir das aus 
   if(copy<=0)
      Print("Erfolgloser Versuch, Indikatorwerte Custom Moving Average zu erhalten");
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+