Der Semaphore-Signalindikator basiert auf der relativen geglätteten Preisänderungsrate und bietet Ihnen die Möglichkeit, Alarme einzurichten, E-Mails zu versenden und Push-Benachrichtigungen auf mobile Geräte zu erhalten.
Um diese Funktionen zu integrieren, wurden folgende Änderungen am Code des Indikators vorgenommen:
- Neue Eingabeparameter hinzugefügt:
input uint AnzahlDerBalken=1;//Balkennummer für das Signal input bool TonAktiv=true; //Alarme aktivieren input uint AnzahlDerAlarme=2;//Anzahl der Alarme input bool EmailAktiv=false; //E-Mail-Benachrichtigungen aktivieren input bool PushAktiv=false; //Push-Benachrichtigungen aktivieren
- Drei neue Funktionen wurden am Ende des Indikatorcodes hinzugefügt: BuySignal(), SellSignal() und GetStringTimeframe()
//+------------------------------------------------------------------+ //| Funktion für Kaufsignal | //+------------------------------------------------------------------+ void Kaufsignal(string Signalname, // Text für E-Mail und Push-Nachrichten double &KaufPfeil[], // Puffer für Kaufsignale const int GesamtBalken, // Aktuelle Anzahl der Balken const int VorherBerechnet, // Anzahl der Balken beim vorherigen Tick const double &Schluss[], // Schlusskurs const int &Spread[]) // Spread { u//--- static uint zähler=0; if(GesamtBalken!=VorherBerechnet) zähler=0; bool Kaufsignal=false; bool SerienTest=ArrayGetAsSeries(KaufPfeil); int index; if(SerienTest) index=int(AnzahlDerBalken); else index=GesamtBalken-int(AnzahlDerBalken)-1; if(NormalizeDouble(KaufPfeil[index],_Digits) && KaufPfeil[index]!=EMPTY_VALUE) Kaufsignal=true; if(Kaufsignal && zähler<=AnzahlDerAlarme) { zähler++; MqlDateTime tm; TimeToStruct(TimeCurrent(),tm); string text=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min); SerienTest=ArrayGetAsSeries(Schluss); if(SerienTest) index=int(AnzahlDerBalken); else index=GesamtBalken-int(AnzahlDerBalken)-1; double Fragen=Schluss[index]; double Angebot=Schluss[index]; SerienTest=ArrayGetAsSeries(Spread); if(SerienTest) index=int(AnzahlDerBalken); else index=GesamtBalken-int(AnzahlDerBalken)-1; Angebot+=Spread[index]; string sAngebot=DoubleToString(Angebot,_Digits); string sBid=DoubleToString(Bid,_Digits); string sZeitraum=GetStringTimeframe(ChartPeriod()); if(TonAktiv) Alert("KAUFSIGNAL Angebot=",Angebot," Bid=",Bid," aktuelle Zeit=",text," Symbol=",Symbol()," Zeitraum=",sZeitraum); if(EmailAktiv) SendMail(Signalname+: KAUFSIGNAL ALARM,"KAUFSIGNAL bei Angebot="+sAngebot+", Bid="+sBid+", Datum="+text+" Symbol="+Symbol()+" Zeitraum="+sZeitraum); if(PushAktiv) SendNotification(Signalname+: KAUFSIGNAL bei Angebot="+sAngebot+", Bid="+sBid+", Datum="+text+" Symbol="+Symbol()+" Zeitraum="+sZeitraum); } u//--- } //+------------------------------------------------------------------+ //| Funktion für Verkaufssignal | //+------------------------------------------------------------------+ void Verkaufssignal(string Signalname, // Text für E-Mail und Push-Nachrichten double &VerkaufPfeil[], // Puffer für Verkaufssignale const int GesamtBalken, // Aktuelle Anzahl der Balken const int VorherBerechnet, // Anzahl der Balken beim vorherigen Tick const double &Schluss[], // Schlusskurs const int &Spread[]) // Spread { u//--- static uint zähler=0; if(GesamtBalken!=VorherBerechnet) zähler=0; bool Verkaufssignal=false; bool SerienTest=ArrayGetAsSeries(VerkaufPfeil); int index; if(SerienTest) index=int(AnzahlDerBalken); else index=GesamtBalken-int(AnzahlDerBalken)-1; if(NormalizeDouble(VerkaufPfeil[index],_Digits) && VerkaufPfeil[index]!=EMPTY_VALUE) Verkaufssignal=true; if(Verkaufssignal && zähler<=AnzahlDerAlarme) { zähler++; MqlDateTime tm; TimeToStruct(TimeCurrent(),tm); string text=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min); SerienTest=ArrayGetAsSeries(Schluss); if(SerienTest) index=int(AnzahlDerBalken); else index=GesamtBalken-int(AnzahlDerBalken)-1; double Angebot=Schluss[index]; double Bid=Schluss[index]; SerienTest=ArrayGetAsSeries(Spread); if(SerienTest) index=int(AnzahlDerBalken); else index=GesamtBalken-int(AnzahlDerBalken)-1; Bid+=Spread[index]; string sAngebot=DoubleToString(Angebot,_Digits); string sBid=DoubleToString(Bid,_Digits); string sZeitraum=GetStringTimeframe(ChartPeriod()); if(TonAktiv) Alert("VERKAUFSIGNAL Angebot=",Angebot," Bid=",Bid," aktuelle Zeit=",text," Symbol=",Symbol()," Zeitraum=",sZeitraum); if(EmailAktiv) SendMail(Signalname+: VERKAUFSIGNAL ALARM,"VERKAUFSIGNAL bei Angebot="+sAngebot+", Bid="+sBid+", Datum="+text+" Symbol="+Symbol()+" Zeitraum="+sZeitraum); if(PushAktiv) SendNotification(Signalname+: VERKAUFSIGNAL bei Angebot="+sAngebot+", Bid="+sBid+", Datum="+text+" Symbol="+Symbol()+" Zeitraum="+sZeitraum); } u//--- } //+------------------------------------------------------------------+ //| Zeitrahmen als String abrufen | //+------------------------------------------------------------------+ string GetStringTimeframe(ENUM_TIMEFRAMES timeframe) { //---- return(StringSubstr(EnumToString(timeframe),7,-1)); //---- }
- Ein paar Aufrufe der Funktionen Kaufsignal() und Verkaufssignal() wurden nach den Berechnungszyklen des Indikators im OnCalculate() Block hinzugefügt:
u//--- Kaufsignal("PPO_Sign",KaufPuffer,gesamt_balken,von_berechnet,schluessel,spread); Verkaufssignal("PPO_Sign",VerkaufPuffer,gesamt_balken,von_berechnet,schluessel,spread); u//---
Hierbei sind Kaufpuffer und Verkaufpuffer die Namen der Indikatorpuffer für die Speicherung der Kauf- und Verkaufssignale. Die leeren Werte in den Indikatorpuffern müssen entweder Zeros oder EMPTY_VALUE sein.
Es wird angenommen, dass nur ein Aufruf der Funktionen Kaufsignal() und Verkaufssignal() im OnCalculate() Block des Indikatorcodes verwendet wird.
Der Indikator verwendet die SmoothAlgorithms.mqh-Bibliotheksklassen (kopieren Sie sie nach <terminal_data_folder>\MQL5\Include). Die Verwendung der Klassen wurde ausführlich in dem Artikel "Durchschnittliche Preisreihen für Zwischenberechnungen ohne Verwendung zusätzlicher Puffer" beschrieben.
Ursprünglich wurde dieser Indikator in MQL4 geschrieben und erstmals am Code Basis am 08.03.2008 veröffentlicht.

Abb.1. Der PPO_SignAlert-Indikator auf dem Chart
Abb.2. Der PPO_SignAlert-Indikator. Generierung von Alarmen.
Verwandte Beiträge
- Tägliche prozentuale Veränderung in MT5 – Indikator für MetaTrader 5
- Uniformitätsfaktor-Indikator für MetaTrader 5: Analysiere deine Preisbewegungen
- Boom Index Spike Pattern – Ein Leitfaden für MetaTrader 5 Trader
- Marktfazilitätsindex (BW MFI) – Ein hilfreicher Indikator für MetaTrader 5
- Tägliche Pivot-Punkte: Der unverzichtbare Indikator für MetaTrader 5
