MetaTrader 4 / Indicatori

FE Fibo Expansion - indicatore per MetaTrader 4

23318
(18)

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.