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.