Startseite Technischer Indikator Beitrag

iRSISignAlert: Der perfekte Indikator für MetaTrader 5

Anhang
15840.zip (3.1 KB, Herunterladen 0 mal)

Der Semaphore-Pfeil-Signalindikator basiert auf dem klassischen Relative Strength Index (RSI) und zeigt Signale an, wenn der Markt überkauft oder überverkauft ist. Mit nützlichen Funktionen wie Alarmen, E-Mail-Benachrichtigungen und Push-Nachrichten für mobile Endgeräte, ist dieser Indikator ein Muss für jeden Trader.

Um die Alarmfunktionen, E-Mail-Benachrichtigungen und Push-Nachrichten zu implementieren, wurden folgende Änderungen im Indikatorcode vorgenommen:

  1. Neue Eingabeparameter hinzugefügt:
    input uint AnzahlDerKerzen=1;// Kerzenanzahl für das Signal
    input bool AlarmAktiv=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
    
  2. 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 Kaufsignalen
                   const int GesamtKerzen,     // aktuelle Anzahl der Kerzen
                   const int VorherBerechnet,// Anzahl der Kerzen im vorherigen Tick
                   const double &Schluss[],     // Schlusskurs
                   const int &Spread[])       // Spread
      {
    //---
       static uint zähler=0;
       if(GesamtKerzen!=VorherBerechnet) zähler=0;
    
       bool KaufSignal=false;
       bool SerieTest=ArrayGetAsSeries(KaufPfeil);
       int index;
       if(SerieTest) index=int(AnzahlDerKerzen);
       else index=GesamtKerzen-int(AnzahlDerKerzen)-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);
          SerieTest=ArrayGetAsSeries(Schluss);
          if(SerieTest) index=int(AnzahlDerKerzen);
          else index=GesamtKerzen-int(AnzahlDerKerzen)-1;
          double Ask=Schluss[index];
          double Bid=Schluss[index];
          SerieTest=ArrayGetAsSeries(Spread);
          if(SerieTest) index=int(AnzahlDerKerzen);
          else index=GesamtKerzen-int(AnzahlDerKerzen)-1;
          Bid+=Spread[index];
          string sAsk=DoubleToString(Ask,_Digits);
          string sBid=DoubleToString(Bid,_Digits);
          string sPeriod=GetStringTimeframe(ChartPeriod());
          if(AlarmAktiv) Alert("KAUF-Signal \n Ask=",Ask,"\n Bid=",Bid,"\n currtime=",text,"\n Symbol=",Symbol()," Periode=",sPeriod);
          if(EMailAktiv) SendMail(SignalName+": KAUF-Signal-Alarm","KAUF-Signal bei Ask="+sAsk+", Bid="+sBid+", Datum="+text+" Symbol="+Symbol()+" Periode="+sPeriod);
          if(PushAktiv) SendNotification(SignalName+": KAUF-Signal bei Ask="+sAsk+", Bid="+sBid+", Datum="+text+" Symbol="+Symbol()+" Periode="+sPeriod);
         }
    
    //---
      }
    //+------------------------------------------------------------------+
    //| Verkaufs-Signal-Funktion                                             |
    //+------------------------------------------------------------------+
    void SellSignal(string SignalName,      // Text des Indikatornamens für E-Mail- und Push-Nachrichten
                    double &VerkaufPfeil[],       // Indikatorpuffer mit Verkaufssignalen
                    const int GesamtKerzen,     // aktuelle Anzahl der Kerzen
                    const int VorherBerechnet, // Anzahl der Kerzen im vorherigen Tick
                    const double &Schluss[],     // Schlusskurs
                    const int &Spread[])       // Spread
      {
    //---
       static uint zähler=0;
       if(GesamtKerzen!=VorherBerechnet) zähler=0;
    
       bool VerkaufsSignal=false;
       bool SerieTest=ArrayGetAsSeries(VerkaufPfeil);
       int index;
       if(SerieTest) index=int(AnzahlDerKerzen);
       else index=GesamtKerzen-int(AnzahlDerKerzen)-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);
          SerieTest=ArrayGetAsSeries(Schluss);
          if(SerieTest) index=int(AnzahlDerKerzen);
          else index=GesamtKerzen-int(AnzahlDerKerzen)-1;
          double Ask=Schluss[index];
          double Bid=Schluss[index];
          SerieTest=ArrayGetAsSeries(Spread);
          if(SerieTest) index=int(AnzahlDerKerzen);
          else index=GesamtKerzen-int(AnzahlDerKerzen)-1;
          Bid+=Spread[index];
          string sAsk=DoubleToString(Ask,_Digits);
          string sBid=DoubleToString(Bid,_Digits);
          string sPeriod=GetStringTimeframe(ChartPeriod());
          if(AlarmAktiv) Alert("VERKAUF-Signal \n Ask=",Ask,"\n Bid=",Bid,"\n currtime=",text,"\n Symbol=",Symbol()," Periode=",sPeriod);
          if(EMailAktiv) SendMail(SignalName+": VERKAUF-Signal-Alarm","VERKAUF-Signal bei Ask="+sAsk+", Bid="+sBid+", Datum="+text+" Symbol="+Symbol()+" Periode="+sPeriod);
          if(PushAktiv) SendNotification(SignalName+": VERKAUF-Signal bei Ask="+sAsk+", Bid="+sBid+", Datum="+text+" Symbol="+Symbol()+" Periode="+sPeriod);
         }
    //---
      }
    //+------------------------------------------------------------------+
    //|  Zeitrahmen als String zurückgeben                               |
    //+------------------------------------------------------------------+
    string GetStringTimeframe(ENUM_TIMEFRAMES timeframe)
      {
    //----
       return(StringSubstr(EnumToString(timeframe),7,-1));
    //----
      }
    
  3. Ein paar Aufrufe der Funktionen BuySignal() und SellSignal() wurden nach den Berechnungsschleifen im OnCalculate()-Block hinzugefügt:
    BuySignal("iWPRSign",KaufPuffer,gesamt_kerzen,vorgängig_berechnet,schluß,spread);
        SellSignal("iWPRSign",VerkaufPuffer,gesamt_kerzen,vorgängig_berechnet,schluß,spread);
    

Dabei 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 Null oder EMPTY_VALUE gesetzt werden.

Es wird davon ausgegangen, dass nur ein Aufruf der Funktionen BuySignal() und SellSignal() im OnCalculate()-Block des Indikatorcodes verwendet wird.

Abb.1. Der iRSISignAlert-Indikator im Chart

Abb.1. Der iRSISignAlert-Indikator im Chart

Abb.2. Der iRSISignAlert-Indikator. Alarmgenerierung.

Abb.2. Der iRSISignAlert-Indikator. Alarmgenerierung.

Verwandte Beiträge

Kommentar (0)