Laman utama Indikator Teknikal Siaran

FE Fibo Expansion: Indikator Berguna untuk MetaTrader 4

Lampiran
31891.zip (1.76 KB, Muat turun 0 kali)

Hai semua trader!

Pada kali ini, kita akan membincangkan tentang FE Fibo Expansion yang saya buat menggunakan dua objek (P[2]) dalam array. Ini mewakili sifat untuk setiap arah, sama ada UP atau DOWN.

Berikut adalah gambaran kelas yang saya gunakan:

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

Untuk setiap arah, kita memerlukan tiga harga: A, B dan C, yang mewakili harga atas, bawah dan harga di antara keduanya. Sementara itu, aa, bb, dan cc adalah lokasi bar untuk harga masing-masing A, B dan C yang telah disebutkan.

Seterusnya, saya menggunakan formula fractal dan sedikit pengubahsuaian untuk menentukan tiga titik: atas, bawah dan harga di antara mereka, berserta arah masing-masing.

Saya menggunakan loop dari lokasi bar yang paling baru:

//---
   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;   //modifikasi B[1] sebelum A[1] wujud
                P[1].bb=i+2;
              }
            if(n==1)
          {
               if(P[1].C<hi)
                 {
                  P[1].B=hi;   //ini 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;   //C[0] awal ke atas
             P[0].cc=i+2;
             m++;
          }         }
         else
         {
           if(m==2)
          {
           if(P[0].C<hi)
             {
              P[0].A=hi;   //ini A[0] ke atas
              P[0].aa=i+2;
              m=0;
              stop=true;
              }
          }
          if(m==1)
          {
           if(P[0].C<hi)
             {
              P[0].C=hi;   //modifikasi C[0] sebelum B[0] wujud
              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;   //modifikasi B[0] sebelum A[0] wujud
                P[0].bb=i+2;
                }
              }
            if(m==1)
          {
           if(P[0].C>lo)
             {
              P[0].B=lo;   //ini B[0] ke atas
              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;   //C[1] awal ke bawah
             P[1].cc=i+2;
             n++;
          }         }
         else
         {
           if(n==2)
              {
               if(P[1].C>lo)
                 {
                  P[1].A=lo;   //ini A[1] ke bawah
                P[1].aa=i+2;
              n=0;
              stop=true;
               }
          }
          if(n==1)
          {
           if(P[1].C>lo)
             {
                  P[1].C=lo;   //modifikasi C[1] sebelum B[1] wujud
              P[1].cc=i+2;
               }
          }
      }
       }
      //---
      if((P[0].C==0.0&&P[1].C==0.0)||(hi==0.0&&lo==0.0))
        {
         continue;
        }
    }// loop

Jika ia menemui tiga titik untuk arah UP atau DOWN, loop akan berhenti.

Saya perlu menarik keluar tiga titik tersebut.

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

Akhirnya, saya menggunakan objek OBJ_EXPANSION untuk menarik carta tersebut dan menggunakan satu fungsi 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)+"  ");
  //---
}

Di sini, saya menggunakan tahap 0.618, 1.000, 1.618, 2.618 dan 4.236.




Siaran berkaitan

Komen (0)