다중 타임프레임(MTF) 데이터 불러오기: request.security() 함수를 활용해 상위 프레임(일봉·4시간봉)의 RSI를 하위 프레임 차트에 오버레이하는 법
안녕하세요, 여러분! 👋 트레이딩뷰에서 나만의 멋진 전략 지표를 만들다가 "아, 지금 5분봉 단타를 치고 있지만 큰손들은 4시간봉이나 일봉에서 어떤 모양을 그리고 있는지 한눈에 같이 보고 싶은데..." 하고 답답하셨던 적, 다들 한 번쯤 있으시죠?
단기 차트만 들여다보고 매매하다 보면 숲은 못 보고 나무만 보다가 큰 추세에 호되게 당하기 십상입니다. 이럴 때 필요한 게 바로 단기 타임프레임(5분봉, 15분봉 등)의 민첩함과 상위 타임프레임(일봉, 4시간봉 등)의 묵직한 대세 추세를 동시에 묶어버리는 다중 타임프레임(MTF) 분석인데요!
문득 이런 의문, 품어보지 않으셨나요?
"도대체 짧은 봉 차트 위에 상위 타임프레임의 RSI 같은 핵심 보조지표를 깔끔하게 띄워놓고 매매할 수는 없는 걸까?"
이 복잡한 숙제를 단번에 해결해 주는 파인 스크립트(Pine Script v5)의 최고급 치트키 함수가 있습니다. 바로 오늘 이야기할 request.security()입니다!
이번 글에서는 request.security()를 활용해 상위 타임프레임의 RSI를 찰떡같이 불러와 차트에 오버레이하는 구체적인 코드 작성법부터, 초보자들이 가장 흔하게 겪는 치명적인 실수와 주의사항까지 아주 알기 쉽게 낱낱이 파헤쳐 드리겠습니다.
내 차트의 해상도를 한 차원 훅 높여줄 마법의 코드, 지금 바로 만나러 가볼까요? 🚀
1. request.security() 함수 기초 매개변수 이해
request.security() 함수는 현재 차트의 심볼(종목) 또는 타임프레임이 아닌, 다른 심볼이나 상위/하위 타임프레임의 데이터를 요청할 때 사용합니다.
request.security(symbol, timeframe, expression, gaps, lookahead)
symbol (
string): 데이터를 가져올 종목 코드입니다. 현재 차트와 동일한 종목을 사용할 때는syminfo.tickerid를 입력합니다.timeframe (
string): 가져올 타임프레임 주기입니다.일봉:
"D"주봉:
"W"4시간봉:
"240"(분 단위 표기)1시간봉:
"60"
expression (
type): 가져올 계산식이나 지표 변수입니다. (예:ta.rsi(close, 14))gaps (
barmerge.gaps_*): 상위 타임프레임 봉이 완성되지 않은 중간 봉들의 데이터를 어떻게 처리할지 결정합니다.barmerge.gaps_off(기본값): 상위 봉이 완성될 때까지 이전 완성된 값을 계속 유지하여 채웁니다.barmerge.gaps_on: 상위 봉이 업데이트되지 않는 구간에서는na값(빈값)을 반환합니다.
lookahead (
barmerge.lookahead_*): 과거 백테스팅 시 미래 데이터 참조(리페인팅, Lookahead Bias)를 방지하는 설정입니다.barmerge.lookahead_off: 확정된 이전 봉의 데이터만 불러와 리페인팅을 방지합니다.
2. 미래 참조(Lookahead Bias / 리페인팅) 방지법
MTF 지표 제작 시 가장 흔하게 범하는 실수가 Lookahead Bias(미래 데이터 참조) 문제입니다.
실시간 매매 시에는 상위 타임프레임 봉이 아직 마감되지 않았기 때문에 데이터가 움직이지만, 백테스팅에서는 해당 일봉/4시간봉의 최종 종가를 과거 하위 봉들에 미리 적용해 버리는 현상이 발생합니다. 이 경우 백테스트 성과는 압도적으로 좋게 나오지만, 실전 투입 시 심각한 손실로 이어집니다.
이를 완벽하게 방지하기 위해서는 아래 두 가지 원칙을 지켜야 합니다.
// 리페인팅이 발생하는 위험한 코드 (백테스트 오류 원인)
bad_rsi = request.security(syminfo.tickerid, "D", ta.rsi(close, 14))
// 리페인팅을 완벽히 방지한 올바른 코드
rsi_expr = ta.rsi(close, 14)[1]
safe_rsi = request.security(syminfo.tickerid, "D", rsi_expr, lookahead = barmerge.lookahead_off)
위와 같이 작성하면, 현재 형성 중인 일봉이 아니라 이미 마감(확정)된 전일 일봉의 RSI 값만 가져오므로 백테스트와 실매매 간의 차이가 사라집니다.
3. 실전 파인 스크립트 v5 전체 코드
아래 코드는 현재 차트(예: 5분봉 또는 15분봉) 위에 4시간봉 RSI와 일봉 RSI를 동시에 계산하여 오버레이하고, 과매수(70)/과매도(30) 영역을 시각화하는 전체 지표 코드입니다.
//@version=5
indicator(title="MTF RSI Indicator (4H & Daily)", shorttitle="MTF RSI", overlay=false)
// ==========================================
// 1. 사용자 입력 설정 (Inputs)
// ==========================================
rsi_length = input.int(14, title="RSI 기간 (Length)")
show_4h = input.bool(true, title="4시간봉 RSI 표시")
show_daily = input.bool(true, title="일봉 RSI 표시")
tf_4h = input.timeframe("240", title="상위 타임프레임 1")
tf_daily = input.timeframe("D", title="상위 타임프레임 2")
// ==========================================
// 2. 현재 타임프레임 RSI 계산
// ==========================================
current_rsi = ta.rsi(close, rsi_length)
// ==========================================
// 3. 상위 타임프레임 RSI 데이터 요청 (리페인팅 방지 적용)
// ==========================================
// 표현식 정의: 마감된 이전 봉([1])의 RSI를 계산
rsi_expression = ta.rsi(close, rsi_length)[1]
// 4시간봉 RSI 불러오기
rsi_4h = request.security(
syminfo.tickerid,
tf_4h,
rsi_expression,
gaps = barmerge.gaps_off,
lookahead = barmerge.lookahead_off
)
// 일봉 RSI 불러오기
rsi_daily = request.security(
syminfo.tickerid,
tf_daily,
rsi_expression,
gaps = barmerge.gaps_off,
lookahead = barmerge.lookahead_off
)
// ==========================================
// 4. 차트 출력 및 시각화 (Plotting)
// ==========================================
// 기준선 (30, 50, 70) 설정
h_top = hline(70, "과매수 (Overbought)", color=color.new(color.red, 30), linestyle=hline.style_dashed)
hline(50, "중립 (Neutral)", color=color.new(color.gray, 50), linestyle=hline.style_dotted)
h_bot = hline(30, "과매도 (Oversold)", color=color.new(color.green, 30), linestyle=hline.style_dashed)
// 기준선 사이 배경색 채우기
fill(h_top, h_bot, color=color.new(color.purple, 95), title="RSI 정상 범주 배경")
// 현재 차트 RSI 출력
plot(current_rsi, title="현재 차트 RSI", color=color.gray, linewidth=1)
// 상위 타임프레임 RSI 출력 (선 굵기 및 색상 차별화)
plot(show_4h ? rsi_4h : na, title="4시간봉 RSI", color=color.orange, linewidth=2)
plot(show_daily ? rsi_daily : na, title="일봉 RSI", color=color.blue, linewidth=2)
4. 코드 주요 구조 및 동작 방식 해설
overlay=false: RSI는 가격(Candlestick) 차트 위에 직접 그리면 축이 맞지 않으므로, 차트 하단의 별도 오실레이터 패널에 출력하도록 설정했습니다.input.timeframe(): 사용자가 설정창에서 타임프레임을 직접 변경할 수 있도록 제작하여 flexibility를 높였습니다.rsi_expression = ta.rsi(close, rsi_length)[1]:request.security내부에서 매번 계산식을 반복하지 않고 별도 변수로 선언해 재사용성과 가독성을 높였습니다.[1]을 붙여 마감봉 데이터만 활용하도록 제한했습니다.show_4h ? rsi_4h : na: 삼항 연산자를 활용하여 사용자가 설정창에서 체크박스를 해제하면 해당 라인이 차트에 표시되지 않도록 처리했습니다.
5. MTF RSI 활용 매매 전략 팁
상위 타임프레임 RSI를 하위 차트에 오버레이하면 강력한 다중 필터링 매매 전략을 세울 수 있습니다.
추세 방향 필터링:
일봉 RSI가 50 이상(상승 국면)일 때만 하위 타임프레임(예: 15분봉)에서 매수(Long) 시그널을 노립니다.
일봉 RSI가 50 이하(하락 국면)일 때만 하위 타임프레임에서 매도(Short) 시그널을 노립니다.
다중 과매도/과매수 중첩 (Confluence):
일봉 RSI, 4시간봉 RSI, 현재 차트 RSI가 모두 30 이하(과매도)에 동시에 진입할 때 강력한 반등 타점으로 판단할 수 있습니다.
다이버전스 확인:
상위 타임프레임 RSI가 상방 다이버전스를 형성하는 동안, 하위 타임프레임에서 첫 번째 눌림목 진입을 시도하여 위험 대비 보상 비율(Risk-Reward Ratio)을 극대화할 수 있습니다.
댓글
댓글 쓰기