Expert Advisors • Indicators • Scripts • Libraries

MQL.RobotFX.org is the biggest collection of MetaTrader expert advisors (MT5 & MT4), indicators, scripts and libraries that can be used to improve trading results, minimize risks or simply automate trading tasks

MetaTrader 4 Indicator | FE Fibo Expansion

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.

MetaTrader Experts, Indicators, Scripts and Libraries

31891