//+------------------------------------------------------------------+
//| Demo_iGator.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2000-2024, MetaQuotes Ltd."
#property link "https://www.mql5.com"
#property version "1.00"
#property description "Der Indikator zeigt, wie Daten erhalten werden sollen"
#property description "Indikator-Puffer für den technischen Indikator iGator."
#property description "Symbol und Zeitrahmen, in denen der Indikator berechnet wird,"
#property description "sind durch die Parameter symbol und period angegeben."
#property description "Erstellungsweise des Handles ist durch den 'type' Parameter (Typ der Funktion) angegeben."
#property description "Alle andere Parameter sind wie im normalen Indikator Gator Oscillator."
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_plots 2
//--- GatorUp bauen
#property indicator_label1 "GatorUp"
#property indicator_type1 DRAW_COLOR_HISTOGRAM
#property indicator_color1 clrGreen, clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- GatorDown bauen
#property indicator_label2 "GatorDown"
#property indicator_type2 DRAW_COLOR_HISTOGRAM
#property indicator_color2 clrGreen, clrRed
#property indicator_style2 STYLE_SOLID
#property indicator_width2 1
//+------------------------------------------------------------------+
//| Enumeration der Erstellungsweisen des Handles |
//+------------------------------------------------------------------+
enum Creation
{
Call_iGator, // iGator verwenden
Call_IndicatorCreate // IndicatorCreate verwenden
};
//--- Eingabeparameter
input Creation type=Call_iGator; // Funktionstyp
input string symbol=" "; // Symbol
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // Zeitrahmen
input int jaw_period=13; // Zeitraum für die Kiefer-Linie
input int jaw_shift=8; // Verschiebung der Kiefer-Linie
input int teeth_period=8; // Zeitraum für die Zähne-Linie
input int teeth_shift=5; // Verschiebung der Zähne-Linie
input int lips_period=5; // Zeitraum für die Lippen-Linie
input int lips_shift=3; // Verschiebung der Lippen-Linie
input ENUM_MA_METHOD MA_method=MODE_SMMA; // Methode der Mittelung der Alligator-Linie
input ENUM_APPLIED_PRICE applied_price=PRICE_MEDIAN;// Typ der Preise aus der der Alligator gebaut wird
//--- Indicator-Puffer
double GatorUpBuffer[];
double GatorUpColors[];
double GatorDownBuffer[];
double GatorDownColors[];
//--- Eine Variable um Handle des Indikators iGator zu speichern
int handle;
//--- Variable für Speicherung
string name=symbol;
//--- Name des Indikators auf dem Chart
string short_name;
//--- Verschiebung für die obere und untere Histogramme
int shift;
//--- die Anzahl der Werte im Indikator Gator Oscillator gespeichert wird
int bars_calculated=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- Bindung von Arrays zu den Indikator-Puffern
SetIndexBuffer(0,GatorUpBuffer,INDICATOR_DATA);
SetIndexBuffer(1,GatorUpColors,INDICATOR_COLOR_INDEX);
SetIndexBuffer(2,GatorDownBuffer,INDICATOR_DATA);
SetIndexBuffer(3,GatorDownColors,INDICATOR_COLOR_INDEX);
/*
Alle Verschiebungen, die in den Parametern angegeben werden, gehören zum Indikator Alligator, auf den Gator Oscillator gebaut wird!
Daher produzieren diese Verschiebungen keine Verschiebung des Indikators Gator, und verschieben die Linien von Alligator,
auf dessen Werte die Indikatorwerte von Gator Oscillator konstruiert sind!
*/
//--- Berechnung der Verschiebung für den oberen und unteren Histogramm, die die Abweichung zwischen der Jaws-Linie und der Teeth-Linie ist
shift=MathMin(jaw_shift,teeth_shift);
PlotIndexSetInteger(0,PLOT_SHIFT,shift);
//--- Trotz der Tatsache, dass der Indikator zwei Histogramme hat, die gleiche Verschiebung verwendet wird - das ist die Realisierung des Indikators iGator
PlotIndexSetInteger(1,PLOT_SHIFT,shift);
//--- das Symbol, auf das der Indikator gebaut wird, definieren
name=symbol;
//--- Leerzeichen aus dem linken und rechten löschen
StringTrimRight(name);
StringTrimLeft(name);
//--- Wenn nach diesem die Länge des String name ist Null
if(StringLen(name)==0)
{
//--- das Symbol aus dem Chart, auf dem der Indikator läuft, nehmen
name=_Symbol;
}
//--- Erstellen ein Handel des Indikators
if(type==Call_iGator)
handle=iGator(name,period,jaw_period,jaw_shift,teeth_period,teeth_shift,
lips_period,lips_shift,MA_method,applied_price);
else
{
//--- die Struktur mit Werten von Indikatorparametern ausfüllen
MqlParam pars[8];
//--- Perioden und Verschiebungen der Alligator-Linien
pars[0].type=TYPE_INT;
pars[0].integer_value=jaw_period;
pars[1].type=TYPE_INT;
pars[1].integer_value=jaw_shift;
pars[2].type=TYPE_INT;
pars[2].integer_value=teeth_period;
pars[3].type=TYPE_INT;
pars[3].integer_value=teeth_shift;
pars[4].type=TYPE_INT;
pars[4].integer_value=lips_period;
pars[5].type=TYPE_INT;
pars[5].integer_value=lips_shift;
//--- Art der Glättung
pars[6].type=TYPE_INT;
pars[6].integer_value=MA_method;
//--- Preistyp
pars[7].type=TYPE_INT;
pars[7].integer_value=applied_price;
//--- Handle erstellen
handle=IndicatorCreate(name,period,IND_GATOR,8,pars);
}
//--- Wenn Handle konnte nicht erstellt werden
if(handle==INVALID_HANDLE)
{
//--- darüber schreiben und Nummer des Fehlers anzeigen
PrintFormat("Handle des Indikators iGator für das Paar %s/%s konnte nicht erstellt werden. Fehlercode ist %d",
name,
EnumToString(period),
GetLastError());
//--- Arbeit des Indikators ist früher geendet
return(INIT_FAILED);
}
//--- Das Paar, Symbol/Zeitrahmen, auf deren Gator Oscillator berechnet war, zeigen
short_name=StringFormat("iGator(%s/%s, %d, %d ,%d, %d, %d, %d)",name,EnumToString(period),
jaw_period,jaw_shift,teeth_period,teeth_shift,lips_period,lips_shift);
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- normale Initialisierung des Indikators
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[])
{
//--- Anzahl der Werte des Indikators iGator zu kopieren
int values_to_copy;
//--- Anzahl der berechneten Werte im Indikator finden
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat("BarsCalculated() hat %d zurückgegeben, Fehlercode ist %d",calculated,GetLastError());
return(0);
}
//--- wenn dies der erste Start der Berechnung des Indikators ist oder die Anzahl der Werte im Indikator iGator geändert hat
//--- oder wenn Sie brauchen den Indikator für zwei oder mehr Balken (was bedeutet, dass etwas in der Geschichte verändert hat) zu berechnen
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//--- wenn Array GatorUpBuffer größer als die Anzahl der Werte in iGator auf symbol/period ist, dann kopieren wir nicht alles
//--- sonst kopieren wir weniger als Größe der Indikator-Puffer
if(calculated>rates_total) values_to_copy=rates_total;
else values_to_copy=calculated;
}
else
{
//--- dann ist unser Indikator nicht das erste Mal berechnet, und seit dem letzten Aufruf von OnCalculate())
//--- nicht mehr als ein Balken für die Berechnung hinzugefügt war
values_to_copy=(rates_total-prev_calculated)+1;
}
//--- Die Arrays mit den Werten aus dem Indikator Gator Oscillator ausfüllen
//--- Wenn FillArraysFromBuffer false zurückgegeben hat, dann die Daten nicht bereit sind - das Werk vollenden
if(!FillArraysFromBuffers(GatorUpBuffer,GatorUpColors,GatorDownBuffer,GatorDownColors,
shift,handle,values_to_copy)) return(0);
//--- Nachricht bilden
string comm=StringFormat("%s ==> Aktualisierte Werte im Indikator %s: %d",
TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),
short_name,
values_to_copy);
//--- Hilfsnachrichtung auf dem Chart anzeigen
Comment(comm);
//--- die Anzahl der Werte im Indikator Gator Oscillator speichern
bars_calculated=calculated;
//--- den Wert prev_calculated für den nächsten Anruf zurückgeben
return(rates_total);
}
//+------------------------------------------------------------------+
//| Indikator-Puffer aus dem Indikator iGator ausfüllen |
//+------------------------------------------------------------------+
bool FillArraysFromBuffers(double &ups_buffer[], // Indikator-Puffer für die obere Histogramm
double &up_color_buffer[], // Indikator-Puffer für die Preisindizes der oberen Histogramm
double &downs_buffer[], // Indikator-Puffer für die untere Histogramm
double &downs_color_buffer[], // Indikator-Puffer für die Preisindizes der unteren Histogramm
int u_shift, // Verschiebung für die obere und untere Histogramme
int ind_handle, // Handle des Indikators iGator
int amount // Anzahl der Werte, die kopiert werden
)
{
//--- Fehlercode rücksetzen
ResetLastError();
//--- Teil des Arrays GatorUpBuffer mit Werten auf Indikator-Puffer mit Index 0 ausfüllen
if(CopyBuffer(ind_handle,0,-u_shift,amount,ups_buffer)<0)
{
//--- wenn die Kopie fehlschlägt, Fehlercode anzeigen
PrintFormat("Daten konnte nicht aus dem Indikator iGator kopiert werden, Fehlercode ist %d",GetLastError());
//--- Beenden mit Null-Ergebnis - dies bedeutet, dass der Indikator nicht berechnet wird
return(false);
}
//--- Teil des Arrays GatorUpColors mit Werten auf Indikator-Puffer mit Index 1 ausfüllen
if(CopyBuffer(ind_handle,1,-u_shift,amount,up_color_buffer)<0)
{
//--- wenn die Kopie fehlschlägt, Fehlercode anzeigen
PrintFormat("Daten konnte nicht aus dem Indikator iGator kopiert werden, Fehlercode ist %d",GetLastError());
//--- Beenden mit Null-Ergebnis - dies bedeutet, dass der Indikator nicht berechnet wird
return(false);
}
//--- Teil des Arrays GatorDownBuffer mit Werten auf Indikator-Puffer mit Index 2 ausfüllen
if(CopyBuffer(ind_handle,2,-u_shift,amount,downs_buffer)<0)
{
//--- wenn die Kopie fehlschlägt, Fehlercode anzeigen
PrintFormat("Daten konnte nicht aus dem Indikator iGator kopiert werden, Fehlercode ist %d",GetLastError());
//--- Beenden mit Null-Ergebnis - dies bedeutet, dass der Indikator nicht berechnet wird
return(false);
}
//--- Teil des Arrays GatorDownColors mit Werten auf Indikator-Puffer mit Index 3 ausfüllen
if(CopyBuffer(ind_handle,3,-u_shift,amount,downs_color_buffer)<0)
{
//--- wenn die Kopie fehlschlägt, Fehlercode anzeigen
PrintFormat("Daten konnte nicht aus dem Indikator iGator kopiert werden, Fehlercode ist %d",GetLastError());
//--- Beenden mit Null-Ergebnis - dies bedeutet, dass der Indikator nicht berechnet wird
return(false);
}
//--- Alles gelang
return(true);
}
//+------------------------------------------------------------------+
//| Indicator deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- Das Chart nach der Löschung des Indikators leeren
Comment("");
}
|