μ λΉνΈ(Upbit) APIλ₯Ό νμ©ν κ°μνν μλλ§€λ§€ λ° ν¬νΈν΄λ¦¬μ€ κ΄λ¦¬ μμ€ν μ λλ€.
μ΄ νλ‘μ νΈλ κΈ°μ μ μ§ν(RSI, μ΄λνκ· μ , λ³Όλ¦°μ λ°΄λ λ±)λ₯Ό λ°νμΌλ‘ 24μκ° μλμΌλ‘ κ°μννλ₯Ό λ§€λ§€νλ λ΄ μμ€ν
μ
λλ€.
FastAPI λ°±μλμμ μμ μ μΈ λ§€λ§€ λ‘μ§κ³Ό λ°±κ·ΈλΌμ΄λ μ€μΌμ€λ¬κ° λμνλ©°, React κΈ°λ° λμ보λλ₯Ό ν΅ν΄ μ€μκ° μμ΅λ₯ κ³Ό λ§€λ§€ 체결 λ‘κ·Έλ₯Ό μμ½κ² λͺ¨λν°λ§ν μ μμ΅λλ€.
- μλ λ§€λ§€ μκ³ λ¦¬μ¦:
pandas-taλ₯Ό νμ©ν κΈ°μ μ μ§ν κ³μ° λ° μ‘°κ±΄λΆ λ§€μ/λ§€λ λ‘μ§ (RSI, λ³Όλ¦°μ λ°΄λ, μ€μΊν μ₯μ°©) - μ€μκ° λͺ¨λν°λ§: SSE(Server-Sent Events)λ₯Ό νμ©ν μ€μκ° λ΄ μν λ° μμ€ν λ‘κ·Έ(체결 λ΄μ, μλ¬) μ€νΈλ¦¬λ°
- ν¬νΈν΄λ¦¬μ€ μμ΅λ₯ κ΄λ¦¬: μΌκ°/μκ°λ³ ν¬μ μμ΅λ₯ (PnL) μ€λ
μ· μλ μ μ₯ λ° μκ°ν μ°¨νΈ μ 곡 (
Recharts) - λ°±κ·ΈλΌμ΄λ μλν:
APSchedulerλ₯Ό μ΄μ©ν μμ μμ° μ€λ μ·, μ λΉνΈ λ§€λ§€ λ΄μ λκΈ°ν, μ€λλ λ‘κ·Έ μλ μ 리
- Framework & UI: React 19, Vite, TypeScript
- Visualization Component: Recharts (μμ΅λ₯ κ·Έλν)
- Network: Axios (λ¨μΌ λ° κ³΅ν΅ API κ΄λ¦¬)
- Framework: FastAPI, Uvicorn
- Language: Python 3
- Core Engine: PyUpbit (μ λΉνΈ μ£Όλ¬Έ μ°λ), Pandas / Numpy (λ°μ΄ν° νμ±)
- Real-time & Schedule: SSE μ§μ (
sse-starlette), APScheduler
- Database: PostgreSQL 17 (ORM: SQLAlchemy 2.0, SQLModel, λΉλκΈ° λλΌμ΄λ² asyncpg)
- Migration: Alembic
- Deploy: Docker & Docker Compose
νλ‘μ νΈλ₯Ό λ‘컬μμ ꡬλνλ €λ©΄ λ€μ μ€μ κ³Ό νλ‘κ·Έλ¨μ΄ νμν©λλ€.
- Node.js (v18 λλ v22+ κΆμ₯)
- Python 3.10+
- Docker & Docker Compose (νμ)
git clone https://github.com/μ¬μ©μκ³μ /auto-trading-bot.git
cd auto-trading-botbackend λλ ν 리μ .env νμΌμ μμ±νκ³ , λ³ΈμΈμ μ
λΉνΈ API ν€μ DB μ 보λ₯Ό μ
λ ₯ν©λλ€.
backend/.env
UPBIT_ACCESS_KEY=λΉμ μ_μ
λΉνΈ_ACCESS_KEY
UPBIT_SECRET_KEY=λΉμ μ_μ
λΉνΈ_SECRET_KEY
DB_USER=postgres
DB_PASSWORD=your_password
DB_NAME=gold_dbμ΄ νλ‘μ νΈλ Docker Composeλ₯Ό νμ©νμ¬ λ°μ΄ν°λ² μ΄μ€μ λ°±μλλ₯Ό ν λ²μ μ¬λ¦΄ μ μμ΅λλ€.
μ΅μμ κ²½λ‘(auto-trading-bot/)μμ μλ λͺ
λ Ήμ΄λ₯Ό μ€ννμΈμ.
docker-compose up -d --buildꡬλ νμΈ β
http://localhost:8000/docs(FastAPI Swagger UI νμΈ κ°λ₯)
λ°±μλκ° μΌμ‘λ€λ©΄, νλ‘ νΈμλλ₯Ό μ€ννμ¬ νλ©΄μ λμλλ€.
cd frontend
npm install
npm run devꡬλ νμΈ β
http://localhost:5173(React λμ보λ μ§μ )
auto-trading-bot/
βββ backend/ # λ΄ κ΅¬λ λ° ν΅μ¬ API μλ²
β βββ app/ # λλ©μΈ λ³ λΉμ¦λμ€ λ‘μ§ (bot, coin, log, performance λ±)
β βββ core/ # DB μ°κ²° μ€μ , CORS/λ‘κ±° λͺ¨λ
β βββ trading/ # λ§€λ§€ νλ¨ κΈ°λ° ν΄λμ€ λ° λ°±ν
μ€ν
(μκ³ λ¦¬μ¦) ν¨μ
β βββ alembic/ # λ°μ΄ν°λ² μ΄μ€ λ§μ΄κ·Έλ μ΄μ
λꡬ μΈν
β βββ .env # λ°±μλ νκ²½λ³μ μΈν
β βββ requirements.txt # νμ΄μ¬ μμ‘΄ λΌμ΄λΈλ¬λ¦¬ λͺ©λ‘
βββ frontend/ # κ΄λ¦¬μ λμ보λ UI
β βββ src/
β β βββ components/ # μ°¨νΈ, λ‘κ·Έ, ν€λ λ± μ»΄ν¬λνΈ λͺ©λ‘
β β βββ lib/ # API ν΅μ ν¨μ λͺ¨μ (`api.ts` λ±)
β β βββ pages/ # λμ보λ λ©μΈ λ μ΄μμ
β β βββ App.tsx / main.tsx # μ± μ§μ
μ
β βββ .env.local # λ‘컬 ν
μ€νΈμ© νκ²½λ³μ λͺ¨μ
β βββ vite.config.js # λ²λ€λ¬ νκ²½ μΈν
βββ postgres_data/ # Docker λ³Όλ₯¨ (DB λ°μ΄ν°λ₯Ό λ‘컬μ μꡬ λ³΄μ‘΄μ© λ§΅ν)
βββ docker-compose.yml # λ°±μλ λ° DB 컨ν
μ΄λ μΈν
νμΌ