#공통 전략
Reversal Band를 이용한 시스템입니다.
Reversal Band는 변동성 기반 상·하단 밴드와 그 주변의 파동(Upper/Lower Wave)을 그려서
추세 전환 구간을 시각화하는 지표입니다.
upper_band 상향돌파시 매수진입
Lower_band 하향이탈시 매도진입
매수진입 후 upper_Wave 위로 봉이 완전히 올라갔다가 하락해 upper_wave를 터치하면 청산
매도진입 후 Lower_Wave 아래로 봉이 완전히 내려갔다가 상승해 Lower_wave를 터치하면 청산
// =======================
// 입력 값 설정
// =======================
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 direction <= 0 and sig_up == true Then
direction = 1; // 상승 돌파 시 방향 = 1 (상승)
if direction >= 0 and 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 → 하단 파동
if MarketPosition <= 0 and direction == 1 and direction != direction[1] Then
Buy("B");
if MarketPosition >= 0 and direction == -1 and direction != direction[1] Then
Sell("S");
if MarketPosition == 1 and L > upper_wave Then
ExitLong("bx",AtStop,upper_Wave);
if MarketPosition == -1 and H < Lower_wave Then
ExitShort("sx",AtStop,Lower_Wave);
JavaScript
복사
