Files
AutoCoinTrader2/docs/code_review_report_v9.md

206 lines
6.4 KiB
Markdown

# AutoCoinTrader Code Review Report (v9)
## 1. 개요 (Overview)
**분석 일자**: 2025-12-16
**분석 대상**: 전체 소스 코드 (src/, tests/, main.py, config/)
**주요 변경점**: ADX/MACD/SMA 지표 계산 시 미완성 캔들 제외 로직 추가
**분석 관점**: Python 전문가 + 암호화폐 트레이더
---
## 2. 최근 수정사항 검증 ✅
### 2.1 미완성 캔들 제외 로직 (완료)
**파일**: `signals.py``_prepare_data_and_indicators()`
```python
# ✅ 마지막 미완성 캔들 제외 (완성된 캔들만 사용)
df_complete = df.iloc[:-1].copy()
```
| 항목 | 상태 | 비고 |
|------|------|------|
| ADX 계산 | ✅ 적용 | `df_complete["high/low/close"]` 사용 |
| MACD 계산 | ✅ 적용 | `df_complete["close"]` 사용 |
| SMA 5/200 계산 | ✅ 적용 | `df_complete["close"]` 사용 |
| 로그 기록 | ✅ 적용 | 제외된 봉과 최종 봉 시간 표시 |
**효과**: 업비트 웹사이트 지표와 일치, 가짜 신호(Fakeout) 방지
---
## 3. 발견된 문제점 및 개선사항
### 🔴 HIGH Priority (높은 우선순위)
#### HIGH-001: config.json에 `confirm_stop_loss` 설정 누락
**현황**: `config.py``validate_config()` 함수는 `confirm.confirm_stop_loss` 필드를 검증하지만, 실제 `config.json`에는 이 필드가 없습니다.
```json
// config.json (현재)
"confirm": {
"confirm_via_file": false,
"confirm_timeout": 300
}
// 필요한 설정 (누락됨)
"confirm": {
"confirm_via_file": false,
"confirm_timeout": 300,
"confirm_stop_loss": false // ← 손절 시 확인 스킵 여부
}
```
**영향**: 손절 시 파일 확인 로직이 의도대로 동작하지 않을 수 있음
**권장**: `config.json``confirm_stop_loss` 필드 추가
---
#### HIGH-002: `_update_df_with_realtime_price` 함수 미사용 (Dead Code)
**현황**: 미완성 캔들 제외 로직 적용으로 `_update_df_with_realtime_price()` 함수가 더 이상 호출되지 않습니다.
```python
# signals.py:283-319 - 호출되지 않는 함수
def _update_df_with_realtime_price(df, symbol, timeframe, buffer):
"""진행 중인 마지막 캔들 데이터를 실시간 현재가로 업데이트합니다."""
...
```
**권장**: 함수 제거 또는 향후 실시간 모드 지원을 위해 주석으로 보존
---
#### HIGH-003: SMA 200 계산 시 데이터 부족 가능성
**현황**: 200봉 이평선 계산에 최소 200개의 완성된 봉이 필요하지만, 현재 검증은 `len(df) < 4`만 확인합니다.
```python
# signals.py:333
if df.empty or len(df) < 4: # 미완성 봉 제외 후 최소 3개 필요
```
**문제**: 데이터가 50개만 있으면 SMA200은 모두 NaN이 됩니다.
**권장**: 경고 로그 추가 또는 최소 데이터 수 검증 강화
---
### 🟡 MEDIUM Priority (중간 우선순위)
#### MEDIUM-001: 매수 조건 로그에서 현재가 미표시
**현황**: 매수 조건 로그에 지표 값만 표시되고 현재가가 표시되지 않습니다.
**권장**: 현재가 추가
```
[지표값] Close: 4409000 | MACD: ... | ADX: ...
```
---
#### MEDIUM-002: `rebuy_cooldown_hours` 설정이 config.json에 없음
**현황**: 코드에서 `rebuy_cooldown_hours` 설정을 읽지만, `config.json`에 정의되어 있지 않습니다.
**권장**: `config.json``auto_trade` 섹션에 추가
```json
"auto_trade": {
"rebuy_cooldown_hours": 24
}
```
---
#### MEDIUM-003: 과도한 `except Exception` 사용 (3곳)
| 파일 | 위치 | 권장 |
|------|------|------|
| `signals.py:376` | `_prepare_data_and_indicators` | `RuntimeError, ValueError` 로 구체화 |
| `order.py:698` | `place_buy_order_upbit` 모니터링 | `TimeoutError` 등으로 구체화 |
| `holdings.py:473` | `fetch_holdings_from_upbit` 스냅샷 | `json.JSONDecodeError, OSError` 로 구체화 |
---
### 🟢 LOW Priority (낮은 우선순위)
#### LOW-001: 중복 import 문
일부 파일에서 함수 내부에서 import를 반복합니다. 파일 상단에 한 번만 import 권장.
#### LOW-002: 타입 힌트 불완전
일부 함수의 반환 타입이 명시되지 않았습니다.
---
## 4. 트레이딩 전략 관점 분석 📊
### 4.1 매수 전략 검토
| 조건 | 로직 | 평가 |
|------|------|------|
| 조건1 | MACD 골든크로스 + SMA5 > SMA200 + ADX > 25 | ✅ 표준적인 추세 추종 |
| 조건2 | SMA 골든크로스 + MACD 상향 + ADX > 25 | ✅ 모멘텀 확인 |
| 조건3 | ADX 상향 돌파 + SMA/MACD 확인 | ✅ 추세 강도 확인 |
### 4.2 매도 전략 검토
| 조건 | 로직 | 평가 |
|------|------|------|
| 손절 | 매수가 대비 -5% | ✅ 적절한 손절선 |
| 부분익절 | 10% 수익 시 50% 매도 | ✅ 리스크 감소 |
| 트레일링 | 최고점 대비 5%/15% 하락 | ✅ 수익 보호 |
---
## 5. 아키텍처 품질 평가 🏗️
### 5.1 강점
1. **원자적 파일 쓰기**: `.tmp` 파일 사용 후 `os.replace()` (데이터 손실 방지)
2. **Rate Limiter**: 토큰 버킷 기반 다중 윈도우 제한 (초당 8회, 분당 590회)
3. **StateManager**: 영구 상태 관리 분리
4. **Decimal 기반 정밀 계산**: 부동소수점 오차 방지
### 5.2 개선 가능 영역
1. **전략 패턴 미적용**: 매수/매도 로직이 `signals.py`에 하드코딩
2. **백테스팅 어려움**: 전략 변경 시 코드 수정 필요
---
## 6. v9 개선 권고 요약
| 우선순위 | ID | 항목 | 예상 작업량 |
|----------|-----|------|------------|
| 🔴 HIGH | HIGH-001 | config.json에 confirm_stop_loss 추가 | 5분 |
| 🔴 HIGH | HIGH-002 | 미사용 함수 정리 | 10분 |
| 🔴 HIGH | HIGH-003 | SMA200 데이터 부족 경고 추가 | 15분 |
| 🟡 MEDIUM | MEDIUM-001 | 매수 로그에 현재가 추가 | 10분 |
| 🟡 MEDIUM | MEDIUM-002 | rebuy_cooldown_hours 설정 추가 | 5분 |
| 🟡 MEDIUM | MEDIUM-003 | 예외 처리 구체화 | 30분 |
| 🟢 LOW | LOW-001 | 중복 import 정리 | 10분 |
| 🟢 LOW | LOW-002 | 타입 힌트 보완 | 20분 |
---
## 7. 결론
현재 코드베이스는 **전반적으로 양호한 상태**입니다. v5~v7 리뷰에서 지적된 주요 문제들이 해결되었으며, 최근 미완성 캔들 제외 로직 추가로 지표 정확도가 크게 향상되었습니다.
**즉시 조치 필요**:
- `config.json`에 누락된 설정 필드 추가 (`confirm_stop_loss`, `rebuy_cooldown_hours`)
**중기 개선 과제**:
- 전략 패턴 도입으로 유연성 확보
- 백테스팅 프레임워크 구축
---
*Report generated by AutoCoinTrader Code Review System v9*