#property description "Der Indikator hervorhebt die Kerzen, die lokal sind"
#property description "Maximum und Minimum. Die Länge des Intervalls für Aufsuchen"
#property description "die Extremums kann man durch die Eingabeparameters einstellt werden."
//--- Indikator Einstellungen
#property indicator_chart_window
#property indicator_buffers 5
#property indicator_plots 1
//---- plot
#property indicator_label1 "Extremums"
#property indicator_type1 DRAW_COLOR_CANDLES
#property indicator_color1 clrLightSteelBlue,clrRed,clrBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- vordefinierte Konstante
#define INDICATOR_EMPTY_VALUE 0.0
//--- Eingabeparameters
input int InpNum=4; // Die Länge des Halb-Intervalls
// --- Indikator Puffers
double ExtOpen[];
double ExtHigh[];
double ExtLow[];
double ExtClose[];
double ExtColor[];
//--- globale Variablen
int ExtStart=0; // der Index der ersten Kerze, die kein Extremum ist
int ExtCount=0; // Anzahl der Kerzen, nicht den Extremums in diesen Intervall
//+------------------------------------------------------------------+
//| Zeichnen die Kerzen, nicht Extremums |
//+------------------------------------------------------------------+
void FillCandles(const double &open[],const double &high[],
const double &low[],const double &close[])
{
//--- Zeichnen Sie die Kerzen
ArrayCopy(ExtOpen,open,ExtStart,ExtStart,ExtCount);
ArrayCopy(ExtHigh,high,ExtStart,ExtStart,ExtCount);
ArrayCopy(ExtLow,low,ExtStart,ExtStart,ExtCount);
ArrayCopy(ExtClose,close,ExtStart,ExtStart,ExtCount);
}
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- Bindung von Array zum Indikator Puffer
SetIndexBuffer(0,ExtOpen);
SetIndexBuffer(1,ExtHigh);
SetIndexBuffer(2,ExtLow);
SetIndexBuffer(3,ExtClose);
SetIndexBuffer(4,ExtColor,INDICATOR_COLOR_INDEX);
//--- erstellen Sie die Wert, die nicht sichtbar sein werden
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,INDICATOR_EMPTY_VALUE);
//--- erstellen Sie die Name von Indikator-Puffers für die Anzeige im Daten-Fenster
PlotIndexSetString(0,PLOT_LABEL,"Open;High;Low;Close");
//---
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[])
{
//--- stellen Sie die gerade Richtung der Indexierung in Zeitreihen ein
ArraySetAsSeries(open,false);
ArraySetAsSeries(high,false);
ArraySetAsSeries(low,false);
ArraySetAsSeries(close,false);
//--- Variable zur Berechnung den Anfang des Bars
int start=prev_calculated;
//--- für die ersten InpNum*2 Bars wird die Berechnung nicht durchgeführt
if(start==0)
{
start+=InpNum*2;
ExtStart=0;
ExtCount=0;
}
//--- Wenn sich nur eine Bar gebildet hat, so werden wir den nächsten potentiellen Extremum prüfen
if(rates_total-start==1)
start--;
//--- der Index der Bar, den wir auf Extremum prüfen werden
int ext;
//--- die Zyklus von die Berechnung der Indikatorwerte
for(int i=start;i<rates_total-1;i++)
{
//--- vornherein an der i-ten Bar ohne Zeichnung
ExtOpen[i]=0;
ExtHigh[i]=0;
ExtLow[i]=0;
ExtClose[i]=0;
//--- der Extremum Index für die Überprüfung
ext=i-InpNum;
//--- die Überprüfung für das lokale Maximum
if(IsMax(high,ext))
{
//--- bezeichnen Sie die Extremum Kerze
ExtOpen[ext]=open[ext];
ExtHigh[ext]=high[ext];
ExtLow[ext]=low[ext];
ExtClose[ext]=close[ext];
ExtColor[ext]=1;
//--- die übrigen Kerzen werden wir bis zu Extremum mit der neutralen Farbe bezeichnen
FillCandles(open,high,low,close);
//--- ändern Sie die Variablenwerte
ExtStart=ext+1;
ExtCount=0;
//--- gehen Sie zum nächsten Iteration
continue;
}
//--- Überprüfung für das lokale Minimum
if(IsMin(low,ext))
{
//--- bezeichnen Sie die Extremum Kerze
ExtOpen[ext]=open[ext];
ExtHigh[ext]=high[ext];
ExtLow[ext]=low[ext];
ExtClose[ext]=close[ext];
ExtColor[ext]=2;
//--- die übrigen Kerzen werden wir bis zu Extremum mit der neutralen Farbe bezeichnen
FillCandles(open,high,low,close);
//--- ändern Sie die Variablenwerte
ExtStart=ext+1;
ExtCount=0;
//--- gehen Sie zum nächsten Iteration
continue;
}
// vergrößern Sie die Anzahl nicht den Extremums in diesem Intervall
ExtCount++;
}
//--- den Wert prev_calculated für den nächsten Anruf zurückgeben
return(rates_total);
}
//+------------------------------------------------------------------+
//| Ob das aktuelle Element des Arrays ein lokales Maximum ist |
//+------------------------------------------------------------------+
bool IsMax(const double &price[],const int ind)
{
//--- Variable von dem Intervall-Anfang
int i=ind-InpNum;
//--- Variable von dem Intervall-Abschluß
int finish=ind+InpNum+1;
//--- die Überprüfung für die erste Hälfte des Intervalls
for(;i<ind;i++)
{
if(price[ind]<=price[i])
return(false);
}
//--- die Überprüfung für die zweite Hälfte des Intervalls
for(i=ind+1;i<finish;i++)
{
if(price[ind]<=price[i])
return(false);
}
//--- es ist Extremum
return(true);
}
//+------------------------------------------------------------------+
//| Ob das aktuell Element des Arrays ein lokales Minimum ist |
//+------------------------------------------------------------------+
bool IsMin(const double &price[],const int ind)
{
//--- Variable von dem Intervall-Anfang
int i=ind-InpNum;
//--- Variable von dem Intervall-Abschluß
int finish=ind+InpNum+1;
//--- die Überprüfung für die erste Hälfte des Intervalls
for(;i<ind;i++)
{
if(price[ind]>=price[i])
return(false);
}
//--- die Überprüfung für die zweite Hälfte des Intervalls
for(i=ind+1;i<finish;i++)
{
if(price[ind]>=price[i])
return(false);
}
//--- es ist Extremum
return(true);
}
|