콘텐츠로 이동

데이터 접근

chart() 함수로 차트 데이터를 가져옵니다. 반환된 객체로 OHLCV 데이터에 접근하고 지표를 차트에 그릴 수 있습니다.

c = chart("1D")       # 일봉
m5 = chart("5T")      # 5분봉
h1 = chart("1H")      # 1시간봉

지원 타임프레임

분류 타임프레임
분봉 1T, 3T, 5T, 10T, 15T, 30T
시간봉 60T 또는 1H (동일), 4H
일봉+ 1D, 1W

60T1H는 같은 타임프레임입니다. 어느 표기를 사용해도 동일하게 동작합니다.

대소문자는 구분하지 않습니다 — chart("1h")chart("1H")는 동일한 슬롯의 데이터를 반환합니다.

ScaleChart 속성

OHLCV

  • c.open, c.high, c.low, c.close, c.volume -> TSeries

파생 시계열

  • c.hl2 -> (high + low) / 2
  • c.hlc3 -> (high + low + close) / 3
  • c.ohlc4 -> (open + high + low + close) / 4
  • c.tr -> True Range
  • c.bar_index -> 봉 인덱스 TSeries (스칼라 int 아님)

스칼라

  • c.bars -> 봉 개수 (int)
  • c.scale -> 타임프레임 문자열 (str)
  • c.bar_status -> 현재 구현에서는 항상 "completed"

TSeries 규칙

시계열 데이터 접근 방법입니다. [0]이 가장 최신 값, [1]이 한 봉 이전입니다.

c = chart("1D")

c.close[0]   # 현재 봉 종가 (오늘)
c.close[1]   # 이전 봉 종가 (어제)
c.close[2]   # 2봉 전 종가

# 시계열 직접 비교 — [0] 기준으로 자동 비교
if c.close > ta.sma(c.close, 20):
    # c.close[0] > sma[0] 과 동일
    buy(tag="이평선 위")

범위를 벗어난 인덱스는 0.0을 반환합니다. 데이터가 충분한지 먼저 확인하세요.

if c.close.is_valid(60):    # 최소 60개 데이터가 있을 때만
    sma60 = ta.sma(c.close, 60)

TSeries 메서드

메서드 설명 예시
series.is_valid(i) i번째 인덱스 데이터 유효 여부 c.close.is_valid(20)
series.get_or_default(i, default) i번째 값, 없으면 기본값 c.close.get_or_default(5, 0.0)
series.cross_up(other) 이번 봉에서 상향 교차했는지 fast.cross_up(slow)
series.cross_down(other) 이번 봉에서 하향 교차했는지 fast.cross_down(slow)
series.to_list(length) 최근 N개 값을 리스트로 c.close.to_list(5)

차트 오버레이

chart()로 받은 객체에서 오버레이 메서드를 사용할 수 있습니다.

  • line(name, value, color="#2196f3")
  • histogram(name, value, color="#4caf50")
  • hline(name, value=0, color="#ff9800")
  • vline(name, color="#9c27b0")
  • marker(text="", color="#f44336", position="above", shape="circle")
  • status_marker(text="", color="#f44336", position="above", shape="circle")
  • arrow_up_marker(text="", color="#f04452")
  • arrow_down_marker(text="", color="#3182f6")
  • circle_marker(text="", color="#f44336", position="above")
  • square_marker(text="", color="#f44336", position="above")
  • pane(name)

universe.* — 거래소 전체 ticker 랭킹 (업비트 피벗)

업비트 자체 스크리너는 거래소 전체 ticker에 대한 metric을 cache 레이어로 유지합니다. universe.*는 현재 ticker가 그 랭킹의 어디에 위치하는지 lookup하는 surface입니다. 모든 lookup은 cache hit으로 동작하며, 조건식·자동매매 어느 경로(evaluate, evaluate_test_batch, incremental step)에서도 동일하게 사용할 수 있습니다.

if universe.in_top("trade_value_24h", n=50):
    buy(qty=1, tag="top50_entry")

메서드

메서드 반환 의미
universe.in_top(key, n) bool 현재 ticker가 metric key 상위 N에 드는가
universe.in_bottom(key, n) bool 하위 N에 드는가
universe.rank(key) int \| None 1-based rank (1 = 최상위)
universe.percentile(key) float \| None 0.0 ~ 1.0 백분위
universe.metric(key) float \| None 현재 ticker의 metric raw 값
universe.size() int universe scope 안 ticker 수
universe.ref(symbol) SymbolRef 다른 ticker 참조 (구현 예정)

Built-in metric 키

엔진이 WS 데이터에서 항상 갱신합니다. 등록 절차 없이 바로 사용할 수 있습니다.

key 의미
trade_value_24h / _1h / _5m 누적 거래대금 (KRW)
trade_volume_24h / _1h 누적 거래량 (coin)
change_pct_24h / _1h / _5m 등락률
volatility_1h / _24h 수익률 stdev (candle close 갱신)
last_price 현재가
spread_bps 호가 스프레드 (bp)

동작 보장

  • 슬라이딩 윈도우(*_1h, *_5m) 랭킹은 비활성 ticker도 시간 경과에 따라 자동 만료됩니다 — 70분간 거래가 없는 ticker가 trade_value_1h 랭킹에 계속 남아 의사결정을 왜곡하지 않습니다.
  • universe cache가 wiring되지 않은 평가에서 universe.*를 호출하면 즉시 UniverseNotWiredError가 발생합니다 (silently False/None을 돌려주지 않습니다).
  • 등록되지 않은 metric key는 UniverseMetricNotRegistered로 등록된 키 목록과 함께 명시적으로 실패합니다.

자세한 spec: ssot/spec/upbit-screener.md §6.

관련 문서