Benutzerindikatoren

Gruppe der Funktionen, die für die Erzeugung der Benutzerindikatoren verwendet werden. Diese Funktionen können nicht beim Schreiben von Scripts und Ratgebern verwendet werden.

Funktion

Massnahme

SetIndexBuffer

Verbindet den Indikatorpuffer mit dem eindimensionalen dynamischen Feld Feld des Typs double

IndicatorSetDouble

Gibt den Wert des Indikators vor, der den Typ double hat

IndicatorSetInteger

Gibt Eigenschaftswert des Indikators vor, der den Typ int hat

IndicatorSetString

Gibt Eigenschaftswert des Indikators vor, der den Typ string hat

PlotIndexSetDouble

Gibt Zeilenwert des Indikators vor, der den Typ double hat

PlotIndexSetInteger

Gibt Zeilenwert des Indikators vor,der den Typ int hat

PlotIndexSetString

Gibt Zeilenwert des Indikators vor, der den Typ string hat

PlotIndexGetInteger

Gibt Zeilenwert des Indikators zurück, der den ganzzahligen Typ hat

Eigenschaften der Indikator können mit Hilfe der Compiler-Direktiven oder mit Funktionen angegeben werden. Um dies besser zu verstehen, ist es empfehlenswert, dass Sie Stile der Indikator in den Beispielen studieren.

Alle notwendigen Berechnungen der Benutzerindikatoren muessen in der vorbestimmten Funktion OnCalculate() untergeordnet werden .Wenn die kurze Aufrufform der Funktion OnCalculate() der Art

int OnCalculate (const int rates_total, const int prev_calculated, const int begin, const double& price[])

verwendet wird, enthält die Variable rates_total den Wert der gesamten Anzahl der Elemente des Feldes price[], das als Eingabe-Parameter für Berechnung der Anzeigerwerte übertragen wurde.

Parameter prev_calculated  – ist das Ergebnis der Durchführung der Funktion OnCalculate() auf dem vorangehenden Level und ermöglicht sparsamen Algorythmus für Berechnung der Indikatorwerte zu gestalten. ZB wenn der laufende Wert rates_total=1000, und prev_calculated=999, dann ist es vielleicht genug, Berechnungen nur für einen Wert des Anzeigerpuffers zu machen.

Wenn die Information über die Größe des Eingabefeldes price unzugaenglich waere, wuerde es zur Notwendigkeit führen, Berechnungen für 1000 Werte jedes Indikatorpuffers zu machen. Beim ersten Aufruf der Funktion OnCalculate() ist der Wert prev_calculated=0. Wenn sich das Feld price[] irgendwie verändert hat, ist  prev_calculated in diesem Fall auch 0.

Parameter begin zeigt die Anzahl der Initialwerte des Feldes price, die keine Daten für die Berechnung enthalten. ZB wenn als Eingabefeld die Werte des Indikators Accelerator Oscillator verwendet wurden (für den die ersten 37 Werte nicht berechnet werden), ist begin=37. Als Beispiel betrachten wir einen einfachen Anzeiger:

#property indicator_chart_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
//--- indicator buffers
double         Label1Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
//---
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
 
  {
//---
   Print("begin = ",begin,"  prev_calculated = ",prev_calculated,"  rates_total = ",rates_total);
//--- return value of prev_calculated for next call
   return(rates_total);
  }

Ziehen wir das aus dem Fenster "Navigator" ins Fenster des Indikators Accelerator Oscillator und geben wir an, dass Berechnungen auf der Grund der Werte des früheren Indikators durchgeführt werden:

Indikatorberechnung nach Werten des frueher erzeugten Indikators

Im Ergebnis wird der Wert prev_calculated beim ersten Aufruf der Funktion OnCalculate() 0 sein, bei weiteren Aufrufen wird der Wert dem Werten  rates_total gleich sein (bis die Anzahl der Bars am Preischart größer wird).

Parameter begin zeigt die Anzahl der Initialbars, fuer die die Werte weggelassen sind

Wert des Parameters begin wird der Anzahl der Initialbars gleich, für die Werte des Indikators Accelerator nicht berechnet werden auf Grund der Logik dieses Indikators. Wenn wir den Ausgangskode des Benutzerindikators Accelerator.mq5 ansehen, sehen wir in der Funktion OnInit() die folgenden Zeilen:

//--- sets first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,37);

Gerade durch die Funktion PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, empty_first_values) stellen wir die Anzahl der unbedeutenden ersten Werte im Nullindikatorfeld, die wir für die Berechnungen  (empty_first_values) nicht zu beachten brauchen. So haben wir Mechanismen um:

  1. die Anzahl der Initialwerte des Indikators anzugeben, die für Berechnungen im anderen Benutzerindikator nicht zu verwendet sind;
  2. die Information über die Anzahl der ersten Werte zu bekommen, die beim Aufruf eines anderen Benutzerundikatots ignoriert werden muessen, ohne in Logik der Berechnungen zu gehen.