- 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>
101 lines
2.9 KiB
Markdown
101 lines
2.9 KiB
Markdown
# 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`
|