206 lines
6.4 KiB
Markdown
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*
|