OBJ_ELLIOTWAVE5

Vague d'Impulsion d'Elliot.

ObjElliotWave5

Note

Pour la "Vague d'Impulsion d'Elliott", il est possible d'activer/désactiver le mode de connexion des points par des lignes (propriété OBJPROP_DRAWLINES), mais aussi le niveau de positionnement de la vague (avec l'énumération ENUM_ELLIOT_WAVE_DEGREE).

Exemple

Le script suivant crée et déplace une vague d'impulsion d'Elliott 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 \"Vague d'Impulsion d'Elliott\"."
#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="ElliotWave5";   // nom de l'objet
input int                     InpDate1=10;             // Date du premier point, %
input int                     InpPrice1=90;            // Prix du premier point, %
input int                     InpDate2=20;             // Date du second point, %
input int                     InpPrice2=40;            // Prix du second point, %
input int                     InpDate3=30;             // Date du troisième point, %
input int                     InpPrice3=60;            // Prix du troisième point, %
input int                     InpDate4=40;             // Date du quatrième point, %
input int                     InpPrice4=10;            // Prix du quatrième point, %
input int                     InpDate5=60;             // Date du cinquième point, %
input int                     InpPrice5=40;            // Prix du cinquième, %
input ENUM_ELLIOT_WAVE_DEGREE InpDegree=ELLIOTT_MINOR// Niveau
input bool                    InpDrawLines=true;       // Affichage des lignes
input color                   InpColor=clrRed;         // Couleur des lignes
input ENUM_LINE_STYLE         InpStyle=STYLE_DASH;     // Style des lignes
input int                     InpWidth=2;              // Largeur des lignes
input bool                    InpBack=false;           // Objet en arrière plan
input bool                    InpSelection=true;       // mise en surbrillance pour le déplacement
input bool                    InpHidden=true;          // caché dans la liste des objets
input long                    InpZOrder=0;             // priorité pour le clic de souris
//+----------------------------------------------------------------------------------------------------+
//| Crée une "Vague d'Impulsion d'Elliott" aux coordonnées données                                     |
//+----------------------------------------------------------------------------------------------------+
bool ElliotWave5Create(const long                    chart_ID=0,              // identifiant du graphique
                       const string                  name="ElliotWave5",      // nom de la vague
                       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
                       double                        price2=0,                // prix du deuxième point
                       datetime                      time3=0,                 // heure du troisième point
                       double                        price3=0,                // prix du troisième point
                       datetime                      time4=0,                 // heure du quatrième point
                       double                        price4=0,                // prix du quatrième point
                       datetime                      time5=0,                 // heure du cinquième point
                       double                        price5=0,                // prix du cinquième point
                       const ENUM_ELLIOT_WAVE_DEGREE degree=ELLIOTT_MINUETTE// degré
                       const bool                    draw_lines=true,         // Affichage des lignes
                       const color                   clr=clrRed,              // couleur de l'objet
                       const ENUM_LINE_STYLE         style=STYLE_SOLID,       // Style des lignes
                       const int                     width=1,                 // Largeur des lignes
                       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é pour le clic de souris
  {
//--- définit les coordonnées du point d'ancrage si elles ne sont pas définies
   ChangeElliotWave5EmptyPoints(time1,price1,time2,price2,time3,price3,time4,price4,time5,price5);
//--- réinitialise la valeur d'erreur
   ResetLastError();
//--- Crée une "Vague d'Impulsion d'Elliott" aux coordonnées données
   if(!ObjectCreate(chart_ID,name,OBJ_ELLIOTWAVE5,sub_window,time1,price1,time2,price2,time3,
      price3,time4,price4,time5,price5))
     {
      Print(__FUNCTION__,
            " : échec de création de la \"Vague d'Impulsion d'Elliott\" ! Code d'erreur = ",GetLastError());
      return(false);
     }
//--- définit le degré (taille de la vague)
   ObjectSetInteger(chart_ID,name,OBJPROP_DEGREE,degree);
//--- active (true) ou désactive (false) le mode d'affichage des lignes
   ObjectSetInteger(chart_ID,name,OBJPROP_DRAWLINES,draw_lines);
//--- définit la couleur de l'objet
   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 (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);
//--- 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 Vague d'Impulsion d'Elliott                                       |
//+----------------------------------------------------------------------------------------------------+
bool ElliotWave5PointChange(const long   chart_ID=0,         // identifiant du graphique
                            const string name="ElliotWave5"// nom de l'objet
                            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
   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 Vague d'Impulsion d'Elliott                                                            |
//+----------------------------------------------------------------------------------------------------+
bool ElliotWave5Delete(const long   chart_ID=0,         // identifiant du graphique
                       const string name="ElliotWave5"// nom de l'objet
  {
//--- réinitialise la valeur d'erreur
   ResetLastError();
//--- supprime l'objet
   if(!ObjectDelete(chart_ID,name))
     {
      Print(__FUNCTION__,
            " : échec de la suppression de la \"Vague d'Impulsion d'Elliott\" ! Code d'erreur = ",GetLastError());
      return(false);
     }
//--- exécution réussie
   return(true);
  }
//+----------------------------------------------------------------------------------------------------+
//| Vérifie les valeurs des points d'ancrage de la Vague d'Impulsion d'Elliott                         |
//| et définit les valeurs par défaut des points vides                                                 |
//+----------------------------------------------------------------------------------------------------+
void ChangeElliotWave5EmptyPoints(datetime &time1,double &price1,
                                  datetime &time2,double &price2,
                                  datetime &time3,double &price3,
                                  datetime &time4,double &price4,
                                  datetime &time5,double &price5)
  {
//--- tableau pour récupérer l'heure d'ouverture des 10 dernières barres
   datetime temp[];
   ArrayResize(temp,10);
//--- récupère les données
   CopyTime(Symbol(),Period(),TimeCurrent(),10,temp);
//--- récupère la valeur d'un point du graphique courant
   double point=SymbolInfoDouble(Symbol(),SYMBOL_POINT);
//--- si l'heure du premier point n'est pas définie, il sera placé 9 barres à gauche de la dernière barre
   if(!time1)
      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);
//--- si l'heure du second point n'est pas définie, il sera placé 7 barres à gauche de la dernière barre
   if(!time2)
      time2=temp[2];
//--- si le prix du deuxième point n'est pas défini, le déplace 300 points plus bas que le premier
   if(!price2)
      price2=price1-300*point;
//--- si l'heure du troisième point n'est pas définie, il sera placé 5 barres à gauche de la dernière barre
   if(!time3)
      time3=temp[4];
//--- si le prix du troisième point n'est pas défini, le déplace de 250 points plus bas que le premier
   if(!price3)
      price3=price1-250*point;
//--- si l'heure du quatrième point n'est pas définie, il sera placé 3 barres à gauche de la dernière barre
   if(!time4)
      time4=temp[6];
//--- si le prix du quatrième point n'est pas défini, le déplace de 550 points plus bas que le premier
   if(!price4)
      price4=price1-550*point;
//--- si l'heure du cinquième point n'est pas définie, elle sera définie sur la barre courante
   if(!time5)
      time5=temp[9];
//--- si le prix du cinquième point n'est pas défini, le déplace de 450 points plus bas que le premier
   if(!price5)
      price5=price1-450*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 || 
      InpDate4<0 || InpDate4>100 || InpPrice4<0 || InpPrice4>100 || 
      InpDate5<0 || InpDate5>100 || InpPrice5<0 || InpPrice5>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 l'objet
   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 Vague d'Impulsion d'Elliott
   int d1=InpDate1*(bars-1)/100;
   int d2=InpDate2*(bars-1)/100;
   int d3=InpDate3*(bars-1)/100;
   int d4=InpDate4*(bars-1)/100;
   int d5=InpDate5*(bars-1)/100;
   int p1=InpPrice1*(accuracy-1)/100;
   int p2=InpPrice2*(accuracy-1)/100;
   int p3=InpPrice3*(accuracy-1)/100;
   int p4=InpPrice4*(accuracy-1)/100;
   int p5=InpPrice5*(accuracy-1)/100;
//--- Crée la Vague d'Impulsion d'Elliott
   if(!ElliotWave5Create(0,InpName,0,date[d1],price[p1],date[d2],price[p2],date[d3],price[p3],
      date[d4],price[p4],date[d5],price[p5],InpDegree,InpDrawLines,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
//--- compteur de boucle
   int v_steps=accuracy/5;
//--- déplace le cinquième point d'ancrage
   for(int i=0;i<v_steps;i++)
     {
      //--- utilise la valeur suivante
      if(p5<accuracy-1)
         p5+=1;
      //--- déplace le point
      if(!ElliotWave5PointChange(0,InpName,4,date[d5],price[p5]))
         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
   v_steps=accuracy/5;
//--- déplace le deuxième et le troisième points d'ancrage
   for(int i=0;i<v_steps;i++)
     {
      //--- utilise les valeurs suivantes
      if(p2<accuracy-1)
         p2+=1;
      if(p3>1)
         p3-=1;
      //--- décale les points
      if(!ElliotWave5PointChange(0,InpName,1,date[d2],price[p2]))
         return;
      if(!ElliotWave5PointChange(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();
     }
//--- délai de 1 seconde
   Sleep(1000);
//--- compteur de boucle
   v_steps=accuracy*4/5;
//--- déplace le premier et le quatrième points d'ancrage
   for(int i=0;i<v_steps;i++)
     {
      //--- utilise les valeurs suivantes
      if(p1>1)
         p1-=1;
      if(p4<accuracy-1)
         p4+=1;
      //--- décale les points
      if(!ElliotWave5PointChange(0,InpName,0,date[d1],price[p1]))
         return;
      if(!ElliotWave5PointChange(0,InpName,3,date[d4],price[p4]))
         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 l'objet du graphique
   ElliotWave5Delete(0,InpName);
   ChartRedraw();
//--- délai de 1 seconde
   Sleep(1000);
//---
  }