หน้าแรก ตัวชี้วัดทางเทคนิค โพสต์

การใช้ FE Fibo Expansion ในการเทรดด้วย MetaTrader 4

ไฟล์แนบ
31891.zip (1.76 KB, ดาวน์โหลด 0 ครั้ง)

สวัสดีครับเพื่อนนักเทรดทุกคน!

วันนี้เราจะมาพูดถึง 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


โพสต์ที่เกี่ยวข้อง

ความคิดเห็น (0)