- 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>
2.9 KiB
2.9 KiB
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/ -- 미사용 파일 보관
매매 전략 요약
진입
- 20초봉 확정 시 시그널 감지 (양봉 + 거래량 5x + 거래대금 5M+)
- 사전 필터: 횡보(15봉 변동 < 0.3%), 고점(30분 구간 90%+), 연속양봉(2봉+)
- 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 |
실행
# 환경 설정
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