# AutoCoinTrader 사용 가이드 ## 개요 AutoCoinTrader는 Upbit 시세 데이터를 기반으로 MACD, SMA, ADX 지표를 활용해 매수/매도 신호를 분석하고(`dry_run` 모드), 설정에 따라 자동 주문까지 수행할 수 있는 트레이딩 보조/자동화 도구입니다. 모든 주요 상태 파일(`holdings.json`, `trades.json`, `pending_orders.json`)은 `data/` 디렉터리 하위에서 관리됩니다. ## 1. 사전 준비 ### 1.1 필수 요구사항 1. Python 3.11 이상 2. 가상환경 권장 (venv, pyenv, Conda 등) 3. Upbit API 키 (자동매매 사용 시) 4. Telegram Bot Token & Chat ID (알림 사용 시) ### 1.2 설치 ```powershell python -m venv .venv; .\.venv\Scripts\activate pip install -r requirements.txt ``` ### 1.3 환경변수 설정 (`.env`) `.env` 파일에 아래 항목을 필요 시 추가: ```bash TELEGRAM_BOT_TOKEN=123456789:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX TELEGRAM_CHAT_ID=123456789 UPBIT_ACCESS_KEY=YOUR_UPBIT_ACCESS UPBIT_SECRET_KEY=YOUR_UPBIT_SECRET # 선택 기능 AGGREGATE_ALERTS=false TELEGRAM_TEST=0 AUTO_TRADE_ENABLED=0 # require_env_confirm 활성화 시 1로 설정해야 자동매매 진행 ORDER_MONITOR_TIMEOUT=120 ORDER_POLL_INTERVAL=3 ORDER_MAX_RETRIES=1 ORDER_MAX_CONSECUTIVE_ERRORS=5 ``` `UPBIT_*` 키는 실거래(dry_run=False) + 자동매매(trading_mode=auto_trade/mixed)에서 필수. `.env`는 반드시 `.gitignore`에 포함시키십시오. ## 2. 설정 파일 (`config/config.json`) 미존재 시 기본값이 내부 로직에서 자동 로드됩니다. 핵심 항목: | 키 | 설명 | 기본값 | |----|------|--------| | candle_count | 각 심볼 지표 계산에 사용하는 캔들 개수 | 200 | | buy_check_interval_minutes | 매수 조건 검사 주기 | 240 | | stop_loss_check_interval_minutes | 손절 검사 주기 | 60 | | profit_taking_check_interval_minutes | 익절 검사 주기 | 240 | | loop | True면 주기적 루프 실행 | True | | dry_run | True면 시뮬레이션 기록만 | True | | max_threads | 병렬 스레드 수 | 3 | | trading_mode | signal_only / auto_trade / mixed | signal_only | | auto_trade.buy_enabled | 자동 매수 허용 여부 | False | | auto_trade.buy_amount_krw | 1회 매수 금액 | 10000 | | auto_trade.min_order_value_krw | 최소 주문 허용 KRW | 5000 | | auto_trade.loss_threshold | 손절 기준(%) | -5.0 | | auto_trade.profit_threshold_1 | 부분 익절 시작 수익률(%) | 10.0 | | auto_trade.profit_threshold_2 | 전량 익절 고수익 기준(%) | 30.0 | | auto_trade.drawdown_1 | 중간 구간 트레일링 하락률(%) | 5.0 | | auto_trade.drawdown_2 | 고수익 구간 트레일링 하락률(%) | 15.0 | ## 3. 주요 데이터 파일 (data/) | 파일 | 용도 | |------|------| | holdings.json | 현재 보유 코인 상태 (매수 평균가, 수량, max_price 등) | | trades.json | 매수/매도 기록 (원자적 저장) | | pending_orders.json | 사용자 확인 대기 중인 주문 토큰 목록 | 모든 경로는 코드 내부에서 `src.common`의 상수를 통해 관리되므로 재배치 시 해당 상수만 수정하면 됩니다. ## 4. 실행 방법 ### 4.1 기본 실행 (드라이런) ```powershell python main.py ``` 루프 모드, 설정 주기에 따라 매수/손절/익절 검사 수행. `data/` 하위에 기록 생성. ### 4.2 벤치마크 실행 ```powershell python main.py --benchmark ``` 순차/병렬 처리 시간 비교 후 로그 출력. ### 4.3 실거래 모드 전환 1. `config.json`에서 `dry_run`을 `false`, `trading_mode`를 `auto_trade` 또는 `mixed`로 설정. 2. `.env`에 `UPBIT_ACCESS_KEY`, `UPBIT_SECRET_KEY` 추가. 3. (선택) `AUTO_TRADE_ENABLED=1` 설정 (require_env_confirm일 경우 필수). 4. 소액으로 먼저 검증 후 확장. ### 4.4 Telegram 알림 테스트 `.env`에 `TELEGRAM_TEST=1` 설정 후 최초 실행 시 시작 메시지 전송. ## 5. 매수/매도 로직 개요 1. 매수 조건: MACD 교차, SMA 단기>장기, ADX 임계 초과 조합 (3가지 패턴) 2. 매도 조건: 손절(초기 하락), 부분 익절 후 수익 보호, 트레일링 익절 (구간별 다른 하락률 적용) 3. 부분 익절 1회 후 `partial_sell_done` 플래그로 중복 익절 방지. ## 6. 수동 확인 기반 주문 흐름 자동매매 모드에서 주문은 `pending_orders.json`에 기록 → 사용자가 `confirm_<토큰>` 파일 생성 → 타임아웃 내 확인되면 주문 실행. ## 7. 로그 `logs/AutoCoinTrader.log` 회전 로그(최대 10MB, 백업 7개). `LOG_DIR`, `LOG_LEVEL` 환경변수로 조정 가능. ## 8. Troubleshooting | 증상 | 원인 | 해결 | |------|------|------| | 실거래 안 됨 | API 키 미설정 | `.env` 키 추가 및 dry_run False | | 텔레그램 알림 없음 | 토큰/채팅ID 누락 | `.env` 값 확인 | | 부분 체결 후 holdings 미반영 | 네트워크 지연 | 로그에서 monitor 결과 확인 후 수동 조정 | | trades.json 손상 | 비정상 종료 | 자동 백업(`.corrupted.`) 후 재생성됨 | ## 9. 성능 & 안정성 팁 1. 스레드 수(`max_threads`)를 심볼 수 대비 과도하게 늘리지 말 것 (IO 포화 발생 가능). 2. 캔들 개수(`candle_count`)는 필요 이상 크게 하면 지표 계산 비용 증가. 3. 네트워크 오류 다발 시 `ORDER_MAX_CONSECUTIVE_ERRORS` 조정. ## 10. 백테스트 확장 (향후 계획) `data/` 구조 유지 + 별도 `backtest/` 모듈에서 동일 지표 계산 후 결과 비교, `trades.json` 포맷 재사용. (구현 예정) ## 11. FAQ **Q: dry_run과 auto_trade 차이?** A: dry_run은 모든 거래를 기록만 하고 실제 주문을 보내지 않음. auto_trade는 조건 충족 시 주문 API 호출. **Q: 부분 익절 후 재매도는 어떻게?** A: `partial_sell_done` 플래그 True 후 트레일링 조건 또는 수익 보호 조건 충족 시 전량 매도. **Q: trades.json 손상 시?** A: 자동으로 `.corrupted.` 백업 후 새로 시작. 백업 파일 검토 가능. **Q: 설정 변경 반영 시점?** A: 프로세스 재시작 필요. 장기 실행 중에는 실시간 반영 안 함. **Q: 최소 주문 금액 미만 상황?** A: 매도/매수 모두 안전하게 건너뛰고 로그와 텔레그램 알림(선택)으로 통지.