# 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`