#property description "Le script, basé sur l'indicateur RSI, affiche"
#property description "combien de fois le marché était dans les zones"
#property description "de surachat/survente dans l'intervalle de temps spécifié."
//--- affiche la fenêtre des paramètres d'entrée au lancement du script
#property script_show_inputs
//--- paramètres d'entrée
input int InpMAPeriod=14; // Période de la moyenne mobile
input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE; // Type du prix
input double InpOversoldValue=30.0; // Niveau de survente
input double InpOverboughtValue=70.0; // Niveau de surachat
input datetime InpDateStart=D'2012.01.01 00:00'; // Date de début d'analyse
input datetime InpDateFinish=D'2013.01.01 00:00'; // Date de fin d'analyse
//+------------------------------------------------------------------+
//| Fonction de démarrage du script |
//+------------------------------------------------------------------+
void OnStart()
{
double rsi_buff[]; // tableau des valeurs de l'indicateur
int size=0; // taille du tableau
//--- récupère le handle de l'indicateur RSI
ResetLastError();
int rsi_handle=iRSI(Symbol(),Period(),InpMAPeriod,InpAppliedPrice);
if(rsi_handle==INVALID_HANDLE)
{
//--- échec de récupération du handle de l'indicateur
PrintFormat("Erreur de récupération du handle de l'indicateur. Code d'erreur = %d",GetLastError());
return;
}
//--- boucle tant que toutes les valeurs de l'indicateur n'ont pas été calculées
while(BarsCalculated(rsi_handle)==-1)
{
//--- sort si l'indicateur a été arrêté
if(IsStopped())
return;
//--- pause pour permettre à l'indicateur de calculer toutes ses valeurs
Sleep(10);
}
//--- copie les valeurs de l'indicateur pour un certain intervalle de temps
ResetLastError();
if(CopyBuffer(rsi_handle,0,InpDateStart,InpDateFinish,rsi_buff)==-1)
{
PrintFormat("Echec de la copie des valeurs de l'indicateur. Code d'erreur = %d",GetLastError());
return;
}
//--- récupère la taille du tableau
size=ArraySize(rsi_buff);
//--- trie le tableau
ArraySort(rsi_buff);
//--- recherche du temps passé (en pourcentage) par le marché en zone de survente
double ovs=(double)ArrayBsearch(rsi_buff,InpOversoldValue)*100/(double)size;
//--- recherche du temps passé (en pourcentage) par le marché en zone de surachat
double ovb=(double)(size-ArrayBsearch(rsi_buff,InpOverboughtValue))*100/(double)size;
//--- crée les chaînes de caractères pour l'affichage des données
string str="De "+TimeToString(InpDateStart,TIME_DATE)+" à "
+TimeToString(InpDateFinish,TIME_DATE)+" le marché était :";
string str_ovb="en zone de surachat "+DoubleToString(ovb,2)+"% du temps";
string str_ovs="en zone de survente "+DoubleToString(ovs,2)+"% du temps";
//--- affiche les données sur le graphique
CreateLabel("top",5,60,str,clrDodgerBlue);
CreateLabel("suracheté",5,35,str_ovb,clrDodgerBlue);
CreateLabel("survendu",5,10,str_ovs,clrDodgerBlue);
//--- redéssine le graphique
ChartRedraw(0);
//--- pause
Sleep(10000);
}
//+------------------------------------------------------------------+
//| Affiche le commentaire dans le coin inférieur gauche du graphique|
//+------------------------------------------------------------------+
void CreateLabel(const string name,const int x,const int y,
const string str,const color clr)
{
//--- crée l'étiquette
ObjectCreate(0,name,OBJ_LABEL,0,0,0);
//--- lie le lable au coin inférieur gauche
ObjectSetInteger(0,name,OBJPROP_CORNER,CORNER_LEFT_LOWER);
//--- change la position du point d'ancrage
ObjectSetInteger(0,name,OBJPROP_ANCHOR,ANCHOR_LEFT_LOWER);
//--- distance depuis le point d'ancrage dans la direction X
ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x);
//--- distance depuis le point d'ancrage dans la direction Y
ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y);
//--- texte de l'étiquette
ObjectSetString(0,name,OBJPROP_TEXT,str);
//--- couleur du texte
ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
//--- taille du texte
ObjectSetInteger(0,name,OBJPROP_FONTSIZE,12);
}
|