iStochKomposterAlert: Ein leistungsstarker Indikator für MetaTrader 5

Mike 2016.07.20 23:45 179 0 0
Anhang

Autor: komposter

Der iStochKomposterAlert ist ein Semaphore-Pfeil-Signalindikator, der auf dem klassischen Stochastik-Oszillator basiert. Er signalisiert, wenn Märkte überkauft oder überverkauft sind und bietet praktische Funktionen wie Alerts, E-Mail-Benachrichtigungen und Push-Notifications auf mobile Geräte.

Um die Alerts sowie E-Mail- und Push-Benachrichtigungen zu implementieren, wurden folgende Änderungen im Code des Indikators vorgenommen:

  1. Neue Eingabeparameter hinzugefügt:
  2. inputuint NumberofBar=1;// Anzahl der Balken für das Signalinputbool SoundON=true; // Alerts aktiviereninputuint NumberofAlerts=2;// Anzahl der Alertsinputbool EMailON=false; // E-Mail-Benachrichtigung aktiviereninputbool PushON=false; // Push-Benachrichtigung aktivieren
  3. Drei neue Funktionen am Ende des Indikatorcodes hinzugefügt: BuySignal(), SellSignal() und GetStringTimeframe()
  4. //+------------------------------------------------------------------+//| Funktion für Kaufsignal                                           |//+------------------------------------------------------------------+void BuySignal(string SignalSirname, // Name des Indikators für E-Mail und Push-Nachrichten
          double &BuyArrow[], // Puffer für Kaufsignale
          constint Rates_total, // aktuelle Anzahl der Balken
          constint Prev_calculated, // Anzahl der Balken beim letzten Tick
          constdouble &Close[], // Schlusskurs
          constint &Spread[]) // Spread
      {
    //---
        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)
        {
          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("BUY signal \n Ask=",Ask,"\n Bid=",Bid,"\n currtime=",text,"\n Symbol=",Symbol()," Period=",sPeriod);
          if(EMailON) SendMail(SignalSirname+": BUY signal alert","BUY signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
          if(PushON) SendNotification(SignalSirname+": BUY signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
        }
    //---
      }
    //+------------------------------------------------------------------+//| Funktion für Verkaufssignal                                       |//+------------------------------------------------------------------+void SellSignal(string SignalSirname, // Name des Indikators für E-Mail und Push-Nachrichten
          double &SellArrow[], // Puffer für Verkaufssignale
          constint Rates_total,// aktuelle Anzahl der Balken
          constint Prev_calculated,// Anzahl der Balken beim letzten Tick
          constdouble &Close[],// Schlusskurs
          constint &Spread[]) // Spread
      {
    //---
        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("SELL signal \n Ask=",Ask,"\n Bid=",Bid,"\n currtime=",text,"\n Symbol=",Symbol()," Period=",sPeriod);
          if(EMailON) SendMail(SignalSirname+": SELL signal alert","SELL signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
          if(PushON) SendNotification(SignalSirname+": SELL signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
        }
    //---
      }
    //+------------------------------------------------------------------+//|  Zeitrahmen als String abrufen                                  |//+------------------------------------------------------------------+string GetStringTimeframe(ENUM_TIMEFRAMES timeframe)
      {
    //----
       return(StringSubstr(EnumToString(timeframe),7,-1));
    //----
      }
    
  5. Aufrufe zu BuySignal() und SellSignal() nach den Berechnungsschleifen des Indikators im OnCalculate()-Block hinzugefügt:
  6. BuySignal("iWPRSign",BuyBuffer,rates_total,prev_calculated,close,spread);
        SellSignal("iWPRSign",SellBuffer,rates_total,prev_calculated,close,spread);
    

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

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

Fig.1. Der iStochKomposterAlert Indikator im Chart

Fig.1. Der iStochKomposterAlert Indikator im Chart

Fig.2. Der iStochKomposterAlert Indikator. Generierung von Alerts.

Fig.2. Der iStochKomposterAlert Indikator. Generierung von Alerts.

Liste
Kommentar 0