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:
- Nieuwe invoerparameters zijn toegevoegd:
input uint AantalBars=1;//Aantal bars voor het signaal input bool GeluidAan=true; //Meldingen inschakelen input uint AantalMeldingen=2;//Aantal meldingen input bool EMailAan=false; //E-mail meldingen inschakelen input bool PushAan=false; //Push meldingen inschakelen
- 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 const int TotaalBars, // huidige aantal bars const int Vorig_Berekend,// aantal bars op de vorige tick const double &Sluit[], // sluitprijs const int &Spread[]) // spread { //--- static uint 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; double Vraag=Sluit[index]; double Bod=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 const int TotaalBars, // huidige aantal bars const int Vorig_Berekend, // aantal bars op de vorige tick const double &Sluit[], // sluitprijs const int &Spread[]) // spread { //--- static uint 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; double Vraag=Sluit[index]; double Bod=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)); //---- }
- 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.2. De iMFISignAlert indicator. Genereren van meldingen.
Gerelateerde berichten
- Prijs in het Poolse Coördinatensysteem - Indicator voor MetaTrader 5
- ATR Geïntegreerde Laguerre RSI Indicator voor MetaTrader 5
- MultiLineMovingAverage: De Must-Have Indicator voor MetaTrader 5
- ATR Geïndividualiseerde EMA: De Slimme Indicator voor MetaTrader 5
- MFI Berekenen met de Ringbuffer in MetaTrader 5