refactor: MVC 구조 분리 + 미사용 파일 archive 정리

- tick_trader.py를 Controller로 축소, 로직을 3개 모듈로 분리:
  - core/signal.py: 시그널 감지, 지표 계산 (calc_vr, calc_atr, detect_signal)
  - core/order.py: Upbit 주문 실행 (매수/매도/취소/조회)
  - core/position_manager.py: 포지션 관리, DB sync, 복구, 청산 조건
- type hints, Google docstring, 구체적 예외 타입 적용
- 50줄 초과 함수 분리 (process_signal, restore_positions)
- 미사용 파일 58개 archive/ 폴더로 이동
- README.md 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
joungmin
2026-03-06 20:46:47 +09:00
parent 976c53ed66
commit 6e0c4508fa
69 changed files with 5018 additions and 495 deletions

100
README.md Normal file
View File

@@ -0,0 +1,100 @@
# upbit-trader
Upbit WebSocket 기반 20초봉 자동매매 봇. LLM(Gemini 2.5 Flash) 매수 판단 + 트레일링 스탑 청산.
## 프로젝트 구조
```
upbit-trader/
STRATEGY.md -- 전략 상세 문서
ecosystem.config.js -- PM2 프로세스 설정
backtest_march.py -- 3월 백테스트 시뮬레이션
core/ -- Model / Service 레이어
signal.py -- 시그널 감지 (양봉 + VOL + 사전필터 3종)
order.py -- Upbit 주문 실행 (매수/매도/취소/조회)
position_manager.py -- 포지션 관리, 청산 조건, DB sync, 복구
llm_advisor.py -- LLM 매수 어드바이저 (OpenRouter + tool calling)
notify.py -- 텔레그램 알림
daemons/ -- Controller / 데몬
tick_trader.py -- 주력 트레이더 (WebSocket -> 봉 집계 -> 매매)
tick_collector.py -- price_tick + 1분봉 Oracle 수집
context_collector.py -- 종목 컨텍스트 수집 (뉴스 + 가격 통계)
state_sync.py -- 포지션 상태 동기화
archive/ -- 미사용 파일 보관
```
## 매매 전략 요약
### 진입
1. 20초봉 확정 시 시그널 감지 (양봉 + 거래량 5x + 거래대금 5M+)
2. 사전 필터: 횡보(15봉 변동 < 0.3%), 고점(30분 구간 90%+), 연속양봉(2봉+)
3. LLM(Gemini 2.5 Flash) 매수 판단 -> 현재가 지정가 매수
### 청산
| 조건 | 값 |
|------|------|
| 트레일링 스탑 | 고점 대비 -1.5% (최소 수익 +0.5%) |
| 손절 | -2% |
| 타임아웃 | 4시간 |
### 운용 설정
| 항목 | 값 |
|------|------|
| 감시 종목 | 10개 (ETH, XRP, SOL, DOGE, SIGN, BARD, KITE, CFG, SXP, ARDR) |
| 총 예산 | 1,000,000원 |
| 최대 포지션 | 5개 |
| 종목당 투자 | 200,000원 |
## 기술 스택
| 구성 | 기술 |
|------|------|
| 거래소 | Upbit API (REST + WebSocket) |
| DB | Oracle ADB |
| LLM | Gemini 2.5 Flash via OpenRouter |
| 알림 | Telegram Bot API |
| 뉴스 | SearXNG (self-hosted) |
| 프로세스 | PM2 |
## 실행
```bash
# 환경 설정
cp .env.example .env
# .env에 API 키 입력
# PM2로 실행
pm2 start ecosystem.config.js
# 개별 실행
.venv/bin/python3 daemons/tick_trader.py
```
## PM2 데몬
| 이름 | 파일 | 설명 |
|------|------|------|
| tick-trader | `daemons/tick_trader.py` | 주력 트레이더 |
| tick-collector | `daemons/tick_collector.py` | 가격 데이터 수집 |
| context-collector | `daemons/context_collector.py` | 종목 컨텍스트 수집 |
| state-sync | `daemons/state_sync.py` | 포지션 상태 동기화 |
## 백테스트 결과 (2026-03-01~06)
| 항목 | 값 |
|------|------|
| 거래 수 | 48건 |
| 승률 | 52.1% |
| 총 PNL | +17,868원 (+17.9%) |
| 평균 PNL | +1.22% |
## 주의사항
- `.env` 변경 후 PM2 재시작 시 `pm2 restart --update-env` 필수
- 로그: `/tmp/tick_trader.log`