6.4 KiB
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()
# ✅ 마지막 미완성 캔들 제외 (완성된 캔들만 사용)
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에는 이 필드가 없습니다.
// 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() 함수가 더 이상 호출되지 않습니다.
# signals.py:283-319 - 호출되지 않는 함수
def _update_df_with_realtime_price(df, symbol, timeframe, buffer):
"""진행 중인 마지막 캔들 데이터를 실시간 현재가로 업데이트합니다."""
...
권장: 함수 제거 또는 향후 실시간 모드 지원을 위해 주석으로 보존
HIGH-003: SMA 200 계산 시 데이터 부족 가능성
현황: 200봉 이평선 계산에 최소 200개의 완성된 봉이 필요하지만, 현재 검증은 len(df) < 4만 확인합니다.
# 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 섹션에 추가
"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 강점
- 원자적 파일 쓰기:
.tmp파일 사용 후os.replace()(데이터 손실 방지) - Rate Limiter: 토큰 버킷 기반 다중 윈도우 제한 (초당 8회, 분당 590회)
- StateManager: 영구 상태 관리 분리
- Decimal 기반 정밀 계산: 부동소수점 오차 방지
5.2 개선 가능 영역
- 전략 패턴 미적용: 매수/매도 로직이
signals.py에 하드코딩 - 백테스팅 어려움: 전략 변경 시 코드 수정 필요
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