Startseite Technischer Indikator Beitrag

DSSBressertSignAlert: Der Signalindikator für MetaTrader 5

Anhang
16115.zip (21.84 KB, Herunterladen 0 mal)

Der Semaphore-Signalindikator basiert auf dem Algorithmus des DSSBressert Indikators. Er bietet nicht nur präzise Signale, sondern auch die Möglichkeit, Benachrichtigungen per E-Mail und Push-Nachrichten auf mobile Geräte zu senden.

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

  1. Neue Eingabeparameter wurden eingeführt:
    input uint NumberofBar=1;//Bar-Nummer für das Signal
    input bool SoundON=true; //Alarme aktivieren
    input uint NumberofAlerts=2;//Anzahl der Alarme
    input bool EMailON=false; //E-Mail-Signal aktivieren
    input bool PushON=false; //Push-Benachrichtigungen aktivieren
    
  2. Drei neue Funktionen wurden am Ende des Indikatorcodes hinzugefügt: BuySignal(), SellSignal() und GetStringTimeframe()
    //+------------------------------------------------------------------+
    //| Funktion für Kaufsignal |
    //+------------------------------------------------------------------+
    void BuySignal(string SignalSirname,// Name des Indikators für E-Mail und Push-Nachrichten
          double &BuyArrow[],// Indikatorpuffer für Kauf-Signale
          const int Rates_total,// aktuelle Anzahl an Bars
          const int Prev_calculated,// Anzahl der Bars beim vorherigen Tick
          const double &Close[],// Schlusskurs
          const int &Spread[])// Spread
      {u//---
       static uint counter=0;
       if(Rates_total!=Prev_calculated) counter=0;
    
       bool BuySignal=false;
       bool SeriesTest=ArrayGetAsSeries(BuyArrow);
       int index;
       if(SeriesTest) index=int(NumberofBar);
       else index=Rates_total-int(NumberofBar)-1;
       if(NormalizeDouble(BuyArrow[index],_Digits) && BuyArrow[index]!=EMPTY_VALUE) BuySignal=true;
       if(BuySignal && counter<=NumberofAlerts)// Alarmbedingungen prüfen
         {
          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+=Spread[index];
          string sAsk=DoubleToString(Ask,_Digits);
          string sBid=DoubleToString(Bid,_Digits);
          string sPeriod=GetStringTimeframe(ChartPeriod());
          if(SoundON) Alert("KAUF-Signal \\n Ask=",Ask,"\n Bid=",Bid,"\n currtime=",text,"\n Symbol=",Symbol()," Periode=",sPeriod);
          if(EMailON) SendMail(SignalSirname+": KAUF-Signal-Alarm","KAUF-Signal bei Ask="+sAsk+", Bid="+sBid+", Datum="+text+" Symbol="+Symbol()+" Periode="+sPeriod);
          if(PushON) SendNotification(SignalSirname+": KAUF-Signal bei Ask="+sAsk+", Bid="+sBid+", Datum="+text+" Symbol="+Symbol()+" Periode="+sPeriod);
         }
    
    u//---
      }
    //+------------------------------------------------------------------+
    //| Verkaufsignal-Funktion |
    //+------------------------------------------------------------------+
    void SellSignal(string SignalSirname,// Name des Indikators für E-Mail und Push-Nachrichten
          double &SellArrow[],// Indikatorpuffer für Verkaufs-Signale
          const int Rates_total,// aktuelle Anzahl an Bars
          const int Prev_calculated,// Anzahl der Bars beim vorherigen Tick
          const double &Close[],// Schlusskurs
          const int &Spread[])// Spread
      {
    u//---
       static uint counter=0;
       if(Rates_total!=Prev_calculated) counter=0;
    
       bool SellSignal=false;
       bool SeriesTest=ArrayGetAsSeries(SellArrow);
       int index;
       if(SeriesTest) index=int(NumberofBar);
       else index=Rates_total-int(NumberofBar)-1;
       if(NormalizeDouble(SellArrow[index],_Digits) && 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+=Spread[index];
          string sAsk=DoubleToString(Ask,_Digits);
          string sBid=DoubleToString(Bid,_Digits);
          string sPeriod=GetStringTimeframe(ChartPeriod());
          if(SoundON) Alert("VERKAUF-Signal \\n Ask=",Ask,"\n Bid=",Bid,"\n currtime=",text,"\n Symbol=",Symbol()," Periode=",sPeriod);
          if(EMailON) SendMail(SignalSirname+": VERKAUF-Signal-Alarm","VERKAUF-Signal bei Ask="+sAsk+", Bid="+sBid+", Datum="+text+" Symbol="+Symbol()+" Periode="+sPeriod);
          if(PushON) SendNotification(SignalSirname+": VERKAUF-Signal bei Ask="+sAsk+", Bid="+sBid+", Datum="+text+" Symbol="+Symbol()+" Periode="+sPeriod);
         }
    u//---
      }
    //+------------------------------------------------------------------+
    //| Die Zeitspanne als String erhalten |
    //+------------------------------------------------------------------+
    string GetStringTimeframe(ENUM_TIMEFRAMES timeframe)
      {
    //----
       return(StringSubstr(EnumToString(timeframe),7,-1));
    //----
      }
  3. Ein paar Aufrufe zu den Funktionen BuySignal() und SellSignal() wurden nach den Berechnungsschleifen des Indikators im OnCalculate()-Block hinzugefügt:
    u//---
       BuySignal("DSSBressertSignAlert",BuyBuffer,rates_total,prev_calculated,close,spread);
       SellSignal("DSSBressertSignAlert",SellBuffer,rates_total,prev_calculated,close,spread);
    u//---
    

Hierbei sind BuyBuffer und SellBuffer die Namen der Indikatorpuffer für die Speicherung der Kauf- und Verkaufssignale. Die leeren Werte in den Indikatorpuffern müssen entweder Nullen oder EMPTY_VALUE sein.

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

Der Indikator nutzt die Klassen der SmoothAlgorithms.mqh Bibliothek (kopieren Sie sie in \\MQL5\Include). Die Verwendung dieser Klassen wurde ausführlich im Artikel "Durchschnittliche Preiserien für Zwischenberechnungen ohne Verwendung zusätzlicher Puffer" beschrieben.


Fig.1. Der DSSBressertSignAlert Indikator im Chart

Fig.1. Der DSSBressertSignAlert Indikator im Chart

Fig.2. Der DSSBressertSignAlert Indikator. Alarmgenerierung.

Fig.2. Der DSSBressertSignAlert Indikator. Alarmgenerierung.

Verwandte Beiträge

Kommentar (0)