JBrainTrend1Stop ist ein Trendindikator, der mit Alarmen, E-Mail-Benachrichtigungen und Push-Nachrichten ausgestattet ist.
Im Folgenden erkläre ich die Änderungen, die am Indikator-Code vorgenommen wurden, um die Alarmfunktionen, E-Mail-Benachrichtigungen und Push-Nachrichten zu implementieren:
- Neue Eingabeparameter wurden eingeführt:
input uint NumberofBar=1;// Anzahl der Balken für das Signal input bool SoundON=true; // Alarme aktivieren input uint NumberofAlerts=2;// Anzahl der Alarme input bool EMailON=false; // E-Mail-Benachrichtigungen aktivieren input bool PushON=false; // Push-Benachrichtigungen aktivieren
- Drei neue Funktionen wurden am Ende des Indikator-Codes hinzugefügt: BuySignal(), SellSignal() und GetStringTimeframe()
//+------------------------------------------------------------------+
//| Funktion für Kaufsignal |
//+------------------------------------------------------------------+
void BuySignal(string SignalSirname, // Text des Indikatornamens für E-Mail- und Push-Nachrichten
double &BuyArrow[], // Indikatorpuffer mit Signalen für einen Aufwärtstrend
double &SellArrow[], // Indikatorpuffer mit Signalen für einen Abwärtstrend
const int Rates_total, // Aktuelle Anzahl der Balken
const int Prev_calculated, // Anzahl der Balken im vorherigen Tick
const double &Close[], // Schlusskurs
const int &Spread[]) // Spread
{
//---
static uint counter=0;
if(Rates_total!=Prev_calculated) counter=0;
bool BuySignal=false;
bool SeriesTest=ArrayGetAsSeries(BuyArrow);
int index,index1;
if(SeriesTest)
{
index=int(NumberofBar);
index1=index+1;
}
else
{
index=Rates_total-int(NumberofBar)-1;
index1=index-1;
}
if(SellArrow[index1] && SellArrow[index1]!=EMPTY_VALUE && BuyArrow[index] && BuyArrow[index]!=EMPTY_VALUE) BuySignal=true;
if(BuySignal && counter<=NumberofAlerts)
{
counter++;
MqlDateTime tm;
TimeToStruct(TimeCurrent(),tm);
string text=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min);
SeriesTest=ArrayGetAsSeries(Close);
if(SeriesTest) index=int(NumberofBar);
else index=Rates_total-int(NumberofBar)-1;
double Ask=Close[index];
double Bid=Close[index];
SeriesTest=ArrayGetAsSeries(Spread);
if(SeriesTest) index=int(NumberofBar);
else index=Rates_total-int(NumberofBar)-1;
Bid+=_Point*Spread[index];
string sAsk=DoubleToString(Ask,_Digits);
string sBid=DoubleToString(Bid,_Digits);
string sPeriod=GetStringTimeframe(ChartPeriod());
if(SoundON) Alert("KAUF-Signal Ask=",Ask," Bid=",Bid," currtime=",text," Symbol=",Symbol()," Zeitraum=",sPeriod);
if(EMailON) SendMail(SignalSirname+": KAUF-Signal-Alarm","KAUF-Signal bei Ask="+sAsk+", Bid="+sBid+", Datum="+text+" Symbol="+Symbol()+" Zeitraum="+sPeriod);
if(PushON) SendNotification(SignalSirname+": KAUF-Signal bei Ask="+sAsk+", Bid="+sBid+", Datum="+text+" Symbol="+Symbol()+" Zeitraum="+sPeriod);
}
//---
}
//+------------------------------------------------------------------+
//| Funktion für Verkaufssignal |
//+------------------------------------------------------------------+
void SellSignal(string SignalSirname, // Text des Indikatornamens für E-Mail- und Push-Nachrichten
double &SellArrow[], // Indikatorpuffer mit Signalen für einen Abwärtstrend
double &BuyArrow[], // Indikatorpuffer mit Signalen für einen Aufwärtstrend
const int Rates_total, // Aktuelle Anzahl der Balken
const int Prev_calculated, // Anzahl der Balken im vorherigen Tick
const double &Close[], // Schlusskurs
const int &Spread[]) // Spread
{
//---
static uint counter=0;
if(Rates_total!=Prev_calculated) counter=0;
bool SellSignal=false;
bool SeriesTest=ArrayGetAsSeries(SellArrow);
int index,index1;
if(SeriesTest)
{
index=int(NumberofBar);
index1=index+1;
}
else
{
index=Rates_total-int(NumberofBar)-1;
index1=index-1;
}
if(BuyArrow[index1] && BuyArrow[index1]!=EMPTY_VALUE && SellArrow[index] && SellArrow[index]!=EMPTY_VALUE) SellSignal=true;
if(SellSignal && counter<=NumberofAlerts)
{
counter++;
MqlDateTime tm;
TimeToStruct(TimeCurrent(),tm);
string text=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min);
SeriesTest=ArrayGetAsSeries(Close);
if(SeriesTest) index=int(NumberofBar);
else index=Rates_total-int(NumberofBar)-1;
double Ask=Close[index];
double Bid=Close[index];
SeriesTest=ArrayGetAsSeries(Spread);
if(SeriesTest) index=int(NumberofBar);
else index=Rates_total-int(NumberofBar)-1;
Bid+=_Point*Spread[index];
string sAsk=DoubleToString(Ask,_Digits);
string sBid=DoubleToString(Bid,_Digits);
string sPeriod=GetStringTimeframe(ChartPeriod());
if(SoundON) Alert("VERKAUF-Signal Ask=",Ask," Bid=",Bid," currtime=",text," Symbol=",Symbol()," Zeitraum=",sPeriod);
if(EMailON) SendMail(SignalSirname+": VERKAUF-Signal-Alarm","VERKAUF-Signal bei Ask="+sAsk+", Bid="+sBid+", Datum="+text+" Symbol="+Symbol()+" Zeitraum="+sPeriod);
if(PushON) SendNotification(SignalSirname+": VERKAUF-Signal bei Ask="+sAsk+", Bid="+sBid+", Datum="+text+" Symbol="+Symbol()+" Zeitraum="+sPeriod);
}
//---
}
//+------------------------------------------------------------------+
//| Die Zeitspanne als String abrufen |
//+------------------------------------------------------------------+
string GetStringTimeframe(ENUM_TIMEFRAMES timeframe)
{
//----
return(StringSubstr(EnumToString(timeframe),7,-1));
//----
} - Ein paar Aufrufe der BuySignal() und SellSignal() Funktionen wurden nach den Berechnungsschleifen des Indikators im OnCalculate() Block hinzugefügt:
//---
BuySignal("JBrainTrend1Stop_Alert",BuyStopBuffer,SellStopBuffer,rates_total,prev_calculated,close,spread);
SellSignal("JBrainTrend1Stop_Alert",SellStopBuffer,BuyStopBuffer,rates_total,prev_calculated,close,spread);
//---
Bei BuyStopBuffer und SellStopBuffer handelt es sich um die Namen der Indikatorpuffer, die die Signale für Aufwärts- und Abwärtstrends (Stoplinien für Long- und Short-Positionen) speichern. Ein Wert von Null oder EMPTY_VALUE sollte in den Indikatorpuffern vorhanden sein, wenn kein entsprechender Trend besteht.
Es wird angenommen, dass nur ein Aufruf der Funktionen BuySignal() und SellSignal() im OnCalculate() Block des Indikatorcodes verwendet wird.
Die kompilierte Datei des JMA.mq5 Indikators sollte in das Verzeichnis MQL5\Indicators platziert werden.

Abb.1. JBrainTrend1Stop_Alert Indikator im Chart

Abb.2. JBrainTrend1Stop_Alert Indikator. Alarme generieren
Kommentar 0