토스 자동매매 개발기 시리즈 (Phase 7-8 / 전체 26편)
- Phase 0 — 자동매매 봇 기초 설계 (#0)
- Phase 0-1 — 환율/통화 버그 수정 (#0-1)
- Phase 1 — 설정 분리 & 재시도 로직 통합 (#3)
- Phase 1-2 — 설정·재시도 로직 후속 개선 (#4)
- Phase 1-3 — pytest 테스트 도입 (#5)
- Phase 1-4 — 로그 파일 로테이션 처리 (#6)
- Phase 2-1 — 전략 클래스 설계 (#7)
- Phase 2-2 — 멀티 종목 모니터링 (#8)
- Phase 3-1 — 데이터 영속성 설계 (#9)
- Phase 3-2 — DB 모듈 구현 (#10)
- Phase 3-3 — DB 통합 (#11)
- Phase 2-3 — 전략 플러그인 인터페이스 (#12)
- Phase 4 — 백테스트 엔진 구축 (#13)
- Phase 4 — 캔들 API 페이지네이션 (#14)
- Phase 5 — 읽기전용 대시보드 (#15)
- Phase 5 — 텔레그램 제어 로직 (#16)
- Phase 5 — 텔레그램 제어 로직 후속 (#17)
- Phase 6 — 스케줄러 & 워치독 (#18)
- Phase 7 — 주문 한도 가드 (#19)
- Phase 7 — 손실 한도 자동 일시정지 (#20)
- Phase 7-3 — 알림 이중화 도입 (#21)
- Phase 7-4 — 보안 진단 시스템 (#22)
- Phase 7-5 — 종목별 익절/손절 사이클 (#23)
- Phase 7-6 — FastAPI 대시보드 통합 (#24)
- Phase 7-7 — 보유 주식 대시보드 (#25)
- Phase 7-8 — 원클릭 매도 조건 설정 UI (#26) · 현재 글
이전 글: Phase 7-7 보유 주식 대시보드 → | 다음 글: 발행 후 업데이트 예정
현재 글: Phase 7-8 / 전체 26편 중 26번째
💡 이번 Phase 7-8 요약
- 목적: 보유 주식 목록에서 클릭 한 번으로 매도 목표가를 설정하고, 매수/매도 조건을 독립적으로 지정할 수 있게 함
- 핵심 포인트:
python-multipart기반 FastAPI Form API로strategy_configs테이블을 즉시 갱신하고,stock_names캐시 테이블로 종목명 병행 표기(예: 삼성전자 (005930))를 구현 - 검증: 실제 API 토큰 연동 진단 성공, pytest 단위 테스트 130개 100% 통과
원클릭 매도 조건 설정 기능을 이번 Phase 7-8에서 드디어 붙였어. 예전엔 종목코드만 줄줄이 보이니까 어떤 종목인지 매번 검색해서 확인해야 했고, 매도 조건을 걸려면 코드를 직접 열어서 값을 바꿔야 했거든.
보유 주식 시각화 & 원클릭 매도 조건 설정 UI
toss_portfolio.fetch_holdings로 가져온 계좌 보유 종목을 대시보드 상단에 표로 띄웠어. 수량, 평단가, 현재가, 평가손익, 수익률까지 한 눈에 보이게 했고, 각 행마다 인라인 폼을 붙여서 매도 목표가를 바로 입력할 수 있게 했지.
@app.post("/api/strategies")
async def create_strategy(
symbol: str = Form(...),
side: str = Form(...), # BUY / SELL / BOTH
target_price: float = Form(...),
):
save_strategy_config(symbol, side, target_price)
return RedirectResponse("/", status_code=303)
처음엔python-multipart를 안 깔아놓고 폼을 붙였다가RuntimeError: Form data requires "python-multipart" to be installed에러를 만났어.pip install python-multipart한 줄로 해결.
가상 계좌 기준 예시로 보면, 삼성전자 (005930)를 평단가 71,000원에 10주 보유 중이라면 목표가 78,000원을 입력하는 순간 strategy_configs 테이블에 즉시 저장되고 감시가 시작돼.
매수/매도 독립 조건 & 종목명 병행 표기
기존엔 매수 조건 하나만 걸 수 있었는데, 이제는 side 컬럼을 BUY / SELL / BOTH 세 가지로 나눴어. 이미 보유 중인 종목은 SELL만, 새로 들어가고 싶은 종목은 BUY만, 둘 다 관리하고 싶으면 BOTH로 설정하면 돼.
stock_names 캐시 테이블
API 조회 때마다 받아오는 종목명을 stock_names 테이블에 매핑해서 저장하고, get_display_name() 유틸리티 하나로 대시보드 전체 표기를 통일했어.
def get_display_name(code: str) -> str:
name = get_cached_stock_name(code)
return f"{name} ({code})" if name else code
이제 대시보드 어디를 봐도 “005930”이 아니라 “삼성전자 (005930)”로 뜨니까 헷갈릴 일이 없어졌어. SK하이닉스 (000660) 같은 종목도 마찬가지.
가상 매수-매도 사이클 & 알림 이중화 · 보안 진단
DRY_RUN = True 상태에서 목표가 도달 시 가상 매수 → 수익률 추적 → 익절/손절 도달 시 가상 매도까지 전체 사이클을 trades 테이블에 기록하도록 만들었어. 실제 주문 없이도 전략 로직을 그대로 검증할 수 있어.
알림도 이중화했어. WARNING 이상 등급은 텔레그램뿐 아니라 이메일(SMTP)로도 동시에 날아가게 notifier.py를 손봤고, security_check.py에서는 .env Git 보호 여부, 5중 안전 브레이크 작동 상태, OAuth2 토큰 연결 상태까지 비파괴적으로 종합 점검하도록 했어.
마지막으로 start_all_daemons.bat / stop_all_daemons.bat을 만들어서 Windows 부팅 시 auto_trader, bot_server, scheduler, dashboard 4개 데몬이 한 번에 뜨도록 정리했어.
검증: pytest 130개 통과
실제 API 토큰으로 연동 진단을 돌려봤고, python-multipart 폼 처리 포함해서 pytest 단위 테스트 130개가 전부 통과했어. 이번 변경은 UI/DB/알림/보안 전 영역을 건드린 거라 회귀 테스트가 특히 중요했지.
마무리
이번 Phase로 원클릭 매도 조건 설정이라는 목표는 얼추 달성한 것 같아. 다음엔 매도 조건 설정 UI에 손절 비율 슬라이더까지 붙여볼 생각이야.