Der Semaphore-Pfeil-Signalindikator basiert auf dem klassischen Money Flow Index-Oszillator und verlässt die überkauften und überverkauften Bereiche. Er verfügt über Alarme, die E-Mails senden und Push-Benachrichtigungen auf mobile Geräte schicken.
Um die Alarme, E-Mail-Nachrichten und Push-Benachrichtigungen zu implementieren, wurden die folgenden Änderungen im Indikatorcode vorgenommen:
- Neue Eingabeparameter wurden eingeführt:
input uint AnzahlDerBalken=1;//Balkennummer für das Signal input bool SoundAktiv=true; //Alarme aktivieren input uint AnzahlDerAlarme=2;//Anzahl der Alarme input bool EMailAktiv=false; //Aktivieren des E-Mail-Versands input bool PushAktiv=false; //Aktivieren des Versands an mobile Geräte
- Drei neue Funktionen wurden am Ende des Indikatorcodes hinzugefügt: BuySignal(), SellSignal() und GetStringTimeframe():
//+------------------------------------------------------------------+ //| Kauf-Signal-Funktion | //+------------------------------------------------------------------+ void BuySignal(string SignalName, // Text des Indikatornamens für E-Mail und Push-Nachrichten double &KaufPfeil[], // Indikatorpuffer mit Kauf-Signalen const int BalkenGesamt, // die aktuelle Anzahl der Balken const int VorherBerechnet, // die Anzahl der Balken im vorherigen Tick const double &Close[], // Schlusskurs const int &Spread[]) // Spread { //--- static uint zähler=0; if(BalkenGesamt!=VorherBerechnet) zähler=0; bool KaufSignal=false; bool SerieTest=ArrayGetAsSeries(KaufPfeil); int index; if(SerieTest) index=int(AnzahlDerBalken); else index=BalkenGesamt-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.stunde)+":"+string(tm.min); SerieTest=ArrayGetAsSeries(Close); if(SerieTest) index=int(AnzahlDerBalken); else index=BalkenGesamt-int(AnzahlDerBalken)-1; double Ask=Close[index]; double Bid=Close[index]; SerieTest=ArrayGetAsSeries(Spread); if(SerieTest) index=int(AnzahlDerBalken); else index=BalkenGesamt-int(AnzahlDerBalken)-1; Bid+=Spread[index]; string sAsk=DoubleToString(Ask,_Digits); string sBid=DoubleToString(Bid,_Digits); string sPeriode=GetStringTimeframe(ChartPeriod()); if(SoundAktiv) Alert("KAUF-Signal \n Ask=",Ask,"\n Bid=",Bid,"\n currtime=",text,"\n Symbol=",Symbol()," Periode=",sPeriode); if(EMailAktiv) SendMail(SignalName+": KAUF-Signal-Alarm","KAUF-Signal bei Ask="+sAsk+", Bid="+sBid+", Datum="+text+" Symbol="+Symbol()+" Periode="+sPeriode); if(PushAktiv) SendNotification(SignalName+": KAUF-Signal bei Ask="+sAsk+", Bid="+sBid+", Datum="+text+" Symbol="+Symbol()+" Periode="+sPeriode); } //--- } //+------------------------------------------------------------------+ //| Verkaufs-Signal-Funktion | //+------------------------------------------------------------------+ void SellSignal(string SignalName, // Text des Indikatornamens für E-Mail und Push-Nachrichten double &VerkaufPfeil[], // Indikatorpuffer mit Verkaufs-Signalen const int BalkenGesamt, // die aktuelle Anzahl der Balken const int VorherBerechnet, // die Anzahl der Balken im vorherigen Tick const double &Close[], // Schlusskurs const int &Spread[]) // Spread { //--- static uint zähler=0; if(BalkenGesamt!=VorherBerechnet) zähler=0; bool VerkaufsSignal=false; bool SerieTest=ArrayGetAsSeries(VerkaufPfeil); int index; if(SerieTest) index=int(AnzahlDerBalken); else index=BalkenGesamt-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.stunde)+":"+string(tm.min); SerieTest=ArrayGetAsSeries(Close); if(SerieTest) index=int(AnzahlDerBalken); else index=BalkenGesamt-int(AnzahlDerBalken)-1; double Ask=Close[index]; double Bid=Close[index]; SerieTest=ArrayGetAsSeries(Spread); if(SerieTest) index=int(AnzahlDerBalken); else index=BalkenGesamt-int(AnzahlDerBalken)-1; Bid+=Spread[index]; string sAsk=DoubleToString(Ask,_Digits); string sBid=DoubleToString(Bid,_Digits); string sPeriode=GetStringTimeframe(ChartPeriod()); if(SoundAktiv) Alert("VERKAUF-Signal \n Ask=",Ask,"\n Bid=",Bid,"\n currtime=",text,"\n Symbol=",Symbol()," Periode=",sPeriode); if(EMailAktiv) SendMail(SignalName+": VERKAUF-Signal-Alarm","VERKAUF-Signal bei Ask="+sAsk+", Bid="+sBid+", Datum="+text+" Symbol="+Symbol()+" Periode="+sPeriode); if(PushAktiv) SendNotification(SignalName+": VERKAUF-Signal bei Ask="+sAsk+", Bid="+sBid+", Datum="+text+" Symbol="+Symbol()+" Periode="+sPeriode); } //--- } //+------------------------------------------------------------------+ //| Erhalten der Zeitspanne als String | //+------------------------------------------------------------------+ string GetStringTimeframe(ENUM_TIMEFRAMES zeitspanne) { //---- return(StringSubstr(EnumToString(zeitspanne),7,-1)); //---- }
- Ein paar Aufrufe zu den Funktionen BuySignal() und SellSignal() wurden nach den Berechnungsschleifen des Indikators im OnCalculate()-Block hinzugefügt:
BuySignal("iWPRSign",KaufPuffer,rates_total,prev_calculated,close,spread); SellSignal("iWPRSign",VerkaufPuffer,rates_total,prev_calculated,close,spread);
Dabei sind KaufPuffer und VerkaufPuffer die Namen der Indikatorpuffer, in denen die Kauf- und Verkaufsignale gespeichert werden. Die leeren Werte in den Indikatorpuffern müssen entweder Null oder EMPTY_VALUE gesetzt werden.
Es wird angenommen, dass nur ein Aufruf der Funktionen BuySignal() und SellSignal() im OnCalculate()-Block des Indikatorcodes verwendet wird.

Abbildung 1. Der iMFISignAlert-Indikator im Chart

Abbildung 2. Der iMFISignAlert-Indikator. Alarme generieren.
Verwandte Beiträge
- Uniformitätsfaktor-Indikator für MetaTrader 5: Analysiere deine Preisbewegungen
- Tägliche prozentuale Veränderung in MT4 – Indikator für MetaTrader 4
- Erstelle deinen eigenen neuronalen Netzwerk-Prädiktor für MetaTrader 4
- Tägliche prozentuale Veränderung in MT5 – Indikator für MetaTrader 5
- Awesome_HTF_Signal: Ihr zuverlässiger Indikator für den MetaTrader 5