首页 技术指标 帖子

MetaTrader 4上的FE斐波扩展指标使用指南

附件
31891.zip (1.76 KB, 下载 0次)

大家好,今天我们来聊聊我自己开发的FE斐波扩展指标。这是一个在MetaTrader 4平台上使用的工具,主要帮助交易者在市场中识别价格的关键水平。

这个指标是通过两个对象(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)// ------------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;
                 }
              }
       }
         //---
         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)// ------------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;   //这修改了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;
        }
     }// loop

当我找到三个关键点的方向后,循环就会中断。

然后,我提取这三个点:

   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)