OBJ_TRENDBYANGLE

Ligne de Tendance Angulaire.

ObjTrendByAngle

Note

Pour la "Ligne de Tendance Angulaire", 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).

Pour déterminer la pente de la ligne, il est possible d'utiliser un angle ou les coordonnées du deuxième point d'ancrage.

Exemple

Le script suivant crée et déplace une ligne de tendance 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 l'objet graphique \"Ligne de Tendance Angulaire\"."
#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="Trend";     // Nom de la ligne
input int             InpDate1=50;         // Date du premier point, %
input int             InpPrice1=75;        // Prix du premier point, %
input int             InpAngle=0;          // Angle de pente de la ligne
input color           InpColor=clrRed;     // Couleur de la ligne
input ENUM_LINE_STYLE InpStyle=STYLE_DASH// Style de la ligne
input int             InpWidth=2;          // Largeur de la ligne
input bool            InpBack=false;       // Ligne d'arrière-plan
input bool            InpSelection=true;   // Mise en surbrillance pour déplacer
input bool            InpRayLeft=false;    // Prolongement de la ligne vers la gauche
input bool            InpRayRight=true;    // Prolongement de la ligne vers la droite
input bool            InpHidden=true;      // Caché dans la liste des objets
input long            InpZOrder=0;         // Priorité du clic de souris
//+----------------------------------------------------------------------------------------------------+
//| Crée une ligne de tendance angulaire                                                               |
//+----------------------------------------------------------------------------------------------------+
bool TrendByAngleCreate(const long            chart_ID=0,        // identifiant du graphique
                        const string          name="TrendLine",  // nom de la ligne
                        const int             sub_window=0,      // indice de sous-fenêtre
                        datetime              time=0,            // heure du point
                        double                price=0,           // prix du point
                        const double          angle=45.0,        // angle de pente
                        const color           clr=clrRed,        // couleur de la ligne
                        const ENUM_LINE_STYLE style=STYLE_SOLID// style de la ligne
                        const int             width=1,           // largeur de la ligne
                        const bool            back=false,        // en arrière plan
                        const bool            selection=true,    // mise en surbrillance pour le déplacement
                        const bool            ray_left=false,    // Prolongement de la ligne vers la gauche
                        const bool            ray_right=true,    // Prolongement de la ligne vers la droite
                        const bool            hidden=true,       // caché dans la liste des objets
                        const long            z_order=0)         // priorité pour le clic de souris
  {
//--- crée le second point pour faciliter le déplacement de la ligne de tendance avec la souris
   datetime time2=0;
   double   price2=0;
//--- définit les coordonnées du point d'ancrage si elles ne sont pas définies
   ChangeTrendEmptyPoints(time,price,time2,price2);
//--- réinitialise la valeur d'erreur
   ResetLastError();
//--- crée une ligne de tendance en utilisant 2 points
   if(!ObjectCreate(chart_ID,name,OBJ_TRENDBYANGLE,sub_window,time,price,time2,price2))
     {
      Print(__FUNCTION__,
            " : impossible de créer une ligne de tendance ! Code d'erreur = ",GetLastError());
      return(false);
     }
//--- change l'angle de la pente de la ligne de tendance ; lors du changement d'angle, les coordonnées du deuxième
//--- point de la ligne sont redéfinies automatiquement suivant la nouvelle valeur de l'angle
   ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle);
//--- définit la couleur de la ligne
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- définit le style de la ligne
   ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- définit la largeur de la ligne
   ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- 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 déplacement de la ligne à la souris
//--- 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 de la ligne 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 de la ligne 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);
  }
//+----------------------------------------------------------------------------------------------------+
//| Modifie les coordonnées du point d'ancrage de la ligne de tendance                                 |
//+----------------------------------------------------------------------------------------------------+
bool TrendPointChange(const long   chart_ID=0,       // identifiant du graphique
                      const string name="TrendLine"// nom de la ligne
                      datetime     time=0,           // coordonnées du point d'ancrage temporel
                      double       price=0)          // coordonnées du point d'ancrage prix
  {
//--- si la position du point n'est pas définie, le déplace vers la barre courante du prix Bid
   if(!time)
      time=TimeCurrent();
   if(!price)
      price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- réinitialise la valeur d'erreur
   ResetLastError();
//--- déplace le point d'ancrage de la ligne de tendance
   if(!ObjectMove(chart_ID,name,0,time,price))
     {
      Print(__FUNCTION__,
            " : impossible de déplacer le point d'ancrage ! Code d'erreur = ",GetLastError());
      return(false);
     }
//--- exécution réussie
   return(true);
  }
//+----------------------------------------------------------------------------------------------------+
//| Change l'angle de pente de la ligne de tendance                                                    |
//+----------------------------------------------------------------------------------------------------+
bool TrendAngleChange(const long   chart_ID=0,       // identifiant du graphique
                      const string name="TrendLine"// nom de la ligne de tendance
                      const double angle=45)         // angle de pente de la ligne de tendance
  {
//--- réinitialise la valeur d'erreur
   ResetLastError();
//--- change l'angle de la pente de la ligne de tendance
   if(!ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle))
     {
      Print(__FUNCTION__,
            " : échec de changement de l'angle de pente de la ligne ! Code d'erreur = ",GetLastError());
      return(false);
     }
//--- exécution réussie
   return(true);
  }
//+----------------------------------------------------------------------------------------------------+
//| Supprime la ligne de tendance                                                                      |
//+----------------------------------------------------------------------------------------------------+
bool TrendDelete(const long   chart_ID=0,       // identifiant du graphique
                 const string name="TrendLine"// nom de la ligne
  {
//--- réinitialise la valeur d'erreur
   ResetLastError();
//--- supprime une ligne de tendance
   if(!ObjectDelete(chart_ID,name))
     {
      Print(__FUNCTION__,
            " : impossible de supprimer la ligne de tendance ! Code d'erreur = ",GetLastError());
      return(false);
     }
//--- exécution réussie
   return(true);
  }
//+----------------------------------------------------------------------------------------------------+
//| Vérifie les valeurs des points d'ancrage de la ligne de tendance et définit la valeur              |
//| par défaut des points vides                                                                        |
//+----------------------------------------------------------------------------------------------------+
void ChangeTrendEmptyPoints(datetime &time1,double &price1,
                            datetime &time2,double &price2)
  {
//--- si l'heure du premier point n'est pas définie, elle sera définie sur la barre courante
   if(!time1)
      time1=TimeCurrent();
//--- si le prix du premier point n'est pas défini, il aura la valeur Bid
   if(!price1)
      price1=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- définit les coordonnées du second point auxiliaire
//--- le deuxième point sera 9 barres plus à gauche et aura le même prix
   datetime second_point_time[10];
   CopyTime(Symbol(),Period(),time1,10,second_point_time);
   time2=second_point_time[0];
   price2=price1;
  }
//+----------------------------------------------------------------------------------------------------+
//| Fonction de démarrage du script                                                                    |
//+----------------------------------------------------------------------------------------------------+
void OnStart()
  {
//--- vérifie l'exactitude des paramètres d'entrée
   if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>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 le réglage et la modification des coordonnées des points d'ancrage des lignes
   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 la ligne
   int d1=InpDate1*(bars-1)/100;
   int p1=InpPrice1*(accuracy-1)/100;
//--- crée une ligne de tendance
   if(!TrendByAngleCreate(0,InpName,0,date[d1],price[p1],InpAngle,InpColor,InpStyle,
      InpWidth,InpBack,InpSelection,InpRayLeft,InpRayRight,InpHidden,InpZOrder))
     {
      return;
     }
//--- redéssine le graphique et attend 1 seconde
   ChartRedraw();
   Sleep(1000);
//--- déplace et tourne la ligne
//--- compteur de boucle
   int v_steps=accuracy/2;
//--- déplace le point d'ancrage et change l'angle de pente de la ligne
   for(int i=0;i<v_steps;i++)
     {
      //--- utilise la valeur suivante
      if(p1>1)
         p1-=1;
      //--- déplace le point
      if(!TrendPointChange(0,InpName,date[d1],price[p1]))
         return;
      if(!TrendAngleChange(0,InpName,18*(i+1)))
         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 du graphique
   TrendDelete(0,InpName);
   ChartRedraw();
//--- délai de 1 seconde
   Sleep(1000);
//---
  }