Auteur réel :
RoboFx
L'indicateur Balance de Puissance (BOP) est présenté sous forme d'histogramme coloré, représentant la force et la direction de la tendance actuelle. Il offre des alertes, envoie des e-mails et des notifications push sur vos appareils mobiles. La couleur de l'histogramme varie en fonction des paramètres d'entrée définissant les niveaux de surachat et de survente ainsi que la direction de mouvement de l'histogramme.
Pour intégrer les alertes, les messages électroniques et les notifications push, plusieurs modifications ont été apportées au code de l'indicateur :
- Introduction de nouveaux paramètres d'entrée :
//---- Variables d'entrée pour les alertes input uint NombreDeBarres=1; //Numéro de barre pour le signal input bool SonON=true; //Activer les alertes input uint NombreDAlerts=2; //Nombre d'alertes input bool EMailON=false; //Activer l'envoi de signal par e-mail input bool PushON=false; //Activer l'envoi de signal sur appareils mobiles
- Ajout de trois nouvelles fonctions à la fin du code de l'indicateur : BuySignal(), SellSignal() et GetStringTimeframe()
//+------------------------------------------------------------------+ //| Fonction du signal d'achat | //+------------------------------------------------------------------+ void BuySignal(string nomSignal,// texte du nom de l'indicateur pour les messages e-mail et push double &TableauCouleur[],// buffer d'index de couleur int IndexCouleur,// index de couleur dans le buffer d'index de couleur pour générer un signal const int Total_Rates, // le nombre actuel de barres const int Precedent_calculé, // le nombre de barres sur le tick précédent const double &Close[], // prix de clôture const int &Spread[]) // spread { //--- static uint compteur=0; if(Total_Rates!=Precedent_calculé) compteur=0; bool signalAchat=false; bool testSérie=ArrayGetAsSeries(TableauCouleur); int index,index1; if(testSérie) { index=int(NombreDeBarres); index1=index+1; } else { index=Total_Rates-int(NombreDeBarres)-1; index1=index-1; } if(TableauCouleur[index1]!=IndexCouleur && TableauCouleur[index]==IndexCouleur) signalAchat=true; if(signalAchat && compteur<=NombreDAlerts) { compteur++; MqlDateTime tm; TimeToStruct(TimeCurrent(),tm); string texte=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min); testSérie=ArrayGetAsSeries(Close); if(testSérie) index=int(NombreDeBarres); else index=Total_Rates-int(NombreDeBarres)-1; double Ask=Close[index]; double Bid=Close[index]; testSérie=ArrayGetAsSeries(Spread); if(testSérie) index=int(NombreDeBarres); else index=Total_Rates-int(NombreDeBarres)-1; Bid+=Spread[index]; string sAsk=DoubleToString(Ask,_Digits); string sBid=DoubleToString(Bid,_Digits); string sPeriod=GetStringTimeframe(ChartPeriod()); if(SonON) Alert("Signal d'ACHAT Ask=",Ask," Bid=",Bid," currtime=",texte," Symbole=",Symbol()," Période=",sPeriod); if(EMailON) SendMail(nomSignal+": Alerte de signal d'ACHAT","Signal d'achat à Ask="+sAsk+", Bid="+sBid+", Date="+texte+" Symbole="+Symbol()+" Période="+sPeriod); if(PushON) SendNotification(nomSignal+": Signal d'ACHAT à Ask="+sAsk+", Bid="+sBid+", Date="+texte+" Symbole="+Symbol()+" Période="+sPeriod); } //--- } //+------------------------------------------------------------------+ //| Fonction de signal de vente | //+------------------------------------------------------------------+ void SellSignal(string nomSignal, // texte du nom de l'indicateur pour les messages e-mail et push double &TableauCouleur[], // buffer d'index de couleur int IndexCouleur, // index de couleur dans le buffer d'index de couleur pour générer un signal const int Total_Rates, // le nombre actuel de barres const int Precedent_calculé, // le nombre de barres sur le tick précédent const double &Close[], // prix de clôture const int &Spread[]) // spread { //--- static uint compteur=0; if(Total_Rates!=Precedent_calculé) compteur=0; bool signalVente=false; bool testSérie=ArrayGetAsSeries(TableauCouleur); int index,index1; if(testSérie) { index=int(NombreDeBarres); index1=index+1; } else { index=Total_Rates-int(NombreDeBarres)-1; index1=index-1; } if(TableauCouleur[index1]!=IndexCouleur && TableauCouleur[index]==IndexCouleur) signalVente=true; if(signalVente && compteur<=NombreDAlerts) { compteur++; MqlDateTime tm; TimeToStruct(TimeCurrent(),tm); string texte=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min); testSérie=ArrayGetAsSeries(Close); if(testSérie) index=int(NombreDeBarres); else index=Total_Rates-int(NombreDeBarres)-1; double Ask=Close[index]; double Bid=Close[index]; testSérie=ArrayGetAsSeries(Spread); if(testSérie) index=int(NombreDeBarres); else index=Total_Rates-int(NombreDeBarres)-1; Bid+=Spread[index]; string sAsk=DoubleToString(Ask,_Digits); string sBid=DoubleToString(Bid,_Digits); string sPeriod=GetStringTimeframe(ChartPeriod()); if(SonON) Alert("Signal de VENTE Ask=",Ask," Bid=",Bid," currtime=",texte," Symbole=",Symbol()," Période=",sPeriod); if(EMailON) SendMail(nomSignal+": Alerte de signal de VENTE","Signal de vente à Ask="+sAsk+", Bid="+sBid+", Date="+texte+" Symbole="+Symbol()+" Période="+sPeriod); if(PushON) SendNotification(nomSignal+": Signal de VENTE à Ask="+sAsk+", Bid="+sBid+", Date="+texte+" Symbole="+Symbol()+" Période="+sPeriod); } //--- } //+------------------------------------------------------------------+ //| Obtenir le timeframe sous forme de chaîne | //+------------------------------------------------------------------+ string GetStringTimeframe(ENUM_TIMEFRAMES timeframe) { //---- return(StringSubstr(EnumToString(timeframe),7,-1)); //---- }
- Ajout d'appels à BuySignal() et SellSignal() après les cycles de calcul de l'indicateur dans le bloc OnCalculate()
//--- BuySignal("BalanceOfPower_Histogram_Alert",TableauCouleurInd,0,Total_Rates,Precedent_calculé,Close,Spread); SellSignal("BalanceOfPower_Histogram_Alert",TableauCouleurInd,7,Total_Rates,Precedent_calculé,Close,Spread); //---
Où TableauCouleurInd est le nom du buffer d'index de couleur pour stocker la couleur de la bougie sous forme d'index.
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 (copiez-la dans <dossier_de_données_terminal>\MQL5\Include). L'utilisation de ces classes est décrite en détail dans l'article "Moyenne des séries de prix pour des calculs intermédiaires sans utiliser de buffers supplémentaires".
À l'origine, cet indicateur a été écrit en MQL5 et a été publié pour la première fois dans la Base de Code le 07.02.2013.

Fig1. L'indicateur BalanceOfPower_Histogram_Alert sur le graphique
Fig.2. L'indicateur BalanceOfPower_Histogram_Alert générant des alertes.
Articles connexes
- Découvrez l'indicateur Tymen STARC Bands MTF pour MetaTrader 5
- Découvrez l'indicateur 3 en 1 Stochastic pour MetaTrader 5
- Découvrez l'Indicateur Donchian Ultimate pour MT5 : Un Outil Indispensable pour les Traders
- Découvrez le 3XMA_Ichimoku : Un Indicateur Incontournable pour MetaTrader 5
- Découvrez l'indicateur Ultra Spearman Rank Correlation pour MetaTrader 5
