보조지표 게시글

메타트레이더 4를 위한 FE 피보 확장 지표 사용법

첨부파일
31891.zip (1.76 KB, 다운로드 0회)

안녕하세요, 트레이더 여러분!

오늘은 제가 개발한 FE 피보 확장 지표에 대해 소개할게요. 이 지표는 두 개의 객체(P[2])를 이용하여 각각의 방향(상향 또는 하향)에 대한 속성을 나타내고 있습니다.

이 클래스는 다음과 같은 형태를 가지고 있습니다:

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

각 방향에 대해 세 가지 가격 A, B, C가 필요합니다. 이들은 각각 상한가, 하한가, 그리고 그 사이의 가격을 나타내죠. aa, bb, cc는 그 가격에 해당하는 막대 위치를 나타냅니다.

그 다음으로, 저는 프랙탈 공식을 사용해 세 개의 포인트(상한, 하한, 그리고 그 사이의 가격)를 구하고, 방향을 결정하는 약간의 수정을 했습니다.

최근 바 위치에서 루프를 사용하여 데이터를 가져옵니다:

//---
   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)// ------------상향------------
      {
         if(P[1].C!=0.0)
           {
            if(n==2)
              {
                if(P[1].B<hi&&P[1].C<P[1].B)
                 {
                  P[1].B=hi;   // 이때 B[1]을 A[1]이 존재하기 전에 수정합니다.
                P[1].bb=i+2;
              }
            if(n==1)
              {
               if(P[1].C<hi)
                 {
                  P[1].B=hi;   // 이때 B[1]을 하향으로 설정합니다.
                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]이 상향으로 설정됩니다.
            P[0].cc=i+2;
            m++;
          } 
      }
      else
       {
          if(m==2)
          {
            if(P[0].C<hi)
             {
              P[0].A=hi;   // 이때 A[0]을 상향으로 설정합니다.
            P[0].aa=i+2;
            m=0;
            stop=true;
            } 
            if(m==1)
          {
            if(P[0].C<hi)
             {
              P[0].C=hi;   // 이때 C[0]을 B[0]이 존재하기 전에 수정합니다.
            P[0].cc=i+2;
            } 
            }
      }
      //---
      }
      //else
      if(lo!=0.0)// ------------하향------------
      {
         if(P[0].C!=0.0)
       {
            if(m==2)
              {
               if(P[0].B>lo&&P[0].C>P[0].B)
                 {
                  P[0].B=lo;   // 이때 B[0]을 A[0]이 존재하기 전에 수정합니다.
                P[0].bb=i+2;
                 }
              }
            if(m==1)
          {
            if(P[0].C>lo)
             {
                  P[0].B=lo;   // 이때 B[0]을 상향으로 설정합니다.
            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]이 하향으로 설정됩니다.
            P[1].cc=i+2;
            n++;
              }
      }
      else
       {
          if(n==2)
              {
               if(P[1].C>lo)
                 {
                  P[1].A=lo;   // 이때 A[1]을 하향으로 설정합니다.
                P[1].aa=i+2;
                n=0;
                stop=true;
                 }
              }
            if(n==1)
              {
               if(P[1].C>lo)
                 {
                  P[1].C=lo;   // 이때 C[1]을 B[1]이 존재하기 전에 수정합니다.
                P[1].cc=i+2;
             }
              }
      }
      //---
      }
      //else
      //
      //---
      //---
      //---
      if((P[0].C==0.0&&P[1].C==0.0)||(hi==0.0&&lo==0.0))
        {
         continue;
        }
     }// 루프

어느 방향에서든 세 포인트를 찾으면 루프가 종료됩니다.

그 후, 세 포인트를 꺼내서 사용합니다:

   if(P[0].A!=0.0&&P[0].B!=0.0&&P[00.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);
     }

마지막으로 OBJ_EXPANSION 객체를 사용하여 그려줍니다. 그리고 단일 함수 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)+"  ");
   //---
}

여기에서 저는 0.618, 1.000, 1.618, 2.618, 4.236 레벨을 사용합니다.



연관 포스트

댓글 (0)