OBJ_GANNGRID

Grille de Gann.

ObjGannGrid

Note

Pour la Grille de Gann, il est possible de spécifier le type de tendance avec l'énumération ENUM_GANN_DIRECTION. En ajustant la valeur de l'échelle (OBJPROP_SCALE), il est possible de changer l'angle de pente des lignes de la grille.

Exemple

Le script suivant crée et déplace la Grille de Gann 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 \"Grille de Gann\"."
#property description "Les coordonnées du point d'ancrage de la grille 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="GannGrid";        // Nom de la grille
input int             InpDate1=15;               // Date du premier point, %
input int             InpPrice1=25;              // Prix du premier point, %
input int             InpDate2=35;               // Date du second point, %
input double          InpScale=3.0;              // Echelle
input bool            InpDirection=false;        // Direction de la tendance
input color           InpColor=clrRed;           // Couleur de la grille
input ENUM_LINE_STYLE InpStyle=STYLE_DASHDOTDOT// Style des lignes de la grille
input int             InpWidth=1;                // Largeur des lignes de l'éventail
input bool            InpBack=false;             // Grille en 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 la Grille de Gann                                                                             |
//+----------------------------------------------------------------------------------------------------+
bool GannGridCreate(const long            chart_ID=0,        // identifiant du graphique
                    const string          name="GannGrid",   // Nom de la grille
                    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 deuxième point
                    const double          scale=1.0,         // Echelle
                    const bool            direction=true,    // direction de la tendance
                    const color           clr=clrRed,        // Couleur de la grille
                    const ENUM_LINE_STYLE style=STYLE_SOLID// Style des lignes de la grille
                    const int             width=1,           // largeur des lignes de la grille
                    const bool            back=false,        // en arrière-plan
                    const bool            selection=true,    // mise en surbrillance pour le déplacement
                    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
   ChangeGannGridEmptyPoints(time1,price1,time2);
//--- réinitialise la valeur d'erreur
   ResetLastError();
//--- crée la Grille de Gann aux coordonnées données
   if(!ObjectCreate(chart_ID,name,OBJ_GANNGRID,sub_window,time1,price1,time2,0))
     {
      Print(__FUNCTION__,
            " : échec de création de la \"Grille de Gann\" ! Code d'erreur = ",GetLastError());
      return(false);
     }
//--- change l'échelle (nombre de pips par barre)
   ObjectSetDouble(chart_ID,name,OBJPROP_SCALE,scale);
//--- change la direction de la tendance de l'Eventail de Gann (true - baissière, false - haussière)
   ObjectSetInteger(chart_ID,name,OBJPROP_DIRECTION,direction);
//--- définit la couleur de la grille
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- définit le style d'affichage des lignes de la grille
   ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- définit la largeur des lignes de la grille
   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 mise en surbrillance de la grille 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);
//--- 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 Grille de Gann                                                    |
//+----------------------------------------------------------------------------------------------------+
bool GannGridPointChange(const long   chart_ID=0,      // identifiant du graphique
                         const string name="GannGrid"// Nom de la grille
                         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éplace le point d'ancrage de la grille
   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);
  }
//+----------------------------------------------------------------------------------------------------+
//| Change l'échelle de la Grille de Gann                                                              |
//+----------------------------------------------------------------------------------------------------+
bool GannGridScaleChange(const long   chart_ID=0,      // identifiant du graphique
                         const string name="GannGrid"// grilles
                         const double scale=1.0)       // Echelle
  {
//--- réinitialise la valeur d'erreur
   ResetLastError();
//--- change l'échelle (nombre de pips par barre)
   if(!ObjectSetDouble(chart_ID,name,OBJPROP_SCALE,scale))
     {
      Print(__FUNCTION__,
            " : échec de changement de l'échelle ! Code d'erreur = ",GetLastError());
      return(false);
     }
//--- exécution réussie
   return(true);
  }
//+----------------------------------------------------------------------------------------------------+
//| Change la direction de la tendance de la Grille de Gann                                            |
//+----------------------------------------------------------------------------------------------------+
bool GannGridDirectionChange(const long   chart_ID=0,      // identifiant du graphique
                             const string name="GannGrid"// Nom de la grille
                             const bool   direction=true)  // direction de la tendance
  {
//--- réinitialise la valeur d'erreur
   ResetLastError();
//--- change la direction de la tendance de la Grille de Gann
   if(!ObjectSetInteger(chart_ID,name,OBJPROP_DIRECTION,direction))
     {
      Print(__FUNCTION__,
            " : échec de changement de l'échelle ! Code d'erreur = ",GetLastError());
      return(false);
     }
//--- exécution réussie
   return(true);
  }
//+----------------------------------------------------------------------------------------------------+
//| La fonction supprime l'Eventail de Gann du graphique                                               |
//+----------------------------------------------------------------------------------------------------+
bool GannGridDelete(const long   chart_ID=0,      // identifiant du graphique
                    const string name="GannGrid"// Nom de la grille
  {
//--- réinitialise la valeur d'erreur
   ResetLastError();
//--- supprime la Grille de Gann
   if(!ObjectDelete(chart_ID,name))
     {
      Print(__FUNCTION__,
            " : échec de suppression de la \"Grille de Gann\" ! Code d'erreur = ",GetLastError());
      return(false);
     }
//--- exécution réussie
   return(true);
  }
//+----------------------------------------------------------------------------------------------------+
//| Vérifie les valeurs des points d'ancrage de la Grille de Gann et définit la valeur                 |
//| par défaut des points vides                                                                        |
//+----------------------------------------------------------------------------------------------------+
void ChangeGannGridEmptyPoints(datetime &time1,double &price1,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];
     }
//--- si le prix du premier point n'est pas défini, il aura la valeur Bid
   if(!price1)
      price1=SymbolInfoDouble(Symbol(),SYMBOL_BID);
  }
//+----------------------------------------------------------------------------------------------------+
//| 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)
     {
      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 de la grille
   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 Grille de Gann
   int d1=InpDate1*(bars-1)/100;
   int d2=InpDate2*(bars-1)/100;
   int p1=InpPrice1*(accuracy-1)/100;
//--- crée la Grille de Gann
   if(!GannGridCreate(0,InpName,0,date[d1],price[p1],date[d2],InpScale,InpDirection,
      InpColor,InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
     {
      return;
     }
//--- redéssine le graphique et attend 1 seconde
   ChartRedraw();
   Sleep(1000);
//--- déplace maintenant les points d'ancrage de la grille
//--- compteur de boucle
   int v_steps=accuracy/4;
//--- déplace le premier point d'ancrage verticalement
   for(int i=0;i<v_steps;i++)
     {
      //--- utilise la valeur suivante
      if(p1<accuracy-1)
         p1+=1;
      if(!GannGridPointChange(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/4;
//--- déplace le deuxième point horizontalement
   for(int i=0;i<h_steps;i++)
     {
      //--- utilise la valeur suivante
      if(d2<bars-1)
         d2+=1;
      if(!GannGridPointChange(0,InpName,1,date[d2],0))
         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);
//--- change la direction de la tendance de la grille en tendance baissière
   GannGridDirectionChange(0,InpName,true);
//--- redessine le graphique
   ChartRedraw();
//--- délai de 1 seconde
   Sleep(1000);
//--- supprime la grille du graphique
   GannGridDelete(0,InpName);
   ChartRedraw();
//--- délai de 1 seconde
   Sleep(1000);
//---
  }