Vous cherchez un indicateur qui vous aide à naviguer dans les zones de surachat et de survente sur MetaTrader 5 ? Ne cherchez pas plus loin ! L'iMFISignAlert est un indicateur basé sur l'oscillateur classique de l'indice de flux monétaire. Il vous alerte avec des notifications par e-mail et des push sur vos appareils mobiles.
Pour intégrer ces alertes, plusieurs modifications ont été apportées au code de l'indicateur :
- Introduction de nouveaux paramètres d'entrée :
inputuint NumberofBar=1;// Nombre de barres pour le signalinputbool SoundON=true; // Activer les alertesinputuint NumberofAlerts=2;// Nombre d'alertesinputbool EMailON=false; // Activer l'envoi d'e-mails pour le signalinputbool PushON=false; // Activer l'envoi de notifications push
- Ajout de trois nouvelles fonctions à la fin du code : BuySignal(), SellSignal() et GetStringTimeframe()
//+------------------------------------------------------------------+//| Fonction de signal d'achat |//+------------------------------------------------------------------+void BuySignal(string SignalSirname, // texte du nom de l'indicateur pour les e-mails et notifications double &BuyArrow[], // tampon d'indicateur avec des signaux d'achat constint Rates_total, // le nombre actuel de barres constint Prev_calculated, // le nombre de barres lors du tick précédent constdouble &Close[], // prix de clôture 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("Signal d'ACHAT Ask=",Ask," Bid=",Bid," heure actuelle=",text," Symbole=",Symbol()," Période=",sPeriod); if(EMailON) SendMail(SignalSirname+": Alerte signal d'ACHAT","Signal d'ACHAT à Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbole="+Symbol()+" Période="+sPeriod); if(PushON) SendNotification(SignalSirname+": Signal d'ACHAT à Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbole="+Symbol()+" Période="+sPeriod); } //--- } //+------------------------------------------------------------------+//| Fonction de signal de vente |//+------------------------------------------------------------------+void SellSignal(string SignalSirname, // texte du nom de l'indicateur pour les e-mails et notifications double &SellArrow[], // tampon d'indicateur avec des signaux de vente constint Rates_total, // le nombre actuel de barres constint Prev_calculated, // le nombre de barres lors du tick précédent constdouble &Close[], // prix de clôture 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("Signal de VENTE Ask=",Ask," Bid=",Bid," heure actuelle=",text," Symbole=",Symbol()," Période=",sPeriod); if(EMailON) SendMail(SignalSirname+": Alerte signal de VENTE","Signal de VENTE à Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbole="+Symbol()+" Période="+sPeriod); if(PushON) SendNotification(SignalSirname+": Signal de VENTE à Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbole="+Symbol()+" Période="+sPeriod); } //--- } //+------------------------------------------------------------------+//| Obtenir la période sous forme de chaîne |//+------------------------------------------------------------------+string GetStringTimeframe(ENUM_TIMEFRAMES timeframe) { //---- return(StringSubstr(EnumToString(timeframe),7,-1)); //---- }
- Ajout d'appels aux fonctions BuySignal() et SellSignal() après les cycles de calcul de l'indicateur dans le bloc OnCalculate()
BuySignal("iWPRSign",BuyBuffer,rates_total,prev_calculated,close,spread); SellSignal("iWPRSign",SellBuffer,rates_total,prev_calculated,close,spread);
Où BuyBuffer et SellBuffer sont les noms des tampons d'indicateur pour stocker les signaux d'achat et de vente. Les valeurs vides dans les tampons d'indicateur doivent être soit des zéros, soit EMPTY_VALUE.
Il est supposé qu'un seul appel aux fonctions BuySignal() et SellSignal() sera utilisé dans le bloc OnCalculate() du code de l'indicateur.

Fig.1. L'indicateur iMFISignAlert sur le graphique

Fig.2. L'indicateur iMFISignAlert. Génération d'alertes.

Commentaire 0