파인스크립트 request.security() 활용법: 상위 프레임 RSI 차트 오버레이
트레이딩뷰(TradingView) 파인 스크립트(Pine Script v5)를 활용하면 단일 차트 내에서 상위 타임프레임(일봉, 4시간봉 등)의 기술적 지표를 동시에 분석하는 다중 타임프레임(MTF, Multi-Timeframe) 지표를 구현할 수 있습니다.
하위 타임프레임(예: 15분봉) 차트를 보면서 상위 타임프레임의 상대강도지수(RSI)를 함께 관찰하면, 거시적 추세 방향을 파악하면서 정밀한 진입 타점을 잡는 다중 프레임 분석이 가능해집니다.
1. 다중 타임프레임(MTF) 분석의 핵심 개념
트레이딩에서 "숲과 나무를 함께 보라"는 원칙은 기술적 분석의 기초입니다. 하위 프레임 차트는 진입과 청산의 시점을 잡는 데 유용하지만, 상위 프레임의 강력한 추세를 역행하는 매매는 실패할 확률이 높습니다.
MTF RSI 오버레이의 실전 이점
추세 필터링: 일봉 RSI가 70 이상(과매수) 영역에 있을 때 15분봉 차트에서 섣부른 추세 추종 매수를 자제하거나, 역추세 숏 타점을 신중하게 검토할 수 있습니다.
합일점(Confluence) 발견: 4시간봉 RSI가 과매도(30 이하)에 도달하고 동시에 15분봉 RSI도 과매도 신호를 보일 때, 확률 높은 반등 타점을 도출할 수 있습니다.
차트 전환 피로 감소: 타임프레임을 일일이 변경하며 지표를 비교할 필요 없이 단일 화면에서 멀티 프레임 데이터를 한눈에 파악합니다.
2. Pine Script v5 request.security() 함수 구조
상위 프레임의 데이터를 가져올 때 사용하는 핵심 함수는 request.security()입니다.
파라미터 상세설명
symbol(string): 조회할 종목의 티커입니다. 현재 차트의 종목을 그대로 쓸 때는syminfo.tickerid를 입력합니다.timeframe(string): 불러올 타임프레임 주기입니다."D": 일봉 (Day)"W": 주봉 (Week)"240": 4시간봉 (4 * 60분)"": 현재 차트의 타임프레임
expression(series): 가져오고자 하는 값입니다.ta.rsi(close, 14)처럼 계산된 시리즈 변수나 단순 가격 데이터(close,high등)를 지정합니다.gaps(barmerge.gaps_*): 상위 타임프레임 캔들이 진행되는 동안 하위 프레임 캔들에 값을 어떻게 표현할지 결정합니다.barmerge.gaps_off(기본값): 상위 캔들이 완성될 때까지 이전 값을 지속해서 채워 스텝(Step) 형태의 연속된 선을 그립니다.barmerge.gaps_on: 상위 캔들이 새로 생기는 시점에만 값을 반환하고, 나머지 하위 캔들에는na(빈값)를 채웁니다.
lookahead(barmerge.lookahead_*): 리페인팅(Repainting) 방지의 핵심 설정입니다.barmerge.lookahead_off: 캔들이 완전히 종가 확정(Close)된 과거 값만 가져옵니다. 실전 매매 및 백테스팅 오류를 막기 위해 필수로 권장됩니다.
3. 실전 파인 스크립트 코드: 일봉 & 4시간봉 RSI 오버레이
아래 코드는 현재 차트에 현재 프레임 RSI, 4시간봉 RSI, 일봉 RSI를 동시에 계산하여 차트 하단 서브패널에 출력하는 완벽한 파인 스크립트 v5 코드입니다.
//@version=5
indicator(title="MTF RSI Overlay (Current, 4H, Daily)", shorttitle="MTF RSI", overlay=false)
// ==========================================
// 1. 입력 변수 설정 (Input Settings)
// ==========================================
rsiLength = input.int(14, title="RSI 기간 (Length)", minval=1)
rsiSource = input.source(close, title="RSI 적용 가격")
// 타임프레임 선택
tf1_enable = input.bool(true, title="4시간봉 RSI 표시", group="타임프레임 설정")
tf1_str = input.timeframe("240", title="첫 번째 상위 프레임", group="타임프레임 설정")
tf2_enable = input.bool(true, title="일봉 RSI 표시", group="타임프레임 설정")
tf2_str = input.timeframe("D", title="두 번째 상위 프레임", group="타임프레임 설정")
// 기준선 설정
overbought = input.int(70, title="과매수 기준선 (Overbought)", group="기준선 설정")
oversold = input.int(30, title="과매도 기준선 (Oversold)", group="기준선 설정")
// ==========================================
// 2. RSI 계산 및 상위 프레임 데이터 로드
// ==========================================
// 현재 차트의 RSI 계산
rsiCurrent = ta.rsi(rsiSource, rsiLength)
// 안전한 상위 프레임 RSI 불러오기 함수 (리페인팅 방지 로직 적용)
f_secureRSI(_tf, _src, _len) =>
// 상위 타임프레임 기준 확정된(1바 전) RSI 계산
rsiCalculated = ta.rsi(_src, _len)[1]
// lookahead_on 과 이전 바 참조([1])의 조합을 사용해 차트 캔들 내 리페인팅을 차단
request.security(syminfo.tickerid, _tf, rsiCalculated, gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
// 상위 프레임 RSI 변수 추출
rsi4H = f_secureRSI(tf1_str, rsiSource, rsiLength)
rsiDay = f_secureRSI(tf2_str, rsiSource, rsiLength)
// ==========================================
// 3. 차트 시각화 (Plotting)
// ==========================================
// 기준선 채우기 표현
hTop = hline(overbought, "과매수 선", color=color.new(color.red, 30), linestyle=hline.style_dashed)
hline(50, "중립 선", color=color.new(color.gray, 50), linestyle=hline.style_dotted)
hBot = hline(oversold, "과매도 선", color=color.new(color.green, 30), linestyle=hline.style_dashed)
fill(hTop, hBot, color=color.new(color.purple, 95), title="RSI 정상 영역 배경")
// RSI 라인 출력
plot(rsiCurrent, title="현재 프레임 RSI", color=color.gray, linewidth=1)
plot(tf1_enable ? rsi4H : na, title="4시간봉 RSI", color=color.blue, linewidth=2)
plot(tf2_enable ? rsiDay : na, title="일봉 RSI", color=color.orange, linewidth=2)
4. 파인 스크립트 구현 시 필수 주의사항 (리페인팅 문제)
상위 프레임 데이터를 하위 차트에 가져올 때 가장 흔하게 발생하는 실수가 리페인팅(Repainting) 현상입니다.
리페인팅이 발생하는 이유
예를 들어 15분봉 차트에서 오늘 낮 12시에 생성 중인 일봉(1D) RSI 값을 조회한다고 가정해 봅시다. 낮 12시 시점의 일봉은 아직 종가가 확정되지 않은 '진행 중인 캔들'입니다.
만약 미래의 종가 데이터를 그대로 하위 프레임 과거 캔들에 소급 적용하면, 백테스팅 시점에는 완벽한 타점에 신호가 뜬 것처럼 보이지만 실제 라이브 매매에서는 지표가 계속 변동하다 사라지는 착시 현상이 일어납니다.
리페인팅 완벽 방지 패턴
리페인팅을 막으려면 "이미 완전히 종가가 확정된 상위 타임프레임의 봉(Bar) 데이터"만 참조해야 합니다.
// 1. 계산식 자체에 1바 전 참조([1])를 적용
rsiHistorical = ta.rsi(close, 14)[1]
// 2. lookahead_on을 통해 확정된 과거 데이터 반환 지정
rsiNonRepainting = request.security(syminfo.tickerid, "D", rsiHistorical, lookahead=barmerge.lookahead_on)
이 패턴을 사용하면 하위 차트의 캔들이 진행되는 동안 상위 차트의 확정된 전일 RSI 값이 일관되게 유지되어, 실제 라이브 매매 환경과 백테스트 결과가 정확히 일치하게 됩니다.
5. MTF RSI 지표의 매매 활용 방법
요약
request.security() 함수를 활용한 다중 타임프레임 RSI 오버레이는 트레이딩뷰에서 상위 프레임의 흐름을 놓치지 않도록 돕는 강력한 도구입니다. 코드 작성 시 ta.rsi()[1]과 lookahead=barmerge.lookahead_on 조합을 통해 리페인팅을 차단하는 점만 유의한다면, 백테스팅과 실전 매매 모두에서 신뢰할 수 있는 지표를 구축할 수 있습니다.
댓글
댓글 쓰기