Accueil Indicateur technique Publication

FE Fibo Expansion : Un Indicateur Pratique pour MetaTrader 4

Pièce jointe
31891.zip (1.76 KB, Télécharger 0 fois)

Bonjour à tous les traders !

Aujourd'hui, je vais vous parler de l'indicateur FE Fibo Expansion, que j'ai développé à l'aide de deux objets (P[2]) dans un tableau représentant les propriétés pour chaque direction, que ce soit en hausse ou en baisse.

Voici à quoi ressemble la classe :

class ___
  {
public:
   int aa,bb,cc;
   double A,B,C;
                     ___():
                     aa(0),bb(0),cc(0),
                     A(0.0),B(0.0),C(0.0)
     {}
                    ~___() {}
  } P[2];

Pour chaque direction, nous avons besoin de trois prix A, B et C qui représentent respectivement le prix supérieur, inférieur et un prix intermédiaire. Les variables aa, bb et cc permettent de localiser les barres pour ces prix.

Ensuite, j'ai utilisé la formule des fractales avec quelques modifications pour déterminer ces trois points, en fonction de leur direction. Pour cela, j'ai mis en place une boucle à partir de la position de la barre la plus récente :

//---
   int i=0;
   int m=0,n=0;
   bool stop=false;
   double hi=0.0,lo=0.0;
//---
   A=0.0;
   B=0.0;
   C=0.0;
   for(m=0,n=0,i=0; i<Bars-5&&!stop; i++)
     {
      hi=(
            iHigh(_Symbol,0,i+2)>=iHigh(_Symbol,0,i+0) &&
            iHigh(_Symbol,0,i+2)>=iHigh(_Symbol,0,i+1) &&
            iHigh(_Symbol,0,i+2)>=iHigh(_Symbol,0,i+3) &&
            iHigh(_Symbol,0,i+2)>=iHigh(_Symbol,0,i+4))
         ?iHigh(_Symbol,0,i+2):0.0;
      lo=(
            iLow(_Symbol,0,i+2)<=iLow(_Symbol,0,i+0) &&
            iLow(_Symbol,0,i+2)<=iLow(_Symbol,0,i+1) &&
            iLow(_Symbol,0,i+2)<=iLow(_Symbol,0,i+3) &&
            iLow(_Symbol,0,i+2)<=iLow(_Symbol,0,i+4))
         ?iLow(_Symbol,0,i+2):0.0;
      //---
      //---
      //--------------------------------------------------------------------------------------------------------------------
      //--------------------------------------------------------------------------------------------------------------------
      if(hi!=0.0)// ------------up------------
        {
         if(P[1].C!=0.0)
           {
            if(n==2)
              {
               if(P[1].B<hi&&P[1].C<P[1].B)
                 {
                  P[1].B=hi;   // cette modification B[1] avant que A[1] n'existe
                P[1].bb=i+2;
              }
            if(n==1)
          {
               if(P[1].C<hi)
                 {
                  P[1].B=hi;   // ceci B[1] en baisse
                  P[1].bb=i+2;
                  n++;
                 }
               else
                 {
                  n--;
                  P[1].C=0.0;
                 }
          }
      }
         //---
        if(P[0].C==0.0)
         {
           if(m<1)
          {
             P[0].C=hi;   // initial C[0] en hausse
             P[0].cc=i+2;
             m++;
          }
         }
         else
         {
          if(m==2)
          {
            if(P[0].C<hi)
                 {
                  P[0].A=hi;   // ceci A[0] en hausse
                  P[0].aa=i+2;
                  m=0;
                  stop=true;
                 }
              }
            if(m==1)
          {
            if(P[0].C<hi)
                 {
                  P[0].C=hi;   // cette modification C[0] avant que B[0] n'existe
                 P[0].cc=i+2;
              }
              }
          }
        //---
        }
      //else
      if(lo!=0.0)// ------------dn------------
        {
         if(P[0].C!=0.0)
           {
            if(m==2)
              {
               if(P[0].B>lo&&P[0].C>P[0].B)
                 {
                  P[0].B=lo;   // cette modification B[0] avant que A[0] n'existe
                P[0].bb=i+2;
                 }
              }
            if(m==1)
          {
            if(P[0].C>lo)
                 {
                  P[0].B=lo;   // ceci B[0] en hausse
                  P[0].bb=i+2;
                  m++;
                 }
                else
                 {
                  m--;
                  P[0].C=0.0;
                 }
              }
      }
         //---
        }
      //else
      if(P[1].C==0.0)
         {
          if(n<1)
          {
             P[1].C=lo;   // initial C[1] en baisse
             P[1].cc=i+2;
             n++;
              }
         }
         else
         {
            if(n==2)
              {
               if(P[1].C>lo)
                 {
                  P[1].A=lo;   // ceci A[1] en baisse
                  P[1].aa=i+2;
                  n=0;
                  stop=true;
                 }
              }
            if(n==1)
              {
               if(P[1].C>lo)
                 {
                  P[1].C=lo;   // cette modification C[1] avant que B[1] n'existe
                 P[1].cc=i+2;
                 }
              }
          }
         //---
        }
      //else
      //
      //---
      //---
      //---

      if((P[0].C==0.0&&P[1].C==0.0)||(hi==0.0&&lo==0.0))
        {
         continue;
        }

     }// boucle

Si la boucle trouve trois points dans une direction (hausse ou baisse), elle se termine.

Je dois ensuite extraire ces trois points.

   if(P[0].A!=0.0&&P[0].B!=0.0&&P[00.0)
     {
      DrawExpansion(tool,"FE ->",Time[P[0].aa],P[0].A,Time[P[0].bb],P[0].B,Time[P[0].cc],P[0].C,-1);
     }
//---
   if(P[1].A!=0.0&&P[1].B!=0.0&&P[1].C!=0.0)
     {
      DrawExpansion(tool,"FE ->",Time[P[1].aa],P[1].A,Time[P[1].bb],P[1].B,Time[P[1].cc],P[1].C,1);
     }

Et enfin, nous dessinons en utilisant l'objet OBJ_EXPANSION, et j'utilise une fonction unique DrawExpansion(...).

void DrawExpansion(string name,string label,datetime t1,double p1,datetime t2,double p2,datetime t3,double p3,int fl=0)
  {
//---
   ObjectDelete(name);
   color wrn=(fl>&0)?clrSkyBlue:(fl<0)?clrTomato:clrWhite;
   if(ObjectFind(0,name)!=0)
      ObjectCreate(name,OBJ_EXPANSION,0,t1,p1,t2,p2,t3,p3);
   ObjectSet(name,OBJPROP_FIBOLEVELS,5);
   ObjectSet(name,OBJPROP_FIRSTLEVEL+0,0.618);
   ObjectSet(name,OBJPROP_FIRSTLEVEL+1,1.000);
   ObjectSet(name,OBJPROP_FIRSTLEVEL+2,1.618);
   ObjectSet(name,OBJPROP_FIRSTLEVEL+3,2.618);
   ObjectSet(name,OBJPROP_FIRSTLEVEL+4,4.236);
//---
   ObjectSet(name,OBJPROP_LEVELCOLOR,clrMediumPurple);
   ObjectSet(name,OBJPROP_LEVELWIDTH,1);
   ObjectSet(name,OBJPROP_LEVELSTYLE,0);
   ObjectSet(name,OBJPROP_COLOR,wrn);
//---
   ObjectSetFiboDescription(name,0,label+"  "+DoubleToStr(0.618*100,1)+"  ");
   ObjectSetFiboDescription(name,1,label+"  "+DoubleToStr(1.000*100,1)+"  ");
   ObjectSetFiboDescription(name,2,label+"  "+DoubleToStr(1.618*100,1)+"  ");
   ObjectSetFiboDescription(name,3,label+"  "+DoubleToStr(2.618*100,1)+"  ");
   ObjectSetFiboDescription(name,4,label+"  "+DoubleToStr(4.236*100,1)+"  ");
//---
  }

Ici, j'utilise les niveaux 0.618, 1.000, 1.618, 2.618 et 4.236.



Articles connexes

Commentaire (0)