토스증권 자동매매 봇 익절손절 사이클 완성 | 토스 자동매매 개발기 #23

🌐 Read in English →

💡 이번 Phase 7-5 요약

  • 목적: 종목별 매수 목표가·익절/손절 비율을 config로 뽑아서 DRY_RUN 상태에서 실전처럼 매매 사이클을 돌려보는 거였어.
  • 핵심 포인트: notifier.py를 따로 떼서 텔레그램+이메일 이중 발송을 등급별로 나눈 것.
  • 검증: pytest 136개 전부 통과, security_check.py로 API 토큰·계좌 연결·5중 안전장치까지 비파괴 진단 완료.

이번에 토스증권 자동매매 봇에 진짜 매매 흐름을 붙였어. DRY_RUN=True로 돌리고 있다고 해서 대충 만들면 안 되겠더라. 익절/손절 비율까지 설정해서 사이클을 완성해두면, 나중에 진짜 계좌 연동할 때 로직만 그대로 켜면 되니까.

토스증권 자동매매 봇 익절/손절 사이클 구조

기존엔 목표가 이하로 떨어지면 매수 감시 후 그냥 끝났는데, 이제는 진짜 매매 흐름처럼 만들었어.

  • config.TARGET_STRATEGIES에 종목별 매수 목표가, 수량, take_profit_pct(기본 +5%), stop_loss_pct(기본 -3%) 정의
  • strategy.create_strategy()가 설정 딕셔너리 보고 알맞은 전략 객체 동적 생성
  • 가상 매수 → 포지션 생성 → 수익률 계산 → 익절/손절 도달 시 가상 매도 알림 + DB(trades) 기록

예를 들어 삼성전자(005930)를 가상으로 70,000원에 매수했다고 치면, 73,500원(+5%) 찍으면 익절, 67,900원(-3%) 찍으면 손절로 자동 매도 처리되는 구조야. 익절/손절 미설정 종목은 예전처럼 단발성 매수 감시만 하는 회귀 호환성도 그대로 살려놨어.

알림 이중화 — notifier.py

원래 auto_trader.py 안에 텔레그램 알림 코드가 흩어져 있었는데, 이번에 완전히 분리했어.

등급 분기: INFO는 텔레그램+DB만, WARNING/ERROR/CRITICAL은 텔레그램+이메일(SMTP) 둘 다 발송

제일 신경 쓴 부분은 best-effort 예외 흡수야. 실제로 테스트 중에 이런 에러가 났었는데,

smtplib.SMTPServerDisconnected: please run connect() first
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='api.telegram.org', port=443): Max retries exceeded

이런 상황에서도 알림 실패가 감시 엔진 자체를 죽이면 안 되니까, notifier.py 내부에서 try/except로 다 흡수하고 로그만 남기게 만들었어. risk_control.py랑 연동해서 누적 손실 한도(MAX_CUMULATIVE_LOSS_PCT) 넘으면 감시 자동 일시정지 + 비상 알림도 같이 나가.

보안 및 권한 종합 진단 — security_check.py

실전 전환 앞두고 한 번 훑어봐야 할 항목들을 스크립트 하나로 묶었어.

  • .env 존재 여부 및 .gitignore 등록 여부 검사 (키 노출 방지)
  • 5중 안전 브레이크 상태 확인: DRY_RUN=True, TARGET_BUY_PRICE=1원, MAX_ORDER_QUANTITY_PER_TRADE=10주, MAX_CUMULATIVE_LOSS_PCT=10%, 주문 API 물리적 차단
  • OAuth2 토큰 발급(POST /api-v1/oauth2/token), 계좌 일련번호 연결, 시세 조회 API(GET /api-v1/quote/{symbol}) 접근 권한을 실제 주문 없이 진단

pytest 136개 통과

이번에 새로 추가된 익절/손절 사이클 테스트, notifier.py 등급별 분기 테스트, security_check.py 진단 테스트까지 다 합쳐서 136개가 전부 통과했어. 특히 SMTP 장애 상황을 강제로 발생시켜서 감시 엔진이 죽지 않는지 확인하는 테스트가 제일 까다로웠는데 결과는 깔끔했어. 테스트 프레임워크 자체는 pytest 공식 문서에 나온 fixture·parametrize 패턴을 그대로 활용했어.

다음 단계

이제 실전 전환 전에 남은 건 소액으로 실제 계좌 연동 테스트 정도. 다음 편에서 다룰 예정이야.

👉 다음 편은 아직 준비 중이야. 시리즈 전체 목차는 위 목록에서 확인할 수 있어.

FAQ

Q1. DRY_RUN 모드에서도 익절/손절이 실제로 동작하나요?

네, DRY_RUN=True 상태에서는 실제 주문은 나가지 않지만 가상 매수/매도, 수익률 계산, DB 기록까지 실전과 동일한 로직으로 동작해.

Q2. 알림이 이메일로도 오는 기준이 뭔가요?

WARNING 이상 등급(WARNING/ERROR/CRITICAL)일 때만 텔레그램+이메일 이중 발송이 돼. INFO는 텔레그램+DB 기록만 남아.

Q3. security_check.py는 실제 계좌에 영향을 주나요?

아니, 비파괴 진단이라 실제 주문이나 계좌 변경 없이 토큰·권한·안전장치 상태만 조회해서 보여줘.

Q4. 익절/손절 비율은 종목마다 다르게 줄 수 있나요?

가능해. config.TARGET_STRATEGIES에서 종목별로 take_profit_pct, stop_loss_pct를 따로 정의할 수 있어.

“토스증권 자동매매 봇 익절손절 사이클 완성 | 토스 자동매매 개발기 #23”에 대한 1개의 생각

댓글 남기기