지그재그 인디케이터로 추출한 바닥 턴어라운드 포인트만 추출하는 방법은 무엇입니까?

 

친애하는 여러분, 지그재그의 바닥만 표시하도록 코드를 수정하는 방법은 무엇입니까?

다음 코드는 지그재그로 추출한 tops를 성공적으로 추출할 수 있습니다. Indicator.tops[]는 init() 함수 에서 인덱스 버퍼로 지정되어 있습니다....그러나 수정하여 더 낮은 전환점의 바닥만 표시할 수 있습니까? iCustom 호출의 두 번째 마지막 매개변수는? 대답이 아니오인 경우. 그러면 MT4 플랫폼에서 무엇을 해야 합니까? 나는 두 번째 마지막 매개 변수로 0과 2를 사용하려고 시도했지만 결과는 내가 원하지 않았습니다....

귀하의 편의를 위해 제 코드를 첨부합니다. 그리고 최대한 단순화 시켰습니다... 많은 시간을 내어주시고 배려해주셔서 감사합니다.
 int start()
{
   int counted_bars=IndicatorCounted();
   int limit= 0 ;
  limit = Bars -counted_bars;
  
   for ( int shift=limit- 1 ;shift>= 0 ;shift--)
  {
    tops[shift]= iCustom ( NULL , 0 , "ZigZag" , 12 , 5 , 3 , 1 , shift);
     if (tops[shift]> 0.1 ) tops[shift]=tops[shift];
  }
  
   return ( 0 );
}

 

비교하는 것처럼

 double K = iCustom ( Symbol (), 0 , "zigzag" ,ExtDepth,ExtDeviation,ExtBackstep, 0 ,i);
if (K==Low[i] && K> 0 )   //..low zigzag......   
 

드브리스,

귀하의 신속한 답변에 감사드립니다. iCustom의 두 번째 마지막 매개변수를 0으로 변경하기만 하면 됩니까? 나는 이것을 전에 시도했다. 결과는 확실히 내가 원하는 것이 아닙니다 ... 내 질문을 더 명확하게하기 위해 내 질문을 설명하기 위해 아래 두 그림을 보여줍니다....

. FIg.1 원하지 않는 상판(ABCDe)은 위 그림과 같습니다.

그림1. 하의만 보여주고 싶을 때 원하지 않는 상의가 보인다! 하단만 표시하고 싶을 때 원하지 않는 상단을 모두 걸러내고 싶습니다.

그림2. 원하는 상의만 표시됩니다.

그림2. 원하는 상단이 원하지 않는 하단 없이 표시됩니다. 이것이 내가 원하는 결과입니다.

그래서 제 질문은 A/B/C/D/E 지점을 표시하지 않고 맨 아래 지점만 표시할 수 있습니까? 궁금증이 풀리셨길 바라며.....

빠른 답변 감사합니다....

 
//+------------------------------------------------------------------+
//|                                                      Zigzag2.mq4 |
//|                 Copyright © 2005-2007, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, MetaQuotes Software Corp."
#property link       "http://www.metaquotes.net/"

#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Red
#property indicator_color2 Magenta
#property indicator_color3 LightSkyBlue


//---- indicator parameters
extern int ExtDepth= 12 ;
extern int ExtDeviation= 5 ;
extern int ExtBackstep= 3 ;
//---- indicator buffers
double ZigzagBuffer[];
double HighMapBuffer[];
double LowMapBuffer[];
int level= 3 ; // recounting's depth 
bool downloadhistory= false ;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorBuffers( 3 );
//---- drawing settings
   SetIndexStyle( 0 , DRAW_SECTION );
   SetIndexStyle( 1 , DRAW_SECTION );   
   SetIndexStyle( 2 , DRAW_SECTION );   
//---- indicator buffers mapping
   SetIndexBuffer ( 0 ,ZigzagBuffer);
   SetIndexBuffer ( 1 ,HighMapBuffer);
   SetIndexBuffer ( 2 ,LowMapBuffer);
   SetIndexEmptyValue( 0 , 0.0 );
   SetIndexEmptyValue( 1 , 0.0 );   
   SetIndexEmptyValue( 2 , 0.0 );   

//---- indicator short name
   IndicatorShortName( "ZigZag(" +ExtDepth+ "," +ExtDeviation+ "," +ExtBackstep+ ")" );
//---- initialization done
   return ( 0 );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   int i, counted_bars = IndicatorCounted();
   int limit,counterZ,whatlookfor;
   int shift,back,lasthighpos,lastlowpos;
   double val,res;
   double curlow,curhigh,lasthigh,lastlow;

   if (counted_bars== 0 && downloadhistory) // history was downloaded
     {
       ArrayInitialize (ZigzagBuffer, 0.0 );
       ArrayInitialize (HighMapBuffer, 0.0 );
       ArrayInitialize (LowMapBuffer, 0.0 );
     }
   if (counted_bars== 0 ) 
     {
      limit= Bars -ExtDepth;
      downloadhistory= true ;
     }
   if (counted_bars> 0 ) 
     {
       while (counterZ<level && i< 100 )
        {
         res=ZigzagBuffer[i];
         if (res!= 0 ) counterZ++;
         i++;
        }
      i--;
      limit=i;
       if (LowMapBuffer[i]!= 0 ) 
        {
         curlow=LowMapBuffer[i];
         whatlookfor= 1 ;
        }
       else
        {
         curhigh=HighMapBuffer[i];
         whatlookfor=- 1 ;
        }
       for (i=limit- 1 ;i>= 0 ;i--)  
        {
         ZigzagBuffer[i]= 0.0 ;  
         LowMapBuffer[i]= 0.0 ;
         HighMapBuffer[i]= 0.0 ;
        }
     }
      
   for (shift=limit; shift>= 0 ; shift--)
     {
      val=Low[iLowest( NULL , 0 ,MODE_LOW,ExtDepth,shift)];
       if (val==lastlow) val= 0.0 ;
       else 
        { 
         lastlow=val; 
         if ((Low[shift]-val)>(ExtDeviation* Point )) val= 0.0 ;
         else
           {
             for (back= 1 ; back<=ExtBackstep; back++)
              {
               res=LowMapBuffer[shift+back];
               if ((res!= 0 )&&(res>val)) LowMapBuffer[shift+back]= 0.0 ; 
              }
           }
        } 
       if (Low[shift]==val) LowMapBuffer[shift]=val; else LowMapBuffer[shift]= 0.0 ;
       //--- high
      val=High[iHighest( NULL , 0 ,MODE_HIGH,ExtDepth,shift)];
       if (val==lasthigh) val= 0.0 ;
       else 
        {
         lasthigh=val;
         if ((val-High[shift])>(ExtDeviation* Point )) val= 0.0 ;
         else
           {
             for (back= 1 ; back<=ExtBackstep; back++)
              {
               res=HighMapBuffer[shift+back];
               if ((res!= 0 )&&(res<val)) HighMapBuffer[shift+back]= 0.0 ; 
              } 
           }
        }
       if (High[shift]==val) HighMapBuffer[shift]=val; else HighMapBuffer[shift]= 0.0 ;
     }

   // final cutting 
   if (whatlookfor== 0 )
     {
      lastlow= 0 ;
      lasthigh= 0 ;  
     }
   else
     {
      lastlow=curlow;
      lasthigh=curhigh;
     }
   for (shift=limit;shift>= 0 ;shift--)
     {
      res= 0.0 ;
       switch (whatlookfor)
        {
         case 0 : // look for peak or lawn 
             if (lastlow== 0 && lasthigh== 0 )
              {
               if (HighMapBuffer[shift]!= 0 )
                 {
                  lasthigh=High[shift];
                  lasthighpos=shift;
                  whatlookfor=- 1 ;
                  ZigzagBuffer[shift]=lasthigh;
                  res= 1 ;
                 }
               if (LowMapBuffer[shift]!= 0 )
                 {
                  lastlow=Low[shift];
                  lastlowpos=shift;
                  whatlookfor= 1 ;
                  ZigzagBuffer[shift]=lastlow;
                  res= 1 ;
                 }
              }
             break ;  
         case 1 : // look for peak
             if (LowMapBuffer[shift]!= 0.0 && LowMapBuffer[shift]<lastlow && HighMapBuffer[shift]== 0.0 )
              {
               ZigzagBuffer[lastlowpos]= 0.0 ;
               lastlowpos=shift;
               lastlow=LowMapBuffer[shift];
               ZigzagBuffer[shift]=lastlow;
               res= 1 ;
              }
             if (HighMapBuffer[shift]!= 0.0 && LowMapBuffer[shift]== 0.0 )
              {
               lasthigh=HighMapBuffer[shift];
               lasthighpos=shift;
               ZigzagBuffer[shift]=lasthigh;
               whatlookfor=- 1 ;
               res= 1 ;
              }   
             break ;               
         case - 1 : // look for lawn
             if (HighMapBuffer[shift]!= 0.0 && HighMapBuffer[shift]>lasthigh && LowMapBuffer[shift]== 0.0 )
              {
               ZigzagBuffer[lasthighpos]= 0.0 ;
               lasthighpos=shift;
               lasthigh=HighMapBuffer[shift];
               ZigzagBuffer[shift]=lasthigh;
              }
             if (LowMapBuffer[shift]!= 0.0 && HighMapBuffer[shift]== 0.0 )
              {
               lastlow=LowMapBuffer[shift];
               lastlowpos=shift;
               ZigzagBuffer[shift]=lastlow;
               whatlookfor= 1 ;
              }   
             break ;               
         default : return ; 
        }
     }

   return ( 0 );
  }
//+------------------------------------------------------------------+

지그재그 버퍼만 표시 가능

지그재그로 다시 그리는 중


이것의 결과를 참조하십시오

 

여기 내가 생각해낸 것이 있습니다. 나는 [그가 게시할 때 이것을 하고 있었다] 위의 deVries 결과를 확인하지 않았습니다.

 #property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Green
#property indicator_width1 1
#property indicator_color2 Yellow
#property indicator_width2 1

double Bottoms[];
double Toppers[];

int init()
{

   IndicatorBuffers( 2 );

   SetIndexStyle( 0 , DRAW_SECTION );
   SetIndexBuffer ( 0 ,Bottoms);
   SetIndexEmptyValue( 0 , 0.0 );

   SetIndexStyle( 1 , DRAW_SECTION );
   SetIndexBuffer ( 1 ,Toppers);
   SetIndexEmptyValue( 1 , 0.0 );

  IndicatorShortName( "zz show top & bottom" );
   return ( 0 );
}

int deinit()
{
   return ( 0 );
}

int start()
{
   int counted_bars=IndicatorCounted();
   int limit= 0 ;
  limit = Bars -counted_bars;
  
   for ( int shift=limit- 1 ;shift>= 0 ;shift--)
  {
     int ExtDepth= 12 ; int ExtDeviation= 5 ; int ExtBackstep= 3 ;
     int ZigzagBuffer= 0 ; int HighMapBuffer= 1 ; int LowMapBuffer= 2 ;
    
    Bottoms[shift]= iCustom (
         Symbol (), 0 , "ZigZag" ,
        ExtDepth, ExtDeviation, ExtBackstep,
        LowMapBuffer, shift
    );
    
    Toppers[shift]= iCustom (
         Symbol (), 0 , "ZigZag" ,
        ExtDepth, ExtDeviation, ExtBackstep,
        HighMapBuffer, shift
    );
    
     if (Bottoms[shift]> 0.1 ) Bottoms[shift]=Bottoms[shift];
     if (Toppers[shift]> 0.1 ) Toppers[shift]=Toppers[shift];
  }
  
   return ( 0 );
}

 
ubzen :

여기 내가 생각해낸 것이 있습니다. 나는 [그가 게시할 때 이것을 하고 있었다] 위의 deVries 결과를 확인하지 않았습니다.

귀하의 코드 덕분에 좋은 ubzen 이 여기에 왔습니다 ......

 #property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Red
#property indicator_width1 3
#property indicator_color2 Green
#property indicator_width2 3
#property indicator_color3 Yellow
#property indicator_width3 3


//---- indicator parameters
extern int ExtDepth= 12 ;
extern int ExtDeviation= 5 ;
extern int ExtBackstep= 3 ;


double ZigZag[];
double Bottoms[];
double Toppers[];

int init()
{
   IndicatorBuffers( 3 );

   SetIndexStyle( 0 , DRAW_SECTION );
   SetIndexBuffer ( 0 ,ZigZag);
   SetIndexEmptyValue( 0 , 0.0 );
   
   SetIndexStyle( 1 , DRAW_SECTION );
   SetIndexBuffer ( 1 ,Bottoms);
   SetIndexEmptyValue( 1 , 0.0 );

   SetIndexStyle( 2 , DRAW_SECTION );
   SetIndexBuffer ( 2 ,Toppers);
   SetIndexEmptyValue( 2 , 0.0 );

  IndicatorShortName( "zz show top & bottom" );
   return ( 0 );
}

int deinit()
{
   return ( 0 );
}

int start()
{
   int counted_bars=IndicatorCounted();
   int limit= 0 ;
  limit = Bars -counted_bars;
  
   for ( int shift=limit- 1 ;shift>= 0 ;shift--)
  {
    ZigZag[shift]= iCustom (
         Symbol (), 0 , "ZigZag" ,
        ExtDepth, ExtDeviation, ExtBackstep,
         0 , shift
    );

     if (ZigZag[shift]> 0.1 && Low[shift]==ZigZag[shift]) Bottoms[shift]=ZigZag[shift];
     if (ZigZag[shift]> 0.1 && High[shift]==ZigZag[shift]) Toppers[shift]=ZigZag[shift];
  }
  
   return ( 0 );
}

이것은 결과로 제공됩니다


이제 하의와 상의가 모두 지그재그로 일치합니다.

 
deVries : 귀하의 코드 덕분에 좋은 ubzen 이 여기에 왔습니다 ...... 이것은 결과로 제공됩니다.
좋은 직업 deVries .
 
친애하는 여러분, 특히 deVries와 Ubzen의 도움과 친절로 제 지표는 이 상쾌한 이른 봄 아침에 지그재그 지표 가 추출한 바닥 턴어라운드 포인트를 연결하는 그림을 성공적으로 그렸습니다....:)
 
d



데브리스 :

귀하의 코드 덕분에 좋은 ubzen 이 여기에 왔습니다 ......

이것은 결과로 제공됩니다

이제 하의와 상의가 모두 지그재그로 일치합니다.





안녕하세요 deVries님,

귀하의 코드에 감사드립니다. 마지막 지그재그 다리의 피보나치 되돌림이 얼마나 멀리 있는지 알고 싶다면 이전 지그재그 다리와 비교하십시오. 그렇게하는 방법 ?

사진처럼 하고싶은데 아래 코드가 안되네요...

감사해요,


피보 되돌림


 #property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Red
#property indicator_width1 3
#property indicator_color2 Green
#property indicator_width2 3
#property indicator_color3 Yellow
#property indicator_width3 3


//---- indicator parameters
extern int ExtDepth= 12 ;
extern int ExtDeviation= 5 ;
extern int ExtBackstep= 3 ;


double ZigZag[];
double Bottoms[];
double Toppers[];
double resBuffer[][];

//---
int init() {
   IndicatorBuffers( 3 );

   SetIndexStyle( 0 , DRAW_SECTION );
   SetIndexBuffer ( 0 ,ZigZag);
   SetIndexEmptyValue( 0 , 0.0 );
   
   SetIndexStyle( 1 , DRAW_SECTION );
   SetIndexBuffer ( 1 ,Bottoms);
   SetIndexEmptyValue( 1 , 0.0 );

   SetIndexStyle( 2 , DRAW_SECTION );
   SetIndexBuffer ( 2 ,Toppers);
   SetIndexEmptyValue( 2 , 0.0 );

  IndicatorShortName( "zz show top & bottom" );
   return ( 0 );
}

int deinit()
{
   ObjectDelete ( "myFibo" );
   return ( 0 );
}

int start()
{
   int counted_bars=IndicatorCounted();
   int limit= 0 ;
  limit = Bars -counted_bars;
   int k= 0 , m= 0 ;
   int candle1= 0 , candle2= 0 ;
   double prc1= 0 , prc2= 0 ;
  
   for ( int shift=limit- 1 ;shift>= 0 ;shift--) {
    ZigZag[shift]= iCustom (
         Symbol (), 0 , "ZigZag" ,
        ExtDepth, ExtDeviation, ExtBackstep,
         0 , shift
    );

     if (ZigZag[shift]> 0.1 && Low[shift]==ZigZag[shift]) {
      Bottoms[shift]=ZigZag[shift];
      resBuffer[k][ 0 ] = Bottoms[shift];
      resBuffer[k][ 1 ] = shift;
      k++;
    }
     if (ZigZag[shift]> 0.1 && High[shift]==ZigZag[shift]) {
      Toppers[shift]=ZigZag[shift];
      resBuffer[k][ 0 ] = Toppers[shift];
      resBuffer[k][ 1 ] = shift;
      k++;
    }
  } // ende for
  
   //---
   for (m=k;m>= 0 ;m--) {
   candle1 = resBuffer[m][ 1 ];
   prc1 = resBuffer[m][ 0 ];
   candle2 = resBuffer[m- 1 ][ 1 ];
   prc2 = resBuffer[m- 1 ][ 0 ];
   //---
         ObjectDelete ( "myFibo" );
         ObjectCreate ( "myFibo" , OBJ_FIBO , 0 , Time[candle1], prc2, Time[candle2], prc1);
 
  } // ende for
          
   return ( 0 );
}
 
jackprobe :


안녕하세요 deVries님,

귀하의 코드에 감사드립니다. 마지막 지그재그 다리의 피보나치 되돌림이 얼마나 멀리 있는지 알고 싶다면 이전 지그재그 다리와 비교하십시오. 그렇게하는 방법 ?

감사해요,


이 방법으로 피보나치 그리기 지그재그 표시기로 두 점 찾기 iCustom

0.0 1.6154

100.0 1.6168

차이 0.0014

마지막 고가 = 1.6169

0.0과의 차이 0.0015 in% 0.0015/0.0014 * 100% = 107% 거리 + 0.0001

이게 네가 말하는거야 ??

 

안녕하세요 deVries님,

고맙습니다. 네, 보내주신 사진과 같습니다. 하지만 코딩하는 방법을 알고 싶습니다. 각 이전 지그재그 구간을 계산한 다음 피보나치 수준을 그려야 하므로 현재/마지막 지그재그가 얼마나 멀리 있는지 알 수 있습니다.

편집: 이전 게시물에 코드를 보냈습니다. 그것은 fibo 선 을 그리지 않을 것입니다 ...

감사해요