OBJ_STDDEVCHANNEL

Canal de Déviation Standard.

ObjStdDevChannel

Note

Pour le Canal de Déviation Standard, il est possible de spécifier le mode de prolongement de son affichage vers la droite et/ou vers la gauche (propriétés OBJPROP_RAY_RIGHT et OBJPROP_RAY_LEFT respectivement). Le mode de remplissage du canal avec une couleur peut également être défini.

La propriété OBJPROP_DEVIATION est utilisée pour changer la valeur de déviation du canal.

Exemple

Le script suivant crée et déplace un Canal de Déviation Standard sur le graphique. Des fonctions spéciales ont été développées pour créer et modifier les propriétés de l'objet graphique. Vous pouvez utiliser ces fonctions "telles quelles" dans vos propres applications.

 

//--- description
#property description "Le script dessine un objet graphique \"Canal de Déviation Standard\"."
#property description "Les coordonnées du point d'ancrage sont en pourcentage de la taille"
#property description "de la fenêtre du graphique."
//--- affichage de la fenêtre des paramètres d'entrée lors du lancement du script
#property script_show_inputs
//--- paramètres d'entrée du script
input string          InpName="StdDevChannel";   // nom du canal
input int             InpDate1=10;               // Date du premier point, %
input int             InpDate2=40;               // Date du second point, %
input double          InpDeviation=1.0;          // Déviation
input color           InpColor=clrRed;           // Couleur du canal
input ENUM_LINE_STYLE InpStyle=STYLE_DASHDOTDOT// Style des lignes du canal
input int             InpWidth=2;                // largeur des lignes du canal
input bool            InpFill=false;             // Remplissage du canal avec une couleur
input bool            InpBack=false;             // Canal en arrière plan
input bool            InpSelection=true;         // Mise en surbrillance pour déplacer
input bool            InpRayLeft=false;          // Prolongation du canal vers la gauche
input bool            InpRayRight=false;         // Prolongation du canal vers la droite
input bool            InpHidden=true;            // Caché dans la liste des objets
input long            InpZOrder=0;               // Priorité du clic de souris
//+----------------------------------------------------------------------------------------------------+
//| Crée un Canal de Déviation Standard aux coordonnées données                                        |
//+----------------------------------------------------------------------------------------------------+
bool StdDevChannelCreate(const long            chart_ID=0,        // identifiant du graphique
                         const string          name="Channel",    // nom du canal
                         const int             sub_window=0,      // indice de sous-fenêtre 
                         datetime              time1=0,           // heure du premier point
                         datetime              time2=0,           // heure du second point
                         const double          deviation=1.0,     // déviation 
                         const color           clr=clrRed,        // Couleur du canal
                         const ENUM_LINE_STYLE style=STYLE_SOLID// Style des lignes du canal
                         const int             width=1,           // largeur des lignes du canal
                         const bool            fill=false,        // Remplissage du canal avec une couleur
                         const bool            back=false,        // en arrière-plan
                         const bool            selection=true,    // mise en surbrillance pour déplacer
                         const bool            ray_left=false,    // Prolongation du canal vers la gauche
                         const bool            ray_right=false,   // Prolongation du canal vers la droite
                         const bool            hidden=true,       // caché dans la liste des objets
                         const long            z_order=0)         // priorité du clic de souris
  {
//--- définit les coordonnées du point d'ancrage si elles ne sont pas définies
   ChangeChannelEmptyPoints(time1,time2);
//--- réinitialise la valeur d'erreur
   ResetLastError();
//--- crée un canal aux coordonnées données
   if(!ObjectCreate(chart_ID,name,OBJ_STDDEVCHANNEL,sub_window,time1,0,time2,0))
     {
      Print(__FUNCTION__,
            " : échec de création du canal de déviation standard ! Code d'erreur = ",GetLastError());
      return(false);
     }
//--- définit la valeur de la déviation affectant la largeur du canal
   ObjectSetDouble(chart_ID,name,OBJPROP_DEVIATION,deviation);
//--- définit la couleur du canal
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- définit le style des lignes du canal
   ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- définit la largeur des lignes du canal
   ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- active (true) ou désactive (false) le mode de remplissage du canal
   ObjectSetInteger(chart_ID,name,OBJPROP_FILL,fill);
//--- affiche en premier plan (false) ou en arrière-plan (true)
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- active (true) ou désactive (false) le mode de mise en surbrillance du canal pour le déplacement
//--- lors de la création d'un objet graphique utilisant la fonction ObjectCreate, l'objet ne peut pas être
//--- mis en surbrillance et déplacé par défaut. Dans cette méthode, le paramètre de sélection
//--- est vrai par défaut, permettant de mettre en surbrillance et de déplacer l'objet
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- active (true) ou désactive(false) le mode de prolongation de l'affichage du canal vers la gauche
   ObjectSetInteger(chart_ID,name,OBJPROP_RAY_LEFT,ray_left);
//--- active (true) ou désactive(false) le mode de prolongation de l'affichage du canal vers la droite
   ObjectSetInteger(chart_ID,name,OBJPROP_RAY_RIGHT,ray_right);
//--- masque (true) ou affiche (false) le nom de l'objet graphique dans la liste des objets
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- définit la priorité pour recevoir l'événement d'un clic de souris dans le graphique
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- exécution réussie
   return(true);
  }
//+----------------------------------------------------------------------------------------------------+
//| Déplace le point d'ancrage du canal                                                                |
//+----------------------------------------------------------------------------------------------------+
bool StdDevChannelPointChange(const long   chart_ID=0,     // identifiant du graphique
                              const string name="Channel"// nom du canal
                              const int    point_index=0,  // indice du point d'ancrage
                              datetime     time=0)         // coordonnées du point d'ancrage temporel
  {
//--- si l'heure du point n'est pas définie, déplace le point sur la barre courante
   if(!time)
      time=TimeCurrent();
//--- réinitialise la valeur d'erreur
   ResetLastError();
//--- déplace le point d'ancrage
   if(!ObjectMove(chart_ID,name,point_index,time,0))
     {
      Print(__FUNCTION__,
            " : impossible de déplacer le point d'ancrage ! Code d'erreur = ",GetLastError());
      return(false);
     }
//--- exécution réussie
   return(true);
  }
//+----------------------------------------------------------------------------------------------------+
//| Change la déviation du canal                                                                       |
//+----------------------------------------------------------------------------------------------------+
bool StdDevChannelDeviationChange(const long   chart_ID=0,     // identifiant du graphique
                                  const string name="Channel"// nom du canal
                                  const double deviation=1.0)  // déviation
  {
//--- réinitialise la valeur d'erreur
   ResetLastError();
//--- change l'angle de la pente de la ligne de tendance
   if(!ObjectSetDouble(chart_ID,name,OBJPROP_DEVIATION,deviation))
     {
      Print(__FUNCTION__,
            " : échec du changement de déviation du canal ! Code d'erreur = ",GetLastError());
      return(false);
     }
//--- exécution réussie
   return(true);
  }
//+----------------------------------------------------------------------------------------------------+
//| Supprime le canal                                                                                  |
//+----------------------------------------------------------------------------------------------------+
bool StdDevChannelDelete(const long   chart_ID=0,     // identifiant du graphique
                         const string name="Channel"// nom du canal
  {
//--- réinitialise la valeur d'erreur
   ResetLastError();
//--- supprime le canal
   if(!ObjectDelete(chart_ID,name))
     {
      Print(__FUNCTION__,
            " : échec de la suppression du canal ! Code d'erreur = ",GetLastError());
      return(false);
     }
//--- exécution réussie
   return(true);
  }
//+--------------------------------------------------------------------------------------+
//| Vérifie les valeurs des points d'ancrage du canal et définit les valeurs par défaut  |
//| pour les vides                                                                       |
//+--------------------------------------------------------------------------------------+
void ChangeChannelEmptyPoints(datetime &time1,datetime &time2)
  {
//--- si l'heure du deuxième point n'est pas définie, il sera mis sur la barre courante
   if(!time2)
      time2=TimeCurrent();
//--- si l'heure du premier point n'est pas réglée, il est mis 9 barres à gauche du deuxième point
   if(!time1)
     {
      //--- tableau pour recevoir l'heure d'ouverture des 10 dernières barres
      datetime temp[10];
      CopyTime(Symbol(),Period(),time2,10,temp);
      //--- définit le premier point 9 barres à gauche du deuxième
      time1=temp[0];
     }
  }
//+----------------------------------------------------------------------------------------------------+
//| Fonction de démarrage du script                                                                    |
//+----------------------------------------------------------------------------------------------------+
void OnStart()
  {
//--- vérifie l'exactitude des paramètres d'entrée
   if(InpDate1<0 || InpDate1>100 || 
      InpDate2<0 || InpDate2>100)
     {
      Print("Erreur ! Valeurs incorrectes des paramètres d'entrée !");
      return;
     }
//--- nombre de barres visibles dans la fenêtre du graphique
   int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- taille du tableau des prix
   int accuracy=1000;
//--- tableaux pour stocker les valeurs de date et de prix à utiliser
//--- pour définir et changer les coordonnées des points d'ancrage du canal
   datetime date[];
   double   price[];
//--- allocation mémoire
   ArrayResize(date,bars);
   ArrayResize(price,accuracy);
//--- remplit le tableau de dates
   ResetLastError();
   if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
     {
      Print("N'a pas réussi à copier les valeurs de l'heure ! Code d'erreur = ",GetLastError());
      return;
     }
//--- remplit le tableau des prix
//--- trouve les valeurs les plus élevées et les plus faibles du graphique
   double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
   double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- définit un changement de prix et remplit le tableau
   double step=(max_price-min_price)/accuracy;
   for(int i=0;i<accuracy;i++)
      price[i]=min_price+i*step;
//--- définit les points pour dessiner le canal
   int d1=InpDate1*(bars-1)/100;
   int d2=InpDate2*(bars-1)/100;
//--- crée le canal de déviation standard
   if(!StdDevChannelCreate(0,InpName,0,date[d1],date[d2],InpDeviation,InpColor,InpStyle,
      InpWidth,InpFill,InpBack,InpSelection,InpRayLeft,InpRayRight,InpHidden,InpZOrder))
     {
      return;
     }
//--- redéssine le graphique et attend 1 seconde
   ChartRedraw();
   Sleep(1000);
//--- déplace maintenant le canal horizontalement vers la droite et l'étend
//--- compteur de boucle
   int h_steps=bars/2;
//--- déplace le canal
   for(int i=0;i<h_steps;i++)
     {
      //--- utilise les valeurs suivantes
      if(d1<bars-1)
         d1+=1;
      if(d2<bars-1)
         d2+=1;
      //--- déplace les points d'ancrage
      if(!StdDevChannelPointChange(0,InpName,0,date[d1]))
         return;
      if(!StdDevChannelPointChange(0,InpName,1,date[d2]))
         return;
      //--- vérifie si l'exécution du script a été stoppée
      if(IsStopped())
         return;
      //--- redessine le graphique
      ChartRedraw();
      // délai de 0,05 secondes
      Sleep(50);
     }
//--- délai de 1 seconde
   Sleep(1000);
//--- compteur de boucle
   double v_steps=InpDeviation*2;
//--- étend le canal
   for(double i=InpDeviation;i<v_steps;i+=10.0/accuracy)
     {
      if(!StdDevChannelDeviationChange(0,InpName,i))
         return;
      //--- vérifie si l'exécution du script a été stoppée
      if(IsStopped())
         return;
      //--- redessine le graphique
      ChartRedraw();
     }
//--- délai de 1 seconde
   Sleep(1000);
//--- supprime le canal du graphique
   StdDevChannelDelete(0,InpName);
   ChartRedraw();
//--- délai de 1 seconde
   Sleep(1000);
//---
  }