데이터 접근¶
chart() 함수로 차트 데이터를 가져옵니다. 반환된 객체로 OHLCV 데이터에 접근하고 지표를 차트에 그릴 수 있습니다.
지원 타임프레임¶
| 분류 | 타임프레임 |
|---|---|
| 분봉 | 1T, 3T, 5T, 10T, 15T, 30T |
| 시간봉 | 60T 또는 1H (동일), 4H |
| 일봉+ | 1D, 1W |
60T와 1H는 같은 타임프레임입니다. 어느 표기를 사용해도 동일하게 동작합니다.
대소문자는 구분하지 않습니다 — chart("1h")와 chart("1H")는 동일한 슬롯의 데이터를 반환합니다.
ScaleChart 속성¶
OHLCV¶
c.open,c.high,c.low,c.close,c.volume->TSeries
파생 시계열¶
c.hl2->(high + low) / 2c.hlc3->(high + low + close) / 3c.ohlc4->(open + high + low + close) / 4c.tr-> True Rangec.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을 반환합니다. 데이터가 충분한지 먼저 확인하세요.
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)에서도 동일하게 사용할 수 있습니다.
메서드¶
| 메서드 | 반환 | 의미 |
|---|---|---|
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.