feat: 대시보드 오픈 포지션 패널 추가 (#193) #194
Reference in New Issue
Block a user
Delete Branch "feature/issue-193-dashboard-positions"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
변경 파일
Test plan
Closes #193
Generated with Claude Code
sell 종목이라해도 잔량이 남아 있을 수 있잖아. 오픈 포지션이 어떤건지 설명해줘.
좋은 지적입니다. 현재 시스템의 "오픈 포지션" 정의를 설명드리겠습니다.
현재 시스템의 오픈 포지션 정의
src/db.py:226의get_open_position()구현 기준:이 방식이 성립하는 이유
현재 Ouroboros의 매매 구조는 전량 매수 / 전량 매도 방식입니다.
따라서 마지막 거래가 SELL이면 잔량 = 0, BUY이면 잔량 = BUY 시 수량 전체입니다.
한계 인정
유저 지적처럼, 향후 부분 매도 기능이 추가된다면 이 방식은 부정확해집니다.
그 경우에는
SUM(CASE WHEN action=BUY THEN quantity ELSE -quantity END) > 0방식으로 전환이 필요합니다.현재 범위(전량 매수/매도 시스템)에서는 이 구현이 정확하게 동작합니다.
전량 매도라 하더라도 매도 주문인거지 체결은 아니지 않나? 시장가 매도가 아닌한 잔량은 남을 수 있을텐데?
맞습니다. 코드를 확인한 결과 이 부분이 실제 한계입니다.
국내주식 (src/main.py:708): price=0 → 시장가(ORD_DVSN=01) → 즉시 전량 체결 보장
해외주식 (src/main.py:714-730): KIS VTS가 시장가를 거부하므로 지정가 사용. price=current_price → ORD_DVSN=00 → 미체결 가능
현재 구현의 한계: trades 테이블은 주문 접수 성공(rt_cd=0) 시점에 기록됩니다(src/main.py:781). 체결 여부와 무관합니다.
따라서 해외주식에서 SELL 지정가 주문이 미체결되면, trades에는 SELL이 기록되지만 실제로는 포지션이 남아있는 상태가 됩니다. /api/positions는 "마지막=SELL이므로 포지션 없음"으로 잘못 판단합니다.
국내주식은 시장가이므로 이 문제가 없지만, 해외주식은 지적하신 대로 포지션 과소 표시 가능성이 있습니다.
근본적 해결: KIS 잔고 조회 API를 주기적으로 폴링하여 실제 체결 잔고와 동기화해야 합니다. 현재 스코프 밖이므로 별도 이슈로 추적하겠습니다.