가장 낮은 함수와 가장 높은 함수가 반환하는 것 - 페이지 5

 
Candid 지금은 괜찮아.
Klot , 흥미로운 옵션입니다.

지그재그 변형이 흥미로운 결과를 나타내면 개발에 사용할 수 있습니까?

물론 할 수 있습니다. 저는 관심을 가지고 개발을 따르고 귀하의 작업을 정말 좋아합니다.
 
고맙습니다.
 
2넨 :
"옵션"에 대한 추가 정보. 이제 극한값을 전환하기 위한 조건 중 하나는 낮은 전류가 낮은 전류보다 ExtDeviation 포인트보다 더 높다는 것입니다(높은 경우와 유사). 필요한 경우 코드를 통해 다른 옵션을 쉽게 구현할 수 있습니다.
글쎄요, klot 다음으로, 저는 ZigZag에 대한 저의 현재 관심이 전적으로 귀하의 개발에 대한 관심에서 비롯된 것이라고 덧붙이고 싶습니다.
 
다시 한 번 소스 코드를 수정했습니다. 어제 저는 때때로 첫 번째 중요한 막대의 규칙이 때때로 존중되지 않는다는 것을 알았습니다. 진실을 확인하기 위해 접속한 시간은 1시간 30분에 불과했지만, 문제는 0과 2를 비교하는 데 있었던 것 같다.
 
또 다른 버그: 막대 끝에서만 극한값을 전환할 수 있습니다. 그렇지 않으면 실시간과 기록 간의 차이가 발생합니다. 쉽게 고칠 수 있습니다. 분기의 소스 코드는 아직 수정되지 않았습니다. 새 버전이 몇 분 더 회전하도록 두십시오.
 
솔직함 , ZUP 표시기 버전 45 작성: http://onix-trade.net/forum/index.php?s=&showtopic=118&view=findpost&p=117997
그 안에 당신의 지그재그를 외부 지그재그로 포함시켰습니다. 안정적인 작동 버전이 나오면 바로 변경하겠습니다.
 
눈에 보이는 문제는 없지만 수정된 코드 버전은 다음과 같습니다.
//+------------------------------------------------------------------+
//|                                                      CZigZag.mq4 |
//|                                         Copyright © 2006, Candid |
//|                                                   likh@yandex.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Candid"
#property link      "likh@yandex.ru"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Navy

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

int    shift;
double res=0;
int i;
double CurMax,CurMin;
int CurMaxPos,CurMinPos;
int CurMaxBar,CurMinBar;
double hPoint;
double mhPoint;
double EDev;
int MaxDist,MinDist;
bool FirstRun;
bool AfterMax,AfterMin;
int BarTime;

//---- indicator buffers
double ZigZag[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init() {
//---- indicators
   SetIndexStyle(0,DRAW_SECTION);
//---- indicator buffers mapping
   SetIndexBuffer(0,ZigZag);
   SetIndexEmptyValue(0,0.0);
//---- indicator short name
   IndicatorShortName("ZigZag("+ExtDepth+","+ExtDeviation+")");
   
   FirstRun = true;
//----
  return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit() {
//----
   
//----
  return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start() {
  int counted_bars=IndicatorCounted();
  int fBar;
  
  if (FirstRun) {
    hPoint = 0.5*Point;
    mhPoint = -hPoint;
    EDev = (ExtDeviation+0.5)*Point;
    AfterMax = true;
    AfterMin = true;
    fBar = Bars-1;
    CurMax = High[fBar];
    CurMaxBar = 1;
    CurMin = Low[fBar];
    CurMinBar = 1;
    MaxDist = 0;
    MinDist = 0;
    BarTime = 0;
    FirstRun = false;
  }


//----
  fBar = Bars-counted_bars-1;
  if (fBar > Bars-2) fBar = Bars-2;
  for(shift=fBar; shift>=0; shift--) {
    if (BarTime!=Time[shift]) {
      BarTime=Time[shift];
      if (res > hPoint ) {
        MaxDist = Bars-CurMaxBar-shift+1;
        MinDist = Bars-CurMinBar-shift+1;
        if ((MaxDist>ExtDepth && MinDist>ExtDepth) || res > EDev) {
          if (AfterMax) {
            AfterMax = false;
            AfterMin = true;
            CurMaxBar = CurMinBar+1;
            CurMaxPos = Bars-CurMaxBar;
            CurMax = High[CurMaxPos];
            for (i=CurMaxPos-1;i>=shift;i--) {
              if (High[i] > CurMax+hPoint) {
                CurMaxBar = Bars-i;
                CurMax = High[i];
              }
            }  //  for (i=CurMaxPos-1;i>=shift;i--)
            ZigZag[Bars-CurMaxBar] = CurMax;
          } else {  //  if (AfterMax)
            AfterMin = false;
            AfterMax = true;
            CurMinBar = CurMaxBar+1;
            CurMinPos = Bars-CurMinBar;
            CurMin = Low[CurMinPos];
            for (i=CurMinPos-1;i>=shift;i--) {
              if (Low[i] < CurMin-hPoint) {
                CurMinBar = Bars-i;
                CurMin = Low[i];
              }
            }  //  for (i=CurMinPos-1;i>=shift;i--)
            ZigZag[Bars-CurMinBar] = CurMin;
          }  //  else if (AfterMax)    
        }  //  if ((MaxDist>ExtDepth && MinDist>ExtDepth) || res > EDev)
      }  //  if (res > hPoint )
    }  //  if (BarTime!=Time[0])
    if (AfterMax) {
      res = Low[shift]-CurMin;
      if (res < mhPoint) {
        ZigZag[Bars-CurMinBar] = 0;
        CurMin = Low[shift];
        CurMinBar = Bars-shift; 
        ZigZag[Bars-CurMinBar] = CurMin;
      }  //  if (res < mhPoint)
    }  //  if (AfterMax) 
    if (AfterMin) {
      res = CurMax-High[shift];
      if (res < mhPoint) {
        ZigZag[Bars-CurMaxBar] = 0;
        CurMax = High[shift];
        CurMaxBar = Bars-shift; 
        ZigZag[Bars-CurMaxBar] = CurMax;
      }  //  if (res < mhPoint)
    }  //  if (AfterMin) 
  }  //  for(shift=fBar; shift>=0; shift--)
//----
  return(0);
}
//+------------------------------------------------------------------+


다른 지그재그의 특징에 대한 질문. 이 지그재그의 주요 징후는 모든 것이 한 번에 완료되고, 이력 데이터는 극한값이 고정된 경우에만, 이 극값 이후의 데이터에 대해서만 다시 검토된다는 것입니다. 즉, 꽤 빨라야 합니다. 드로잉 기능은 물론 극한 고정 기준에 따라 다르지만 여기서는 다양한 옵션을 쉽게 구현할 수 있습니다. 예를 들어, 이전 이동의 백분율로 전환하고, 높음이 낮음에서 멀리 이동하고(각각 높음에서 낮음), 스위치를 평균 막대 크기에 연결하는 옵션을 이미 만들었습니다.

 
표시기의 또 다른 문제는 다음과 같습니다. 지그재그에서 꼬임을 발견했습니다(그림의 커서 십자형). 브레이크 타임은 단말기가 꺼진 시간에 해당하고 가격은 다시 켜는 시간에 해당합니다.


발생한 의심을 명확히 하기 위해 다음 Print를 코드에 삽입했습니다.
 if (shift<5) Print ("shift=",shift,", Bars=",Bars,", Time[shift]=",TimeToStr(Time[shift],TIME_DATE|TIME_MINUTES),", High[shift] =",높음[시프트],",낮음[시프트]=",낮음[시프트]);


그 후 터미널이 닫히고 몇 분 후에 다시 시작되었습니다. 다음은 로그 스니펫입니다.

 2006.10.31 23:58:26 CZZ2 EURUSD,M1: shift=0, Bars=38233, Time[shift]=2006.10.31 22:51, High[shift]=1.2763, Low[shift]=1.2763
2006.10.31 23:58:26 CZZ2 EURUSD,M1: shift=0, Bars=38233, Time[shift]=2006.10.31 22:51, High[shift]=1.2763, Low[shift]=1.2763
2006.10.31 23:58:26 CZZ2 EURUSD,M1: shift=0, Bars=38233, Time[shift]=2006.10.31 22:51, High[shift]=1.2763, Low[shift]=1.2763
2006.10.31 23:58:26 CZZ2 EURUSD,M1: shift=1, 막대=38233, 시간[shift]=2006.10.31 22:50, 높음[shift]=1.2763, 낮음[shift]=1.2762
2006.10.31 23:58:26 CZZ2 EURUSD,M1: shift=2, 막대=38233, 시간[shift]=2006.10.31 22:49, 높음[shift]=1.2763, 낮음[shift]=1.2763
2006.10.31 23:58:26 CZZ2 EURUSD,M1: shift=3, 막대=38233, 시간[shift]=2006.10.31 22:47, 높음[shift]=1.2763, 낮음[shift]=1.2762
2006.10.31 23:58:26 CZZ2 EURUSD,M1: shift=4, 막대=38233, 시간[shift]=2006.10.31 22:45, 높음[shift]=1.2763, 낮음[shift]=1.2762
2006.10.31 23:58:25 CZZ2 EURUSD,M1: shift=0, 막대=38230, 시간[shift]=2006.10.31 22:51, 높음[shift]=1.2763, 낮음[shift]=1.2763
2006.10.31 23:58:25 CZZ2 EURUSD,M1: shift=1, 막대=38230, 시간[shift]=2006.10.31 22:45, 높음[shift]=1.2762, 낮음[shift]=1.2762
2006.10.31 23:58:23 CZZ2 EURUSD,M1: shift=0, 막대=38229, 시간[shift]=2006.10.31 22:45, 높음[shift]=1.2762, 낮음[shift]=1.2762
2006.10.31 23:58:22 CZZ2 EURUSD,M1: shift=0, 막대=38229, 시간[shift]=2006.10.31 22:45, 높음[shift]=1.2762, 낮음[shift]=1.2762


23:58:23에 히스토리가 아직 펌핑되지 않았으며 23:58:25까지 1개의 마지막 막대가 펌핑되었음을 알 수 있습니다. 그리고 2006.10.31 23:58:26까지만 모든 중간 막대가 다운로드되었습니다.
개발자에게 질문: 이것이 표준 스왑 순서입니까? 그렇다면 요점은 무엇입니까? 현재 시세를 조기에 확보하는 것이 바람직함은 자명하다. 그러나 일정 기간 동안 역사에 구멍이 계획적으로 존재한다는 것은 본질적으로 이 시간에 대한 지표의 보장 실패를 의미합니다. 히스토리가 완전히 로드될 때까지 사용자 가 지표 계산을 연기하는 것이 더 안전하지 않습니까? 아니면 적어도 전체 교체 후에 다시 초기화합니까?

 
"다시 초기화"에 관해서는 헛되이 썼습니다. 본질적으로 흔적을 덮을 것입니다 :)
 
나는 그러한 역사의 교환에 익숙하다. 나는 처음 5개의 지그재그 브레이크와 ZUP 표시기의 재계산을 확인했습니다.