가장 낮은 함수와 가장 높은 함수가 반환하는 것

 
Metatrader의 개발자 여러분!.

최저 및 최고 함수는 무엇을 반환합니까?
내가 이 질문을 하는 이유는 무엇입니까? 이러한 기능에 대한 설명은 혼란스럽습니다. 메타트레이더와 함께 제공되는 ZigZag가 제대로 동작하지 않는 이유를 분석해보니 위의 함수들이 아무것도 반환하지 않는다는 사실을 알게 되었습니다. 아니면 혼란스러운 설명으로 인해 잘못 사용되었습니까? 이 포럼 페이지 스레드의 77페이지 엘리엇 파동 이론에 기반한 거래 전략이 이 문제에 대해 설명했습니다. 이해하려고하는데 ZigZag 알고리즘이 잘못되었을 수 있습니다. 그러나 모든 것은 이러한 기능의 작동에 달려 있습니다.

다른 지표에서도 이러한 기능의 문제를 관찰했습니다. 그러나 현재 - 지그재그에서.

명확히 해주세요.
 
그들은 역사상 가장 높은 N 막대와 가장 낮은 N 막대의 수를 반환합니다. 이 경우 두 개의 값이 같으면(이 샘플에서 두 개의 막대는 극값) 이전에 나온(오래된) 막대의 번호가 항상 반환됩니다.

ZigZag 알고리즘(MT4에 표준으로 포함됨)은 하나의 막대가 동시에 높거나 낮을 수 있는 상황(바깥쪽 막대)을 고려하지 않습니다.
 
로쉬, 이해가 됩니다. 웨이브 분석에 대한 스레드에서 인용한 라인을 ZigZag 텍스트에 삽입하십시오. 그리고 무슨 일이 일어나는지 보십시오. 그리고 그것은 쓰레기로 밝혀졌습니다. 이 때문에 질문이 생겼습니다.

이론을 사용하면 실천에서 벗어나지 않는 한 모든 것이 명확합니다. 오류가 발생하면 끝까지 가야합니다. 그리고 오류가 어디에서 왔는지 알아내십시오.
 
로쉬, 이해가 됩니다. 웨이브 분석에 대한 스레드에서 인용한 라인을 지그재그로 텍스트에 삽입하십시오. 그리고 무슨 일이 일어나는지 보십시오. 그리고 그것은 쓰레기로 밝혀졌습니다. 이 때문에 질문이 생겼습니다.


오닉스에서 해당 페이지를 보고 비교하기 위해 표준 지그재그를 열었습니다. 코드는 이해하기 위해 다릅니다. ZigZag 버전을 찾고 철저하게 구문 분석한 다음에만 무언가를 말할 수 있어야 합니다. 그러므로 나는 대답할 수 없다.

그리고 네, 귀하의 페이지에 표시된 코드에 값을 쓰는 데 의견이 일치하지 않지만 아마도 그래야 할 것입니다. 말하기는 어렵습니다. 나는 때때로 크리핑 값으로 그러한 지표를 만들고 채널과 같은 것으로 밝혀 지지만 역사에 거짓말을하지 않습니다.
 
Rosh, 다음은 codebase.mql.com의 지그재그 코드입니다.

//+----------------------------------------------- --------------------+
//| 사용자 정의 이동 평균.mq4 |
//| Copyright © 2005, MetaQuotes Software Corp. |
//| https://www.metaquotes.net/ |
//+----------------------------------------------- --------------------+
#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#속성 링크 https://www.metaquotes.net/

#속성 표시기_차트_창
#속성 표시기_버퍼 1
#property indicator_color1 빨간색
//---- 표시기 매개변수
외부 정수 ExtDepth=12;
extern int ExtDeviation=5;
extern int ExtBackstep=3;
//---- 표시기 버퍼
이중 ExtMapBuffer[];
이중 ExtMapBuffer2[];

//+----------------------------------------------- --------------------+
//| 사용자 지정 표시기 초기화 기능 |
//+----------------------------------------------- --------------------+
정수 초기화()
{
표시 버퍼(2);
//---- 그리기 설정
SetIndexStyle(0,DRAW_SECTION);
//---- 표시기 버퍼 매핑
SetIndexBuffer(0,ExtMapBuffer);
SetIndexBuffer(1,ExtMapBuffer2);
SetIndexEmptyValue(0,0.0);
//---- 인디케이터 짧은 이름
IndicatorShortName("ZigZag("+ExtDepth+","+ExtDeviation+","+ExtBackstep+")");
//---- 초기화 완료
반환(0);
}
//+----------------------------------------------- --------------------+
//| |
//+----------------------------------------------- --------------------+
정수 시작()
{
int shift, 뒤로, 마지막 높은 위치, 마지막 낮은 위치;
이중 발, 입술;
더블 curlow,curhigh,lasthigh,lastlow;

for(shift=Bars-ExtDepth; shift>=0; shift--)
{
val=낮음[최저(NULL,0,MODE_LOW,ExtDepth,shift)];
if(발==최저) 발=0.0;
또 다른
{
마지막으로 = 발;
if((낮은[shift]-val)>(ExtDeviation*Point)) val=0.0;
또 다른
{
for(back=1; back<=ExtBackstep; back++)
{
res=ExtMapBuffer[시프트+뒤로];
if((res!=0)&&(res>val)) ExtMapBuffer[shift+back]=0.0;
}
}
}
******ExtMapBuffer[시프트]=val;
//--- 높은
val=높음[최고(NULL,0,MODE_HIGH, 확장 깊이, 시프트)];
if(val==마지막 높음) val=0.0;
또 다른
{
마지막 고 = 발;
if((val-High[shift])>(ExtDeviation*Point)) val=0.0;
또 다른
{
for(back=1; back<=ExtBackstep; back++)
{
res=ExtMapBuffer2[시프트+뒤로];
if((res!=0)&&(res<val)) ExtMapBuffer2[shift+back]=0.0;
}
}
}
***** ExtMapBuffer2[시프트]=val;
}


===============================

이 부분이 오류가 나는 부분으로, 파동분석 분과 77쪽에서 인용한 곳을 별표로 표시하였습니다. 이 코드는 내가 준 것과 어떻게 다른가요? 이것은 표준 코드입니다.

이제 이 스레드의 두 번째 게시물에서 귀하의 말을 인용합니다.

로쉬 18.10.06 10:14

그들은 역사상 가장 높은 N 막대와 가장 낮은 N 막대의 수를 반환합니다. 이 경우 두 개의 값이 같으면(이 샘플에서 두 개의 막대는 극값) 이전에 나온(오래된) 막대의 번호가 항상 반환됩니다.

ZigZag 알고리즘(MT4에 표준으로 포함됨)은 하나의 막대가 동시에 높거나 낮을 수 있는 상황(바깥쪽 막대)을 고려하지 않습니다.
=========================
코드에 다음 줄이 있습니다. val=High[Highest(NULL,0,MODE_HIGH,ExtDepth,shift)];
대괄호는 막대의 숫자입니다 ... 글쎄, 귀하의 대답에는 막대의 숫자가 무엇인지 알려줍니다

다음 라인에서: ExtMapBuffer[shift]=val; - 우리가 가진 것? 더 설명해야 할까요?

첫째, 표시기 버퍼의 인덱스는 val 값을 가져온 막대의 인덱스와 같아야 합니다. 그렇지 않으면 불일치가 발생합니다. 우리가 지그재그가 공중에 휴식을 가지고 있는 것을 볼 때 우리가 실제로 가지고 있는 것.

Rosh, 대답을 회피하지 마십시오. 당신의 아이디어는 지그재그입니다. 알아봅시다. 코드에 많은 오류가 있습니다. 내가 쓴 것을 주의 깊게 분석하면 명백한 오류를 볼 수 있습니다.

그러나 이것이 중요한 것은 아닙니다. 이러한 오류만 있었다면 스레드의 제목이 무엇인지 묻지 않을 것입니다.
 
최저 및 최고 기능에 대해 다시 한 번.

이전 글에서 지그재그 코드의 오류에 대해 썼습니다.

주요 실수.

ExtDepth 막대 크기 영역에서 가장 높은 값 또는 가장 낮은 값의 막대를 검색합니다. 검색은 SHIFT 막대에서 수행됩니다. Roche는 다음과 같은 함수 정의를 제공했습니다. 현재 막대에서 기록 깊이까지 N 막대 내에서 가장 높은 막대와 가장 낮은 막대의 수가 반환됩니다. 그러나 현재 막대가 무엇인지에 대한 정의는 없습니다. 현재 막대는 0 막대 또는 시프트 번호가 있는 막대입니다. 주어진 지그재그 코드로 판단하면 현재 막대는 시프트 번호가 있는 막대로 이해해야 합니다.

바의 ExtDepth 섹션에서 시프트 번호가 있는 바에서 세어 바 번호를 찾았다고 가정해 보겠습니다. 그리고 이 막대에는 반드시 교대 번호가 있는 것은 아닙니다. 그러나 시프트 번호가 있는 막대와 다른 발견된 막대의 극값 값은 시프트 번호 아래 의 표시기 버퍼 에 배치합니다. ExtMapBuffer[shift]=val. 여기에서 공중에 매달린 골절이 지그재그로 얻어진다. MT에서 지그재그로 작업을 시도한 모든 사람이 보았습니다.

이것이 주요 실수입니다. 그러나 이 오류는 쉽게 고칠 수 있습니다. 그리고 물어볼 가치도 없었다.

이 오류를 제거하기 시작하면 질문이 발생합니다. 막대에서 최저 및 최고 함수가 원하는 극값을 찾은 숫자는 무엇입니까? 어떤 논리도 여기에 도움이 되지 않습니다. 이 막대의 수를 아무리 계산해봐도 아무 일도 일어나지 않았습니다.

따라서 질문은 개발자에게 전달되었습니다.

하지만 Rosh가 질문에 답하기 시작해서 기뻤습니다. 오랜만에 MT 배송에 포함된 지그재그를 사용하여 편집한 모습입니다.

개발자 여러분, 제기된 질문에 주의를 기울이십시오. 질문이 심각합니다. 많은 지표가 MT 배송에 포함된 지그재그를 사용합니다. 지그재그 작업에 대한 불만의 수는 셀 수 없습니다.
나는 오류에 대해 설명했다. 좋은 소식은 실수를 수정해야 한다는 것입니다. 버그 수정을 무시하면 회사의 평판이 손상됩니다. 그리고 이것은 좋지 않습니다. 아무도 이것을 필요로하지 않습니다.
 
...최저 및 최고 함수가 원하는 극값을 찾은 막대에서 질문이 발생합니다. 여기에는 어떤 논리도 도움이 되지 않습니다. 이 막대의 수를 아무리 계산해봐도 아무 일도 일어나지 않았습니다.
이론적으로 막대 인덱스 = Highest(NULL,0,MODE_HIGH,ExtDepth,shift)

저것들. ExtMapBuffer2[Highest(NULL,0,MODE_HIGH,ExtDepth,shift)]=val;
 
nen, 이제 표준 지그재그 알고리즘을 보았습니다. 귀하가 제공한 것과 다른 또 다른 알고리즘이 있습니다.

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

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red
//---- indicator parameters
extern int ExtDepth=12;
extern int ExtDeviation=5;
extern int ExtBackstep=3;
//---- indicator buffers
double ExtMapBuffer[];
double ExtLowBuffer[];
double ExtHighBuffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorBuffers(3);
//---- drawing settings
   SetIndexStyle(0,DRAW_SECTION);
//---- indicator buffers mapping
   SetIndexBuffer(0,ExtMapBuffer);
   SetIndexBuffer(1,ExtLowBuffer);
   SetIndexBuffer(2,ExtHighBuffer);
   SetIndexEmptyValue(0,0.0);
//---- indicator short name
   IndicatorShortName("ZigZag("+ExtDepth+","+ExtDeviation+","+ExtBackstep+")");
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   int    shift, back,lasthighpos,lastlowpos,index;
   double val,res;
   double curlow,curhigh,lasthigh,lastlow;
//----
   for(shift=Bars-ExtDepth; shift>=0; shift--)
     {
      index=Lowest(NULL,0,MODE_LOW,ExtDepth,shift);
      val=Low[index];
      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=ExtLowBuffer[shift+back];
               if((res!=0)&&(res>val)) ExtLowBuffer[shift+back]=0.0; 
              }
           }
        } 
      ExtLowBuffer[shift]=0.0;
      if(val!=0.0) ExtLowBuffer[index]=val;
      //--- high
      index=Highest(NULL,0,MODE_HIGH,ExtDepth,shift);
      val=High[index];
      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=ExtHighBuffer[shift+back];
               if((res!=0)&&(res<val)) ExtHighBuffer[shift+back]=0.0; 
              } 
           }
        }
      ExtHighBuffer[shift]=0.0;
      if(val!=0.0) ExtHighBuffer[index]=val;
     }
//---- final cutting 
   lasthigh=-1; lasthighpos=-1;
   lastlow=-1;  lastlowpos=-1;

   for(shift=Bars-ExtDepth; shift>=0; shift--)
     {
      curlow=ExtLowBuffer[shift];
      curhigh=ExtHighBuffer[shift];
      if(curlow==0 && curhigh==0) continue;
      //---
      if(curhigh!=0)
        {
         if(lasthigh>0) 
           {
            if(lasthigh<curhigh) ExtHighBuffer[lasthighpos]=0;
            else ExtHighBuffer[shift]=0;
           }
         //---
         if(lasthigh<curhigh || lasthigh<0)
           {
            lasthigh=curhigh;
            lasthighpos=shift;
           }
         lastlow=-1;
        }
      //----
      if(curlow!=0)
        {
         if(lastlow>0)
           {
            if(lastlow>curlow) ExtLowBuffer[lastlowpos]=0;
            else ExtLowBuffer[shift]=0;
           }
         //---
         if((curlow<lastlow)||(lastlow<0))
           {
            lastlow=curlow;
            lastlowpos=shift;
           } 
         lasthigh=-1;
        }
     }
//---- merge 2 buffers
   lasthighpos=-1;
   lastlowpos=-1;
   for(shift=Bars-1; shift>=0; shift--)
     {
      if(shift>=Bars-ExtDepth) ExtMapBuffer[shift]=0.0;
      else
        {
         curlow=ExtLowBuffer[shift];
         curhigh=ExtHighBuffer[shift];
         //----
         res=0;
         if(curlow!=0)
           {
            if(lastlowpos==-1)
              {
               res=curlow;
               lastlowpos=shift;
              }
            else
              {
               if(lasthighpos!=-1 && lastlowpos>lasthighpos)
                 {
                  res=curlow;
                  lastlowpos=shift;
                 }
              }
           }
         if(curhigh!=0)
           {
            if(lasthighpos==-1)
              {
               res=curhigh;
               lasthighpos=shift;
              }
            else
              {
               if(lastlowpos!=-1 && lasthighpos>lastlowpos)
                 {
                  res=curhigh;
                  lasthighpos=shift;
                 }
              }
           }
         //----
         ExtMapBuffer[shift]=res;
        }
     }
  }
//+------------------------------------------------------------------+



여기에서는 모든 것이 올바른 것 같습니다. 인덱스가 저장되고 값이 원하는 배열 요소에 기록됩니다. 이 알고리즘을 기반으로 구축해 보겠습니다.

 
nen , 죄송합니다. 동일한 Lowest와 Highest를 찾는 짧은 코드를 작성하는 것이 더 쉽지 않습니까? 내가 이 함수를 사용하지 않았기 때문입니다. 정확히는 간단한 짧은 코드로 극한값에 필요한 데이터를 받았기 때문입니다. 아마도 표준 함수보다 더 빠르게 작동할 것이기 때문입니다. 다른 시간대에서 데이터를 가져와야 하는 경우에만 사용하는 것이 합리적이라고 생각합니다.
 
컴포스터 맞습니다. 그러면 어디에 쓰여 있는지 보십시오. 어떤 인덱스가 있는 표시기 버퍼 에.
Vladislav, codebase.mql.com에서 코드를 가져왔고 정확히 같은 코드를 가지고 있습니다. 귀하의 코드를 게시하려고 합니다. 무슨 일이 일어나는지 볼게요.
솔직히, 나는 그것이 더 쉬울 수 있다는 데 동의합니다. 그러나 다른 시간 프레임에서 작동하려면 이러한 기능이 필요합니다.