안녕하세요, 트레이더 여러분!
오늘은 제가 개발한 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 레벨을 사용합니다.
