OBJ_ARROWED_LINE

Ligne flêchée.

ObjArrowedLine

Exemple

Le script suivant crée et déplace la ligne flêchée 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 \"Ligne flêchée\" objet graphique."
#property description "Les coordonnées du point d'ancrage sont définies en pourcentage de"
#property description "la taille 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="ArrowedLine"// Nom de la ligne
input int             InpDate1=35;           // date du 1er point, %
input int             InpPrice1=60;          // prix du 1er point, %
input int             InpDate2=65;           // date du 2ème point, %
input int             InpPrice2=40;          // prix du 2ème point, %
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            InpHidden=true;        // Caché dans la liste des objets
input long            InpZOrder=0;           // Priorité du clic de souris
//+----------------------------------------------------------------------------------------------------+
//| Crée une ligne flêchée aux coordonnées données                                                     |
//+----------------------------------------------------------------------------------------------------+
bool ArrowedLineCreate(const long            chart_ID=0,         // identifiant du graphique
                       const string          name="ArrowedLine"// nom de la ligne
                       const int             sub_window=0,       // indice de sous-fenêtre
                       datetime              time1=0,            // heure du 1er point
                       double                price1=0,           // prix du 1er point
                       datetime              time2=0,            // heure du 2nd point
                       double                price2=0,           // prix du 2nd point
                       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 déplacer
                       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
   ChangeArrowedLineEmptyPoints(time1,price1,time2,price2);
//--- réinitialise la valeur d'erreur
   ResetLastError();
//--- crée une ligne flêchée aux coordonnées données
   if(!ObjectCreate(chart_ID,name,OBJ_ARROWED_LINE,sub_window,time1,price1,time2,price2))
     {
      Print(__FUNCTION__,
            " : n'a pas réussi à créer une ligne flêchée ! Code d'erreur = ",GetLastError());
      return(false);
     }
//--- définit la couleur de la ligne
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- définit le style d'affichage 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);
//--- 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 de la ligne flêchée                                                     |
//+----------------------------------------------------------------------------------------------------+
bool ArrowedLinePointChange(const long   chart_ID=0,         // identifiant du graphique
                            const string name="ArrowedLine"// nom de la ligne 
                            const int    point_index=0,      // indice du point d'ancrage
                            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éplacez le point d'ancrage de la ligne
   if(!ObjectMove(chart_ID,name,point_index,time,price))
     {
      Print(__FUNCTION__,
            " : impossible de déplacer le point d'ancrage ! Code d'erreur = ",GetLastError());
      return(false);
     }
//--- exécution réussie
   return(true);
  }
//+----------------------------------------------------------------------------------------------------+
//| La fonction supprime la ligne flêchée du graphique                                                 |
//+----------------------------------------------------------------------------------------------------+
bool ArrowedLineDelete(const long   chart_ID=0,         // identifiant du graphique
                       const string name="ArrowedLine"// nom de la ligne
  {
//--- réinitialise la valeur d'erreur
   ResetLastError();
//--- supprime une ligne flêchée
   if(!ObjectDelete(chart_ID,name))
     {
      Print(__FUNCTION__,
            " : n'a pas réussi à créer une ligne flêchée ! Code d'erreur = ",GetLastError());
      return(false);
     }
//--- exécution réussie
   return(true);
  }
//+----------------------------------------------------------------------------------------------------+
//| Vérifie les valeurs du point d'ancrage et définit les valeurs par défaut                           |
//| pour les points vides                                                                              |
//+----------------------------------------------------------------------------------------------------+
void ChangeArrowedLineEmptyPoints(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);
//--- si l'heure du second point n'est pas réglée, elle se trouve à 9 barres de la seconde
   if(!time2)
     {
      //--- tableau pour recevoir l'heure d'ouverture des 10 dernières barres
      datetime temp[10];
      CopyTime(Symbol(),Period(),time1,10,temp);
      //--- Positionne le deuxième point à 9 barres à gauche du premier
      time2=temp[0];
     }
//--- si le prix du deuxième point n'est pas défini, il est égal à celui du premier point
   if(!price2)
      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 || 
      InpDate2<0 || InpDate2>100 || InpPrice2<0 || InpPrice2>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 d2=InpDate2*(bars-1)/100;
   int p1=InpPrice1*(accuracy-1)/100;
   int p2=InpPrice2*(accuracy-1)/100;
//--- crée une ligne flêchée
   if(!ArrowedLineCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],
      InpColor,InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
     {
      return;
     }
//--- redéssine le graphique et attend 1 seconde
   ChartRedraw();
   Sleep(1000);
//--- maintenant, déplacez les points d'ancrage de la ligne
//--- compteur de boucle
   int v_steps=accuracy/5;
//--- déplacez le second point d'ancrage à la verticale
   for(int i=0;i<v_steps;i++)
     {
      //--- utilise la valeur suivante
      if(p2<accuracy-1)
         p2+=1;
      //--- déplace le point
      if(!ArrowedLinePointChange(0,InpName,1,date[d2],price[p2]))
         return;
      //--- vérifie si l'exécution du script a été stoppée
      if(IsStopped())
         return;
      //--- redessine le graphique
      ChartRedraw();
     }
//--- déplace le premier point d'ancrage verticalement
   for(int i=0;i<v_steps;i++)
     {
      //--- utilise la valeur suivante
      if(p1>1)
         p1-=1;
      //--- déplace le point
      if(!ArrowedLinePointChange(0,InpName,0,date[d1],price[p1]))
         return;
      //--- vérifie si l'exécution du script a été stoppée
      if(IsStopped())
         return;
      //--- redessine le graphique
      ChartRedraw();
     }
//--- délai d'une demie seconde
   Sleep(500);
//--- compteur de boucle
   int h_steps=bars/2;
//--- déplacez les deux points d'ancrage horizontalement en même temps
   for(int i=0;i<h_steps;i++)
     {
      //--- utilise les valeurs suivantes
      if(d1<bars-1)
         d1+=1;
      if(d2>1)
         d2-=1;
      //--- décale les points
      if(!ArrowedLinePointChange(0,InpName,0,date[d1],price[p1]))
         return;
      if(!ArrowedLinePointChange(0,InpName,1,date[d2],price[p2]))
         return;
      //--- vérifie si l'exécution du script a été stoppée
      if(IsStopped())
         return;
      //--- redessine le graphique
      ChartRedraw();
      // délai de 0.03 secondes
      Sleep(30);
     }
//--- délai de 1 seconde
   Sleep(1000);
//--- supprime une ligne flêchée
   ArrowedLineDelete(0,InpName);
   ChartRedraw();
//--- délai de 1 seconde
   Sleep(1000);
//---
  }