Startseite Technischer Indikator Beitrag

PPO_SignAlert: Der Signalindikator für MetaTrader 5

Anhang
16108.zip (22.04 KB, Herunterladen 0 mal)

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:

  1. 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
    
  2. 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));
    //----
      }
    
  3. 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.1. Der PPO_SignAlert-Indikator auf dem Chart

Abb.2. Der PPO_SignAlert-Indikator. Generierung von Alarmen.

Abb.2. Der PPO_SignAlert-Indikator. Generierung von Alarmen.

Verwandte Beiträge

Kommentar (0)