OBJ_PITCHFORK

Fourchette d'Andrews

ObjPitchfork

Note

Pour la Fourchette d'Andrews, 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).

Vous pouvez également spécifier le nombre de lignes-niveaux, leurs valeurs et leurs couleurs.

Exemple

Le script suivant crée et déplace une Fourchette d'Andrews 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 \"Fourchette d'Andrews\"."
#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="Pitchfork";  // Nom de la fourchette
input int             InpDate1=14;          // Date du premier point, %
input int             InpPrice1=40;         // Prix du premier point, %
input int             InpDate2=18;          // Date du second point, %
input int             InpPrice2=50;         // Prix du second point, %
input int             InpDate3=18;          // Date du troisième point, %
input int             InpPrice3=30;         // Prix du troisième point, %
input color           InpColor=clrRed;      // Couleur de la fourchette
input ENUM_LINE_STYLE InpStyle=STYLE_SOLID// Style de ligne de la fourchette
input int             InpWidth=1;           // Largeur de ligne de la fourchette
input bool            InpBack=false;        // Arrière-plan de la fourchette
input bool            InpSelection=true;    // Mise en surbrillance pour déplacer
input bool            InpRayLeft=false;     // Prolongement de la Fourchette vers la gauche
input bool            InpRayRight=false;    // Prolongement de la Fourchette vers la droite
input bool            InpHidden=true;       // Caché de la liste des objets
input long            InpZOrder=0;          // Priorité du clic de souris
//+----------------------------------------------------------------------------------------------------+
//| Crée la Fourchette d'Andrews aux coordonnées données                                               |
//+----------------------------------------------------------------------------------------------------+
bool PitchforkCreate(const long            chart_ID=0,        // identifiant du graphique
                     const string          name="Pitchfork",  // nom de la fourchette
                     const int             sub_window=0,      // indice de sous-fenêtre 
                     datetime              time1=0,           // heure du premier point
                     double                price1=0,          // prix du premier point
                     datetime              time2=0,           // heure du second point
                     double                price2=0,          // prix du second point
                     datetime              time3=0,           // heure du troisième point
                     double                price3=0,          // prix du troisième point
                     const color           clr=clrRed,        // couleur des lignes de la fourchette
                     const ENUM_LINE_STYLE style=STYLE_SOLID// style des lignes de la fourchette
                     const int             width=1,           // largeur des lignes de la fourchette
                     const bool            back=false,        // en arrière-plan
                     const bool            selection=true,    // mise en surbrillance pour déplacer
                     const bool            ray_left=false,    // Prolongement de la Fourchette vers la gauche
                     const bool            ray_right=false,   // Prolongement de la Fourchette 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,price1,time2,price2,time3,price3);
//--- réinitialise la valeur d'erreur
   ResetLastError();
//--- crée la Fourchette d'Andrews par les coordonnées données
   if(!ObjectCreate(chart_ID,name,OBJ_PITCHFORK,sub_window,time1,price1,time2,price2,time3,price3))
     {
      Print(__FUNCTION__,
            ": impossible de créer \"Fourchette d'Andrews\"! Code d'erreur = ",GetLastError());
      return(false);
     }
//--- définit la couleur
   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 des lignes
   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 (vrai) ou désactive (faux) le mode de mise en surbrillance de la fourchette en 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 de la fourchette 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 fourchette 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éfinit le nombre de niveaux de la Fourchette d'Andrews et leurs paramètres                        |
//+----------------------------------------------------------------------------------------------------+
bool PitchforkLevelsSet(int             levels,           // nombre de lignes de niveaux
                        double          &values[],        // valeurs des lignes de niveaux
                        color           &colors[],        // couleur des lignes de niveaux
                        ENUM_LINE_STYLE &styles[],        // style des lignes de niveaux
                        int             &widths[],        // largeur des lignes de niveaux
                        const long      chart_ID=0,       // identifiant du graphique
                        const string    name="Pitchfork"// nom de la fourchette
  {
//--- vérifie les tailles des tableaux
   if(levels!=ArraySize(colors) || levels!=ArraySize(styles) ||
      levels!=ArraySize(widths) || levels!=ArraySize(widths))
     {
      Print(__FUNCTION__," : la taille du tableau ne correspond pas au nombre de niveaux, erreur !");
      return(false);
     }
//--- définit le nombre de niveaux
   ObjectSetInteger(chart_ID,name,OBJPROP_LEVELS,levels);
//--- définit les propriétés des niveaux dans la boucle
   for(int i=0;i<levels;i++)
     {
      //--- valeur du niveau
      ObjectSetDouble(chart_ID,name,OBJPROP_LEVELVALUE,i,values[i]);
      //--- couleur du niveau
      ObjectSetInteger(chart_ID,name,OBJPROP_LEVELCOLOR,i,colors[i]);
      //--- style du niveau
      ObjectSetInteger(chart_ID,name,OBJPROP_LEVELSTYLE,i,styles[i]);
      //--- largeur du niveau
      ObjectSetInteger(chart_ID,name,OBJPROP_LEVELWIDTH,i,widths[i]);
      //--- description du niveau
      ObjectSetString(chart_ID,name,OBJPROP_LEVELTEXT,i,DoubleToString(100*values[i],1));
     }
//--- exécution réussie
   return(true);
  }
//+----------------------------------------------------------------------------------------------------+
//| Déplace le point d'ancrage de la Fourchette d'Andrews                                              |
//+----------------------------------------------------------------------------------------------------+
bool PitchforkPointChange(const long   chart_ID=0,       // identifiant du graphique
                          const string name="Pitchfork"// nom du canal
                          const int    point_index=0,    // indice du point d'ancrage
                          datetime     time=0,           // coordonnée horaire du point d'ancrage
                          double       price=0)          // coordonnée prix du point d'ancrage
  {
//--- 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
   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);
  }
//+----------------------------------------------------------------------------------------------------+
//| Supprime la Fourchette d'Andrews                                                                   |
//+----------------------------------------------------------------------------------------------------+
bool PitchforkDelete(const long   chart_ID=0,       // identifiant du graphique
                     const string name="Pitchfork"// nom du canal
  {
//--- réinitialise la valeur d'erreur
   ResetLastError();
//--- supprime le canal
   if(!ObjectDelete(chart_ID,name))
     {
      Print(__FUNCTION__,
            " : impossible de supprimer la \"Fourchette d'Andrews\"! Code d'erreur = ",GetLastError());
      return(false);
     }
//--- exécution réussie
   return(true);
  }
//+------------------------------------------------------------------------------------------------+
//| Vérifie les valeurs des points d'ancrage de la Fourchette d'Andrews et définit la valeur       |
//| par défaut des points vides                                                                    |
//+------------------------------------------------------------------------------------------------+
void ChangeChannelEmptyPoints(datetime &time1,double &price1,datetime &time2,
                              double &price2,datetime &time3,double &price3)
  {
//--- si l'heure du deuxième (supérieur droit) point n'est pas définie, il sera sur la barre courante
   if(!time2)
      time2=TimeCurrent();
//--- si le prix du deuxième point n'est pas défini, il aura la valeur Bid
   if(!price2)
      price2=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- si l'heure du premier (gauche) point n'est pas définie, il est positionné 9 barres à gauche du second
   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];
     }
//--- si le prix du premier point n'est pas défini, le déplace 200 points plus bas que le second point
   if(!price1)
      price1=price2-200*SymbolInfoDouble(Symbol(),SYMBOL_POINT);
//--- si l'heure du troisième point n'est pas définie, il coincidera avec celle du deuxième point
   if(!time3)
      time3=time2;
//--- si le prix du troisième point n'est pas défini, le déplace de 200 points plus bas que le premier
   if(!price3)
      price3=price1-200*SymbolInfoDouble(Symbol(),SYMBOL_POINT);
  }
//+----------------------------------------------------------------------------------------------------+
//| 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 || 
      InpDate3<0 || InpDate3>100 || InpPrice3<0 || InpPrice3>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 de la Fourchette d'Andrews
   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 Fourchette d'Andrews
   int d1=InpDate1*(bars-1)/100;
   int d2=InpDate2*(bars-1)/100;
   int d3=InpDate3*(bars-1)/100;
   int p1=InpPrice1*(accuracy-1)/100;
   int p2=InpPrice2*(accuracy-1)/100;
   int p3=InpPrice3*(accuracy-1)/100;
//--- crée la fourchette
   if(!PitchforkCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],date[d3],price[p3],
      InpColor,InpStyle,InpWidth,InpBack,InpSelection,InpRayLeft,InpRayRight,InpHidden,InpZOrder))
     {
      return;
     }
//--- redéssine le graphique et attend 1 seconde
   ChartRedraw();
   Sleep(1000);
//--- maintenant, déplace les points d'ancrage de la fourchette
//--- compteur de boucle
   int v_steps=accuracy/10;
//--- déplace le premier point d'ancrage
   for(int i=0;i<v_steps;i++)
     {
      //--- utilise la valeur suivante
      if(p1>1)
         p1-=1;
      //--- déplace le point
      if(!PitchforkPointChange(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 de 1 seconde
   Sleep(1000);
//--- compteur de boucle
   int h_steps=bars/8;
//--- déplace le troisième point d'ancrage
   for(int i=0;i<h_steps;i++)
     {
      //--- utilise la valeur suivante
      if(d3<bars-1)
         d3+=1;
      //--- déplace le point
      if(!PitchforkPointChange(0,InpName,2,date[d3],price[p3]))
         return;
      //--- vérifie si l'exécution du script a été stoppée
      if(IsStopped())
         return;
      //--- redessine le graphique
      ChartRedraw();
      //--- redessine le graphique
      ChartRedraw();
      // délai de 0,05 secondes
      Sleep(50);
     }
//--- délai de 1 seconde
   Sleep(1000);
//--- compteur de boucle
   v_steps=accuracy/10;
//--- déplace le second point d'ancrage
   for(int i=0;i<v_steps;i++)
     {
      //--- utilise la valeur suivante
      if(p2>1)
         p2-=1;
      //--- déplace le point
      if(!PitchforkPointChange(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 1 seconde
   Sleep(1000);
//--- supprime la fourchette du graphique
   PitchforkDelete(0,InpName);
   ChartRedraw();
//--- délai de 1 seconde
   Sleep(1000);
//---
  }