Skip to content

Latest commit

ย 

History

10 Commits

Folders and files

NameName
Last commit message
Last commit date
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Upbit Market Intelligence Console

Formerly Upbit Alpha Desk. Full-stack intelligence console for KRW market structure, listings, and market data operations.

Upbit Alpha Desk is a full-stack trading-intel console for the KRW market.
It blends Upbit day-candles, cached tickers, saved trading-value files, and Bybit-based listing strategies into one React frontend backed by an Express + Redis API layer.

๐Ÿ”ง Tech Stack

  • Backend: Node.js, Express, TypeScript, Redis (market-data cache), Axios schedulers
  • Frontend: React (Vite + TypeScript), React Query, Chart.js, date-fns
  • Scheduling: Listing calendar & listing strategy analyzers (3h), ticker cache persistence, saved_data parsing, midnight candle refresh
  • Package Manager: pnpm

๐Ÿ“ Repository Layout

src/                    # Express server + schedulers
โ”œโ”€โ”€ server.ts           # API & static serving entry
โ”œโ”€โ”€ config.ts           # CORS / API key / rate-limit config
โ”œโ”€โ”€ clients/
โ”‚   โ”œโ”€โ”€ redisClient.ts  # Lazy Redis connector
โ”‚   โ””โ”€โ”€ bybitClient.ts  # Bybit hourly candle fetcher
โ”œโ”€โ”€ services/           # DataManager + schedulers
frontend/               # React/Vite SPA (served as static build)
โ”œโ”€โ”€ src/components/...  # Sidebar, analytics, listing lab, insights
โ”œโ”€โ”€ src/api/            # Typed API client + DTOs
public/                 # Legacy static assets (still served)
cache/                  # JSON snapshots for schedulers & ticker cache
saved_data/             # Trading-value JSON files parsed into Redis

๐Ÿš€ Local Development

  1. Backend
    pnpm install
    pnpm dev           # tsx + nodemon
  2. Frontend
    cd frontend
    pnpm install
    pnpm dev           # http://localhost:5173 (uses VITE_API_BASE_URL)
  3. Production build
    pnpm build        # compiles backend + frontend
    pnpm start        # serves /api and the built SPA
    The Express server automatically serves frontend/dist (set SERVE_FRONTEND=false to disable).
  4. Tests
    pnpm test         # vitest unit tests (rate limiter, etc.)

๐Ÿ” Environment

Copy .env.example (backend root):

CORS_ORIGINS=https://app.your-domain.com
API_KEY=optional-x-api-key
RATE_LIMIT_WINDOW_MS=60000
RATE_LIMIT_MAX=120
REDIS_URL=redis://default:password@host:11219
SERVE_FRONTEND=true
PORT=3000

For the React dev server, copy frontend/.env.example and adjust:

VITE_API_BASE_URL=http://localhost:3000

๐Ÿ”Œ Core API Endpoints

Route Description
GET /api/coins Supported KRW markets (volume sorted).
GET /api/data/:coin/latest?days=30 Latest day-candle slice.
GET /api/data/:coin/range?start=YYYY-MM-DD&end=YYYY-MM-DD Day-candle slice for a date range (start required, end defaults to today).
GET /api/data/:coin/statistics Min/Max/Range per coin.
GET /api/market-data/:coin Redis-backed trading-value overlay (falls back to saved files).
GET /api/coins/listing-dates Cached listing calendar snapshot (3h cadence).
GET /api/coins/listing-strategies Cached Bybit short-scenario lab (3h cadence).
GET /api/ticker / GET /api/ticker/:coins 1-minute cached Upbit tickers (API-key protected if set).

๐Ÿ”„ Data Refresh Cadence

  • Ticker cache: 60s TTL + persisted JSON (restored on restart).
  • Day candles: Loaded on-demand and updated daily at 00:05 KST.
  • Market data overlay: Parsed once per saved_data mtime, then cached in Redis for 6h per coin.
  • Listing calendar & lab: Every 3 hours; results saved to cache/ and, after restart, to Redis for warm responses.

์—…๋น„ํŠธ ์•ŒํŒŒ ๋ฐ์Šคํฌ (Korean)

Upbit Alpha Desk๋Š” KRW ๋งˆ์ผ“์šฉ ๋ฆฌ์•กํŠธ ๊ธฐ๋ฐ˜ ๋Œ€์‹œ๋ณด๋“œ์ž…๋‹ˆ๋‹ค.
Upbit ์ผ๋ด‰, 1๋ถ„ ์บ์‹œ ํ‹ฐ์ปค, saved_data ๊ฑฐ๋ž˜๋Œ€๊ธˆ, Bybit ์ƒ์žฅ ์ˆ ์ „๋žต ํ†ต๊ณ„๋ฅผ Redis๊ฐ€ ๋’ท๋‹จ์—์„œ ์บ์‹ฑํ•˜๊ณ  Express API๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ”ง ๊ธฐ์ˆ  ์Šคํƒ

  • ๋ฐฑ์—”๋“œ: Node.js, Express, TypeScript, Redis ์บ์‹œ, Axios ์Šค์ผ€์ค„๋Ÿฌ
  • ํ”„๋ŸฐํŠธ์—”๋“œ: React (Vite), React Query, Chart.js, date-fns
  • ์Šค์ผ€์ค„๋Ÿฌ: ์ƒ์žฅ ์บ˜๋ฆฐ๋” / ์ƒ์žฅ ์ „๋žต(3์‹œ๊ฐ„), ํ‹ฐ์ปค ์บ์‹œ, saved_data ํŒŒ์„œ, ์ž์ • ๋ฐ์ดํ„ฐ ๊ฐฑ์‹ 

๐Ÿ“ ๊ตฌ์กฐ

src/                  # Express API + ์Šค์ผ€์ค„๋Ÿฌ
frontend/             # React/Vite SPA
public/               # ๊ธฐ์กด ์ •์  ์ž์›
cache/, saved_data/   # ์šด์˜ ์บ์‹œ/๋ฐ์ดํ„ฐ

๐Ÿš€ ๊ฐœ๋ฐœ ๋ฐฉ๋ฒ•

  1. ๋ฃจํŠธ์—์„œ pnpm install, pnpm dev (API ์„œ๋ฒ„).
  2. frontend/์—์„œ pnpm install, pnpm dev (Vite). .env์— VITE_API_BASE_URL์„ ๋ฐฑ์—”๋“œ ์ฃผ์†Œ๋กœ ์ง€์ •.
  3. ๋ฐฐํฌ ์‹œ pnpm build (๋ฐฑ/ํ”„๋ŸฐํŠธ ๋™์‹œ ๋นŒ๋“œ) ํ›„ pnpm start ์‹คํ–‰ โ†’ Express๊ฐ€ frontend/dist(SPA)์™€ /api/*๋ฅผ ํ•จ๊ป˜ ์„œ๋น„์Šคํ•ฉ๋‹ˆ๋‹ค.
  4. pnpm test ๋ช…๋ น์œผ๋กœ ๊ธฐ๋ณธ ์œ ๋‹› ํ…Œ์ŠคํŠธ(๋ ˆ์ดํŠธ ๋ฆฌ๋ฏธํ„ฐ)๋ฅผ ๋Œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ” ํ™˜๊ฒฝ ๋ณ€์ˆ˜

CORS_ORIGINS=https://app.example.com
API_KEY=์„ ํƒ์  ์ธ์ฆ ํ‚ค
RATE_LIMIT_WINDOW_MS=60000
RATE_LIMIT_MAX=120
REDIS_URL=redis://default:password@host:11219
SERVE_FRONTEND=true

ํ”„๋ŸฐํŠธ๋Š” frontend/.env ์•ˆ์— VITE_API_BASE_URL์„ ์„ค์ •ํ•˜์„ธ์š”.

๐Ÿ”Œ ์ฃผ์š” API

๊ฒฝ๋กœ ์„ค๋ช…
/api/coins ์ง€์› KRW ๋งˆ์ผ“ ๋ชฉ๋ก
/api/data/:coin/latest?days=N ์ตœ๊ทผ N์ผ ์ผ๋ด‰ ๋ฐ์ดํ„ฐ
/api/data/:coin/range?start=YYYY-MM-DD&end=YYYY-MM-DD ๊ธฐ๊ฐ„๋ณ„ ์ผ๋ด‰ ๋ฐ์ดํ„ฐ (start ํ•„์ˆ˜, end ๋ฏธ์ง€์ • ์‹œ ์˜ค๋Š˜)
/api/data/:coin/statistics ํ†ต๊ณ„ (์ตœ๊ณ /์ตœ์ € ๋“ฑ)
/api/market-data/:coin Redis ์บ์‹œ๋œ ๊ฑฐ๋ž˜๋Œ€๊ธˆ/๊ฑฐ๋ž˜๋Ÿ‰
/api/coins/listing-dates 3์‹œ๊ฐ„๋งˆ๋‹ค ๊ฐฑ์‹ ๋˜๋Š” ์ƒ์žฅ ์บ˜๋ฆฐ๋”
/api/coins/listing-strategies 3์‹œ๊ฐ„๋งˆ๋‹ค ๊ณ„์‚ฐ๋˜๋Š” ์ƒ์žฅ ์ˆ ์ „๋žต ๋ณด๊ณ ์„œ
/api/ticker / /api/ticker/:coins 1๋ถ„ ์บ์‹œ Upbit ํ‹ฐ์ปค

๐Ÿ”„ ๊ฐฑ์‹  ์ฃผ๊ธฐ

  • ํ‹ฐ์ปค: 1๋ถ„ TTL + ๋””์Šคํฌ ๋ฐฑ์—…
  • ์ผ๋ด‰ ๋ฐ์ดํ„ฐ: ์ž์ •(00:05) ์ž๋™ ์—…๋ฐ์ดํŠธ
  • ๊ฑฐ๋ž˜๋Œ€๊ธˆ: saved_data ํŒŒ์ผ ๋ณ€๊ฒฝ ์‹œ ์žฌํŒŒ์‹ฑ โ†’ Redis 6์‹œ๊ฐ„ ์บ์‹œ
  • ์ƒ์žฅ ์บ˜๋ฆฐ๋”/์ „๋žต: 3์‹œ๊ฐ„๋งˆ๋‹ค ์žฌ๊ณ„์‚ฐ + ๋””์Šคํฌ/Redis ์Šค๋ƒ…์ƒท

์˜์–ด/ํ•œ๊ตญ์–ด ์„ค๋ช…์„ ํ•จ๊ป˜ ์ œ๊ณตํ•˜๋‹ˆ ํ”Œ๋žซํผํ™” ์ž‘์—… ์‹œ ์ฐธ๊ณ ํ•˜์„ธ์š”.

About

Full-stack Upbit market intelligence console for listings, analytics, and KRW market data.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages