DSSBressertSignAlert: Der Signalindikator für MetaTrader 5

Mike 2016.09.19 21:41 64 0 0
Anhang

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:
    inputuint NumberofBar=1;//Bar-Nummer für das Signalinputbool SoundON=true; //Alarme aktiviereninputuint NumberofAlerts=2;//Anzahl der Alarmeinputbool EMailON=false; //E-Mail-Signal aktiviereninputbool 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
          constint Rates_total,// aktuelle Anzahl an Bars
          constint Prev_calculated,// Anzahl der Bars beim vorherigen Tick
          constdouble &Close[],// Schlusskurs
          constint &Spread[])// Spread
      {u//---
       staticuint 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;
          doubleAsk=Close[index];
          doubleBid=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
          constint Rates_total,// aktuelle Anzahl an Bars
          constint Prev_calculated,// Anzahl der Bars beim vorherigen Tick
          constdouble &Close[],// Schlusskurs
          constint &Spread[])// Spread
      {
    u//---
       staticuint 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;
          doubleAsk=Close[index];
          doubleBid=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.

Liste
Kommentar 0