Search

ZigZag

지표설명

가격이 일정폭이상 변동되는 지점들을 고점/저점화해서 가격 추세를 시각화해서 보여주는 지표입니다. 일정폭이상 움직임에 대해서만 라인을 그리므로 상대적으로 작은 가격 움직임은 필터해서 마켓 노이즈을 제거하고 추세를 조금 더 명확하게 보이게 합니다. 일정폭 이상 반대로 움직이 있어야 추세가 변경되므로 이동평균과 같은 추세지표들과 같이 후행성이 주요 단점이므로 다른 지표와 적절한 결합이 필요합니다.
계산식 직전 고점대비 일정폭 하락하면 하락추세 전환 직전 저점대비 일정폭 상승하면 상승추세 전환

활용예시

//추세 상승반전 매수 //추세 하락반전 매도 input : ChangeMethod(4); //1:변화율, 2: 포인트(원), 3: 틱수, 4: n봉 최고가/최저가 갱신 input : Change(20); //ChangeMethod에 따라 변화율, 포인트, 틱수, n봉이 됨 input : UseClose(0); //0이면 고가/저가 사용, 1이면 종가 Array : HD[10](0),HT[10](0),HV[10](0); //고점 날짜, 시간, 가격 저장할 배열 Array : LD[10](0),LT[10](0),LV[10](0); //저점 날짜, 시간, 가격 저장할 배열 var : cnt(0),Hprice(0),Lprice(0); var : UpTrend(false),DownTrend(False),Trend(0); var : ZigZagTL(0),HTL(0),LTL(0); var : Text(0),Box(0); HPrice = IFf(UseClose == 1 ,C,H); LPrice = IFf(UseClose == 1 ,C,L); if Index == 0 Then { //초기 최고값 HD[0] = sDate; HT[0] = sTime; HV[0] = HPrice; //초기 최저값 LD[0] = sDate; LT[0] = sTime; LV[0] = LPrice; } Else { //ChangeMethod에 따른 추세전환 조건 //전환율 if ChangeMethod == 1 Then { //HPrice가 최근 저점대비 일정%이상 상승 UpTrend = HPrice >= LV[0]*(1+Change/100); //LPrice가 최근 고점대비 일정%이상 하락 DownTrend = LPrice <= HV[0]*(1-Change/100); } else if ChangeMethod == 2 Then //포인트(원) { //HPrice가 최근 저점대비 일정 포이트(원) 이상 상승 UpTrend = HPrice >= LV[0]+Change; //LPrice가 최근 고점대비 일정 포이트(원) 이상 하락 DownTrend = LPrice <= HV[0]-Change; } else if ChangeMethod == 3 Then //틱수 { //HPrice가 최근 저점대비 일정틱 이상 상승 UpTrend = HPrice >= LV[0]+Change*PriceScale; //LPrice가 최근 고점대비 일정틱 이상 하락 DownTrend = LPrice <= HV[0]-Change*PriceScale; } Else //n봉 최고가/최저가 갱신 { //HPrice가 최근 n봉 최고가 갱신 UpTrend = HPrice >= Highest(HPrice,Change)[1]; //LPrice가 최근 n봉 최저가 갱신 DownTrend = LPrice <= Lowest(LPrice,Change)[1]; } //상승추세 전환 if trend <= 0 and UpTrend == true Then { //추세구분 1 trend = 1; Buy(); //과거 고점의 날짜, 시간, 값을 다음 배열방으로 이동 For cnt = 9 DownTo 1 { HD[cnt] = HD[cnt-1]; HT[cnt] = HT[cnt-1]; HV[cnt] = HV[cnt-1]; } //0번방에 날짜, 시간, 가격 저장 HD[0] = sDate; HT[0] = sTime; HV[0] = HPrice; //직전 저점에서 현재 고점까지 연결선 출력 ZigZagTL = TL_New(LD[0],LT[0],LV[0],HD[0],HT[0],HV[0]); //색상은 Red TL_SetColor(ZigZagTL,Red); //추세선 굵기는 1 TL_SetSize(ZigZagTL,1); //상승전환되면 전저점과 최근저점을 연결하는 추세선 출력 if LV[1] > 0 Then { //이전 저점 연결 추세선은 삭제 TL_Delete(LTL); //새로운 저점 연결선 출력 LTL = TL_New(LD[1],LT[1],LV[1],LD[0],LT[0],LV[0]); //색상은 cyan TL_SetColor(LTL,cyan); //추세선 굵기는 0 TL_SetSize(LTL,0); //추세선 모양은 점선 TL_SetStyle(LTL,3); //왼쪽으로 확장 TL_SetExtLeft(LTL,true); //오른쪽으로 확장 TL_SetExtRight(LTL,true); //현재 고점 위치에 고점값을 텍스트로 출력 Text = Text_New(HD[0],HT[0],HV[0],NumToStr(HV[0],2)); //텍스트 색상은 Red Text_SetColor(Text,Red); //텍스트 크기는 12 Text_SetSize(Text,12); //텍스트 폰트는 굴림 Text_SetFont(Text,"굴림"); //텍스트를 굵게 설정 Text_SetBold(Text,1); //텍스트는 좌우정렬은 중앙, 상하정렬은 상 Text_SetStyle(Text,2,1); //직전 저점에서 현재 고점까지 박스 출력 Box = box_New(LD[0],LT[0],LV[0],HD[0],HT[0],HV[0]); //박스 색상은 Red box_SetColor(Box,Red); //박스 외곽선 굵기는 0 box_SetSize(Box,0); //박스 내부를 채움, 투명도 30 Box_SetFill(box,true,30); } } Else if trend >= 0 and DownTrend Then//하락추세 전환 { //추세구분은 -1 trend = -1; Sell(); //과거 저점의 날짜, 시간, 값을 다음 배열방으로 이동 For cnt = 9 DownTo 1 { LD[cnt] = LD[cnt-1]; LT[cnt] = LT[cnt-1]; LV[cnt] = LV[cnt-1]; } //0번방에 날짜, 시간, 가격 저장 LD[0] = sDate; LT[0] = sTime; LV[0] = LPrice; //직전 고점에서 현재 저점까지 연결선 출력 ZigZagTL = TL_New(HD[0],HT[0],HV[0],LD[0],LT[0],LV[0]); //색상은 Blue TL_SetColor(ZigZagTL,Blue); //굴긱는 1 TL_SetSize(ZigZagTL,1); //하락전환되면 전고점과 최근고점을 연결하는 추세선 출력 if HV[1] > 0 Then { //이전 고점연결 추세선은 삭제 TL_Delete(HTL); //새로 출력 HTL = TL_New(HD[1],HT[1],HV[1],HD[0],HT[0],HV[0]); //색상은 Red TL_SetColor(HTL,Orange); //추세선 굵기는 0 TL_SetSize(HTL,0); //추세선 모양은 점선 TL_SetStyle(HTL,3); //왼쪽으로 확장 TL_SetExtLeft(HTL,true); //오른쪽으로 확장 TL_SetExtRight(HTL,true); //현재 저점 위치에 저점값을 텍스트로 출력 Text = Text_New(LD[0],LT[0],LV[0],NumToStr(LV[0],2)); //텍스트 색상은 Blue Text_SetColor(Text,Blue); //텍스트 크기는 12 Text_SetSize(Text,12); //텍스트 폰트는 맑음 고딕 Text_SetFont(Text,"맑은 고딕"); //텍스트를 굵게 설정 Text_SetBold(Text,1); //텍스트는 좌우정렬은 중앙, 상하정렬은 하 Text_SetStyle(Text,2,0); //직전 고점에서 현재 저점까지 박스 출력 Box = box_New(HD[0],HT[0],HV[0],LD[0],LT[0],LV[0]); //색상은 Blue box_SetColor(Box,Blue); //박스 외곽선 굵기는 0 box_SetSize(Box,0); //박스 내부를 채움, 투명도 30 Box_SetFill(box,true,30); } } Else { //상승구간 if trend == 1 Then { //고점이 갱신되면 if HPrice > HV[0] Then { //갱신된 봉의 날짜/시간/가격으로 변경 HD[0] = sDate; HT[0] = sTime; HV[0] = HPrice; //지그재그 추세선의 끝점을 현재봉으로 이동 TL_SetEnd(ZigZagTL,HD[0],HT[0],HV[0]); //텍스트의 위치를 새로움 고점봉으로 이동 Text_SetLocation(Text,HD[0],HT[0],HV[0]); //텍스트의 표시값을 새로운 고점값으로 변경 Text_SetString(Text,NumToStr(HV[0],2)); //박스의 끝점을 현재봉 고점으로 이동 Box_SetEnd(Box,HD[0],HT[0],HV[0]); } } //하락구간 if trend == -1 Then { //저점이 갱신되면 if LPrice < LV[0] Then { //갱신된 봉의 날짜/시간/가격으로 변경 LD[0] = sDate; LT[0] = sTime; LV[0] = LPrice; //지그재그 추세선의 끝점을 현재봉으로 이동 TL_SetEnd(ZigZagTL,LD[0],LT[0],LV[0]); //텍스트의 위치를 새로움 저점봉으로 이동 Text_SetLocation(Text,LD[0],LT[0],LV[0]); //텍스트의 표시값을 새로운 고점값으로 변경 Text_SetString(Text,NumToStr(LV[0],2)); //박스의 끝점을 현재봉 고점으로 이동 Box_SetEnd(Box,LD[0],LT[0],LV[0]); } } } }
C
복사
뒤로가기는 좌측상단의 목차 버튼을 눌러주세요.