설정하기
우리가 필요한 것들:
- 1개의 지그재그 플롯
- 고점과 저점을 위한 2개의 데이터 버퍼
- 입력 파라미터
- 지표가 재계산될 때마다 리셋되는 시스템 변수 집합
upWaves 배열은 고점을 저장하고, dwWaves 배열은 저점을 저장합니다.
시스템 변수:
우리는 마지막 파동의 유형, 시작 위치, 종료 위치, 시작과 종료 간의 바 거리 등을 알아야 합니다.
또한, 지역 고점과 저점 변수, 각 지점에서의 바 거리도 필요합니다.
//--- 지그재그 추적하기 int wave_type=0; //--- 파동 유형 [0] 없음 [1] 상승 [2] 하락 double wave_start_price=0.0; //--- 파동 시작 가격 double wave_end_price=0.0; //--- 파동 종료 가격 int wave_start_distance=0; //--- 시작 가격에서의 바 거리 int wave_end_distance=0; //--- 종료 가격에서의 바 거리 //--- 고점 추적 double high_mem=0.0; int distance_from_high=0; //--- 저점 추적 double low_mem=0.0; int distance_from_low=0; //--- 롤링 ATR double rollingAtr=0.0; int rollingAtrs=0;
마지막으로, 롤링 ATR 단위와 얼마나 계산되었는지 확인합니다.
그리고 시스템 리셋 함수를 생성해줍니다:
void resetSystem(){
ArrayFill(upWaves,0,ArraySize(upWaves),0.0);
ArrayFill(dwWaves,0,ArraySize(dwWaves),0.0);
wave_type=0;
wave_start_price=0.0;
wave_end_price=0.0;
wave_start_distance=0;
wave_end_distance=0;
high_mem=0.0;
low_mem=0.0;
distance_from_high=0;
distance_from_low=0;
rollingAtr=0.0;
rollingAtrs=0;
}
기본적인 작업으로, 배열을 0으로 채우고 시스템 변수를 리셋합니다.
초기화 시 버퍼와 플롯을 설정하고 첫 번째로 리셋을 호출합니다:
SetIndexBuffer(0,upWaves,INDICATOR_DATA); SetIndexBuffer(1,dwWaves,INDICATOR_DATA); PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0); PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_ZIGZAG); PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,Color); PlotIndexSetInteger(0,PLOT_LINE_WIDTH,Width); PlotIndexSetInteger(0,PLOT_LINE_STYLE,Style); resetSystem();
이제 계산으로 들어갑니다.
먼저 처리해야 할 것은 롤링 ATR입니다.
ATR 기간보다 더 많은 바를 수집할 때까지는 아무 작업도 하지 않습니다.
롤링 ATR을 관리하는 부분은 다음과 같습니다:
- 기간보다 적으면, 발견된 바의 범위를 더합니다.
- 기간에 도달하면 첫 번째 나눗셈(평균)을 수행합니다.
- 그 후, 롤링 ATR의 구간 하나를 제거하고, 새로운 구간을 추가합니다.
마지막 부분을 먼저 배치하는 이유는 더 자주 발생하기 때문입니다.
//--- ATR 관리
rollingAtrs++;
if(rollingAtrs>rollingAtrPeriod){
double new_portion=((high[i]-low[i])/_Point)/((double)rollingAtrPeriod);
//--- 오래된 구간을 제거하고 새로운 구간을 추가합니다.
rollingAtr=(rollingAtr)-(rollingAtr/((double)rollingAtrPeriod))+new_portion;
} else if(rollingAtrs<=rollingAtrPeriod){
rollingAtr+=(high[i]-low[i])/_Point;
if(rollingAtrs==rollingAtrPeriod){
rollingAtr/=((double)rollingAtrs);
//--- 고점과 저점 메모리 시작
high_mem=high[i];
low_mem=low[i];
distance_from_high=0;
distance_from_low=0;
}
}
좋습니다, 이제 또 다른 문제가 있습니다.
이 지그재그의 기초는 되돌림입니다.
그러나 되돌림이 발생하려면 적어도 하나의 파동이 있어야 합니다.
그래서 우리는 다음과 같이 진행합니다:
- ATR이 채워지면(ATR 수집 = 기간), 고점과 저점을 시스템 변수에 저장합니다.
- 어느 쪽이든 유효한 크기의 파동을 형성하면 새로운 고점(상승 파동) 또는 새로운 저점(하락 파동)을 생성합니다.
이렇게 하면 초기 파동에서 되돌림이 발생하지 않지만, 어쨌든 시퀀스를 시작해야 합니다.
//--- 파동 유형이 아직 없는 경우
else{
//--- 고점을 깨고 저점을 깨지 않았다면
if(high[i]>high_mem&&low[i]>=low_mem){
double new_wave_size_in_atr_units=((high[i]-low_mem)/_Point)/rollingAtr;
//--- 새로운 파동 크기가 유효하다면
if(new_wave_size_in_atr_units>=minSizeInAtrUnits){
//--- 새로운 상승 파동 시작
wave_type=1;
wave_start_price=low_mem;
wave_start_distance=distance_from_low;
wave_end_price=high[i];
wave_end_distance=0;
dwWaves[i-wave_start_distance]=low_mem;
upWaves[i]=high[i];
high_mem=high[i];
distance_from_high=0;
low_mem=low[i];
distance_from_low=0;
}
} else if(low[i]=minSizeInAtrUnits){
//--- 새로운 하락 파동 시작
wave_type=-1;
wave_start_price=high_mem;
wave_start_distance=distance_from_high;
wave_end_price=low[i];
wave_end_distance=0;
upWaves[i-wave_start_distance]=high_mem;
dwWaves[i]=low[i];
high_mem=high[i];
distance_from_high=0;
low_mem=low[i];
distance_from_low=0;
}
}
}
좋습니다. 마지막 조각입니다.
- 상승 파동이 있다면:
- 새로운 고점이 생성되면 이전 고점 위치에서 새로운 고점 위치로 지그재그를 이동합니다. 이전 고점과의 바 거리를 유지합니다. 이 과정에서 저점과 저점 거리도 업데이트합니다.
- 새로운 저점이 생성되거나 설정되면, 고점에서 저점까지의 거리를 계산하고 파동 크기로 나눈 후 100을 곱해 비율을 맞춥니다. 만약 새로운 '될' 파동이 유효하다면 하락 파동을 시작합니다.
여기 관련 코드입니다:
//--- 상승 파동이 있을 때
if(wave_type==1){
//--- 파동이 위로 확장된다면
if(high[i]>wave_end_price){
upWaves[i-wave_end_distance]=0.0;
upWaves[i]=high[i];
wave_end_price=high[i];
wave_end_distance=0;
high_mem=high[i];
distance_from_high=0;
low_mem=low[i];
distance_from_low=0;
}
//--- 되돌림 확인
if(low[i]0.0){
double retraced=(size_of_retracement/size_of_wave)*100.0;
double new_wave_size_in_atr_units=((wave_end_price-low_mem)/_Point)/rollingAtr;
if(new_wave_size_in_atr_units>=minSizeInAtrUnits){
if(retraced>=retracement){
wave_type=-1;
wave_start_price=high[i-distance_from_high];
wave_start_distance=distance_from_high;
wave_end_price=low[i];
wave_end_distance=0;
upWaves[i-wave_start_distance]=high_mem;
dwWaves[i]=low[i];
high_mem=high[i];
distance_from_high=0;
low_mem=low[i];
distance_from_low=0;
}
}
}
}
}
하락 파동이 있을 때는 반대로 진행합니다.
이제 되돌림 지그재그가 준비되었습니다.
다음은 23.6% 되돌림과 0.0 ATR 단위의 최소 파동 크기를 가진 지그재그입니다.

그리고 여기는 3 ATR 단위의 최소 파동 크기를 가진 같은 지그재그입니다.
