보조지표 게시글

파이보나치 지그재그: 메타트레이더 5를 위한 지표 설정하기

첨부파일
56619.zip (2.54 KB, 다운로드 0회)

설정하기

우리가 필요한 것들:

  • 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;
        }
    }
}

좋습니다. 마지막 조각입니다.

  • 상승 파동이 있다면:
  1. 새로운 고점이 생성되면 이전 고점 위치에서 새로운 고점 위치로 지그재그를 이동합니다. 이전 고점과의 바 거리를 유지합니다. 이 과정에서 저점과 저점 거리도 업데이트합니다.
  2. 새로운 저점이 생성되거나 설정되면, 고점에서 저점까지의 거리를 계산하고 파동 크기로 나눈 후 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 단위의 최소 파동 크기를 가진 같은 지그재그입니다.


연관 포스트

댓글 (0)