FE Fibo Expansion

Indicators MetaTrader 4 Free

Hello to all traders..

This is FE fibo expansion that I create using 2 object(P[2]) in array that represent their properties for each direction UP or DOWN.

Here is a class look like:

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];

Where for each direction they must have 3 prices A, B and C that is upper, lower and a price between upper and lower.
While, aa, bb, and cc are the bar locations for their respective prices A, B and C earlier.

Then, I used the fractal formula and a little modification to determine the 3 points upper, lower and price between them along with its directions.

I use loop from the recent bar location:

//---

   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;   //this modify B[1] before A[1] exist

                  P[1].bb=i+2;

                 }

              }

            if(n==1)

              {

               if(P[1].C<hi)

                 {

                  P[1].B=hi;   //this B[1] dn

                  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;   //innitial C[0] up

               P[0].cc=i+2;

               m++;

              }

           }

         else

           {

            if(m==2)

              {

               if(P[0].C<hi)

                 {

                  P[0].A=hi;   //this A[0] up

                  P[0].aa=i+2;

                  m=0;

                  stop=true;

                 }

              }

            if(m==1)

              {

               if(P[0].C<hi)

                 {

                  P[0].C=hi;   //this modify C[0] before B[0] exist

                  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;   //this modify B[0]before A[0] exist

                  P[0].bb=i+2;

                 }

              }

            if(m==1)

              {

               if(P[0].C>lo)

                 {

                  P[0].B=lo;   //this B[0] up

                  P[0].bb=i+2;

                  m++;

                 }

               else

                 {

                  m--;

                  P[0].C=0.0;

                 }

              }

           }

         //---

         if(P[1].C==0.0)

           {

            if(n<1)

              {

               P[1].C=lo;   //innitial C[1] dn

               P[1].cc=i+2;

               n++;

              }

           }

         else

           {

            if(n==2)

              {

               if(P[1].C>lo)

                 {

                  P[1].A=lo;   //this A[1] dn

                  P[1].aa=i+2;

                  n=0;

                  stop=true;

                 }

              }

            if(n==1)

              {

               if(P[1].C>lo)

                 {

                  P[1].C=lo;   //this modify C[1] before B[1] exist

                  P[1].cc=i+2;

                 }

              }

           }

         //---

        }

      //else

      //

      //---

      //---

      //---





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

        {

         continue;

        }



     }// loop

If it found 3 points of either UP or DOWN direction, the loop breaks.

I have to take out the 3 points earlier.

   if(P[0].A!=0.0&&P[0].B!=0.0&&P[0].C!=0.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);

     }

And finally draw using OBJ_EXPANSION object..and I use a single function 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)+"  ");

//---

  }

Here, I use

0.618,

1.000,

1.618,

2.618 and

4.236 level.