콘텐츠로 이동

차트 오버레이 (Chart Overlays)

ScaleChart 객체의 메서드를 사용하여 차트 위에 시각적 요소를 표시할 수 있습니다. 오버레이는 전략의 시그널과 지표를 직관적으로 확인하는 데 활용됩니다.

한국 주식 세션 기준

기본 intraday 차트와 지표는 09:00 <= t < 15:20 정규장 연속매매 구간만 사용합니다. 종가 동시호가(15:20~15:30), 시간외 종가/단일가, NXT 연장세션은 기본 차트 계산에 포함하지 않습니다. 따라서 일부 브로커 MTS/HTS의 연장세션 포함 차트와 마지막 구간이 다를 수 있습니다.

intraday 기본 날짜 범위

전략/모니터 차트, 시뮬레이션, 보고서에서 날짜를 생략하면 당일 장중 데이터가 포함됩니다. 스튜디오 차트는 기본적으로 전일까지만 조회하여, 아직 완료되지 않은 당일 세션을 제외합니다. 스튜디오 차트는 runtime WebSocket의 현재일 delta를 다시 적용하지 않고, 조회 시점의 historical snapshot을 유지합니다. 자세한 내용은 스튜디오 가이드 — intraday 날짜 범위 정책을 참고하세요.

line()

차트에 라인을 그립니다. 이동평균 등 연속적인 시계열을 표시하는 데 사용합니다.

chart_obj.line(name, value, color)

파라미터:

이름 타입 설명
name str 라인 이름 (범례에 표시)
value TSeries 표시할 시계열
color str 색상

예제:

c = chart("1D")
sma20 = ta.sma(c.close, 20)
ema50 = ta.ema(c.close, 50)

c.line("SMA 20", sma20, color="orange")
c.line("EMA 50", ema50, color="blue")

histogram()

차트에 히스토그램(막대)을 그립니다. MACD 히스토그램이나 거래량 시각화에 적합합니다.

chart_obj.histogram(name, value, color)

파라미터:

이름 타입 설명
name str 히스토그램 이름
value TSeries 표시할 시계열
color str 색상

예제:

c = chart("1D")
macd_line, signal, hist = ta.macd(c.close, 12, 26, 9)

c.histogram("MACD Hist", hist, color="gray")
c.line("MACD", macd_line, color="blue")
c.line("Signal", signal, color="orange")

hline()

수평선을 그립니다. 과매수/과매도 수준, 지지/저항선 표시에 사용합니다.

chart_obj.hline(name, value, color)

파라미터:

이름 타입 설명
name str 라인 이름
value float 수평선 Y축 값
color str 색상

예제:

c = chart("1D")
rsi = ta.rsi(c.close, 14)

c.line("RSI", rsi, color="purple")
c.hline("과매수", 70, color="red")
c.hline("과매도", 30, color="green")
c.hline("중심선", 50, color="gray")

vline()

수직선을 그립니다. 특정 시점의 이벤트를 표시하는 데 사용합니다.

chart_obj.vline(name, color)

파라미터:

이름 타입 설명
name str 라인 이름
color str 색상

예제:

c = chart("1D")
sma5 = ta.sma(c.close, 5)
sma20 = ta.sma(c.close, 20)

if sma5.cross_up(sma20):
    c.vline("Golden Cross", color="gold")
    buy(tag="골든크로스")
elif sma5.cross_down(sma20):
    c.vline("Dead Cross", color="red")
    sell(tag="데드크로스")

marker()

차트에 상태형 마커(텍스트 라벨)를 표시합니다. 하위 호환을 위해 유지되는 기본 API이며, 새 스크립트는 status_marker() 또는 shape helper를 우선하는 편이 읽기 쉽습니다.

chart_obj.marker(text="", color="#f44336", position="above", shape="circle")

파라미터:

이름 타입 설명
text str 마커에 표시할 텍스트
color str 색상
position str 위치 ("above" 또는 "below")
shape str 모양 ("circle", "square", "arrow_up", "arrow_down")

예제:

c = chart("1D")
rsi = ta.rsi(c.close, 14)

if rsi[0] < 30:
    c.marker("BUY", color="green", position="below", shape="arrow_up")
    buy(tag="RSI 과매도")
elif rsi[0] > 70:
    c.marker("SELL", color="red", position="above", shape="arrow_down")
    sell(tag="RSI 과매수")

marker helper

shape/position enum을 반복하고 싶지 않다면 helper를 사용할 수 있습니다.

chart_obj.status_marker(text="", color="#f44336", position="above", shape="circle")
chart_obj.arrow_up_marker(text="", color="#f04452") chart_obj.arrow_down_marker(text="", color="#3182f6") chart_obj.circle_marker(text="", color="#f44336", position="above") chart_obj.square_marker(text="", color="#f44336", position="above")
  • status_marker()는 상태형 marker 의도를 이름으로 드러내는 기본 helper입니다.
  • arrow_up_marker()below + arrow_up을 고정합니다.
  • arrow_down_marker()above + arrow_down을 고정합니다.
  • circle_marker()square_marker()는 shape만 고정하고 position은 유지합니다.
  • 과거 예제의 triangle/arrow shape는 계속 허용되지만, 현재 표준 표기는 arrow_up/arrow_down입니다.
c = chart("1D")

if ta.crossover(ta.sma(c.close, 5), ta.sma(c.close, 20)):
    c.arrow_up_marker("GOLDEN")
elif ta.crossunder(ta.sma(c.close, 5), ta.sma(c.close, 20)):
    c.arrow_down_marker("DEAD")

pane()

서브 패인(별도 차트 영역)을 생성합니다. 오실레이터(RSI, ADX, MACD 등)처럼 가격과 다른 스케일의 지표를 분리 표시하는 데 사용합니다.

chart_obj.pane(name) → PaneProxy

파라미터:

이름 타입 설명
name str 패인 이름 (같은 이름이면 같은 패인에 추가)

PaneProxy 메서드:

line(), histogram(), hline(), vline(), marker(), status_marker(), shape helper — ScaleChart와 동일한 시그니처.

예제:

c = chart("1T")

# 메인 차트에는 가격 오버레이
c.line("EMA 20", ta.ema(c.close, 20), color="orange")

# ADX 서브 패인
p = c.pane("ADX")
adx = ta.adx(c.high, c.low, c.close, 14)
p.line("ADX", adx, color="purple")
p.hline("강한 추세", 25, color="gray")

# RSI 서브 패인
r = c.pane("RSI")
rsi = ta.rsi(c.close, 14)
r.line("RSI", rsi, color="cyan")
r.hline("과매수", 70, color="red")
r.hline("과매도", 30, color="green")

전략 상세 차트와 모니터 차트는 위 named pane payload를 별도 보조 패인으로 유지해 렌더링합니다. 따라서 RSI, ADX, MACD histogram처럼 메인 가격축과 다른 스케일의 지표도 runtime 화면에서 분리 표시할 수 있습니다.


runtime 주문 마커와 decision preview

DSL은 차트에 marker를 그릴 수 있지만, Studio와 거래 차트의 marker는 runtime 실행 상태를 함께 반영합니다.

  • 차트 overlay와 marker는 모두 상태형(stateful) 으로 취급합니다. 같은 candle 안에서 같은 객체를 여러 번 갱신하면 최종 상태가 canonical 값이 됩니다.
  • 한 실행에서 같은 candle에 여러 marker를 등록한 경우, 최종 상태를 구성하는 marker들은 함께 표시될 수 있습니다.
  • 같은 candle에서 동일한 사용자/status marker를 반복 등록하면 append 대신 같은 identity marker를 upsert합니다. identity는 time, marker_type, text, color, position, shape 조합으로 구분합니다.
  • 사용자가 chart("1D").marker(...)처럼 직접 그린 marker는 선언한 chart/timeframe에만 남습니다. 다른 timeframe 차트로 자동 복제되지 않습니다.
  • runtime overlay patch는 현재 진행 중인 candle marker를 최신 실행 결과로 교체하는 신호입니다. 따라서 이번 실행 결과에서 빠진 현재 candle 사용자 marker는 다음 patch에서 제거됩니다.
  • 닫힌 과거 candle의 사용자 marker는 브라우저 차트 state에서 유지할 수 있습니다. runtime patch가 과거 marker를 매번 전부 다시 보내지 않아도, 과거 이력을 즉시 지우는 방식으로 해석하지 않습니다.
  • 시스템 주문 marker는 항상 strategy.order_on 기준 차트에만 표시됩니다. 스크립트에 해당 chart 선언이 없어도 Studio와 거래 탭은 이 차트를 자동으로 포함합니다.
  • Studio 테스트/평가에서 주입되는 DSL decision marker도 같은 규칙을 따릅니다. 즉 available scale 전체에 복제되지 않고 canonical strategy.order_on 차트에만 표시됩니다.
  • strategy.order_on="tick"인 전략은 UI에서 canonical chart를 1T로 대표 표시합니다.
  • 주문 후보로 채택된 intent와 실제 submitted 주문 marker는 차트에서 같은 semantic class로 취급합니다. 즉 Studio의 decision marker와 거래 탭의 runtime 주문 marker가 같은 방향/색 체계를 공유합니다.
  • DSL decision marker payload는 내부적으로 PREVIEW status를 가질 수 있지만, 차트에서는 별도 회색 preview 계열이 아니라 submitted와 같은 주문 marker 계열로 렌더링합니다.
  • 엔진이 STOPPED여도 주문 후보로 채택된 intent는 차트에 남을 수 있습니다. 이전의 별도 회색 preview marker와 같은 의미로 읽지 마세요.
  • symbol policy 또는 risk gate로 차단된 주문 의도는 warning 계열 차단 marker로 표시됩니다.
  • 취소 상태는 차트 marker의 authoritative surface가 아닙니다. 취소 여부와 최종 주문 상태는 최근 주문 패널과 거래 로그에서 확인해야 합니다.

Studio와 거래 탭이 marker 정책의 1차 표면입니다. 기존 전략/모니터 차트 경로는 호환을 위해 남아 있어도 별도 정책 축으로 확장하지 않습니다.


현재가와 종목 패널 값

전략 탭과 모니터 탭의 종목 패널은 보유 여부와 무관하게 현재가와 일중 변동을 표시할 수 있습니다.

  • 우선순위 1: runtime live price
  • 우선순위 2: raw quote의 현재가(stck_prpr)와 시가(stck_oprc) fallback

따라서 첫 실시간 틱이 아직 없더라도, quote warm-up이 끝난 종목은 종목 패널과 workspace row에 현재가와 등락이 먼저 채워질 수 있습니다.


색상 값

오버레이에서 사용할 수 있는 색상 이름의 예시입니다.

색상 일반 용도
빨강 "red" 매도, 과매수, 상한
녹색 "green" 매수, 과매도, 하한
파랑 "blue" 이동평균, 기본 라인
주황 "orange" 시그널 라인, 경고
보라 "purple" RSI, 보조 지표
회색 "gray" 중심선, 보조선
흰색 "white" 제로 라인
청록 "cyan" 보조 지표
금색 "gold" 특수 시그널
자홍 "magenta" 보조 지표

종합 예제

version("1.0")
description("풀 차트 오버레이 전략")

c = chart("1D")

# 볼린저밴드
upper, mid, lower = ta.bbands(c.close, 20, 2.0)
c.line("BB Upper", upper, color="red")
c.line("BB Mid", mid, color="gray")
c.line("BB Lower", lower, color="green")

# 이동평균
ema12 = ta.ema(c.close, 12)
c.line("EMA 12", ema12, color="orange")

# MACD
macd_line, signal, hist = ta.macd(c.close, 12, 26, 9)
c.histogram("MACD Hist", hist, color="gray")
c.line("MACD", macd_line, color="blue")
c.line("Signal", signal, color="orange")

# RSI 레벨
rsi = ta.rsi(c.close, 14)
c.hline("OB 70", 70, color="red")
c.hline("OS 30", 30, color="green")

# 시그널 마커
if c.close[0] < lower[0] and rsi[0] < 30:
    c.marker("BUY", color="green", position="below", shape="triangle")
    buy(tag="BB하단 + RSI과매도")
elif c.close[0] > upper[0] and rsi[0] > 70:
    c.marker("SELL", color="red", position="above", shape="triangle")
    sell(tag="BB상단 + RSI과매수")
else:
    hold()

관련 문서