#지표
이 코드는 변동성 기반 상·하단 밴드와 그 주변의 파동(Upper/Lower Wave)을 그려서
추세 전환 구간을 시각화하는 지표입니다.
단기 이동평균과 장기 이동평균을 기준선으로 사용합니다.
일정기간의 고저폭(high-low) 평균에 factor를 곱해 변동성(volatility)을 구하고
최고값/최저값에 변동성을 가감해서 상단(upper), 하단(lower) 밴드를 만듭니다.
현재 방향의 반대편 밴드는 숨기고
기존 상·하단 밴드 주변에 변동성을 반영한 파동형 밴드를 형성합니다.
즉 Upper Band / Lower Band는 추세 방향에 따라 한쪽만 보이도록,
Upper Wave / Lower Wave는 ATR 기반 파동으로 보조 역할을 합니다.
// =======================
// 입력 값 설정
// =======================
input : ShortPeriod(25),LongPeriod(50); // 밴드 계산에 사용할 기본 기간
input : factor(1.0); // 변동성 배율 (볼래틸리티 확대/축소용)
// =======================
// 변수 선언
// =======================
var : direction(0); // 방향(1:상승, -1:하락)
var : volatility(0),upper_band(0),lower_band(0); //상하단 밴드
var : sig_up(False),sig_dn(False); //돌파 신호
var : upper_Wave(0),lower_Wave(0); // 파동(Upper/Lower Wave) 밴드
var : hlc3(0),alpha(0),ATrv(0); // HLC3 가격, EMA 계수, ATR 기반 변동성
var :tx1(0),tx2(0); // (현재 코드에서는 미사용 변수)
// =======================
// 기준선 및 가격 중심값 계산
// =======================
var1 = ma(C,ShortPeriod); // 25일 종가 이동평균 (단기 기준선)
var2 = ma(C,LongPeriod); // length 기간 종가 이동평균 (중기/기본 기준선)
hlc3 = (H+L+C)/3; // HLC3 (고가+저가+종가)/3, 대표가격
// =======================
// 변동성 및 상하 밴드 계산
// =======================
volatility = ma(high-low, 70) * factor; // 70기간 고저폭 평균에 factor를 곱한 변동성
upper_band = highest(var1 + volatility, int(LongPeriod/2)); // 단기기준선+변동성 값의 최고값 (LongPeriod/2 기간) → 상단 밴드
lower_band = lowest(var2 - volatility, int(LongPeriod/2)); // 중기기준선-변동성 값의 최저값 (LongPeriod/2 기간) → 하단 밴드
// =======================
// 상/하단 밴드 돌파 신호 계산
// =======================
sig_up = CrossUp(hlc3, upper_band); // HLC3가 상단 밴드를 위로 돌파하면 상승 신호
sig_dn = CrossDown(hlc3, lower_band); // HLC3가 하단 밴드를 아래로 돌파하면 하락 신호
// =======================
// 방향(direction) 설정
// =======================
if sig_up == true Then
direction = 1; // 상승 돌파 시 방향 = 1 (상승)
if sig_dn == true Then
direction = -1; // 하락 돌파 시 방향 = -1 (하락)
// 현재 방향에 따라 반대편 밴드는 표시하지 않도록 NaN 처리
upper_band = iff(direction == 1 , Nan , upper_band); // 상승 중에는 upper(상단 밴드)를 NaN으로 (표시 안 함)
lower_band = iff(direction == -1 , Nan , lower_band); // 하락 중에는 lower(하단 밴드)를 NaN으로 (표시 안 함)
// =======================
// ATR 기반 변동성(ATrV) 계산
// =======================
// alpha: EMA 계수 (1/100)
alpha = 1 / 100 ;
// ATrV: TrueRange에 대한 EMA를 계산
ATrV = IFf(IsNan(ATrV[1]) == true,
ATR(100) , // 직전 값이 NaN이면 100기간 TR 평균으로 초기화
alpha * TrueRange + (1 - alpha) * IFf(isnan(ATrV[1])==true,0,ATrV[1]) // 그렇지 않으면 EMA 방식 업데이트
);
// =======================
// ATR 파동 밴드 계산
// =======================
upper_Wave = lower_band + ATRV*5; // 하단 밴드 + ATR*5 → 상단 파동
lower_Wave = upper_band - ATRV*5; // 상단 밴드 - ATR*5 → 하단 파동
// =======================
// 파동(Upper/Lower Wave) 및 밴드 출력
// =======================
// Upper Wave 출력 (유효한 값이고, 인덱스 홀수일 때만 색 적용)
if IsNaN(upper_Wave) == False Then
plot1(upper_Wave, "Upper Wave",Cyan);
Else
NoPlot(1); // 값이 NaN이면 해당 플롯 제거
// Lower Wave 출력 (유효한 값이고, 인덱스 홀수일 때만 색 적용)
if IsNaN(lower_Wave) == False Then
plot2(lower_Wave, "Lower Wave",Cyan);
Else
NoPlot(2);
// Upper Band (하락 방향일 때만 실제 값이 남도록 위에서 처리됨)
if IsNaN(upper_band) == False Then
plot3(upper_band, "Upper Band",Red);
Else
NoPlot(3);
// Lower Band (상승 방향일 때만 실제 값이 남도록 위에서 처리됨)
if IsNaN(lower_band) == False Then
plot4(lower_band, "Lower Band",Lime);
Else
NoPlot(4);
JavaScript
복사
