chart-0714
Version:
Professional trading chart library with advanced customization for trading journal apps
347 lines (284 loc) • 9.28 kB
Markdown
# chart-0714 차트 라이브러리
## 개요
chart-0714는 lightweight-charts의 한계를 극복하기 위해 개발된 WebGL 기반의 고성능 금융 차트 라이브러리입니다. 특히 드로잉 기능과 멀티패널을 지원하며, 트레이딩 저널 애플리케이션에 특화된 기능들을 제공합니다.
## 주요 특징
- **WebGL 기반 고성능 렌더링**: 수십만 개의 캔들 데이터 처리 가능
- **완전한 드로잉 도구 지원**: 트렌드라인, 도형, 텍스트, 마커 등
- **멀티패널 레이아웃**: 가격 차트와 볼륨 차트의 분리된 패널
- **OHLC 스냅 기능**: Ctrl 키로 가격에 자동 스냅
- **플러그인 시스템**: 커스텀 인디케이터 확장 가능
- **React 통합 지원**: React 컴포넌트 및 훅 제공
- **완전한 TypeScript 지원**: 타입 안정성 보장
## 설치 및 사용
### 설치
```bash
npm install chart-0714
```
### 기본 사용법
```typescript
import { createChart } from 'chart-0714';
const chart = createChart('container-id', {
width: 800,
height: 600,
theme: 'dark'
});
// 데이터 설정
chart.setData(candleData);
```
### React에서 사용
```tsx
import { ChartComponent } from 'chart-0714/react';
function TradingChart() {
return (
<ChartComponent
data={candleData}
options={{
theme: 'dark',
showVolume: true
}}
/>
);
}
```
## 프로젝트 구조
```
chart-0714/
├── src/
│ ├── core/ # 핵심 차트 로직
│ │ ├── Chart.ts # 메인 차트 클래스
│ │ ├── ChartPanel.ts # 패널 기반 클래스
│ │ ├── DataManager.ts # 데이터 관리
│ │ ├── DrawingManager.ts # 드로잉 도구 관리
│ │ ├── IndicatorManager.ts # 인디케이터 관리
│ │ ├── LineSeriesManager.ts # 라인 시리즈 관리
│ │ ├── MarkerManager.ts # 마커 관리
│ │ ├── PanelManager.ts # 멀티 패널 관리
│ │ ├── WebGLRenderer.ts # WebGL 렌더링 엔진
│ │ ├── chart/ # 차트 컨트롤러들
│ │ └── drawing/ # 드로잉 관련 매니저들
│ ├── indicators/ # 인디케이터 구현
│ ├── panels/ # 패널 타입 (MainChart, Volume)
│ ├── plugins/ # 플러그인 시스템
│ ├── react-integration/ # React 통합
│ ├── renderers/ # 렌더러들 (Candle, Volume, Grid 등)
│ ├── shaders/ # WebGL 쉐이더 (GLSL)
│ ├── types/ # TypeScript 타입 정의
│ ├── ui/ # UI 컴포넌트들
│ └── utils/ # 유틸리티 함수들
├── dist/ # 빌드 결과물
├── docs/ # 문서들
├── examples/ # 예제 파일들
└── package.json # 프로젝트 설정
```
## 아키텍처
### 핵심 컴포넌트
#### 1. Chart 클래스
- 차트의 메인 진입점
- 모든 매니저들을 조율하는 중앙 컨트롤러
- 생명주기 관리 (초기화, 업데이트, 정리)
- 이벤트 처리 및 UI 컨트롤
#### 2. 매니저 시스템
- **DataManager**: 캔들 데이터를 TypedArray로 효율적 관리
- **DrawingManager**: 드로잉 도구의 생성, 수정, 삭제 관리
- **IndicatorManager**: 기술적 지표의 계산 및 렌더링
- **PanelManager**: 멀티 패널 레이아웃 및 리사이징
- **MarkerManager**: 차트 위 마커 및 주석 관리
- **LineSeriesManager**: 추가적인 라인 차트 관리
#### 3. 렌더링 시스템
- **WebGLRenderer**: WebGL 컨텍스트 관리 및 렌더링 파이프라인
- **전용 쉐이더**: GLSL로 작성된 최적화된 쉐이더
- `candle.vert/frag`: 캔들스틱 렌더링
- `line.vert/frag`: 라인 렌더링
- `volume.vert/frag`: 볼륨 바 렌더링
- **특화 렌더러**: 각 차트 요소별 전문 렌더러
### 드로잉 시스템
#### DrawingManager 하위 시스템
- **DrawingSnapManager**: OHLC 가격에 자동 스냅 기능
- **DrawingMeasureManager**: 가격/시간 측정 도구
- **DrawingObjectManager**: 드로잉 객체 생명주기 관리
- **DrawingStateManager**: 실행 취소/재실행 기능
- **DrawingInteractionManager**: 마우스/키보드 상호작용
#### 지원 드로잉 도구
- 트렌드라인 (TrendLine)
- 수평선 (HorizontalLine)
- 수직선 (VerticalLine)
- 사각형 (Rectangle)
- 원 (Circle)
- 텍스트 (Text)
- 마커 (Marker)
- 피보나치 리트레이스먼트
- 측정 도구
### 멀티패널 시스템
#### PanelManager 기능
- 메인 차트 패널과 볼륨 패널의 독립적 관리
- 패널 간 동기화된 스크롤 및 줌
- 드래그 가능한 리사이저로 패널 크기 조정
- 패널별 독립적인 Y축 스케일
#### 패널 타입
- **MainChartPanel**: 가격 차트 (캔들스틱, 라인)
- **VolumePanel**: 거래량 차트
- 확장 가능한 커스텀 패널 지원
## API 레퍼런스
### Chart 생성 옵션
```typescript
interface ChartOptions {
width?: number;
height?: number;
theme?: 'light' | 'dark' | Theme;
locale?: string;
showVolume?: boolean;
showHeader?: boolean;
showSettings?: boolean;
keyboardShortcuts?: boolean;
snapToOHLC?: boolean;
plugins?: Plugin[];
}
```
### 데이터 구조
```typescript
interface Candle {
time: number; // Unix timestamp
open: number;
high: number;
low: number;
close: number;
volume: number;
}
```
### 이벤트 시스템
```typescript
chart.on('ready', () => {
console.log('차트 준비 완료');
});
chart.on('dataUpdate', (data) => {
console.log('데이터 업데이트됨');
});
chart.on('drawingCreated', (drawing) => {
console.log('드로잉 생성됨', drawing);
});
```
### 주요 메서드
```typescript
// 데이터 관련
chart.setData(candles: Candle[]);
chart.updateData(candles: Candle[]);
chart.appendData(candle: Candle);
// 드로잉 관련
chart.activateDrawingTool('trendline');
chart.removeDrawing(drawingId: string);
chart.clearAllDrawings();
// 인디케이터
chart.addIndicator('MA', { period: 20 });
chart.removeIndicator(indicatorId: string);
// 뷰포트 컨트롤
chart.fitContent();
chart.zoomIn();
chart.zoomOut();
chart.scrollTo(time: number);
```
## 테마 시스템
### 내장 테마
- **Light Theme**: 밝은 배경의 기본 테마
- **Dark Theme**: 어두운 배경의 테마
### 커스텀 테마
```typescript
const customTheme: Theme = {
background: '#1a1a1a',
text: '#ffffff',
grid: '#333333',
candle: {
upColor: '#26a69a',
downColor: '#ef5350',
wickColor: '#999999'
},
volume: {
upColor: '#26a69a80',
downColor: '#ef535080'
},
drawing: {
lineColor: '#2196f3',
fillColor: '#2196f330'
}
};
```
## 플러그인 시스템
### MA Cluster 플러그인 예제
```typescript
import { MAClusterPlugin } from 'chart-0714/plugins';
const chart = createChart('container', {
plugins: [
new MAClusterPlugin({
clusters: [
{ periods: [5, 10, 20], color: '#ff0000' },
{ periods: [50, 100, 200], color: '#0000ff' }
]
})
]
});
```
## 성능 최적화
### WebGL 렌더링 최적화
- Vertex Buffer Object (VBO) 사용으로 메모리 효율성 극대화
- Instanced rendering으로 대량 객체 렌더링
- Frustum culling으로 뷰포트 외부 객체 제외
- Level of Detail (LOD) 시스템으로 줌 레벨별 최적화
### 데이터 처리 최적화
- TypedArray 사용으로 메모리 사용량 감소
- Binary search로 빠른 데이터 검색
- 증분 업데이트로 불필요한 재계산 방지
- Web Worker 활용한 병렬 처리 (계획 중)
## 빌드 및 개발
### 개발 환경 설정
```bash
# 의존성 설치
npm install
# 개발 서버 실행
npm run dev
# 빌드
npm run build
# 타입 체크
npm run type-check
```
### 빌드 설정
- **빌드 도구**: Vite
- **타겟**: ES2022
- **모듈 시스템**: ES Modules
- **출력 형식**: ESM, CJS, TypeScript 정의
## 문제 해결 가이드
### 일반적인 문제
#### 1. 차트가 렌더링되지 않음
- 컨테이너 엘리먼트의 크기 확인
- WebGL 지원 브라우저 확인
- 콘솔 에러 메시지 확인
#### 2. 드로잉이 저장되지 않음
- DrawingStateManager 초기화 확인
- 로컬 스토리지 권한 확인
#### 3. 성능 문제
- 데이터 양 확인 (10만 개 이상 시 샘플링 고려)
- 불필요한 인디케이터 제거
- Chrome DevTools Performance 탭 활용
## 로드맵
### v2.0 계획
- [ ] Web Worker를 활용한 백그라운드 계산
- [ ] 더 많은 인디케이터 추가
- [ ] 실시간 데이터 스트리밍 최적화
- [ ] 모바일 터치 제스처 개선
- [ ] 서버 사이드 렌더링 지원
### v3.0 비전
- [ ] 3D 차트 뷰
- [ ] AI 기반 패턴 인식
- [ ] 다중 차트 동기화
- [ ] 클라우드 저장소 통합
## 라이선스
MIT License
## 기여 가이드
프로젝트에 기여하고 싶으시다면:
1. Fork the repository
2. Create your feature branch
3. Commit your changes
4. Push to the branch
5. Create a Pull Request
## 지원
- 이슈 트래커: GitHub Issues
- 문서: `/docs` 디렉토리
- 예제: `/examples` 디렉토리