Search
Duplicate
📝

Half Trend 지표

#공통 지표
Half Trend는 추세 분석 지표 중 하나로 이동평균 기반의 추세 반전 및 진입점을 찾기위해 고안된 지표입니다. TrueRange를 rma로 부드럽게 만들고 그 절반에 일정배수로 채널 폭을 만듭니다.
일정기간 최고가/최저가와 고/저가 이동평균를 이용해 상승/하락 추세 전환 조건을 체크합니다.
이평이 특정 가격 위/아래, 종가가 이전 고/저 돌파을 만족하면 추세 전환을 확정합니다.
추세별로 값을 갱신하면서 계단식으로 이어지는 추세선을 만들게 됩니다.
주가의 방향성과 강도를 평가하여 상승 및 하락 추세를 확인하는데 도움을 줍니다. 일반저긍로 주가가 지표의 선을 상향돌파하면 상승추세, 하향이탈하면 하락추세로 간주됩니다.
input : amplitude(2),channelDeviation(2); // amplitude : 고점/저점을 몇 봉 기준으로 볼지(채널 길이) // channelDeviation : ATR 기반 채널을 얼마나 벌릴지(배율) var : trend(0),nextTrend(0),maxLowPrice(0),minHighPrice(0); // trend : 현재 추세 방향 (0 = 상승, 1 = 하락) // nextTrend : 다음에 전환될 추세 방향 플래그 // maxLowPrice : 추세 전환 계산에 사용할 최근 최저가 최대값 // minHighPrice : 추세 전환 계산에 사용할 최근 최고가 최소값 var : up(0),down(0),atrHigh(0),atrLow(0),arrowUp(0),arrowDown(0); // up : 상승 추세일 때 기준선(half trend 값) // down : 하락 추세일 때 기준선(half trend 값) // atrHigh : 기준선 위쪽 ATR 채널 상단 // atrLow : 기준선 아래쪽 ATR 채널 하단 // arrowUp : 매수(상승전환) 화살표 표시 기준 가격 // arrowDown : 매도(하락전환) 화살표 표시 기준 가격 var : atr2(0),dev(0),highPrice(0),lowPrice(0),highma(0),lowma(0),ht(0); // atr2 : rmav 의 절반 값(변동성 기준값) // dev : ATR 채널 폭 (channelDeviation * atr2) // highPrice : amplitude 기간 중 최고가 // lowPrice : amplitude 기간 중 최저가 // highma : high의 이동평균 (amplitude 기간) // lowma : low의 이동평균 (amplitude 기간) // ht : 현재 half trend 라인 값 (up 또는 down) var : src(0),Alpha(0),sum(0),rmav(0),tx(0); // src : TrueRange 값(변동성 입력) // Alpha : 지수형 평균에 사용되는 가중치(1/100) // sum : rmav 초기화용 변수(이전 값 체크용) // rmav : TrueRange 의 지수 이동평균(ATR 비슷한 개념) // tx : 텍스트(▲▼) 객체 핸들 src = TrueRange; // 변동성 입력을 TrueRange로 설정 alpha = 1/100; // 지수 이동평균 가중치 설정 (0.01) rmav = iff(IsNaN(rmav[1]) == true , ma(src, 100) , alpha * src + (1 - alpha) * iff(isnan(sum[1])==true,0,rmav[1])); // rmav 초기 값이 없으면(src의 100봉 단순이평으로 시작) // 이후에는 rmav = alpha * 현재 TR + (1 - alpha) * 이전 rmav (지수이동평균 형태) atr2 = rmav / 2; // ATR 비슷한 값의 절반을 사용 (채널 폭 기본 단위) dev = channelDeviation * atr2; // 최종 채널폭 = 설정한 배수 * atr2 highPrice = Highest(H,amplitude); // amplitude 기간 동안의 최고가 lowPrice = Lowest(L,amplitude); // amplitude 기간 동안의 최저가 highma = ma(high, amplitude); // 고가의 이동평균 (amplitude 기간) lowma = ma(low, amplitude); // 저가의 이동평균 (amplitude 기간) if nextTrend == 1 Then { // nextTrend = 1 이면, 앞으로 하락 추세로 전환될 가능성을 보는 상태 maxLowPrice = max(lowPrice, maxLowPrice); // 최근 lowPrice 기준으로 maxLowPrice 갱신 (더 큰 값으로 유지) if highma < maxLowPrice and close < iff(isnan(low[1])==true,low,Low[1]) Then { // 고가 이동평균이 maxLowPrice 아래이고, // 종가도 이전 봉 저가 아래로 내려가면 // -> 하락 추세로 확정 전환 trend = 1; nextTrend = 0; minHighPrice = highPrice; // 하락 추세 기준으로 minHighPrice 초기값 설정 } } else { // nextTrend != 1 이면, 앞으로 상승 추세로 전환될 가능성을 보는 상태 minHighPrice = min(highPrice, minHighPrice); // 최근 highPrice 기준으로 minHighPrice 갱신 (더 작은 값으로 유지) if lowma > minHighPrice and close > iff(isnan(high[1])==true,high,high[1]) Then { // 저가 이동평균이 minHighPrice 위로 올라가고, // 종가가 이전 봉 고가 위로 올라가면 // -> 상승 추세로 확정 전환 trend = 0; nextTrend = 1; maxLowPrice = lowPrice; // 상승 추세 기준으로 maxLowPrice 초기값 설정 } } if trend == 0 Then { // 상승 추세 구간 if IsNaN(trend[1]) == False and trend[1] != 0 Then { // 바로 직전봉에서 추세가 0 이 아니었는데 이번 봉에서 0 이 된 경우 // -> 추세가 방금 상승으로 전환된 상황 up = iff(IsNaN(down[1]) == true,down,down[1]); // 직전 down 값을 up 기준으로 사용 (추세 전환시 기준선 이어줌) arrowUp = up - atr2; // 상승전환 화살표 위치 (기준선 아래쪽 atr2) } else { // 기존에 이미 상승 추세였던 경우 up = iff(IsNan(up[1]) == true, maxLowPrice , max(maxLowPrice, up[1])); // up 기준선을 maxLowPrice 이상으로 유지 (계단식 상승) } atrHigh = up + dev; atrLow = up - dev; // 상승 추세에서의 ATR 채널 상단/하단 } else { // 하락 추세 구간 if isnan(trend[1]) == False and trend[1] != 1 Then { // 바로 직전봉에서 추세가 1 이 아니었는데 이번 봉에서 1 이 된 경우 // -> 추세가 방금 하락으로 전환된 상황 down = iff(IsNan(up[1]) == true, up , up[1]); // 직전 up 값을 down 기준으로 사용 (추세 전환시 기준선 이어줌) arrowDown = down + atr2; // 하락전환 화살표 위치 (기준선 위쪽 atr2) } else { // 기존에 이미 하락 추세였던 경우 down = iff(IsNan(down[1]) == true, minHighPrice ,min(minHighPrice, down[1])); // down 기준선을 minHighPrice 이하로 유지 (계단식 하락) } atrHigh = down + dev; atrLow = down - dev; // 하락 추세에서의 ATR 채널 상단/하단 } ht = iff(trend == 0 , up , down); // 현재 half trend 값 : 상승이면 up, 하락이면 down plot1(ht, "HalfTrend",iff(trend == 0 ,RGB(255,82,82),rgb(33,150,243))); // HalfTrend 라인 플롯 (상승 = 빨강, 하락 = 파랑) plot2(atrHigh,"ATR High",RGB(255,82,82)); // ATR 상단 채널 플롯 (빨강) plot3(atrLow, "ATR Low", RGB(33,150,243)); // ATR 하단 채널 플롯 (파랑) if isnan(arrowUp) == false and (trend == 0 and trend[1] == 1) Then { // arrowUp 값이 존재하고, // 직전 봉은 하락(1)이고 이번 봉은 상승(0)인 지점(상승전환) tx = Text_New(sdate,stime,min(HT,Low)-PriceScale*2,"▲"); // 캔들 아래쪽에 ▲ 표시 추가 Text_SetStyle(tx,2,0); Text_SetSize(tx,20); Text_SetColor(tx,red); } if isnan(arrowDown) == false and (trend == 1 and trend[1] == 0) then { // arrowDown 값이 존재하고, // 직전 봉은 상승(0)이고 이번 봉은 하락(1)인 지점(하락전환) tx = Text_New(sdate,stime,max(HT,High)+PriceScale,"▼"); // 캔들 위쪽에 ▼ 표시 추가 Text_SetStyle(tx,2,1); Text_SetSize(tx,20); Text_SetColor(tx,blue); }
JavaScript
복사