iMFISignAlert: De ultieme indicator voor MetaTrader 5

Mike 2016.07.20 23:44 48 0 0
Bijlage

De iMFISignAlert is een handige semaphore-pijlindicator die gebruikmaakt van de klassieke Money Flow Index (MFI) oscillator. Deze indicator laat signalen zien wanneer markten overbought of oversold zijn. Een van de belangrijkste kenmerken is dat hij meldingen kan verzenden, zowel via e-mail als push-notificaties op mobiele apparaten.

Er zijn verschillende verbeteringen aangebracht in de code van de indicator om deze meldingen te implementeren:

  1. Nieuwe invoerparameters zijn toegevoegd:
    inputuint AantalBars=1;//Aantal bars voor het signaalinputbool GeluidAan=true; //Meldingen inschakeleninputuint AantalMeldingen=2;//Aantal meldingeninputbool EMailAan=false; //E-mail meldingen inschakeleninputbool PushAan=false; //Push meldingen inschakelen
  2. Drie nieuwe functies zijn toegevoegd aan de indicatorcode: KoopSignaal(), VerkoopSignaal() en GetStringTimeframe():
    //+------------------------------------------------------------------+//| Functie voor koop signaal                                            |//+------------------------------------------------------------------+void KoopSignaal(string SignaalNaam,      // naam van de indicator voor e-mails en pushberichten
                   double &KoopPijl[],        // buffer voor koop signalen
                   constint TotaalBars,     // huidige aantal bars
                   constint Vorig_Berekend,// aantal bars op de vorige tick
                   constdouble &Sluit[],     // sluitprijs
                   constint &Spread[])       // spread
      {
    //---
       staticuint teller=0;
       if(TotaalBars!=Vorig_Berekend) teller=0;
    
       bool KoopSignaal=false;
       bool SerieTest=ArrayGetAsSeries(KoopPijl);
       int index;
       if(SerieTest) index=int(AantalBars);
       else index=TotaalBars-int(AantalBars)-1;
       if(NormalizeDouble(KoopPijl[index],_Digits) && KoopPijl[index]!=EMPTY_VALUE) KoopSignaal=true;
       if(KoopSignaal && teller<=AantalMeldingen)
         {
          teller++;
          MqlDateTime tm;
          TimeToStruct(TimeCurrent(),tm);
          string tekst=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min);
          SerieTest=ArrayGetAsSeries(Sluit);
          if(SerieTest) index=int(AantalBars);
          else index=TotaalBars-int(AantalBars)-1;
          doubleVraag=Sluit[index];
          doubleBod=Sluit[index];
          SerieTest=ArrayGetAsSeries(Spread);
          if(SerieTest) index=int(AantalBars);
          else index=TotaalBars-int(AantalBars)-1;
          Bod+=Spread[index];
          string sVraag=DoubleToString(Vraag,_Digits);
          string sBod=DoubleToString(Bod,_Digits);
          string sPeriode=GetStringTimeframe(ChartPeriod());
          if(GeluidAan) Alert("KOOP signaal \n Vraag=",Vraag,"\n Bod=",Bod,"\n huidig tijd=",tekst,"\n Symbool=",Symbol()," Periode=",sPeriode);
          if(EMailAan) SendMail(SignaalNaam+": KOOP signaal melding","KOOP signaal bij Vraag="+sVraag+", Bod="+sBod+", Datum="+tekst+" Symbool="+Symbol()+" Periode="+sPeriode);
          if(PushAan) SendNotification(SignaalNaam+": KOOP signaal bij Vraag="+sVraag+", Bod="+sBod+", Datum="+tekst+" Symbool="+Symbol()+" Periode="+sPeriode);
         }
    //---
      }
    //+------------------------------------------------------------------+//| Functie voor verkoop signaal                                             |//+------------------------------------------------------------------+void VerkoopSignaal(string SignaalNaam,      // naam van de indicator voor e-mails en pushberichten
                    double &VerkoopPijl[],       // buffer voor verkoop signalen
                    constint TotaalBars,     // huidige aantal bars
                    constint Vorig_Berekend, // aantal bars op de vorige tick
                    constdouble &Sluit[],     // sluitprijs
                    constint &Spread[])       // spread
      {
    //---
       staticuint teller=0;
       if(TotaalBars!=Vorig_Berekend) teller=0;
    
       bool VerkoopSignaal=false;
       bool SerieTest=ArrayGetAsSeries(VerkoopPijl);
       int index;
       if(SerieTest) index=int(AantalBars);
       else index=TotaalBars-int(AantalBars)-1;
       if(NormalizeDouble(VerkoopPijl[index],_Digits) && VerkoopPijl[index]!=EMPTY_VALUE) VerkoopSignaal=true;
       if(VerkoopSignaal && teller<=AantalMeldingen)
         {
          teller++;
          MqlDateTime tm;
          TimeToStruct(TimeCurrent(),tm);
          string tekst=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min);
          SerieTest=ArrayGetAsSeries(Sluit);
          if(SerieTest) index=int(AantalBars);
          else index=TotaalBars-int(AantalBars)-1;
          doubleVraag=Sluit[index];
          doubleBod=Sluit[index];
          SerieTest=ArrayGetAsSeries(Spread);
          if(SerieTest) index=int(AantalBars);
          else index=TotaalBars-int(AantalBars)-1;
          Bod+=Spread[index];
          string sVraag=DoubleToString(Vraag,_Digits);
          string sBod=DoubleToString(Bod,_Digits);
          string sPeriode=GetStringTimeframe(ChartPeriod());
          if(GeluidAan) Alert("VERKOOP signaal \n Vraag=",Vraag,"\n Bod=",Bod,"\n huidig tijd=",tekst,"\n Symbool=",Symbol()," Periode=",sPeriode);
          if(EMailAan) SendMail(SignaalNaam+": VERKOOP signaal melding","VERKOOP signaal bij Vraag="+sVraag+", Bod="+sBod+", Datum="+tekst+" Symbool="+Symbol()+" Periode="+sPeriode);
          if(PushAan) SendNotification(SignaalNaam+": VERKOOP signaal bij Vraag="+sVraag+", Bod="+sBod+", Datum="+tekst+" Symbool="+Symbol()+" Periode="+sPeriode);
         }
    //---
      }
    //+------------------------------------------------------------------+//|  Tijdframe als string verkijgen                                     |//+------------------------------------------------------------------+string GetStringTimeframe(ENUM_TIMEFRAMES timeframe)
      {
    //----
       return(StringSubstr(EnumToString(timeframe),7,-1));
    //----
      }
    
  3. Er zijn een paar aanroepen toegevoegd aan de functies KoopSignaal() en VerkoopSignaal() na de berekeningen van de indicator in het OnCalculate() blok:
    KoopSignaal("iWPRSign",KoopBuffer,totaal_bars,vorig_berekend,sluit,spread);
        VerkoopSignaal("iWPRSign",VerkoopBuffer,totaal_bars,vorig_berekend,sluit,spread);
    

Waar KoopBuffer en VerkoopBuffer de namen zijn van de indicatorbuffers voor het opslaan van de koop- en verkoop signalen. Houd er rekening mee dat lege waarden in de indicatorbuffers als nullen of EMPTY_VALUE moeten worden ingesteld.

Het is de bedoeling dat er slechts één aanroep naar de functies KoopSignaal() en VerkoopSignaal() wordt gebruikt in het OnCalculate() blok van de indicatorcode.

Fig.1. De iMFISignAlert indicator op de grafiek

Fig.1. De iMFISignAlert indicator op de grafiek

Fig.2. De iMFISignAlert indicator. Genereren van meldingen.

Fig.2. De iMFISignAlert indicator. Genereren van meldingen.

Lijst
Reactie 0