สวัสดีครับเพื่อนนักเทรดทุกคน!
วันนี้เราจะมาพูดถึง FE Fibo Expansion ที่ผมได้สร้างขึ้น โดยใช้วัตถุ 2 ตัว (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];
สำหรับแต่ละทิศทางนั้น จะต้องมีราคาทั้ง 3 ตัวคือ A, B และ C ซึ่ง A เป็นราคาสูงสุด, B เป็นราคาต่ำสุด และ C เป็นราคาที่อยู่ระหว่าง A และ B โดยที่ aa, bb และ cc คือที่ตั้งของบาร์สำหรับราคาทั้ง 3 ตัวนี้
ผมใช้สูตรแฟรคทัลและการปรับแต่งเล็กน้อย เพื่อหาจุดทั้ง 3 ที่เป็นราคาสูงสุด ต่ำสุด และราคาที่อยู่ระหว่างนั้น พร้อมกับกำหนดทิศทาง
มาดูโค้ดในส่วนของการวนลูปจากที่ตั้งบาร์ล่าสุดกัน:
//---
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; //ปรับ 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;
}
}
ถ้าพบจุดทั้ง 3 จุดของทิศทางขึ้นหรือลง ลูปจะหยุด
จากนั้นผมจะต้องนำจุดทั้ง 3 จุดออกมา:
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);
}
และสุดท้ายเราจะวาดโดยใช้วัตถุ 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

โพสต์ที่เกี่ยวข้อง
- เครื่องมือ Open Range Breakout สำหรับ MetaTrader 5
- FX Multi-Meter II: เครื่องมือช่วยเทรดที่ครบครันสำหรับนักลงทุน
- วิธีใช้ iExposure.mq4 ในการติดตามสถานะการเทรดใน MetaTrader 5
- Volume Profile + Range v6.0: เครื่องมือวิเคราะห์การซื้อขายใน MetaTrader 5
- ช่องทางการเทรดเต่ากับ MetaTrader 4: ระบบการติดตามแนวโน้มที่คุณควรรู้