Startseite Technischer Indikator Beitrag

iStochKomposterAlert: Ein leistungsstarker Indikator für MetaTrader 5

Anhang
15850.zip (3.17 KB, Herunterladen 0 mal)

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. input uint NumberofBar=1;// Anzahl der Balken für das Signal
    input bool SoundON=true; // Alerts aktivieren
    input uint NumberofAlerts=2;// Anzahl der Alerts
    input bool EMailON=false; // E-Mail-Benachrichtigung aktivieren
    input bool 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
          const int Rates_total, // aktuelle Anzahl der Balken
          const int Prev_calculated, // Anzahl der Balken beim letzten Tick
          const double &Close[], // Schlusskurs
          const int &Spread[]) // Spread
      {
    //---
        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)
        {
          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("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
          const int Rates_total,// aktuelle Anzahl der Balken
          const int Prev_calculated,// Anzahl der Balken beim letzten Tick
          const double &Close[],// Schlusskurs
          const int &Spread[]) // Spread
      {
    //---
        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("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.

Verwandte Beiträge

Kommentar (0)