Bienvenue à tous les traders ! Aujourd'hui, je vais vous parler de l'indicateur DSSBressertSignAlert, un outil puissant pour MetaTrader 5 qui vous permet de recevoir des alertes directement sur votre plateforme. Grâce à cet indicateur, vous serez notifié par e-mail et push sur vos appareils mobiles, ce qui est idéal pour ne rien rater des opportunités de trading.
Pour mettre en place cet outil, plusieurs modifications ont été apportées au code de l'indicateur afin d'intégrer ces alertes :
- Ajout 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'email pour le signalinputbool PushON=false; // Activer l'envoi de signal aux appareils mobiles
- Ajout de trois nouvelles fonctions à la fin du code de l'indicateur : BuySignal(), SellSignal() et GetStringTimeframe()
//+------------------------------------------------------------------+//| Fonction de signal d'achat |//+------------------------------------------------------------------+void BuySignal(string SignalSirname,// Nom de l'indicateur pour les alertes double &BuyArrow[],// Buffer d'indicateur avec les signaux d'achat constint Rates_total,// Nombre actuel de barres constint Prev_calculated,// Nombre de barres sur le 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," currtime=",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,// Nom de l'indicateur pour les alertes double &SellArrow[],// Buffer d'indicateur avec les signaux de vente constint Rates_total,// Nombre actuel de barres constint Prev_calculated,// Nombre de barres sur le 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," currtime=",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 en tant que chaîne |//+------------------------------------------------------------------+string GetStringTimeframe(ENUM_TIMEFRAMES timeframe) { //---- return(StringSubstr(EnumToString(timeframe),7,-1)); //---- }
- Appel des fonctionsBuySignal() et SellSignal() après les cycles de calcul de l'indicateur dans le bloc OnCalculate()
//--- BuySignal("DSSBressertSignAlert",BuyBuffer,rates_total,prev_calculated,close,spread); SellSignal("DSSBressertSignAlert",SellBuffer,rates_total,prev_calculated,close,spread); //---
Les BuyBuffer et SellBuffer sont les noms des buffers d'indicateur pour stocker les signaux d'achat et de vente. Les valeurs vides dans les buffers d'indicateur doivent être soit des zéros, soit EMPTY_VALUE.
Il est prévu qu'un seul appel aux fonctions BuySignal() et SellSignal() sera utilisé dans le bloc OnCalculate() du code de l'indicateur.
L'indicateur utilise les classes de la bibliothèque SmoothAlgorithms.mqh. Vous devez la copier dans le dossier <terminal_data_folder>\MQL5\Include. L'utilisation de ces classes est décrite en détail dans l'article "Averaging Price Series for Intermediate Calculations Without Using Additional Buffers".

Fig.1. L'indicateur DSSBressertSignAlert sur le graphique
Fig.2. L'indicateur DSSBressertSignAlert. Génération d'alertes.


Commentaire 0