시작하기

데이터 연결

차트는 Datafeed 인터페이스로 데이터를 받아요.
어떤 거래소·증권사든 이 몇 개의 함수만 구현하면 연결돼요.

Datafeed 인터페이스

속성타입기본값설명
resolveSymbol(symbol) => Promise<SymbolInfo>—종목 정보: 이름, 거래소, 시간대, 장 시간, 호가 단위, 로고.
getBars(info, resolution, { from, to, countBack }) => Promise<{ bars, noMoreData }>—과거 봉.
왼쪽으로 스크롤하면 더 오래된 구간을 다시 요청해요.
subscribeBars(info, resolution, onBar, onResetCache?, onConnection?) => unsubscribe—실시간 봉.
틱마다 현재 봉을 onBar로 넘겨요.
searchSymbols(query) => Promise<SymbolSearchResult[]>—선택.
종목 검색 창을 켜요.
subscribeQuotes(info, onQuote) => unsubscribe—선택.
현재가·등락률 같은 시세.

예시: REST + WebSocket

my-datafeed.ts
import {
  ReconnectingWebSocket,
  TickAggregator,
  toConnectionStatus,
  type Datafeed,
} from '@funnest/charts';

export const myDatafeed: Datafeed = {
  async resolveSymbol(symbol) {
    return {
      symbol,
      name: '삼성전자',
      exchange: 'KRX',
      timezone: 'Asia/Seoul',
      session: '0900-1530',
      pricePrecision: 0,
      tickSize: 100,
      logoUrl: '/logos/005930.png',
    };
  },

  async getBars(info, resolution, { to, countBack }) {
    const res = await fetch(`/api/candles?symbol=${info.symbol}&res=${resolution}&to=${to}&count=${countBack}`);
    const bars = await res.json(); // [{ time, open, high, low, close, volume }]
    return { bars, noMoreData: bars.length === 0 };
  },

  subscribeBars(info, resolution, onBar, onResetCache, onConnection) {
    const candles = new TickAggregator(resolution, info.timezone);
    const ws = new ReconnectingWebSocket('wss://example.com/ws', {
      onOpen: (socket, reconnected) => {
        socket.send(JSON.stringify({ subscribe: info.symbol }));
        if (reconnected) onResetCache?.(); // 끊긴 동안 빠진 봉을 다시 받아요
      },
      onMessage: (data) => {
        const trade = JSON.parse(data); // { time, price, volume }
        const bar = candles.push(trade);
        if (bar) onBar(bar);
      },
      onStatus: (s) => onConnection?.({ status: toConnectionStatus(s) }),
    });
    return () => ws.close();
  },
};

실시간 도구

속성타입기본값설명
ReconnectingWebSocketclass—끊기면 점점 간격을 늘려 다시 연결.
응답 없는 연결 감지(idleTimeout), 지연 측정(ping).
TickAggregatorclass—체결(틱)을 봉으로 묶어요.
거래소 시간대 기준 일봉.
combineDatafeedsfunction—여러 datafeed를 접두어(UPBIT:, BINANCE:)로 묶어 하나처럼.
monitorLatencyfunction—REST로 지연 시간을 주기적으로 측정.
라이브러리는 바이낸스·업비트 같은 실제 거래소 연결 코드를 넣지 않아요.
저장소의 apps/playground/src/datafeeds/에 예시가 있으니 참고해서 직접 만드세요.