#공통 지표
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
복사
