Home Technische indicator Bericht

FE Fibo Expansion: De Indicator voor MetaTrader 4

Bijlage
31891.zip (1.76 KB, Downloaden 0 keer)

Hallo traders!

Vandaag wil ik je graag kennis laten maken met de FE Fibo Expansion, een indicator die ik heb ontwikkeld met behulp van twee objecten in een array. Deze objecten vertegenwoordigen de verschillende eigenschappen van de prijsbeweging, zowel omhoog als omlaag.

Hier ziet het klasse-ontwerp eruit:

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

Voor elke richting moeten er drie prijzen zijn: A, B en C, waarbij A de hoogste prijs is, C de laagste, en B een prijs tussen A en C. De variabelen aa, bb en cc verwijzen naar de barposities van de respectieve prijzen A, B en C.

Daarna heb ik een fractalformule gebruikt met een paar aanpassingen om deze drie punten (boven, onder en tussen) te bepalen, samen met hun richtingen. Hierbij gebruik ik een loop vanaf de meest recente barpositie:

//---
   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].B1].C1].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                  {
                  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                  {
                  P[0].A=hi;   //this A[0] up
                  P[0].aa=i+2;
                  m=0;
                  stop=true;
                 }
              }
            if(m==1)
              {
               if(P[0].C                  {
                  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

Als de drie punten voor de richting omhoog of omlaag zijn gevonden, breekt de loop.

Daarna haal ik de drie punten naar voren:

   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);
     }

En tenslotte teken ik het met behulp van het OBJ_EXPANSION-object en gebruik ik een enkele functie genaamd 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)+"  ");
//---
  }

Hier gebruik ik de niveaus:

  • 0.618
  • 1.000
  • 1.618
  • 2.618
  • 4.236



Gerelateerde berichten

Reactie (0)