Compare commits

..

94 Commits

Author SHA1 Message Date
hyowons 49a0651f05 auto: 일일 백업 2026-08-11 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-11 02:00:02 +09:00
hyowons d5da99ed70 auto: 일일 백업 2026-08-10 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-10 02:00:00 +09:00
hyowons 6309d760f0 auto: 일일 백업 2026-08-09 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-09 02:00:01 +09:00
hyowons e30a0b74e1 auto: 일일 백업 2026-08-08 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-08 02:00:04 +09:00
hyowons f38a3878b1 auto: 일일 백업 2026-08-07 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-07 02:00:02 +09:00
hyowons 307f7844c4 auto: 일일 백업 2026-08-06 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-06 02:00:01 +09:00
hyowons c03b3f2659 auto: 일일 백업 2026-08-05 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-05 02:00:06 +09:00
hyowons 7e7d759b34 auto: 일일 백업 2026-08-04 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-04 02:00:05 +09:00
hyowons 153ef20ae5 auto: 일일 백업 2026-08-03 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-03 02:00:02 +09:00
hyowons 5009ed19b7 auto: 일일 백업 2026-08-02 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-02 02:00:01 +09:00
hyowons 30be97ab2f auto: 일일 백업 2026-08-01 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-01 02:00:02 +09:00
hyowons d7042430c3 auto: 일일 백업 2026-07-31 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-31 02:00:02 +09:00
hyowons a5f6b0ecd8 auto: 일일 백업 2026-07-30 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-30 02:00:02 +09:00
hyowons c5dd2f98a8 auto: 일일 백업 2026-07-29 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-29 02:00:02 +09:00
hyowons f3a5858597 auto: 일일 백업 2026-07-28 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-28 02:00:02 +09:00
hyowons 748e9bb482 auto: 일일 백업 2026-07-27 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-27 02:00:02 +09:00
hyowons 1f0a2c8971 auto: 일일 백업 2026-07-26 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-26 02:00:01 +09:00
hyowons a13133aabe auto: 일일 백업 2026-07-25 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-25 02:00:04 +09:00
hyowons 5410009bea auto: 일일 백업 2026-07-24 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-24 02:00:02 +09:00
hyowons 8c23849952 auto: 일일 백업 2026-07-23 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-23 02:00:04 +09:00
hyowons 2cf5b38da1 auto: 일일 백업 2026-07-22 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 02:00:04 +09:00
hyowons 1d6fe0f70d auto: 일일 백업 2026-07-18 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-18 02:00:00 +09:00
hyowons bf55377fdc auto: 일일 백업 2026-07-17 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 02:00:02 +09:00
hyowons 9948122ed3 auto: 일일 백업 2026-07-16 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-16 02:00:03 +09:00
hyowons 66d372b50e auto: 일일 백업 2026-07-15 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-15 02:00:02 +09:00
hyowons ed73ed8b18 auto: 일일 백업 2026-07-14 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-14 02:00:03 +09:00
hyowons 3959401a65 auto: 일일 백업 2026-07-11 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-11 02:00:02 +09:00
hyowons 76e2359216 auto: 일일 백업 2026-07-10 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-10 02:00:00 +09:00
hyowons 434b379c13 auto: 일일 백업 2026-07-09 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-09 02:00:05 +09:00
hyowons 212ed517ee auto: 일일 백업 2026-07-08 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-08 02:00:05 +09:00
hyowons 85674763a3 auto: 일일 백업 2026-07-07 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-07 02:00:04 +09:00
hyowons 008ce8be65 auto: 일일 백업 2026-07-04 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 02:00:03 +09:00
hyowons dd1ad7d964 auto: 일일 백업 2026-07-03 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-03 02:00:02 +09:00
hyowons 300a4c9ca9 feat(budget): 가희 증권 자산 후잉·결산 반영 (securities_balance v2)
- send_balance_to_budget.py: 본인+가희 계좌 소유자별(by_owner) 집계, schema v1→v2
- inbox_handler.py: OWNER_ASSET 맵으로 소유자별 reconcile(self→증권(효원)/gahee→증권(가희)),
  asset_name 기반 출력, v2 payload 검증 추가(v1 하위호환 유지)
- monthly_settlement.py: 텔레그램 reconcile 라인 소유자별 라벨
- INBOX_TOPICS.md / CLAUDE.md: v2 스키마 문서화

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-02 18:51:15 +09:00
hyowons 213c0e0797 auto: 일일 백업 2026-07-02 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-02 02:00:02 +09:00
hyowons 565689df25 auto: 일일 백업 2026-07-01 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-01 02:00:02 +09:00
hyowons 1bbb61520c auto: 일일 백업 2026-06-30 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 02:00:02 +09:00
hyowons 17ad101eb1 auto: 일일 백업 2026-06-29 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 02:00:02 +09:00
hyowons 790effdf0e auto: 일일 백업 2026-06-28 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 02:00:01 +09:00
hyowons 6c89c54fe5 auto: 일일 백업 2026-06-27 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 02:00:02 +09:00
hyowons 03989e9df4 auto: 일일 백업 2026-06-26 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 02:00:04 +09:00
hyowons c15c3a1fec auto: 일일 백업 2026-06-25 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 02:00:02 +09:00
hyowons 21f4f07cbb auto: 일일 백업 2026-06-24 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 02:00:02 +09:00
hyowons cee32e6dfb auto: 일일 백업 2026-06-23 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 02:00:01 +09:00
hyowons 40cc290035 auto: 일일 백업 2026-06-21 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 02:00:02 +09:00
hyowons 5a11a21562 auto: 일일 백업 2026-06-20 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-20 02:00:05 +09:00
hyowons dc537f9925 auto: 일일 백업 2026-06-19 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 02:00:06 +09:00
hyowons 70e2251995 auto: 일일 백업 2026-06-18 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 02:00:02 +09:00
hyowons b3696949f5 auto: 일일 백업 2026-06-17 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 02:00:02 +09:00
hyowons eaa276b26d feat(sim): 물타기(애버리징) 토글 — 하락 시 손절 대신 평단↓ 추가매수
- config: AVERAGING_ENTRY·AVERAGING_DROP_PCT(0.10)·CRASH_DROP_PCT(0.10)
- signals.evaluate_holding: market_ok 인자 + 물타기 분기 (직전매수가 -10% 하락 시 ADD-down, 한도/강세장/비급락 조건, 당일 -10%급락은 손절·약세장 금지)
- engine·backtest: add_kind='down'이면 손절선 낮은 평단 기준 재설정(up은 위로 래칫 유지), engine은 market_ok 전달
- 첫 매수는 기존 검증 진입 그대로(우량주만 물타기)
- 백테스트: 즉시매수와 반대로 유리(10/20/60 수익·승률↑) → 라이브 변이 3개(v301/302/303) 등록, 총 223
- 웹 '물타기' 칩 + 설명 토스트

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 14:30:07 +09:00
hyowons 70f6b9a34d feat(sim): 정렬 토글(오름/내림)·40일선 1등전략(v300) 복구·보유배지 📦
- sim_web 비교탭 정렬: 손익/평가/보유/거래순 클릭마다 오름↔내림 토글 (기본 내림, 평가순만 오름), 활성버튼 화살표 표시
- 40일선 1등 전략 v62 파라미터 복구 → v300 (새 계좌, 220개)
- behive_web 보유 배지: '보유 xx 주' → '📦 xx' (폰트 8px, sim웹과 통일)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 12:16:08 +09:00
hyowons a61f1f67c5 style: 보유 배지 'xx 주' → '보유 xx 주'
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-16 10:04:39 +09:00
hyowons 3366990cfa style: 보유 배지 '보유xx' → 'xx 주'
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-16 09:51:17 +09:00
hyowons 3694393c43 style: 보유 배지 '보유 xx주' → '보유xx' (공백·주 제거)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-16 09:34:38 +09:00
hyowons 5cd3ba9f4e auto: 일일 백업 2026-06-16 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-16 02:00:06 +09:00
hyowons a5e52dc69b feat(sim): 관찰목록 자동편입/제외 — 키움 순위정보로 주도주 매일 편입
- kiwoom_client: get_volume_surge(ka10023)·get_foreign_inst_netbuy(ka90009) 순위 조회 추가 (rkinfo endpoint)
- universe: auto_import(외인·기관 순매수+거래량급증 상위, ETF·하락·급증률이상치 제외, 각15·총120 상한, origin=auto) + auto_prune(auto·미보유·10거래일 무신호만, 보유/수동/비하이브 불가침) + mark_signals
- engine.scan_all: 변이 watching 종목을 mark_signals로 신호 추적(auto_seen.json)
- CLI: python3 -m sim universe {import|prune|all}
- trade-journal plist 평일21:00에 'sim universe all' 4번째 명령 추가
- 첫 실행: 후보38 → 32편입 (59→91종목)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-15 19:03:35 +09:00
hyowons e3c54d62ed feat(sim): 추세선 4종·완화/즉시매수 토글·전략 4요소 이름·거래목록 달력 등 대개편
전략 차원/변이:
- 추세선 10/20/40→10/20/60 (40 제거, 60 추가; 60은 중기게이트와 겹침)
- 기울기 게이트 완화(완화=기울기만 면제, 중기정배열 유지)
- 즉시매수 토글 — 백테스트로 불리 확인 → 라이브 확인용 3개만 유지
- 최종 219개 (비즉시 216 + 즉시 3)

UI:
- 전략 이름 = 4카테고리 두글자(추세·진입·매도·베팅) + 카테고리별 ⓘ 설명
- 거래목록 달력형(오늘 자동선택·거래없어도 클릭), 매수/매도 분리·익절/손절 표시
- 라벨 동적화(실제 SMA_LONG), 제외카드 4조건 표시, 약세모드/완화/즉시 칩
- 매수준비/대기 배지 분리, 탭 깜빡임 제거(서버 checked), 손절/목표 평단% 등

문서: CLAUDE.md sim 섹션 갱신

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-15 18:57:30 +09:00
hyowons ef477d878c feat: 보유종목 행도 NXT/KRX 텍스트 → 거래가능 초록점 (미리보기와 동일)
- _render_holding_row: px badge를 px-dot 초록점으로 통일. 활성 시장 판정(mark)은
  OHLC 미니테이블 컬럼 강조(active_market)용으로만 남겨 OHLC 표시는 그대로 유지
- 더 이상 쓰이지 않는 .px-mark/.px-nxt/.px-krx CSS 제거, CSS 주석 갱신
- 라이브 owner 패널 27개 보유행 전부 초록점 확인

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-15 11:38:39 +09:00
hyowons 904ae5c415 feat: 미리보기 행 NXT/KRX 텍스트 마크 → 거래가능 초록점
- _render_row: 가격 출처(NXT/KRX) 텍스트 배지 대신 '지금 거래시간 여부'로
  초록점(.px-dot.tradable) / 점 없음. 정규장=전부, NXT시간대=NXT거래종목만
  (_nxt_price>0), 장마감·휴장·주말=점 없음. 가격 None은 기존대로 점 없음
- 보유종목 상세행(_render_holding_row)의 NXT/KRX 텍스트는 그대로 유지
- CSS .px-dot 추가 (px-mark.px-nxt/krx는 보유행이 계속 사용)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-15 11:34:26 +09:00
hyowons 474ccf09eb auto: 일일 백업 2026-06-15 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-15 02:00:03 +09:00
hyowons 102bdf36d7 auto: 일일 백업 2026-06-14 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-14 02:00:02 +09:00
hyowons c749e66460 auto: 일일 백업 2026-06-13 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 02:00:02 +09:00
hyowons 137b160a09 docs: 2계좌 매도 전량매도 조건·보유 병기 표기 반영
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-12 15:16:43 +09:00
hyowons 9239901028 feat: 2계좌 매도 팝업은 전량매도일 때만 + 매도 보유수량 현재/전체(그룹) 병기
- 팝업 조건: 입력 수량 == 매도가능 전량(max_qty)일 때만 sell-choice 팝업,
  일부매도는 팝업 없이 단일 진행. lastCheck 미수신 시에도 단일 진행
- 매도 정보영역: 같은 그룹 다른 계좌도 보유 시 '보유: 141주 / 전체 280주' 병기
  (단독 보유면 기존 표시 유지). 팝업 문구도 양쪽 '매도가능 전량'으로 통일

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-12 15:16:23 +09:00
hyowons 5c884a0de6 docs: CLAUDE.md 거래 모달에 2계좌 동시 매도·propose_multi 반영
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-12 15:06:29 +09:00
hyowons e95e2b3f3a feat: 매도 시 같은 그룹 2계좌 동시 매도 (카드 1장+PIN 1개, 선택 팝업)
- orders/handler.py: propose_trade_multi (레그별 독립 검증, 같은 소유자 그룹만,
  SELL+LIMIT/MARKET 한정) + submit_with_pin multi 분기 _submit_multi_legs
  (레그 독립 제출·독립 fill_watcher, 한 레그 실패해도 나머지 시도)
- orders/card.py: format_card_multi (레그별 계좌·수량·예상회수 + 합계)
- behive_web.py: POST /api/order/propose_multi (PIN은 iMessage '매도(2계좌)'),
  sell-choice-modal (두 계좌 모두 / 선택 계좌만 / 취소), doPropose SELL 분기
  (accStatus로 sibling 보유 감지 → 팝업, sibling 수량은 보유 전량)
- fix: /api/order/cancel 응답이 dict를 PendingCard로 취급해 매번 500 나던
  기존 버그 (취소 자체는 동작, 응답만 깨짐)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-12 15:05:35 +09:00
hyowons 72b98409f2 feat: 종목차트 탭 재배열 + 3개월 추가 — 1분봉/5분봉/1개월/3개월/6개월/1년
- CHART_RANGE_DAYS에 '3M': 63 추가 (stock_analysis)
- /api/chart_svg 탭·패널 순서를 분봉 우선으로 재배열, 3M 패널 신설
- 기본 활성 탭은 1개월 유지

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-12 10:28:08 +09:00
hyowons ff3652c8b1 feat: 자산 차트 단위 경계 세로선 — 일별=주 경계, 월별=연 경계
- 일별 보기: ISO 주차가 바뀌는 첫 점에 세로 점선 (주 단위 구간 인지)
- 월별 보기: 연도가 바뀌는 첫 점에 세로 점선
- per_period 모드는 기존 period-sep과 중복이라 생략, week/year 단위 미표시
- 스타일 .grid-v — 가로 grid와 동일 톤 점선

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-12 10:03:11 +09:00
hyowons b5e3fc0f4e fix: VI 1h 매핑 실증 반영 — active=해제시각(1224) 유무로 판정
2026-06-12 사이드카 날 VI 폭주(~1,000건) 실증 결과:
- 9068은 발동/해제가 아니라 VI 종류(1=정적, 2=동적, 3=동적+정적)
  → 구 매핑은 동적 VI를 통째로 무시하고, 해제 이벤트도 active로 덮어썼음
- 발동 이벤트는 1224(해제시각)='000000', 해제 이벤트는 시각이 참
  → active = release_time in ('','000000') 으로 교체, 1223 발동시각 추가 저장
- 1h는 구독 무관 시장 전역 broadcast임을 확인 (주석 기록)
- 실증용 raw 로그 제거 (폭주 날 ~2,000줄 — 역할 완료)
- 토스트: 발동시각 표시 추가, '000000'은 해제 표시 생략
- TTL 백스톱(_vi_expired 180s)은 해제 메시지 유실 대비로 유지

라이브 검증: 002780 동적 VI 발동(09:09:08) → active=True 정상 포착

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-12 09:09:58 +09:00
hyowons defd5c0bf6 auto: 일일 백업 2026-06-12 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-12 02:00:03 +09:00
hyowons b20c21cbd2 fix: VI 배지 자동 만료 — 해제 1h 메시지 미수신 시 영구 잔류 방지
- 관찰(2026-06-11): VI 발동 1h 이후 해제 메시지가 안 오고 1224(해제시각)도
  발동시각과 동일 → active=true 박제, 배지가 안 사라짐
- get_vi/active_vis 읽기 시점에 발동 후 180초(2분+임의연장30s+여유) 경과 시
  active=False 처리 (_vi_expired). 저장 원본은 유지
- 1h 원본 필드 stderr 로그 추가 — 9068/1224 매핑 실증용 (VI 드물어 부담 없음)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-11 15:56:45 +09:00
hyowons 76001b1994 feat: 기업정보 종합 판단에 추정ROE·추정EPS 리비전 반영
- ROE: trailing 낮아도 추정ROE 급증(≥15% & 현재의 1.5배↑) 전망이면 좋은 점으로 표시
- PBR≥3: 추정ROE≥20%면 고평가 단정 대신 '실현 여부 관건'으로 완화 (PER/추정PER과 동일 패턴)
- 추정EPS 리비전(est_change_pct)을 전망 개선/악화 판단에 추가 (목표가 리비전보다 직접적 신호)
- synthNote: pbrJustified로 valHigh 제외 + EPS 리비전을 grPos/grNeg에 포함

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-11 12:23:10 +09:00
hyowons c9fafad10d feat: 기업정보 종합 판단에 추정(forward) PER 반영
기존엔 trailing PER만 보고 고평가 판단 → 성장주(삼성전자 45배 vs 추정 6.9배)
오판. trailing 높아도(≥30) 추정PER이 크게 낮으면(<trailing×0.6 & <20) '이익 급증
기대(growth priced in)'로 인식: 고평가 단정 대신 좋은점(forward 저평가)+주의점
(추정치 미달 시 조정 위험) 양면 표시. synthNote에 forward 우선 케이스 추가.
forward EPS 낙관 경향 고려해 미달 위험 경고 동반.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-11 12:12:46 +09:00
hyowons f8d17f4437 feat: 기업정보 모달 — 가치+성장 종합 해석을 요약탭에 통합
각 탭의 개별 판단 박스 제거. 요약탭 최상단에 📌종합(가치 vs 성장·컨센서스
상충을 한 문장으로 화해: 고평가+긍정/저평가+부진/고평가+부진/저평가+긍정 4분기)
+ 좋은 점 / ⚠️주의할 점(두 영역 합산) 표시.
companyJudge/growthJudge → companyGC/growthGC({good,caution}) + synthNote 추가.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-11 12:09:45 +09:00
hyowons 0845db1915 feat: 기업정보 모달 가치/성장성 탭 요약을 해석형(좋은점/주의점)으로
수치 나열 대신 지표를 좋은 점 / ⚠️주의할 점으로 판단:
- 가치: ROE(우수/낮음/적자)·PER(고평가 부담/부담 작음)·PBR(비쌈/청산가치 이하)
- 성장: 매출·영익·EPS 성장/역성장·상승여력·투자의견·목표가 리비전·서프라이즈
규칙 기반·표준 임계치, 특이점 없으면 미표시. (이전 나열식 요약 대체)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-11 12:04:04 +09:00
hyowons 2d9c6719e8 feat: 기업정보 모달 가치/성장성 탭 상단에 내용 요약 박스
기업정보·가치 탭: 밸류에이션(PER·PBR)+수익성(ROE 우수/양호/낮음/적자).
성장성·컨센서스 탭: 성장(매출·영익·EPS YoY)+목표주가/상승여력/투자의견+
리비전+서프라이즈. 규칙 기반(LLM 미경유), 표시 데이터 그대로 요약.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-11 11:53:22 +09:00
hyowons a3c6496ffa chore: sim 전략 파라미터·페이퍼 실험 데이터 git 추적 (백업 공백 해소)
state/* 일괄 제외에 sim 화이트리스트 추가 — 108변이 파라미터(variants.json)·
메인 튜닝(params.json)·마킹(favorites.json)·등록근거(backtest_results.json)·
일별성과(equity_history)·관찰목록·지수이력 + 변이별 계좌/거래기록.
last_scan·variants_compare(5분 스냅샷)·flow_history.sqlite(백필 재구축 가능)는 계속 제외.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-11 11:20:31 +09:00
hyowons 70841548bc feat: VI 배지 토스트에 종목 실제 VI 데이터 표시
VI 탭 시 그 종목의 실시간 VI 정보(적용구분·방향·발동가·발동등락률·당일
발동횟수·해제시각)를 설명과 함께 표시. window.__rtState.vi[code] 사용.
허브에 발동횟수(1490) 캡처 추가.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-11 11:08:27 +09:00
hyowons ae83deab9f style: VI 설명 토스트 줄바꿈 (동적/정적VI 항목 구분)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-11 11:04:24 +09:00
hyowons 7a60bb1865 feat: VI 배지 탭 시 변동성완화장치 설명 토스트
VI 배지를 누르면 VI 설명 토스트 표시(동적/정적VI·발동 기준·2분 단일가).
document 위임(배지는 동적 생성) + preventDefault/stopPropagation으로 행 토글 차단.
배지에 cursor:pointer 추가.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-11 10:49:55 +09:00
hyowons 25a01f7f4a feat: 보유 상세 듀얼 OHLC 미니 현재가/등락 WS 실시간 갱신
듀얼 OHLC 미니(KRX/NXT)의 '현재가' 행이 서버 렌더라 고정이던 것을 WS 라이브로.
- 현재가 셀에 data-rt-ohlc-cur + data-prev(각 시장 전일종가) 마커
- paintOhlcCur(code,price): 1초 틱마다 현재가=AL 라이브(양쪽 동일), 등락=셀별
  전일종가 대비 재계산. applyState에서 호출.
전일종가/시가/고가/저가/당일종가 행은 그대로(서버 렌더).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-11 10:45:58 +09:00
hyowons c1a46fd908 fix: 보유종목 등락률 가끔 안 보이던 문제 — rt-daypct span 항상 렌더
기존 조건(d_pct_val != 0)으로 등락률이 0/None이면 .rt-daypct span을 아예
안 그렸는데, WS paintDay는 span이 있을 때만 갱신(if(sp))이라 한 번 0으로
렌더되면 실시간으로도 복구 안 돼 사라졌다. show_day_change 동안 항상 span을
그리도록 변경(값 0/None은 0.00% neutral) → WS가 라이브로 채움.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-11 10:05:37 +09:00
hyowons bfb518307f fix: 순자산 차트 고/저점 — 장중가(마지막 점)가 극값일 때도 표시
기존엔 극값이 마지막 점이면 생략 → 저점이 현재값인 차트(가희 등)에서 저점 안 보임.
마지막 점 제외 조건 제거 → 장중가가 고/저점이어도 표시. 단 마지막 점이 신고가(ATH)면
신고가 링이 '고'를 대신(중복 방지).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-11 09:21:22 +09:00
hyowons 1c03a1a6af feat: 순자산 차트에 고/저점 마커 추가
차트보기 구간의 최고점(고·노란 점)·최저점(저·파란 점)에 마커+라벨.
극값이 마지막(현재) 점이면 기존 끝점 마커가 커버하므로 생략(중복 방지).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-11 09:14:42 +09:00
hyowons 81e8847a8e auto: 일일 백업 2026-06-11 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-11 02:00:01 +09:00
hyowons af058cf36d fix: 분봉 툴팁 등락률을 당일시가대비 → 전일대비로 (현재 등락율과 일치)
당일시가대비(vs 오늘 시가)는 갭하락 때 현재 등락율과 어긋남(예: 삼성전자
시가대비 -4.1% vs 전일대비 -7%대). 관리자 요청대로 그 봉 종가 vs 전일종가
기준으로 변경 → 마지막 봉이 현재 등락율(-7%대)과 일치.
- meta.dayOpen 제거, meta.prevClose(=ref_price) 주입
- _setOhlcText: '당일시가대비' → '전일대비' 라인
- day_open 캡처/파라미터 제거(불필요)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 14:23:23 +09:00
hyowons 8bfaecbd1e fix: 분봉 당일시가대비 baseline 오류 + 우상단 전일대비 텍스트 제거
- 당일시가(dayOpen)를 range 슬라이스 전 '오늘 첫 봉' 시가로 고정 → 1h/30min 등
  구간을 좁혀도 baseline 동일. 마지막 봉 당일시가대비 = 현재가 등락율 일치.
  (기존: candles[0]가 슬라이스된 구간 첫 봉이라 baseline이 틀렸음)
- 우상단 '전일대비 X%' 텍스트 제거(관리자 요청). 전일종가 기준선은 유지.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 14:15:03 +09:00
hyowons 51d0384ed4 feat: 분봉 크로스헤어 툴팁에 '당일시가 대비 등락률' 추가
분봉 차트 클릭(세로선) 시 OHLC 팝업에 그 봉 종가의 당일 시가(첫 봉) 대비
등락률을 표시 — 그 시점까지의 오늘 누적 등락을 한눈에. 일봉은 미표시(분봉만).
- render_svg_chart(intraday=) → meta.dayOpen(첫 봉 시가, 분봉만) 주입
- 분봉 엔드포인트 intraday=True
- _setOhlcText: 당일시가대비 라인 + 팝업 박스/닫기버튼 동적 리사이즈

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 14:08:14 +09:00
hyowons 9c830f58f6 feat: 분봉 전일대비% 항상 표시 + 보유 상세 종목명 + 유형 폭 정리
- 분봉 차트(1/5/15m): prev_close를 일봉 캐시에서 못 찾으면 ka10095(현재가−전일대비)로
  보강 → 모든 종목에 '전일대비 +X%'(오늘 하루 등락) 항상 표시.
- 보유종목 자세히 보기 상단에 종목명+코드(.detail-name) 추가.
- 차트 컨트롤 2번째 줄: 연도/월은 내용 크기, 유형은 기간과 동일 폭(글씨 크기 유지).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 14:01:33 +09:00
hyowons e1fd6a7e84 refactor: 차트 컨트롤 2줄 분리 + 지정기간 단위 일별 고정
- 1번째 줄: 기간/단위/차트타입(모드) 유지. 지정기간 선택 시 단위 일별 고정(비활성).
- 2번째 줄(지정기간일 때만 노출): 유형(연도별/월별) / 연도 / 월.
- 유형=연도별이면 월 드롭다운 '-' 표시·비활성, 월별이면 월 활성.
- 연도별도 단위 일별 → 그 해 전체 일별 차트(기존 월별집계에서 변경).
- CSS: .chart-controls 컬럼 레이아웃 + .cc-line 행, .cc-line-ym[hidden] 숨김.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 11:13:17 +09:00
hyowons 8c891a820a refactor: 차트 기간 '연도별/월별' → '지정기간' + 유형 하위 드롭다운
기간 드롭다운의 연도별·월별 2옵션을 '지정기간' 1옵션으로 통합.
지정기간 선택 시 보조 드롭다운 노출: 유형(연도별/월별) → 연도 → 월(월별일 때만).
- _render_chart_controls: custom 옵션 + data-nw-ymtype 유형 select 추가, 가시성 재구성
- JS: range='custom' 진입·data-nw-ymtype 핸들러(ymSet/curYear/curType 헬퍼)
chart_ym 인코딩·서버 로직은 그대로(YYYY/YYYY-MM).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 10:57:40 +09:00
hyowons 5ee35a0e27 fix: 연도별·월별 과거 기간 차트에 오늘 라이브 점 안 붙이기
과거 기간(예: 4월)을 골라도 has_live 판정으로 오늘 순자산이 마지막 점·델타·
하단값으로 붙어 차트와 무관한 값이 나오던 문제. period가 이번달·올해가 아니면
(period_is_current=False) current_net/rt_owner를 None으로 → 라이브 점·라이브
갱신 모두 비활성. 과거 차트는 그 기간 끝점에서 마감, 델타·하단값이 차트와 일치.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 10:49:42 +09:00
hyowons 7bb07ea3ad feat: 자산 차트보기에 연도별·월별 절대 선택 추가
기간 드롭다운에 '연도별'(연도 선택→월별 집계)·'월별'(연도+월 선택→일별) 추가.
- _available_chart_periods(): 스냅샷에서 데이터 있는 연/월만 추출(드롭다운 채움)
- _load_net_worth_series(period=): 'YYYY'/'YYYY-MM' 절대 필터
- _render_summary_panel: chart_ym → 단위 강제(연도별=월별집계/월별=일별)
- _render_chart_controls: 연·월 보조 드롭다운 + months map(JS용) + period 시 단위 disable
- chart_ym 파라미터 체인·캐시키·GET 핸들러(형식검증) 전반 연결
- JS: chartYM 저장/전송 + 연도별/월별/연·월 셀렉터 핸들러
- CSS: .cc-ym[hidden] 숨김(flex가 [hidden] UA스타일 덮지 않도록)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 10:42:25 +09:00
hyowons f8cd71713b Revert "fix: 보유탭 등락 기준을 ka10095 전일종가로 통일 — 감시탭 미리보기와 일치"
This reverts commit 0ba61d4d7c.
2026-06-10 09:05:36 +09:00
250 changed files with 179953 additions and 4879 deletions
+12
View File
@@ -32,6 +32,18 @@ update-check.json
**/state/* **/state/*
!**/state/trade_journal.jsonl !**/state/trade_journal.jsonl
!**/state/market_indicators_history.jsonl !**/state/market_indicators_history.jsonl
# sim 전략 정의·페이퍼 실험 데이터는 추적 (108변이 파라미터·마킹·누적 성적 — 복구 불가, 2026-06-11)
# last_scan·variants_compare(5분 스냅샷)·flow_history.sqlite(백필로 재구축 가능)는 계속 제외
!**/state/sim/
**/state/sim/*
!**/state/sim/variants.json
!**/state/sim/params.json
!**/state/sim/favorites.json
!**/state/sim/backtest_results.json
!**/state/sim/equity_history.json
!**/state/sim/watchlist.json
!**/state/sim/index_history.json
!**/state/sim/variants/
/cache/ /cache/
/locks/ /locks/
/logs/ /logs/
+46 -15
View File
File diff suppressed because one or more lines are too long
+30 -20
View File
@@ -11,44 +11,53 @@ OpenClaw 에이전트 간 파일 기반 통신의 topic 카탈로그. envelope
### `securities_balance` ### `securities_balance`
- **방향:** `stock``budget` - **방향:** `stock``budget`
- **목적:** 본인 증권 계좌별 잔액(평가액·예수금·총자산)을 골디에게 전달, 월간 결산 입력으로 사용 - **목적:** 본인+가희 증권 계좌별 잔액(평가액·예수금·총자산)을 소유자별로 골디에게 전달, 월간 결산 입력으로 사용
- **트리거:** macOS launchd `ai.openclaw.stock.send-balance` — 매월 1일 04:30 KST. 골디 결산 cron(05:00) 30분 전. (`inbox_handler.py``as_of` 가드는 1·10·20일을 허용 — 과거 운영 호환 안전망) - **트리거:** macOS launchd `ai.openclaw.stock.send-balance` — 매월 1일 04:30 KST. 골디 결산 cron(05:00) 30분 전. (`inbox_handler.py``as_of` 가드는 1·10·20일을 허용 — 과거 운영 호환 안전망)
- **schema_version:** 1 - **schema_version:** 2 (v1 하위호환 유지 — 수신자 `SUPPORTED_SCHEMA={1,2}`)
- **payload 스키마:** - **payload 스키마 (v2):**
```json ```json
{ {
"as_of": "2026-05-01", "as_of": "2026-07-01",
"owner_scope": "self_only", "owner_scope": "self_and_gahee",
"accounts": [ "accounts": [
{ {
"label": "일반", "label": "일반",
"owner": "self",
"account_no": "", "account_no": "",
"deposit": 118743, "deposit": 56032,
"eval_amount": 63177225, "eval_amount": 114294705,
"total": 63295968, "total": 114350737,
"position_count": 4 "position_count": 7
}, },
{ "label": "ISA", ... } { "label": "ISA", "owner": "self", ... },
{ "label": "가희_일반", "owner": "gahee", ... },
{ "label": "가희_ISA", "owner": "gahee", ... }
], ],
"by_owner": {
"self": { "deposit": 146362, "eval_amount": 188964561, "total": 189110923 },
"gahee": { "deposit": 138469, "eval_amount": 22587331, "total": 22725800 }
},
"totals": { "totals": {
"deposit": 843705, "deposit": 284831,
"eval_amount": 114519255, "eval_amount": 211551892,
"total": 115362960 "total": 211836723
} }
} }
``` ```
- **owner_scope:** 현재 `self_only`만 발행 (가희 계좌 제외 — `가희_` prefix 라벨 자동 필터). 향후 가희 포함 버전 필요해지면 `with_gahee` 등 새 값 도입 - **owner_scope:** v2는 `self_and_gahee` — 본인·가희 모두 발행. `accounts[].owner``self`|`gahee` (`가희_` prefix 라벨이 gahee). 소유자 집계는 `by_owner`. `totals` 는 참고용 grand total. (v1은 `self_only`·`by_owner` 없음, 단일 소유자로 처리)
- **수신자(골디) 처리 동작:** - **수신자(골디) 처리 동작:**
- 월간결산 cron 진입부에서 `inbox_handler.process_inbox()` 호출 (fetch_balance 이전 — 분개가 후잉 잔액에 반영되어 결산이 분개 후 스냅샷을 보도록) - 월간결산 cron 진입부에서 `inbox_handler.process_inbox()` 호출 (fetch_balance 이전 — 분개가 후잉 잔액에 반영되어 결산이 분개 후 스냅샷을 보도록)
- payload의 `totals.total` 과 후잉 자산 `증권(효원)` 의 차액을 계산: - `by_owner` 의 각 소유자 total 과 후잉 자산(`self``증권(효원)`, `gahee``증권(가희)`)의 차액을 소유자별로 reconcile:
- 차액 > 0 → 차변 `증권(효원)` / 대변 `주식평가수익` 자동 분개 - 차액 > 0 → 차변 `증권(효원|가희)` / 대변 `주식평가수익` 자동 분개 (손익 계정은 소유자 공용)
- 차액 < 0 → 차변 `주식평가손실` / 대변 `증권(효원)` 자동 분개 - 차액 < 0 → 차변 `주식평가손실` / 대변 `증권(효원|가희)` 자동 분개
- `|차액| < 1만원` → 노이즈로 간주, 분개 skip (processed 처리) - `|차액| < 1만원` → 노이즈로 간주, 분개 skip (processed 처리)
- `|차액| > 1억원` → 안전 가드 발동, 분개 거부 + 텔레그램 alert + `failed/` 이동 - `|차액| > 1억원` → 안전 가드 발동, 분개 거부 + 텔레그램 alert + `failed/` 이동
- 처리 후 `processed/`로 이동, `state/inbox_state.json``processed[]` 에 message_id 누적 (idempotency, 최근 1000개) - 후잉에 해당 자산 항목 없으면 `skipped` (분개 안 함)
- 결산 메일 본문에 `## 인박스 reconcile` 섹션, 텔레그램에 한 줄 요약 추가 - 소유자 하나라도 rejected/journal_failed 면 `failed/` 이동·미처리. 재실행 시 이미 분개된 소유자는 fresh 조회로 차액≈0 aligned → 중복분개 없음 (reconcile는 목표값으로 맞추기라 자연 idempotent)
- 정상 처리 후 `processed/`로 이동, `state/inbox_state.json``processed[]` 에 message_id 누적 (idempotency, 최근 1000개)
- 결산 메일 본문에 `## 인박스` reconcile 섹션(소유자별 라인), 텔레그램에 한 줄 요약 추가. 메일 "자산 계정별 변동"은 후잉 자산 전수 순회라 `증권(가희)`도 자동 표시
- **GC / 적체 정책 (월간결산 cron 진입부에서 매월 자동 수행):** - **GC / 적체 정책 (월간결산 cron 진입부에서 매월 자동 수행):**
- `processed/` 의 mtime 30일 초과 envelope 자동 삭제 (`gc_processed`) - `processed/` 의 mtime 30일 초과 envelope 자동 삭제 (`gc_processed`)
- `failed/` 적체가 5건 이상이면 결산 메일·텔레그램에 ⚠️ alert 한 줄 추가 — 사람이 검토 후 수동 삭제 (자동 삭제 안 함, CLAUDE.md 원칙 준수) - `failed/` 적체가 5건 이상이면 결산 메일·텔레그램에 ⚠️ alert 한 줄 추가 — 사람이 검토 후 수동 삭제 (자동 삭제 안 함, CLAUDE.md 원칙 준수)
@@ -57,8 +66,9 @@ OpenClaw 에이전트 간 파일 기반 통신의 topic 카탈로그. envelope
- envelope 키 누락 / `to != budget` / 미등록 topic / 미지원 `schema_version` - envelope 키 누락 / `to != budget` / 미등록 topic / 미지원 `schema_version`
- payload 키 누락 (`as_of`, `accounts`, `totals`, `owner_scope`) - payload 키 누락 (`as_of`, `accounts`, `totals`, `owner_scope`)
- `as_of` 가 매월 1·10·20일이 아님 - `as_of` 가 매월 1·10·20일이 아님
- `totals.{deposit,eval_amount,total}` 음수 또는 100억 초과 - `totals`/`by_owner.*``{deposit,eval_amount,total}` 음수 또는 100억 초과
- `accounts[].total` 합계가 `totals.total` 과 불일치 - `accounts[].total` 합계가 `totals.total` 과 불일치
- `by_owner` 에 미등록 소유자 (self/gahee 외) 또는 구조 오류
- 차액이 1억원 초과 (분개 거부) - 차액이 1억원 초과 (분개 거부)
- 후잉 webhook 분개 실패 - 후잉 webhook 분개 실패
- **관련 스크립트:** - **관련 스크립트:**
+4 -1
View File
@@ -18,8 +18,11 @@
| **증권잔액 → 골디 inbox** | `python3 ~/.openclaw/agents/stock/workspace/scripts/send_balance_to_budget.py` | launchd `ai.openclaw.stock.send-balance` (매월 1일 04:30) | | **증권잔액 → 골디 inbox** | `python3 ~/.openclaw/agents/stock/workspace/scripts/send_balance_to_budget.py` | launchd `ai.openclaw.stock.send-balance` (매월 1일 04:30) |
| **골디 inbox 처리** (단독) | `python3 ~/.openclaw/agents/budget/workspace/skills/monthly-settlement/scripts/inbox_handler.py [--dry-run]` | 트리거 없음 — 월간결산 cron 진입부에서 자동 호출. 수동 점검·재처리용 | | **골디 inbox 처리** (단독) | `python3 ~/.openclaw/agents/budget/workspace/skills/monthly-settlement/scripts/inbox_handler.py [--dry-run]` | 트리거 없음 — 월간결산 cron 진입부에서 자동 호출. 수동 점검·재처리용 |
| **워치리스트 모니터링** | `python3 ~/.openclaw/agents/stock/workspace/scripts/watchlist_monitor.py check` | launchd `ai.openclaw.stock.watchlist-monitor` (평일 0915시 매 15분) | | **워치리스트 모니터링** | `python3 ~/.openclaw/agents/stock/workspace/scripts/watchlist_monitor.py check` | launchd `ai.openclaw.stock.watchlist-monitor` (평일 0915시 매 15분) |
| **트레일링 스톱 감시** | `python3 ~/.openclaw/agents/stock/workspace/scripts/trailing_monitor.py {check [--repeat N --gap S] [--force] [--dry-run]\|list}` | launchd `ai.openclaw.stock.trailing-monitor` (평일 09:0015:30 **매 1분**, 스크립트가 장외·휴장 self-skip). 자산웹에서 PIN 승인된 트레일링 예약의 조건단가를 고점 갱신 시 kt10002로 **상향만** 정정. 신규 발주 없음. 예약 0건이면 즉시 종료(API 콜 0). 상태 `state/trailing_stops.json`. ⚠️ cadence 변경 이력 2분→30초→**1분**(2026-07-30 관리자님) — 30초는 launchd로 불가해 `--repeat 2 --gap 30`(프로세스 내부 2회)으로 구현했었고, 옵션은 살아있으니 다시 쓸 땐 plist 인자만 추가 |
| **공모주 캘린더 동기화** | `python3 ~/.openclaw/agents/stock/workspace/scripts/ipo_calendar_sync.py` | launchd `ai.openclaw.stock.ipo-calendar-sync` (매월 1일 09:00) | | **공모주 캘린더 동기화** | `python3 ~/.openclaw/agents/stock/workspace/scripts/ipo_calendar_sync.py` | launchd `ai.openclaw.stock.ipo-calendar-sync` (매월 1일 09:00) |
| **FOMC 캘린더 동기화** | `python3 ~/.openclaw/agents/stock/workspace/scripts/fomc_calendar_sync.py [--list\|--dry-run]` | launchd `ai.openclaw.stock.fomc-calendar-sync` (매월 1일 09:10). 연준 공식 일정표 → `[FOMC] YYYY-MM 회의` 종일 일정(회의 시작일 ET ~ 발표일 KST). `--list`는 파싱 결과만(캘린더 미접근) |
| **휴장일 동기화** | `python3 ~/.openclaw/agents/stock/workspace/scripts/holiday_sync.py [--show]` | launchd `ai.openclaw.stock.holiday-sync` (매주 일요일 03:00) | | **휴장일 동기화** | `python3 ~/.openclaw/agents/stock/workspace/scripts/holiday_sync.py [--show]` | launchd `ai.openclaw.stock.holiday-sync` (매주 일요일 03:00) |
| **Gmail 라벨 분류** | `python3 ~/.openclaw/workspace/scripts/gmail_label_classify.py [--dry-run]` | launchd `ai.openclaw.gmail-label-classify` (매일 01:00). self-sent 브리핑·종목분석·주식 리포트 메일 라벨링 + 24h 테스트메일 휴지통. LLM 미경유(`gog` CLI). 2026-06-26 cron→launchd 이관 |
| **매매 기록 적재** | `python3 ~/.openclaw/agents/stock/workspace/scripts/trade_journal.py {collect\|seed\|show\|query} ...` | launchd `ai.openclaw.stock.trade-journal` (평일 21:00 — NXT 야간 마감 후 ka10170 4계좌 적재). `seed`는 적재 시작일 이전 보유분을 현재 평단가로 1회 시드 (idempotent) | | **매매 기록 적재** | `python3 ~/.openclaw/agents/stock/workspace/scripts/trade_journal.py {collect\|seed\|show\|query} ...` | launchd `ai.openclaw.stock.trade-journal` (평일 21:00 — NXT 야간 마감 후 ka10170 4계좌 적재). `seed`는 적재 시작일 이전 보유분을 현재 평단가로 1회 시드 (idempotent) |
| **자동매매 시뮬 스캔** | `cd ~/.openclaw/agents/stock/workspace && python3 -m sim {scan [--force]\|status\|report\|reset --yes}` | launchd `ai.openclaw.stock.sim-scan` (평일 0915:30 매 15분, 엔진이 장외 self-skip). 가상자본 1천만 페이퍼 트레이딩, 규칙 엔진(LLM 미경유). 결과 `state/sim/`. 실주문 아님 | | **자동매매 시뮬 스캔** | `cd ~/.openclaw/agents/stock/workspace && python3 -m sim {scan [--force]\|status\|report\|reset --yes}` | launchd `ai.openclaw.stock.sim-scan` (평일 0915:30 매 15분, 엔진이 장외 self-skip). 가상자본 1천만 페이퍼 트레이딩, 규칙 엔진(LLM 미경유). 결과 `state/sim/`. 실주문 아님 |
| **자동매매 시뮬 대시보드** | `cd ~/.openclaw/agents/stock/workspace && python3 -m sim.sim_web {serve\|render}` | launchd `ai.openclaw.stock.sim-web` (상시). 포트 18792 → `sim.hyowons.net`(reverse proxy 수동 등록 대기). 5탭(계좌·관심종목·시장·튜닝·백테스트), 읽기전용+`/save_params`만 쓰기 | | **자동매매 시뮬 대시보드** | `cd ~/.openclaw/agents/stock/workspace && python3 -m sim.sim_web {serve\|render}` | launchd `ai.openclaw.stock.sim-web` (상시). 포트 18792 → `sim.hyowons.net`(reverse proxy 수동 등록 대기). 5탭(계좌·관심종목·시장·튜닝·백테스트), 읽기전용+`/save_params`만 쓰기 |
@@ -36,7 +39,7 @@ LLM이 자막 요약·뉴스 평문 생성·결산 보고서 등 본문을 만
| 작업 | 진입점 (사람이 시키는 한 마디) | 트리거 | | 작업 | 진입점 (사람이 시키는 한 마디) | 트리거 |
|---|---|---| |---|---|---|
| **오전 브리핑** (main/클로) | "오전 브리핑 메일 보내줘" → cron payload의 step 그대로 실행 | OpenClaw cron `56d66b54` (매일 07:00) | | **오전 브리핑** (main/클로) | "오전 브리핑 메일 보내줘" → cron payload의 step 그대로 실행 (미국증시 요약 포함) | OpenClaw cron `56d66b54` (매일 07:30) + 1차폴백 `c4f2d3e5...0755` (07:55) + 2차폴백·최종 `b3f1c2d4...0830` (08:30, US 미게시여도 발송) |
| **오후 브리핑** (main/클로) | "오후 브리핑 메일 보내줘" → cron payload의 step 그대로 실행 | OpenClaw cron `9d2c105f` (매일 19:00) | | **오후 브리핑** (main/클로) | "오후 브리핑 메일 보내줘" → cron payload의 step 그대로 실행 | OpenClaw cron `9d2c105f` (매일 19:00) |
| **비하이브 종목분석 요약** (stock/레이) | "비하이브 신규 영상 점검해줘" → cron payload의 step 그대로 실행 | OpenClaw cron `747e1013` (평일 07/12/18시) | | **비하이브 종목분석 요약** (stock/레이) | "비하이브 신규 영상 점검해줘" → cron payload의 step 그대로 실행 | OpenClaw cron `747e1013` (평일 07/12/18시) |
| **월간 결산** (budget/골디) | "월간 결산 돌려줘" → cron payload의 step 그대로 실행 | OpenClaw cron `08e9a978` (매월 1일 05:00) | | **월간 결산** (budget/골디) | "월간 결산 돌려줘" → cron payload의 step 그대로 실행 | OpenClaw cron `08e9a978` (매월 1일 05:00) |
+4 -1
View File
@@ -68,5 +68,8 @@
- **이미지 답신**: 자동분개 X. 골디 텔레그램 알림만 — 관리자님이 직접 처리하거나 가희님께 텍스트로 다시 요청. - **이미지 답신**: 자동분개 X. 골디 텔레그램 알림만 — 관리자님이 직접 처리하거나 가희님께 텍스트로 다시 요청.
- **포맷 오류** (페어 0건): 분개 중단 + 골디 텔레그램 보고. 가희님께 다시 요청 또는 직접 입력. - **포맷 오류** (페어 0건): 분개 중단 + 골디 텔레그램 보고. 가희님께 다시 요청 또는 직접 입력.
- **완료**: 골디 텔레그램으로 합계·차액·분개 방향 보고. - **완료**: 골디 텔레그램으로 합계·차액·분개 방향 보고.
- 상태 파일: `state/gahee_reminder.json` (last_sent_month, last_processed_message_at), 수신자: `credentials/gahee_imessage.json`. - 상태 파일: `state/gahee_reminder.json` (last_sent_month, last_processed_message_at, last_sent_at, reply_alert_for), 수신자: `credentials/gahee_imessage.json`.
- 발신 문구 수정은 state 파일 `message_template` 직접 편집 (코드 재배포 불필요). - 발신 문구 수정은 state 파일 `message_template` 직접 편집 (코드 재배포 불필요).
- **발신 경로는 `--service imessage`** (2026-08-03 전환). 이전 `sms` 강제는 이 수신자에게 3전 3패였고(전부 `error=4` 미발송), 살아남은 건은 Messages 가 RCS 로 바꿔준 운이었다. 7/25 미발송이 성공으로 기록돼 7월 잔액이 통째로 누락된 사고의 원인.
- **답신 미도착 감시**: 발신 후 2일간 답신 없으면 골디 텔레그램 1회 경고. `imsg send` 는 발송 실패를 알려주지 않아(rc=0) 이게 유일한 안전망이다. 재발신은 자동 X — `python3 gahee_reminder.py --send-now` 로 수동.
- ⚠️ `--send-now`**내 세션에서 못 돌린다** (자동화 → 메시지 권한이 Claude Code 에 거부). launchd 임시 oneshot plist 경유로 실행. 상세는 SKILL.md.
+2 -1
View File
@@ -21,7 +21,8 @@
## Scripts (python3) ## Scripts (python3)
- `skills/whooing-sync/scripts/whooing_sync.py` — iMessage 결제문자 → 후잉 웹훅 POST. launchd `ai.openclaw.budget.whooing-sync` 가 매시 0/15/30/45분 실행 (OpenClaw cron 아님). FDA 필수(`/opt/homebrew/bin/imsg`). 페어 매칭 로직 내장 — 자세한 건 `skills/whooing-sync/SKILL.md`. - `skills/whooing-sync/scripts/whooing_sync.py` — iMessage 결제문자 → 후잉 웹훅 POST. launchd `ai.openclaw.budget.whooing-sync` 가 매시 0/15/30/45분 실행 (OpenClaw cron 아님). ⚠️ **on-demand 실행은 스크립트 직접 호출이 아니라 `launchctl kickstart -p gui/$(id -u)/ai.openclaw.budget.whooing-sync` + 로그 확인** — 내 세션은 게이트웨이 node 를 TCC responsible process 로 물고 있어 `imsg` 가 Messages DB 를 못 읽는다. FDA 필수(`/opt/homebrew/bin/imsg`). 페어 매칭 로직 내장 — 자세한 건 `skills/whooing-sync/SKILL.md`.
- `skills/whooing-sync/scripts/imsg_cli.py``imsg` CLI 공용 래퍼(`run_json`/`chats`). stderr·returncode 를 판정해 FDA 누락을 파싱 에러로 둔갑시키지 않는다. `whooing_sync.py`·`gahee_reminder.py` 가 공유.
- `skills/whooing-sync/scripts/whooing_manual.py` — iMessage 없이 한 건 직접 등록. structured(`--item/--money/--left/--right [--date] [--memo]`) 또는 raw(`--message`). structured는 `whooing_accounts.json` 차트 검증 후 POST. - `skills/whooing-sync/scripts/whooing_manual.py` — iMessage 없이 한 건 직접 등록. structured(`--item/--money/--left/--right [--date] [--memo]`) 또는 raw(`--message`). structured는 `whooing_accounts.json` 차트 검증 후 POST.
- `skills/whooing-sync/scripts/whooing_balance.py` — 후잉 OpenAPI로 자산/부채/자본 잔액 조회. 옵션: `--section-id`, `--as-of YYYY-MM-DD`, `--json`. 크리덴셜은 `credentials/whooing.json``api` 블록(app_id/token/signature). - `skills/whooing-sync/scripts/whooing_balance.py` — 후잉 OpenAPI로 자산/부채/자본 잔액 조회. 옵션: `--section-id`, `--as-of YYYY-MM-DD`, `--json`. 크리덴셜은 `credentials/whooing.json``api` 블록(app_id/token/signature).
@@ -1,3 +1,4 @@
# 2026-05-07 # 2026-05-07
- 관리자님 지시: `삼천리도시가스`는 후잉에서 `주거,관리` 항목으로 분류하고, item은 `공과금`으로 처리. - 관리자님 지시: `삼천리도시가스`는 후잉에서 `주거,관리` 항목으로 분류하고, item은 `공과금`으로 처리.
- ⚠️ **2026-08-06 정정: 계정은 `주거,통신`** — 후잉 차트에 `주거,관리` 계정이 존재하지 않는다(그래서 이 날 실제 입력분도 `주거,통신`으로 들어갔다). item `공과금`은 그대로. 상세는 `memory/2026-08-06.md`.
@@ -0,0 +1,4 @@
# 2026-06-20
- 신한은행 잔액 불일치 `144원`은 관리자님 확인으로 은행이자였다. 후잉에 `신한은행(효원) ← 기타수익`, item `이자`, memo `은행이자`, 금액 `144원`, 날짜 `2026-06-20`로 수동 등록했고, 후잉 잔액이 SMS 잔액 `307,004원`과 일치함을 검증했다. `state/whooing_balance_alerts.json`의 신한은행 정합성 상태도 diff `0`으로 정리했다.
- 관리자님 지시로 신한은행도 잔액 불일치 자동 이자 보정 대상에 추가했다. `whooing_sync.py` 정합성 체크에서 자산 계정이고 후잉 잔액이 SMS보다 부족하며 차이가 `5,000원` 이하이면 카카오뱅크와 동일하게 `{은행계정} ← 기타수익`, item `이자`, memo `은행이자`로 자동 분개한다.
@@ -0,0 +1,27 @@
# 2026-08-06
## 신한카드 삼천리도시가스 분류 실패 — 원인 3겹 (코디 수정)
가스요금 14,000원 SMS가 structured 분류를 통과하지 못하고 raw 폴백 → **후잉에 거래가 아예 생성되지 않았다**(후잉 자체 파서도 이 형식을 못 읽음). 8/6 후잉 거래에 복권·톨비·쿠팡 3건만 있었음.
1. **파서 공백** — 신한카드 `자동납부` SMS는 기존 승인 SMS와 **금액/상호 순서가 반대**다.
- 기존: `신한카드(6847)승인 방*원님 아파트 관리비 184,440원 정상승인 되었습니다.` (상호 → 금액)
- 자동납부: `[신한카드] 자동납부 정상승인 방효원님 08/06 (일시불) 14,000원 삼천리도시가스` (금액 → 상호)
`SHINHAN_APPROVE_RE``[신한카드]``]`에서 막혀 처음부터 한 번도 파싱된 적 없음(2026-05-07·08-06 두 건 전부 raw). `parsers.py``SHINHAN_AUTOPAY_RE` 신설, `parse_shinhan_card`가 자동납부 → 일반 순으로 시도.
⚠️ `SHINHAN_APPROVE_RE`를 느슨하게 고치는 건 안 된다 — merchant 자리에 `08/06 (일시불)`이 잡힌다.
2. **계정 `주거,관리`는 후잉에 없다**`삼천리도시가스` 매핑이 이 죽은 계정을 가리키고 있었다. 2026-06-30 `주택임대료`가 같은 계정으로 `left account does not exist at entry_date` 실패한 그 계정. **`주거,통신` / item `공과금`으로 확정**(2026-05-07 실제 입력분·`도시가스` 기본 매핑·주택임대료 정정 선례와 동일). 2026-05-07 메모의 `주거,관리` 지시는 그 메모에 정정 표기함.
3. **`state/whooing_accounts.json`이 stale**(updated_at 2026-04-23) — `whooing_manual.py`의 차트 검증이 이 파일을 보는데 죽은 계정 `주거,관리`·`카뱅지금통`(실제는 `카뱅저금통`)을 싣고 있어 로컬 검증만 통과하고 후잉에서 터졌다. 라이브 `accounts.json`으로 전체 동기화(자산 +7/−1, 부채 +2, 비용 1, updated_at 2026-08-06). 매핑 계정을 늘릴 때는 이 스냅샷이 최신인지 먼저 확인할 것.
누락분 14,000원은 `whooing_manual.py`로 보정 입력 완료(`20260806 / 공과금 / 주거,통신 ← 신한신용(효원)`).
## ⚠️ raw 폴백 200은 "후잉에 기록됨"이 아니다
후잉 raw 엔드포인트는 **자기 파서가 실패해도 200을 준다**. `✅ [raw] … 200` 로그와 `sent_raw` 카운트는 "접수됨"일 뿐이라, 이번 누락이 5월부터 안 보인 이유다. raw 폴백 알림을 받으면 **후잉에 실제로 줄이 생겼는지 `entries.json`으로 확인**해야 한다. (`imsg send`의 rc=0이 발송 성공이 아닌 것과 같은 함정.)
## 범위 밖 (관리자님 판단 대기)
- **현대카드 자동납부도 같은 파서 공백** — `[현대카드] 자동납부 승인 방*원님 라이나생명 31,100원`(2026-05-17 raw). 다만 `whooing_sync.py`의 잔액차 기반 월 1회 자동보정 + `_should_skip_hyundai_insurance_duplicate`가 이미 커버해 실질 누락 없음. 미수정.
- raw 폴백분이 후잉에 실제 반영됐는지 자동 검출하는 장치는 붙이지 않았다.
@@ -0,0 +1,4 @@
{
"version": 1,
"setupCompletedAt": "2026-04-23T06:17:48.250Z"
}
@@ -43,11 +43,13 @@ BALANCE_SCRIPT = WORKSPACE / 'skills' / 'whooing-sync' / 'scripts' / 'whooing_ba
TELEGRAM_ACCOUNT = 'budget' TELEGRAM_ACCOUNT = 'budget'
KNOWN_TOPICS = {'securities_balance'} KNOWN_TOPICS = {'securities_balance'}
SUPPORTED_SCHEMA = {1} SUPPORTED_SCHEMA = {1, 2}
SECURITIES_ASSET_NAME = '증권(효원)' SECURITIES_ASSET_NAME = '증권(효원)' # v1(단일 소유자) 경로 및 self 자산명
SECURITIES_GAIN_NAME = '주식평가수익' SECURITIES_GAIN_NAME = '주식평가수익'
SECURITIES_LOSS_NAME = '주식평가손실' SECURITIES_LOSS_NAME = '주식평가손실'
# 소유자 → 후잉 자산명 (v2). 손익 계정(주식평가수익/손실)은 양쪽 공용.
OWNER_ASSET = {'self': '증권(효원)', 'gahee': '증권(가희)'}
RECONCILE_NOISE_FLOOR = 10_000 # |차액| < 1만원: 노이즈, 분개 skip RECONCILE_NOISE_FLOOR = 10_000 # |차액| < 1만원: 노이즈, 분개 skip
RECONCILE_HARD_CAP = 100_000_000 # |차액| > 1억원: 분개 거부 (안전 가드) RECONCILE_HARD_CAP = 100_000_000 # |차액| > 1억원: 분개 거부 (안전 가드)
@@ -124,6 +126,17 @@ def validate_envelope(env: dict) -> None:
raise ValidationError('payload 가 dict 가 아님') raise ValidationError('payload 가 dict 가 아님')
def _validate_amount_block(block: dict, where: str) -> None:
for key in ('deposit', 'eval_amount', 'total'):
if key not in block:
raise ValidationError(f'{where}.{key} 누락')
v = block[key]
if not isinstance(v, int) or v < 0:
raise ValidationError(f'{where}.{key} 비정상: {v!r}')
if v > PAYLOAD_AMOUNT_CAP:
raise ValidationError(f'{where}.{key} 100억 초과 (가드): {v:,}')
def validate_securities_payload(payload: dict) -> None: def validate_securities_payload(payload: dict) -> None:
for key in ('as_of', 'accounts', 'totals', 'owner_scope'): for key in ('as_of', 'accounts', 'totals', 'owner_scope'):
if key not in payload: if key not in payload:
@@ -137,24 +150,28 @@ def validate_securities_payload(payload: dict) -> None:
if as_of_dt.day not in (1, 10, 20): if as_of_dt.day not in (1, 10, 20):
raise ValidationError(f'as_of 는 매월 1·10·20일이어야 함: {as_of}') raise ValidationError(f'as_of 는 매월 1·10·20일이어야 함: {as_of}')
totals = payload['totals'] _validate_amount_block(payload['totals'], 'totals')
for key in ('deposit', 'eval_amount', 'total'):
if key not in totals:
raise ValidationError(f'totals.{key} 누락')
v = totals[key]
if not isinstance(v, int) or v < 0:
raise ValidationError(f'totals.{key} 비정상: {v!r}')
if v > PAYLOAD_AMOUNT_CAP:
raise ValidationError(f'totals.{key} 100억 초과 (가드): {v:,}')
if not isinstance(payload['accounts'], list) or not payload['accounts']: if not isinstance(payload['accounts'], list) or not payload['accounts']:
raise ValidationError('accounts 비어있음') raise ValidationError('accounts 비어있음')
sum_total = sum(int(a.get('total', 0)) for a in payload['accounts']) sum_total = sum(int(a.get('total', 0)) for a in payload['accounts'])
if sum_total != totals['total']: if sum_total != payload['totals']['total']:
raise ValidationError( raise ValidationError(
f'accounts 합계 불일치: {sum_total:,} vs totals.total={totals["total"]:,}' f'accounts 합계 불일치: {sum_total:,} vs totals.total={payload["totals"]["total"]:,}'
) )
# v2: 소유자별 집계(by_owner) 검증. 미등록 소유자·구조 오류 차단.
by_owner = payload.get('by_owner')
if by_owner is not None:
if not isinstance(by_owner, dict) or not by_owner:
raise ValidationError('by_owner 비어있음')
for owner, block in by_owner.items():
if owner not in OWNER_ASSET:
raise ValidationError(f'by_owner 미등록 소유자: {owner}')
if not isinstance(block, dict):
raise ValidationError(f'by_owner.{owner} 가 dict 가 아님')
_validate_amount_block(block, f'by_owner.{owner}')
def fetch_whooing_balance(as_of: str | None = None) -> dict: def fetch_whooing_balance(as_of: str | None = None) -> dict:
cmd = ['python3', str(BALANCE_SCRIPT), '--json'] cmd = ['python3', str(BALANCE_SCRIPT), '--json']
@@ -197,23 +214,25 @@ def post_whooing(payload: dict, dry_run: bool = False) -> tuple[bool, str]:
return False, str(e) return False, str(e)
def handle_securities_balance(envelope: dict, current_balance: dict, dry_run: bool = False) -> dict: def _reconcile_asset(asset_name: str, owner: str, target_total: int,
"""차액 reconcile + 후잉 자동 분개. 반환: {action, delta, before, after, journal_ok, note, journal?}. as_of: str, message_id: str, current_balance: dict,
dry_run: bool = False) -> dict:
"""자산 하나를 목표총액으로 reconcile + 후잉 자동 분개. 반환 result dict.
action ∈ {aligned, journaled, noise, skipped, rejected, journal_failed}. action ∈ {aligned, journaled, noise, skipped, rejected, journal_failed}.
""" """
payload = envelope['payload'] current = get_whooing_balance_for(asset_name, current_balance)
target_total = int(payload['totals']['total'])
current = get_whooing_balance_for(SECURITIES_ASSET_NAME, current_balance)
base = { base = {
'topic': 'securities_balance', 'topic': 'securities_balance',
'as_of': payload.get('as_of'), 'owner': owner,
'asset_name': asset_name,
'as_of': as_of,
'target_total': target_total, 'target_total': target_total,
} }
if current is None: if current is None:
return { return {
**base, **base,
'action': 'skipped', 'action': 'skipped',
'note': f'후잉 자산에 "{SECURITIES_ASSET_NAME}" 항목 없음', 'note': f'후잉 자산에 "{asset_name}" 항목 없음',
'delta': None, 'before': None, 'after': None, 'journal_ok': None, 'delta': None, 'before': None, 'after': None, 'journal_ok': None,
} }
delta = target_total - current delta = target_total - current
@@ -230,14 +249,14 @@ def handle_securities_balance(envelope: dict, current_balance: dict, dry_run: bo
'before': current, 'after': current, 'journal_ok': False, 'before': current, 'after': current, 'journal_ok': False,
'note': f'차액 {delta:+,}원 — 1억원 초과, 분개 거부 (가드)'} 'note': f'차액 {delta:+,}원 — 1억원 초과, 분개 거부 (가드)'}
entry_date = payload['as_of'].replace('-', '') entry_date = as_of.replace('-', '')
ym = payload['as_of'][:7] ym = as_of[:7]
if delta > 0: if delta > 0:
item = f'{ym} 평가차익' item = f'{ym} 평가차익'
left, right, money = SECURITIES_ASSET_NAME, SECURITIES_GAIN_NAME, delta left, right, money = asset_name, SECURITIES_GAIN_NAME, delta
else: else:
item = f'{ym} 평가차손' item = f'{ym} 평가차손'
left, right, money = SECURITIES_LOSS_NAME, SECURITIES_ASSET_NAME, -delta left, right, money = SECURITIES_LOSS_NAME, asset_name, -delta
journal = { journal = {
'entry_date': entry_date, 'entry_date': entry_date,
@@ -245,7 +264,7 @@ def handle_securities_balance(envelope: dict, current_balance: dict, dry_run: bo
'money': str(money), 'money': str(money),
'left': left, 'left': left,
'right': right, 'right': right,
'memo': f'레이 inbox reconcile (msg={envelope["message_id"][:8]})', 'memo': f'레이 inbox reconcile (msg={message_id[:8]})',
} }
ok, body = post_whooing(journal, dry_run=dry_run) ok, body = post_whooing(journal, dry_run=dry_run)
return { return {
@@ -260,6 +279,31 @@ def handle_securities_balance(envelope: dict, current_balance: dict, dry_run: bo
} }
def handle_securities_balance(envelope: dict, current_balance: dict, dry_run: bool = False) -> list[dict]:
"""소유자별 reconcile. v2(by_owner)는 소유자마다, v1은 totals.total→증권(효원) 단건.
반환: result dict 리스트.
"""
payload = envelope['payload']
as_of = payload['as_of']
msg_id = envelope['message_id']
by_owner = payload.get('by_owner')
if by_owner:
results = []
for owner, block in sorted(by_owner.items()): # 'gahee' < 'self' — 결정적 순서
results.append(_reconcile_asset(
OWNER_ASSET[owner], owner, int(block['total']),
as_of, msg_id, current_balance, dry_run=dry_run,
))
return results
# v1 하위호환: 단일 소유자(self) → 증권(효원)
return [_reconcile_asset(
SECURITIES_ASSET_NAME, 'self', int(payload['totals']['total']),
as_of, msg_id, current_balance, dry_run=dry_run,
)]
def move_to(src: Path, dest_dir: Path, dry_run: bool = False) -> None: def move_to(src: Path, dest_dir: Path, dry_run: bool = False) -> None:
if dry_run: if dry_run:
return return
@@ -350,24 +394,28 @@ def process_inbox(current_balance: dict | None = None, dry_run: bool = False) ->
validate_securities_payload(env['payload']) validate_securities_payload(env['payload'])
if balance is None: if balance is None:
balance = fetch_whooing_balance() balance = fetch_whooing_balance()
result = handle_securities_balance(env, balance, dry_run=dry_run) results = handle_securities_balance(env, balance, dry_run=dry_run)
summary['reconcile'].setdefault(topic, []).append(result) summary['reconcile'].setdefault(topic, []).extend(results)
if result['action'] in ('rejected', 'journal_failed'): # 소유자 하나라도 rejected/journal_failed 면 failed 로.
# 재실행 시 이미 분개된 소유자는 fresh 조회로 delta≈0 aligned → 중복분개 없음.
bad = [r for r in results if r['action'] in ('rejected', 'journal_failed')]
if bad:
move_to(fpath, FAILED_DIR, dry_run=dry_run) move_to(fpath, FAILED_DIR, dry_run=dry_run)
reason = result['note'] reason = '; '.join(f'{r["asset_name"]}: {r["note"]}' for r in bad)
summary['failed'].append({'file': fpath.name, 'reason': reason, 'message_id': msg_id}) summary['failed'].append({'file': fpath.name, 'reason': reason, 'message_id': msg_id})
send_telegram(f'⚠️ 골디 inbox: 분개 {result["action"]}\n{fpath.name}\n{reason}') send_telegram(f'⚠️ 골디 inbox: 분개 {"/".join(r["action"] for r in bad)}\n{fpath.name}\n{reason}')
continue continue
# 분개 성공/aligned/noise/skipped 모두 processed 로 이동 # 분개 성공분은 후잉 잔액 in-memory 업데이트 (동일 run 내 정합성 위해)
if result.get('journal_ok') and result['action'] == 'journaled' and balance is not None: if balance is not None:
# 후잉 잔액 in-memory 업데이트 (다음 파일 reconcile 시 정합성 위해) for r in results:
if r.get('journal_ok') and r['action'] == 'journaled':
for sec in balance.get('sections', []): for sec in balance.get('sections', []):
items = (sec.get('groups', {}).get('자산', {}) or {}).get('items', []) or [] items = (sec.get('groups', {}).get('자산', {}) or {}).get('items', []) or []
for it in items: for it in items:
if it.get('name') == SECURITIES_ASSET_NAME: if it.get('name') == r['asset_name']:
it['money'] = result['after'] it['money'] = r['after']
else: else:
raise ValidationError(f'핸들러 없음: {topic}') raise ValidationError(f'핸들러 없음: {topic}')
@@ -415,22 +463,23 @@ def format_summary(summary: dict) -> str:
before = result.get('before') before = result.get('before')
after = result.get('after') after = result.get('after')
delta = result.get('delta') delta = result.get('delta')
label = result.get('asset_name', '증권(효원)')
if action == 'aligned': if action == 'aligned':
lines.append(f'- **증권(효원):** {before:,}원 — 레이 ground truth 와 일치') lines.append(f'- **{label}:** {before:,}원 — 레이 ground truth 와 일치')
elif action == 'journaled': elif action == 'journaled':
sign = '평가차익' if (delta or 0) > 0 else '평가차손' sign = '평가차익' if (delta or 0) > 0 else '평가차손'
lines.append( lines.append(
f'- **증권(효원):** {before:,}원 → {after:,}' f'- **{label}:** {before:,}원 → {after:,}'
f'({sign} **{abs(delta):,}원** 자동 분개)' f'({sign} **{abs(delta):,}원** 자동 분개)'
) )
elif action == 'noise': elif action == 'noise':
lines.append(f'- **증권(효원):** 차액 {delta:+,}원 (1만원 미만, 분개 skip)') lines.append(f'- **{label}:** 차액 {delta:+,}원 (1만원 미만, 분개 skip)')
elif action == 'skipped': elif action == 'skipped':
lines.append(f'- **증권(효원):** {result.get("note", "skip")}') lines.append(f'- **{label}:** {result.get("note", "skip")}')
elif action == 'rejected': elif action == 'rejected':
lines.append(f'- **증권(효원):** ⚠️ 차액 {delta:+,}원 — 분개 거부 (안전 가드)') lines.append(f'- **{label}:** ⚠️ 차액 {delta:+,}원 — 분개 거부 (안전 가드)')
elif action == 'journal_failed': elif action == 'journal_failed':
lines.append(f'- **증권(효원):** ⚠️ 분개 실패 — {result.get("note", "")[:120]}') lines.append(f'- **{label}:** ⚠️ 분개 실패 — {result.get("note", "")[:120]}')
if summary['failed']: if summary['failed']:
lines.append('') lines.append('')
@@ -238,19 +238,20 @@ def format_inbox_telegram_line(summary: dict) -> str:
for r in summary.get("reconcile", {}).get("securities_balance", []): for r in summary.get("reconcile", {}).get("securities_balance", []):
action = r.get("action") action = r.get("action")
delta = r.get("delta") or 0 delta = r.get("delta") or 0
label = r.get("asset_name", "증권(효원)")
if action == "aligned": if action == "aligned":
parts.append("증권 일치") parts.append(f"{label} 일치")
elif action == "journaled": elif action == "journaled":
sign = "차익" if delta > 0 else "차손" sign = "차익" if delta > 0 else "차손"
parts.append(f"증권 평가{sign} {abs(delta):,}원 분개") parts.append(f"{label} 평가{sign} {abs(delta):,}원 분개")
elif action == "noise": elif action == "noise":
parts.append(f"증권 차액 {delta:+,}원 (노이즈)") parts.append(f"{label} 차액 {delta:+,}원 (노이즈)")
elif action == "rejected": elif action == "rejected":
parts.append(f"⚠️ 증권 차액 {delta:+,}원 거부") parts.append(f"⚠️ {label} 차액 {delta:+,}원 거부")
elif action == "journal_failed": elif action == "journal_failed":
parts.append("⚠️ 증권 분개 실패") parts.append(f"⚠️ {label} 분개 실패")
elif action == "skipped": elif action == "skipped":
parts.append("증권 reconcile skip") parts.append(f"{label} reconcile skip")
# rejected/journal_failed 는 위 reconcile 라인에서 이미 표시됨 — 중복 카운트 방지 # rejected/journal_failed 는 위 reconcile 라인에서 이미 표시됨 — 중복 카운트 방지
reconcile_failed = sum( reconcile_failed = sum(
1 for r in summary.get("reconcile", {}).get("securities_balance", []) 1 for r in summary.get("reconcile", {}).get("securities_balance", [])
@@ -10,6 +10,18 @@ iMessage에 들어오는 카드/은행 결제 알림을 후잉(whooing.com) 웹
## How ## How
**on-demand 실행은 launchd 잡을 앞당겨 돌린다.** 스크립트를 직접 실행하지 말 것 —
에이전트 세션(코덱스)은 게이트웨이 node 를 TCC responsible process 로 물고 있어서
`imsg` 가 Messages DB 를 못 읽는다 (아래 "Full Disk Access" 참고). launchd 잡은 그 제약이 없다.
```bash
launchctl kickstart -p gui/$(id -u)/ai.openclaw.budget.whooing-sync
# 비동기 — 몇 초 뒤 결과 확인
tail -20 /Users/snowoyh/.openclaw/logs/whooing-sync.log
```
스크립트 직접 실행은 **FDA 를 가진 터미널 앱**(iTerm2 등)에서만 동작한다:
```bash ```bash
python3 /Users/snowoyh/.openclaw/agents/budget/workspace/skills/whooing-sync/scripts/whooing_sync.py python3 /Users/snowoyh/.openclaw/agents/budget/workspace/skills/whooing-sync/scripts/whooing_sync.py
``` ```
@@ -72,18 +84,42 @@ launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/ai.openclaw.budget.whooi
## 전제조건: Full Disk Access (FDA) ## 전제조건: Full Disk Access (FDA)
launchd 컨텍스트에서 `imsg``~/Library/Messages/chat.db` 를 읽으려면 FDA 허용이 필요. 터미널에서 직접 돌릴 땐 터미널 앱의 FDA 를 자식 프로세스가 상속받지만, launchd 는 상속 안 됨. `imsg``~/Library/Messages/chat.db` 를 읽으려면 FDA 허용이 필요. **판정 주체는 TCC responsible process** — 자기 자신이 아니라 프로세스 체인의 책임 프로세스다.
- 등록 대상: `/opt/homebrew/bin/imsg` - launchd → `/usr/bin/python3`(플랫폼 바이너리) → `imsg`: 책임이 `imsg` 자신이라 **`/opt/homebrew/bin/imsg` 승인으로 통과**
- 경로: 시스템 설정 → 개인정보 보호 및 보안 → 전체 디스크 접근 권한 → `+` 로 추가 → 토글 ON - 터미널 앱 → … → `imsg`: 터미널 앱(iTerm2 등)의 FDA 로 통과
- 게이트웨이 node → codex → bash → `imsg`: **게이트웨이 node 바이너리**의 FDA 로 판정됨
**FDA 누락 증상**: stderr 로그에 등록 경로: 시스템 설정 → 개인정보 보호 및 보안 → 전체 디스크 접근 권한 → `+` 로 추가 → 토글 ON
**FDA 누락 증상**: `imsg` 가 stderr 로 다음을 낸다.
``` ```
❌ imsg chats 실행 실패: Expecting value: line 1 column 1 (char 0) Permission Error: Cannot access Messages database
... requires Full Disk Access permission.
``` ```
가 뜨고, stdout 은 `🟢 새 결제 메시지 없음` 으로 조용히 끝남. 오류처럼 보이지 않아 놓치기 쉬움. 맥 이전 / imsg 재설치 시 FDA 재등록 필요. `imsg_cli.run_json()` 이 이걸 잡아 로그에 그대로 옮긴다:
```
⚠️ chat-id 7 history 실패: Messages DB 접근 거부 — 전체 디스크 접근 권한(FDA) 누락. ...
```
### 2026-08-03 사고: homebrew node 업그레이드로 FDA 무효화
node@22 가 2026-07-20 에 `22.22.2``22.23.1` 로 올라가며 **바이너리 경로가 바뀌어** 기존 FDA 승인이 무효화됐다 (시스템 TCC.db 에 22.22.2=허용 / 22.23.1=거부로 남아 있음). 게이트웨이가 7/21 새 바이너리로 재기동되면서 골디의 에이전트 세션에서 `imsg` 가 죽었다. **launchd 잡은 영향 없었다** — 그래서 자동 동기화는 정상인데 골디만 실패하는 그림이 됐고, 골디는 이걸 "문자 수집 실패"로 오진했다.
- 재발 시 확인: `lsof -p $(pgrep -f 'openclaw/dist/index.js gateway') -a -d txt | head -1` 로 실제 node 경로를 뽑아, 그 경로를 FDA 목록에 추가
- 그 다음 게이트웨이 재기동: `launchctl kickstart -k gui/$(id -u)/ai.openclaw.gateway`
- **on-demand 실행을 kickstart 로 바꾼 이유가 이것** — node 업그레이드마다 깨지는 의존을 실행 경로에서 뺐다
당시 오진을 만든 코드 결함 3개는 함께 고쳤다 (2026-08-03):
1. 호출부가 stderr·returncode 를 버려 권한 오류가 `Expecting value: line 1 column 1 (char 0)` 파싱 에러로 둔갑 → `imsg_cli.py` 공용 래퍼로 사유 노출
2. `resolve_chat_ids()` 가 권한 거부 시 **빈 chat id 매핑을 캐시에 저장** → 이후 launchd 포함 전 실행이 캐시 적중으로 조용히 0건 수집을 영구 반복. 이제 전 carrier 가 비면 저장 거부 + exit 3
3. `imsg chats` 기본값이 최근 20건이라 조용한 발신번호(현대카드 SMS·신한은행)가 목록에서 빠짐 → 캐시 재생성 시 그 carrier 수집이 조용히 끊김. `CHATS_LIMIT=200` 으로 전량 조회
맥 이전 / imsg 재설치 시에도 FDA 재등록 필요.
## 페어 매칭 (자기 계좌 간 이체) ## 페어 매칭 (자기 계좌 간 이체)
@@ -118,7 +154,18 @@ launchd 컨텍스트에서 `imsg` 가 `~/Library/Messages/chat.db` 를 읽으려
- 사람 이름 송금(예: "박영춘", "이지윤")은 exact 룰로 등록하지 말고 default fallback 에 맡긴다. merchant_map 비대화 방지. - 사람 이름 송금(예: "박영춘", "이지윤")은 exact 룰로 등록하지 말고 default fallback 에 맡긴다. merchant_map 비대화 방지.
- `deposit` 은 default fallback 없음 — rule 없으면 raw 폴백 (수익/이체/환급 구분 위험 때문). - `deposit` 은 default fallback 없음 — rule 없으면 raw 폴백 (수익/이체/환급 구분 위험 때문).
- ⚠️ **후잉은 계정 그룹별로 쓸 수 있는 변이 정해져 있다**`비용(expenses)`**차변(left) 전용**, `수익(income)`은 **대변(right) 전용**이고 `자산·부채`만 양쪽 자유다. 위반하면 `[r_account] => 잘못된 값입니다`(비용을 우측에) 또는 `[l_account] => 잘못된 값입니다`(수익을 좌측에)로 **HTTP 200 + 실패 본문**이 온다. 이 제약을 몰라서 2026-08-03~04 회귀가 났다. 새 분개 방향을 만들 때 반드시 확인할 것.
- ⚠️ **후잉은 취소·환불 문자를 자동 처리하지 않는다.** 공식 FAQ(`/help/faqs/inserting/refund`)가 "기존의 구입 거래를 **찾아서 지워주거나**, 금액을 마이너스로..." 라고 **사용자에게 수동 안내**한다. raw 로 취소 원문을 보내도 원본 승인은 그대로 남는다. 2026-08-04 에 과거 3건(07-04 카카오 월드킹·06-09 현대 쿠팡·06-13 현대 네이버페이)에서 원본이 사라진 걸 보고 "후잉 파서가 지운다"고 판단했는데, **관리자님이 그동안 수동 삭제해 오신 것**이었다. 두 설명 모두 "건수 −1, 순액 일치"라 검산으로는 구분되지 않는다 — 같은 착각을 반복하지 말 것.
- `card_cancel`**원본 승인 거래를 찾아 PUT 으로 감액**한다 (2026-08-04, 관리자님 결정 — 수동 삭제를 없애는 게 목적). `_handle_card_cancel` → `whooing_balance.find_card_entries` 로 같은 카드·같은 상호(memo 토큰 매칭)·금액이 취소액 이상인 거래를 30일 창에서 찾고, **정확히 1건일 때만** `set_entry_money``원금액 취소액` 으로 줄인다. 전액취소면 0원 줄이 남지만 잔액·합계에 영향은 없다.
- ⚠️ **좌우를 뒤집은 역분개로 바꾸지 말 것** — 비용이 대변으로 가서 후잉이 거부한다(위 제약). 2026-08-03 에 이 방식으로 바꿨다가 **첫 취소 문자에서 동기화가 통째로 멈췄다**(`blocked_at` 이 커서를 잠가 뒤의 정상 결제까지 전부 대기).
- ⚠️ **거래 삭제는 API 로 불가능하다** — 후잉 OpenAPI 의 DELETE 는 `section_id` 를 쿼리·본문(urlencoded/JSON)·쿠키·경로 어디에서도 읽지 못한다(2026-08-04 전수 실측, 같은 본문을 PUT 으로 보내면 정상). 0원 줄을 지우려면 후잉 UI 에서 수동으로. 마이너스 분개(후잉 공식 안내안)도 가능하지만 ± 두 줄이 남아 채택하지 않았다.
- **후보가 0건이거나 2건 이상이면 감액하지 않고 raw 폴백**(오감액보다 안전). 이때는 **후잉이 알아서 처리해주지 않으므로 관리자님 수동 작업이 필요하다** — 그래서 폴백 건은 `new_raw` 에 그대로 실어 raw 폴백 텔레그램 알림이 울리게 둔다. 알림을 끄면 수동 작업이 필요한 걸 모르고 지나친다.
- ⚠️ **매칭은 `item` 이 아니라 `memo` 로 한다**`merchant_map` contains 룰이 `item` 을 재작성해서(동행복권→`복권`) item 은 상호와 다를 수 있지만 memo 는 항상 승인 SMS 원문이다.
- ⚠️ **memo 매칭은 토큰 단위**(`_memo_has_merchant`) — 단순 substring 이면 `쿠팡``쿠팡페이주` 승인까지 잡는다. 2026-08-04 에 두 상호가 같은 날 같은 금액(22,700원)으로 실제로 있었다.
- ⚠️ **`card_cancel` 을 내는 파서는 현대카드·신한카드(`매입취소`/`승인취소`) 둘뿐이다.** 카카오뱅크 `카드결제취소``KAKAOBANK_CARD_RE``카드결제\s+` 가 안 맞아 **파싱 자체가 실패**(`kind=None`)하고, 하나·신한은행은 입금/출금만 있다. **이들은 감액 대상이 아니라 raw 로 가고, 후잉도 처리하지 않으므로 관리자님 수동 삭제가 계속 필요하다.** 자동화하려면 `parsers.py` 보강 + 2026-08-03 픽스처 회귀 재실행이 필요하다 — **2026-08-04 관리자님 지시로 "실제 취소 문자가 올 때 처리"로 보류**. 판단 근거는 파싱이 실패해도 `_infer_raw_details` 가 정규식으로 금액·상호를 뽑아 raw 폴백 알림에 실어주기 때문(실측: 카카오 취소 문자 → `2,000원 · (주)월드킹`). 알림을 보고 그때 대응하면 된다.
- **삼성카드는 아예 동기화 대상이 아니다** — 발신번호 `+8215888700``whooing_account_map.json` 에서 `confirmed=False` 라 수집조차 안 되고, 실제 오는 문자는 전부 `(광고)` 이며 후잉 `삼성신용(효원)`(x77) 은 최근 90일 거래 0건이다(2026-08-04 확인). 취소를 기다릴 대상이 아니라, **다시 사용하기 시작하면 승인 문자부터 누락**되니 그때 `confirmed` 등록이 먼저다.
- 기존 contains(예: "스타벅스 → 식비") / exact(예: "방효원 → 기초잔액(효원)") 는 계속 유효. fallback 은 둘 다 miss 일 때만 탄다. - 기존 contains(예: "스타벅스 → 식비") / exact(예: "방효원 → 기초잔액(효원)") 는 계속 유효. fallback 은 둘 다 miss 일 때만 탄다.
- ⚠️ **주유소는 두 곳을 함께 손대야 한다**`whooing_sync.py``FUEL_KEYWORDS`(150,000원 선승인/취소 스킵)와 `whooing_merchant_map.json` contains 룰(실제 결제 → `차량유지비/주유비`)이 한 쌍이다. 한쪽만 넣으면 선승인이 후잉에 남거나 실제 주유가 기타비용으로 샌다. 상호에 주유/석유가 없는 충전소(현대가스·한경에너)는 상호 자체를 등록. 한경에너는 선승인이 149,900원이라 `FUEL_PREAUTH_AMOUNT`(150,000 정확일치) 스킵엔 안 걸리고 분류만 적용된다.
- 결과적으로 자잘한 인명 송금·가맹점 미등록 건은 전부 기타비용으로 자동 분류되고, 분류가 필요한 것만 후잉 UI 에서 사후 조정하거나 merchant_map 에 규칙 추가한다. - 결과적으로 자잘한 인명 송금·가맹점 미등록 건은 전부 기타비용으로 자동 분류되고, 분류가 필요한 것만 후잉 UI 에서 사후 조정하거나 merchant_map 에 규칙 추가한다.
### 우선 룰 (whooing_overrides.json) ### 우선 룰 (whooing_overrides.json)
@@ -229,7 +276,7 @@ python3 .../whooing_manual.py --dry-run --item ... --money ...
원칙: 원칙:
- 차트에 없는 계정명으로 절대 추측 POST 금지. 모르면 반드시 재질문. - 차트에 없는 계정명으로 절대 추측 POST 금지. 모르면 반드시 재질문.
- 사용자가 이미 한 문장에 "스타벅스 5800원 신한카드로" 다 말했다면, 카테고리만 확인하고 바로 실행. - 사용자가 이미 한 문장에 "스타벅스 5800원 신한카드로" 다 말했다면, 카테고리만 확인하고 바로 실행.
- 카드 취소/환불이면 structured 대신 `--message` raw 모드로 원문 보내 후잉이 상쇄하게 한다. - 카드 취소/환불은 원본 승인 거래를 찾아 감액하는 게 원칙(위 `card_cancel` 항목). 후잉은 취소 문자를 자동 처리해주지 않으니 raw 로 보내고 끝내면 안 된다 — 원본이 그대로 남는다.
## 잔액 조회 (whooing_balance.py) ## 잔액 조회 (whooing_balance.py)
@@ -296,6 +343,9 @@ python3 .../whooing_balance.py --json \
### 흐름 ### 흐름
1. **발신 게이트** — KST 기준 `day >= send_day_of_month` (catch-up 정책) 이고 시각이 `send_hour_kst` 이상이며 `last_sent_month` ≠ 이번 달이면 1회 발신. 25일에 Mac이 꺼져 있었어도 26~월말 사이 켜면 그 시점에 발신. 다음 달로 넘어가면 포기. 1. **발신 게이트** — KST 기준 `day >= send_day_of_month` (catch-up 정책) 이고 시각이 `send_hour_kst` 이상이며 `last_sent_month` ≠ 이번 달이면 1회 발신. 25일에 Mac이 꺼져 있었어도 26~월말 사이 켜면 그 시점에 발신. 다음 달로 넘어가면 포기.
- 발신은 **`--service imessage`** (2026-08-03 전환, 아래 사고 참고). 가희님은 iMessage 사용자다.
- 성공 시 `last_sent_month` 와 함께 **`last_sent_at`** 을 찍는다 — 답신 미도착 감시의 시작점.
1-b. **답신 미도착 감시** (`_check_reply_overdue`) — 발신 후 `REPLY_GRACE_DAYS`(2일)가 지나도 가희님 답신이 없으면 관리자님께 텔레그램 1회. 유예 전이면 API 콜 0으로 즉시 반환하고, 답신이 확인되면 `last_sent_at` 을 지워 감시를 끝낸다. 같은 발신 건에 대한 재알림은 `reply_alert_for` 로 막는다. ⚠️ **재발신은 자동으로 하지 않는다** — 가희님이 늦게 답하는 경우 중복 독촉이 되고, 자동 발송 트리거를 늘리지 않는다는 방침에도 어긋난다.
2. **응답 폴링**`imsg chats --json` → 가희 chat 찾기 → `imsg history --chat-id X --start <last_processed_message_at> --attachments --json`. 가희 발신(is_from_me≠true) 메시지만 처리. 2. **응답 폴링**`imsg chats --json` → 가희 chat 찾기 → `imsg history --chat-id X --start <last_processed_message_at> --attachments --json`. 가희 발신(is_from_me≠true) 메시지만 처리.
3. **1차 스캔** (즉시 워터마크 갱신): 3. **1차 스캔** (즉시 워터마크 갱신):
- **이미지 첨부 있음** → 자동분개 X, 골디 텔레그램 알림만 ("이미지 답신 — 직접 처리 부탁") - **이미지 첨부 있음** → 자동분개 X, 골디 텔레그램 알림만 ("이미지 답신 — 직접 처리 부탁")
@@ -322,6 +372,8 @@ python3 .../whooing_balance.py --json \
"message_template": "가계부 업데이트 날이에요. 계좌잔액 보내주시면 자동으로 반영됩니다.", "message_template": "가계부 업데이트 날이에요. 계좌잔액 보내주시면 자동으로 반영됩니다.",
"last_sent_month": null, "last_sent_month": null,
"last_processed_message_at": null, "last_processed_message_at": null,
"last_sent_at": null,
"reply_alert_for": null,
"whooing_account_name": "가희주머니", "whooing_account_name": "가희주머니",
"income_account": "가희비밀주머니_수익", "income_account": "가희비밀주머니_수익",
"expense_account": "기타비용" "expense_account": "기타비용"
@@ -330,8 +382,29 @@ python3 .../whooing_balance.py --json \
- `last_sent_month` = "YYYY-MM" 발신 직후 기록. 같은 달에 재발신 안 함. - `last_sent_month` = "YYYY-MM" 발신 직후 기록. 같은 달에 재발신 안 함.
- `last_processed_message_at` = imsg history `--start` 의 ISO 워터마크. 처리한 메시지의 created_at 최댓값. - `last_processed_message_at` = imsg history `--start` 의 ISO 워터마크. 처리한 메시지의 created_at 최댓값.
- `last_sent_at` = 발신 시각(UTC Z). 답신 미도착 감시의 기준점. 답신 확인되면 지워진다.
- `reply_alert_for` = 이미 "답신 없음" 알림을 보낸 `last_sent_at` 값. 같은 발신 건 재알림 방지.
- 발신 문구·트리거 일자·계정명 변경은 모두 이 JSON 직접 편집. 코드 재배포 불필요. whooing-sync 가 매 사이클 다시 읽음. - 발신 문구·트리거 일자·계정명 변경은 모두 이 JSON 직접 편집. 코드 재배포 불필요. whooing-sync 가 매 사이클 다시 읽음.
### 수동 발신 (`--send-now`)
발송이 실패해 그 달을 놓쳤을 때의 복구 수단. 날짜 게이트를 무시하고 1회 발신하며 `last_sent_month` 는 건드리지 않아 정규 25일 발신이 살아있다.
```bash
python3 gahee_reminder.py --send-now [--dry-run]
```
⚠️ **에이전트 세션·코디 셸에서 실행하면 20초 타임아웃으로 실패한다.** `imsg send` 는 AppleEvents 로 Messages 를 구동하는데, **자동화 → 메시지** 권한이 `imsg` 와 iTerm2 에만 허용돼 있고 Claude Code 에는 거부로 박혀 있다. launchd 경유로 돌려야 한다 — 임시 oneshot plist 를 만들어 `kickstart` 하고 로그를 읽은 뒤 `bootout` + 삭제한다(2026-08-03 실행 방식).
### 2026-07-25 사고: 미발송이 성공으로 기록됨
7/25 리마인더가 실제로 발송되지 않았는데(`chat.db`: `service=SMS, is_sent=0, error=4`) 시스템은 성공으로 기록했다. 가희주머니 7월 잔액이 안 들어와 8/1 월간 결산에서 빠졌다.
- **왜 실패했나** — `--service sms` 강제가 이 수신자에게 **3전 3패**였다(5/25 ×2, 7/25 ×1 전부 `error=4`). 살아남은 2건(5/25·6/25)은 Messages 가 임의로 **RCS 로 바꿔** 보낸 운이었고, 7월엔 그 폴백이 안 일어났다. 전체 통계로도 iMessage 137/139 성공 vs SMS 실패 3건(전부 이 리마인더).
- **왜 몰랐나** — `imsg send` 는 Messages 에 넘기기만 성공하면 rc=0 이고, 실제 실패는 그 뒤 비동기로 `chat.db``error` 에 찍힌다. 코드가 rc 만 봐서 성공 처리 → 오탐 텔레그램 → `last_sent_month` 갱신 → 그 달 재시도 차단 → 8월엔 catch-up 이 당월만 보므로 7월분 영구 유실.
- **왜 발송 검증을 자동 경로에 안 넣었나** — `is_sent`/`error``chat.db` 에만 있고 `imsg history` JSON 은 노출하지 않는다(실패한 메시지도 정상 조회됨). 직접 sqlite 조회가 유일한 길인데 **launchd 의 `/usr/bin/python3` 는 FDA 가 없어 `authorization denied` 로 막힌다**(2026-08-03 실측). 그래서 자동 경로는 권한과 무관한 답신 기반 감시를 쓰고, 정밀 확인(`_verify_sent`)은 FDA 가 있는 컨텍스트에서 도는 `--send-now` 에만 붙였다.
- `error=4` 의 정확한 의미는 확증 못 함 — 사고 시점 imagent 로그가 이미 롤오프됐다.
### 수신자 설정 ### 수신자 설정
`/Users/snowoyh/.openclaw/credentials/gahee_imessage.json`: `/Users/snowoyh/.openclaw/credentials/gahee_imessage.json`:
@@ -12,13 +12,18 @@
""" """
from __future__ import annotations from __future__ import annotations
import argparse
import json import json
import re import re
import sqlite3
import subprocess import subprocess
import sys
import time
from datetime import datetime, timedelta from datetime import datetime, timedelta
from pathlib import Path from pathlib import Path
from zoneinfo import ZoneInfo from zoneinfo import ZoneInfo
import imsg_cli
import notify import notify
import whooing_balance import whooing_balance
@@ -27,6 +32,13 @@ GAHEE_CRED = Path("/Users/snowoyh/.openclaw/credentials/gahee_imessage.json")
STATE_FILE = Path("/Users/snowoyh/.openclaw/agents/budget/workspace/state/gahee_reminder.json") STATE_FILE = Path("/Users/snowoyh/.openclaw/agents/budget/workspace/state/gahee_reminder.json")
IMSG_TIMEOUT = 20 IMSG_TIMEOUT = 20
HISTORY_LIMIT = 50 HISTORY_LIMIT = 50
# 발신 후 이 기간 안에 가희님 답신이 없으면 발송 실패를 의심하고 관리자님께 1회 알린다.
# imsg send 는 Messages 에 넘기기만 성공하면 rc=0 이라 발송 실패를 동기적으로 못 잡는다
# (2026-07-25 사고: SMS error=4 로 미발송인데 성공 처리돼 그 달 재시도가 막혔다).
# 실측 답신 지연은 3시간·38시간 — 2일이면 오탐이 적다.
REPLY_GRACE_DAYS = 2
CHAT_DB = Path.home() / "Library" / "Messages" / "chat.db"
APPLE_EPOCH = 978307200 # chat.db date 는 2001-01-01 기준 ns
# 라벨 + 금액 패턴. 라벨은 한글/영문/괄호/공백/숫자 1~20자. # 라벨 + 금액 패턴. 라벨은 한글/영문/괄호/공백/숫자 1~20자.
# 콜론 구분 입력은 정수 전체를 허용하고, 공백 구분 입력은 천 단위 콤마가 있을 때만 허용한다. # 콜론 구분 입력은 정수 전체를 허용하고, 공백 구분 입력은 천 단위 콤마가 있을 때만 허용한다.
# 일반 안내 문자의 "오전 09" 같은 표현을 잔액으로 오인하지 않기 위함. # 일반 안내 문자의 "오전 09" 같은 표현을 잔액으로 오인하지 않기 위함.
@@ -77,15 +89,11 @@ def _normalize(handle: str) -> str:
def _imsg_chats() -> list[dict]: def _imsg_chats() -> list[dict]:
try: rows, err = imsg_cli.chats(IMSG_TIMEOUT)
raw = subprocess.run( if err:
["imsg", "chats", "--json"], print(f"⚠️ 가희 imsg chats 실패: {err}")
capture_output=True, text=True, timeout=IMSG_TIMEOUT,
)
return [json.loads(l) for l in raw.stdout.splitlines() if l.strip()]
except Exception as e:
print(f"⚠️ 가희 imsg chats 실패: {e}")
return [] return []
return rows
def _find_gahee_chat_id(handle_norm: str) -> int | None: def _find_gahee_chat_id(handle_norm: str) -> int | None:
@@ -97,26 +105,35 @@ def _find_gahee_chat_id(handle_norm: str) -> int | None:
def _imsg_history(chat_id: int, start_iso: str | None) -> list[dict]: def _imsg_history(chat_id: int, start_iso: str | None) -> list[dict]:
cmd = ["imsg", "history", "--chat-id", str(chat_id), args = ["history", "--chat-id", str(chat_id),
"--limit", str(HISTORY_LIMIT), "--attachments", "--json"] "--limit", str(HISTORY_LIMIT), "--attachments", "--json"]
if start_iso: if start_iso:
cmd += ["--start", start_iso] args += ["--start", start_iso]
try: rows, err = imsg_cli.run_json(args, IMSG_TIMEOUT)
raw = subprocess.run(cmd, capture_output=True, text=True, timeout=IMSG_TIMEOUT) if err:
return [json.loads(l) for l in raw.stdout.splitlines() if l.strip()] print(f"⚠️ 가희 imsg history 실패: {err}")
except Exception as e:
print(f"⚠️ 가희 imsg history 실패: {e}")
return [] return []
return rows
def _send_imessage(handle: str, text: str, dry_run: bool) -> bool: def _send_imessage(handle: str, text: str, dry_run: bool) -> bool:
"""가희님께 리마인더 발신.
⚠️ rc=0 은 "Messages 에 넘겼다"는 뜻일 뿐 발송 성공이 아니다. 실제 실패는 그 뒤
비동기로 chat.db 의 error 칼럼에 찍힌다 — 여기서는 알 수 없다. 발송 여부 확인은
_verify_sent()(FDA 필요, CLI 전용) 또는 _check_reply_overdue()(답신 기반)가 맡는다.
⚠️ service 는 imessage 다. sms 강제는 이 수신자에게 3전 3패였고(5/25 ×2, 7/25 ×1
전부 error=4), 살아남은 2건은 Messages 가 임의로 RCS 로 바꿔준 운이었다. 가희님은
iMessage 사용자다(답신 2건 모두 iMessage). 2026-08-03 전환.
"""
if dry_run: if dry_run:
print(f"[dry-run] imsg send --to {handle} --text {text!r} --service sms") print(f"[dry-run] imsg send --to {handle} --text {text!r} --service imessage")
return True return True
try: try:
result = subprocess.run( result = subprocess.run(
["imsg", "send", "--to", handle, "--text", text, ["imsg", "send", "--to", handle, "--text", text,
"--service", "sms"], "--service", "imessage"],
capture_output=True, text=True, timeout=IMSG_TIMEOUT, capture_output=True, text=True, timeout=IMSG_TIMEOUT,
) )
if result.returncode != 0: if result.returncode != 0:
@@ -128,6 +145,46 @@ def _send_imessage(handle: str, text: str, dry_run: bool) -> bool:
return False return False
def _utc_z(dt: datetime) -> str:
"""imsg --start / state 워터마크와 같은 UTC Z 포맷."""
return dt.astimezone(ZoneInfo("UTC")).isoformat().replace("+00:00", "Z")
def _verify_sent(handle: str, after_unix: float, timeout: int = 20):
"""chat.db 직접 조회로 실제 발송 여부 확인. 반환 (verdict, detail).
verdict True=발송됨 / False=실패 / None=확인 불가.
chat.db 는 FDA 를 가진 컨텍스트에서만 읽힌다 — launchd(/usr/bin/python3)에선 못 읽으므로
확인 불가(None)로 떨어진다. 이 함수는 CLI 전용이고, 자동 경로는 답신 기반 감시를 쓴다.
"""
digits = re.sub(r"\D", "", handle)[-8:]
after_ns = int((after_unix - APPLE_EPOCH) * 1_000_000_000)
deadline = time.time() + timeout
detail = None
while True:
try:
con = sqlite3.connect(f"file:{CHAT_DB}?mode=ro", uri=True)
row = con.execute(
"select m.service, m.is_sent, m.error from message m "
"join handle h on m.handle_id = h.rowid "
"where h.id like ? and m.is_from_me = 1 and m.date >= ? "
"order by m.date desc limit 1",
(f"%{digits}", after_ns),
).fetchone()
con.close()
except Exception as e:
return None, f"chat.db 조회 불가 ({type(e).__name__}: {e})"
if row:
detail = f"service={row[0]} is_sent={row[1]} error={row[2]}"
if row[2]:
return False, detail
if row[1]:
return True, detail
if time.time() >= deadline:
return None, detail or "발신 기록이 아직 안 보임"
time.sleep(1)
def _parse_balance_text(text: str) -> dict[str, int]: def _parse_balance_text(text: str) -> dict[str, int]:
"""가희 답신 텍스트에서 '라벨 : 금액' 페어 추출. 빈 dict면 포맷 오류. """가희 답신 텍스트에서 '라벨 : 금액' 페어 추출. 빈 dict면 포맷 오류.
@@ -234,6 +291,9 @@ def _maybe_send_reminder(state: dict, dry_run: bool) -> bool:
if not dry_run: if not dry_run:
state["last_sent_month"] = month_tag state["last_sent_month"] = month_tag
# 답신 감시 시작점. 발송 성공 여부는 여기서 알 수 없으므로 답신으로 확인한다.
state["last_sent_at"] = _utc_z(now)
state.pop("reply_alert_for", None)
_save_json(STATE_FILE, state) _save_json(STATE_FILE, state)
notify.send( notify.send(
f"📨 <b>가희 잔액 리마인더 발신</b>\n" f"📨 <b>가희 잔액 리마인더 발신</b>\n"
@@ -243,6 +303,51 @@ def _maybe_send_reminder(state: dict, dry_run: bool) -> bool:
return True return True
def _check_reply_overdue(state: dict, dry_run: bool):
"""발신 후 REPLY_GRACE_DAYS 가 지나도 답신이 없으면 관리자님께 1회 알린다.
발송 실패를 직접 감지할 수 없어서(위 _send_imessage 주석) 결과로 대신 본다.
2026-07-25 처럼 미발송이 조용히 넘어가는 걸 막는 유일한 안전망이다.
⚠️ 재발신은 자동으로 하지 않는다 — 가희님이 늦게 답하는 경우 중복 독촉이 되고,
자동 발송 트리거를 늘리지 않는다는 방침에도 어긋난다. 알림 받고 --send-now 로 수동.
"""
sent_at = state.get("last_sent_at")
if not sent_at:
return
try:
sent_dt = datetime.fromisoformat(sent_at.replace("Z", "+00:00"))
except ValueError:
return
if _now_kst() - sent_dt < timedelta(days=REPLY_GRACE_DAYS):
return
if state.get("reply_alert_for") == sent_at:
return # 이번 발신 건은 이미 알림
handle_norm = _normalize(_gahee_handle())
chat_id = _find_gahee_chat_id(handle_norm)
if chat_id is None:
return
if any(_msg_from_gahee(m) for m in _imsg_history(chat_id, sent_at)):
# 답신 도착 — 감시 종료
if not dry_run:
state.pop("last_sent_at", None)
state.pop("reply_alert_for", None)
_save_json(STATE_FILE, state)
return
days = (_now_kst() - sent_dt).days
notify.send(
f"⚠️ <b>가희 잔액 리마인더 — {days}일째 답신 없음</b>\n"
f"발신: {notify.escape_html(sent_at)}\n"
f"발송 자체가 실패했을 수 있어요 (imsg 는 발송 실패를 알려주지 않아요).\n"
f"재발신: <code>python3 gahee_reminder.py --send-now</code>"
)
if not dry_run:
state["reply_alert_for"] = sent_at
_save_json(STATE_FILE, state)
def _msg_text(msg: dict) -> str: def _msg_text(msg: dict) -> str:
"""imsg history 메시지 객체에서 본문 텍스트 추출. 키 변형(text/body) 모두 시도.""" """imsg history 메시지 객체에서 본문 텍스트 추출. 키 변형(text/body) 모두 시도."""
for k in ("text", "body", "message", "content"): for k in ("text", "body", "message", "content"):
@@ -402,9 +507,61 @@ def run(webhook_url: str, post_fn, dry_run: bool = False):
_maybe_send_reminder(state, dry_run=dry_run) _maybe_send_reminder(state, dry_run=dry_run)
# 발신 직후 같은 사이클에서 폴링은 무의미하지만, 다음 사이클부터 자연스럽게 시작됨. # 발신 직후 같은 사이클에서 폴링은 무의미하지만, 다음 사이클부터 자연스럽게 시작됨.
_poll_replies(state, webhook_url, post_fn, dry_run=dry_run) _poll_replies(state, webhook_url, post_fn, dry_run=dry_run)
# 발송 실패가 조용히 넘어가지 않게 하는 안전망. 유예 전이면 API 콜 없이 즉시 반환.
_check_reply_overdue(state, dry_run=dry_run)
except Exception as e: except Exception as e:
print(f"❌ gahee_reminder.run 예외 (격리됨): {e}") print(f"❌ gahee_reminder.run 예외 (격리됨): {e}")
try: try:
notify.send(f"❌ <b>가희 모듈 예외</b>\n{notify.escape_html(str(e))[:500]}") notify.send(f"❌ <b>가희 모듈 예외</b>\n{notify.escape_html(str(e))[:500]}")
except Exception: except Exception:
pass pass
def send_now(dry_run: bool = False) -> int:
"""날짜 게이트를 무시하고 리마인더 1회 발신 (수동용).
발송 실패로 그 달을 통째로 놓쳤을 때 복구 수단. last_sent_month 는 건드리지 않아
정규 발신(매월 25일)이 그대로 살아있다.
"""
state = _load_json(STATE_FILE, None)
if not state:
print("❌ 가희 state 파일 없음", file=sys.stderr)
return 1
handle = _gahee_handle()
template = state.get("message_template") or "가계부 업데이트 날이에요. 계좌잔액 보내주시면 자동으로 반영됩니다."
before = time.time()
if not _send_imessage(handle, template, dry_run=dry_run):
return 1
if dry_run:
print(f"[dry-run] 수신자={handle} · last_sent_month 는 그대로 유지")
return 0
state["last_sent_at"] = _utc_z(_now_kst())
state.pop("reply_alert_for", None)
_save_json(STATE_FILE, state)
verdict, detail = _verify_sent(handle, before)
if verdict is True:
print(f"✅ 발송 확인 — {detail}")
return 0
if verdict is False:
print(f"❌ 발송 실패 — {detail}", file=sys.stderr)
state.pop("last_sent_at", None)
_save_json(STATE_FILE, state)
return 1
# chat.db 를 못 읽는 컨텍스트이거나 아직 판정 전. 실패로 단정하지 않는다.
print(f"⚠️ 발송 확인 불가 — {detail}")
print(f" 답신이 {REPLY_GRACE_DAYS}일간 없으면 골디가 텔레그램으로 알립니다.")
return 0
if __name__ == "__main__":
ap = argparse.ArgumentParser(description="가희 잔액 리마인더 (수동 발신용)")
ap.add_argument("--send-now", action="store_true",
help="날짜 게이트 무시하고 1회 발신. 정규 25일 발신은 유지")
ap.add_argument("--dry-run", action="store_true", help="실제 발송 없이 계획만 출력")
args = ap.parse_args()
if args.send_now:
sys.exit(send_now(dry_run=args.dry_run))
ap.print_help()
@@ -0,0 +1,81 @@
#!/usr/bin/env python3
from __future__ import annotations
"""imsg CLI 호출 공용 래퍼.
호출부가 stdout 만 JSON 파싱하고 stderr·returncode 를 버리면, FDA(전체 디스크 접근 권한)
누락 같은 권한 오류가 `Expecting value: line 1 column 1 (char 0)` 파싱 에러로 둔갑한다.
2026-08-03 골디 오진 사고의 원인 — 실제 원인은 homebrew node 업그레이드로 게이트웨이
바이너리 경로가 바뀌어 FDA 승인이 무효화된 것이었다. 판정을 한곳에 모아 사유를 그대로 노출한다.
"""
import json
import subprocess
# imsg 가 권한 거부 시 내는 문구 (imsg 0.5.0 기준).
FDA_MARKERS = ("Full Disk Access", "Cannot access Messages database")
FDA_HINT = (
"Messages DB 접근 거부 — 전체 디스크 접근 권한(FDA) 누락. "
"skills/whooing-sync/SKILL.md 의 'Full Disk Access' 섹션 참고"
)
# `imsg chats` 기본값은 최근 20건이라, 오래 조용한 발신번호(현대카드 SMS·신한은행 등)가
# 목록에서 빠진다. 그 상태로 chat id 캐시를 다시 만들면 해당 carrier 수집이 조용히 끊긴다.
# chat.db 전체 대화가 130개 수준이라 넉넉히 잡는다. (2026-08-03 실측으로 발견)
CHATS_LIMIT = 200
def _reason(stderr: str, stdout: str, fallback: str) -> str:
"""실패 사유 한 줄. FDA 마커는 stdout/stderr 어느 쪽에 있어도 잡는다."""
err = (stderr or "").strip()
out = (stdout or "").strip()
if any(m in err or m in out for m in FDA_MARKERS):
return FDA_HINT
detail = err or out
if detail:
return " ".join(detail.split())[:200]
return fallback
def run_json(args: list, timeout: int) -> "tuple[list, str | None]":
"""imsg 실행 → (rows, error). 성공 시 (list[dict], None), 실패 시 ([], 사유).
결과 0건과 실패를 구분한다 — 둘 다 빈 리스트지만 실패에만 error 가 붙는다.
"""
try:
p = subprocess.run(
["imsg"] + list(args),
capture_output=True, text=True, timeout=timeout,
)
except FileNotFoundError:
return [], "imsg CLI가 설치되어 있지 않습니다"
except subprocess.TimeoutExpired:
return [], f"타임아웃 ({timeout}s)"
except Exception as e:
return [], f"{type(e).__name__}: {e}"
out = p.stdout or ""
if p.returncode != 0:
return [], _reason(p.stderr, out, f"rc={p.returncode}")
if not out.strip():
# stderr 만 있고 stdout 이 비면 실패. 둘 다 비면 정상적으로 결과 0건.
if (p.stderr or "").strip():
return [], _reason(p.stderr, "", "빈 출력")
return [], None
rows = []
for line in out.splitlines():
line = line.strip()
if not line:
continue
try:
rows.append(json.loads(line))
except json.JSONDecodeError:
return [], _reason(p.stderr, line, "JSON 파싱 실패")
return rows, None
def chats(timeout: int) -> "tuple[list, str | None]":
"""대화 목록 조회 → (rows, error). CHATS_LIMIT 만큼 넓게 훑는다."""
return run_json(["chats", "--limit", str(CHATS_LIMIT), "--json"], timeout)
@@ -74,6 +74,22 @@ SHINHAN_APPROVE_RE = re.compile(
) )
# 신한카드 자동납부 형식은 위 승인 SMS와 금액/상호 순서가 반대다:
# "[신한카드] 자동납부 정상승인 방효원님 08/06 (일시불) 14,000원 삼천리도시가스"
# SHINHAN_APPROVE_RE 를 느슨하게 고치는 대신 별도 패턴으로 먼저 시도한다 —
# 느슨하게 고치면 merchant 자리에 "08/06 (일시불)" 이 잡힌다.
# kind 대안 순서 주의: `정상승인`·`승인취소` 가 `승인` 보다 앞에 와야 한다(왼쪽 우선).
SHINHAN_AUTOPAY_RE = re.compile(
r"\[?신한카드\]?\s*자동납부\s*(?P<kind>정상승인|승인취소|매입취소|승인|취소)\s+"
r"(?P<who>\S+?님)\s+"
r"\d{2}/\d{2}\s+"
r"(?:\([^)]*\)\s+)?" # (일시불) / (3개월) — 없는 변형도 통과
r"(?P<amount>[\d,]+)\s*원\s+"
r"(?P<merchant>[^\n]+)",
re.DOTALL,
)
SHINHAN_BANK_RE = re.compile( SHINHAN_BANK_RE = re.compile(
r"\[Web발신\]\s*\n" r"\[Web발신\]\s*\n"
r"신한\s*(?P<md>\d{2}/\d{2})\s+(?P<hm>\d{2}:\d{2})\s*\n" r"신한\s*(?P<md>\d{2}/\d{2})\s+(?P<hm>\d{2}:\d{2})\s*\n"
@@ -107,7 +123,7 @@ def parse_shinhan_bank(raw: str, created_at: str) -> "dict | None":
def parse_shinhan_card(raw: str, created_at: str) -> "dict | None": def parse_shinhan_card(raw: str, created_at: str) -> "dict | None":
text = _normalize(raw).replace("[Web발신]", "") text = _normalize(raw).replace("[Web발신]", "")
m = SHINHAN_APPROVE_RE.search(text) m = SHINHAN_AUTOPAY_RE.search(text) or SHINHAN_APPROVE_RE.search(text)
if not m: if not m:
return None return None
kind_raw = m.group("kind") kind_raw = m.group("kind")
@@ -135,8 +151,32 @@ KAKAOBANK_RE = re.compile(
) )
KAKAOBANK_CARD_RE = re.compile(
r"\[Web발신\]\s*\[카카오뱅크\]\s+카드결제\s+"
r"(?P<card>\S+)\s+"
r"(?P<md>\d{2}/\d{2})\s+(?P<hm>\d{2}:\d{2})\s+"
r"(?P<amount>[\d,]+)원\s+"
r"(?P<merchant>[^\n]+?)"
r"(?:\s+잔액\s+(?P<balance>[\d,]+)원?)?\s*$",
re.DOTALL,
)
def parse_kakao_bank(raw: str, created_at: str) -> "dict | None": def parse_kakao_bank(raw: str, created_at: str) -> "dict | None":
text = _normalize(raw) text = _normalize(raw)
card = KAKAOBANK_CARD_RE.search(text)
if card:
result = {
"kind": "withdrawal",
"entry_date": _iso_to_kst_date(created_at),
"amount": int(card.group("amount").replace(",", "")),
"merchant": _normalize(card.group("merchant")).split("\n")[0].strip() or "(메모없음)",
"raw": raw,
}
if card.group("balance"):
result["balance"] = int(card.group("balance").replace(",", ""))
return result
m = KAKAOBANK_RE.search(text) m = KAKAOBANK_RE.search(text)
if not m: if not m:
return None return None
@@ -155,15 +195,16 @@ def parse_kakao_bank(raw: str, created_at: str) -> "dict | None":
return result return result
# 현대카드 승인 형식 (취소는 별도 샘플 확보 후 추가): # 현대카드 승인/취소 형식 (취소도 헤더 단어만 다르고 본문 구조는 같다):
# 현대카드 블루멤버스 승인 # 현대카드 블루멤버스 승인 현대카드 블루멤버스 취소
# 방*원 # 방*원 방*원
# 5,170원 일시불 # 5,170원 일시불 150,000원 일시불
# 04/25 11:34 # 04/25 11:34 08/02 13:06
# 쿠팡 # 쿠팡 현대가스
# 누적1,466,011원 # 누적1,466,011원 누적4,696,608원
HYUNDAI_CARD_APPROVE_RE = re.compile( # 앞의 `현대카드[^\n]*` 가 greedy 라 "승인취소" 형태도 kind=취소 로 잡힌다.
r"^\s*현대카드[^\n]*승인\s*\n" HYUNDAI_CARD_RE = re.compile(
r"^\s*현대카드[^\n]*(?P<kind>승인|취소)\s*\n"
r"(?P<who>[^\n]+)\s*\n" r"(?P<who>[^\n]+)\s*\n"
r"(?P<amount>[\d,]+)\s*원[^\n]*\n" r"(?P<amount>[\d,]+)\s*원[^\n]*\n"
r"\d{2}/\d{2}\s+\d{2}:\d{2}\s*\n" r"\d{2}/\d{2}\s+\d{2}:\d{2}\s*\n"
@@ -174,8 +215,8 @@ HYUNDAI_CARD_APPROVE_RE = re.compile(
# RCS/MAAP 형식은 한 줄로 들어온다: # RCS/MAAP 형식은 한 줄로 들어온다:
# [Web발신] 현대카드 블루멤버스 승인 방*원 84,000원 일시불 05/16 11:57 네이버페이 누적820,000원 # [Web발신] 현대카드 블루멤버스 승인 방*원 84,000원 일시불 05/16 11:57 네이버페이 누적820,000원
HYUNDAI_CARD_APPROVE_INLINE_RE = re.compile( HYUNDAI_CARD_INLINE_RE = re.compile(
r"현대카드[^\n]*승인\s+" r"현대카드[^\n]*(?P<kind>승인|취소)\s+"
r"(?P<who>\S+)\s+" r"(?P<who>\S+)\s+"
r"(?P<amount>[\d,]+)\s*원[^\n]*?" r"(?P<amount>[\d,]+)\s*원[^\n]*?"
r"\d{2}/\d{2}\s+\d{2}:\d{2}\s+" r"\d{2}/\d{2}\s+\d{2}:\d{2}\s+"
@@ -187,13 +228,13 @@ HYUNDAI_CARD_APPROVE_INLINE_RE = re.compile(
def parse_hyundai_card(raw: str, created_at: str) -> "dict | None": def parse_hyundai_card(raw: str, created_at: str) -> "dict | None":
text = _normalize(raw).replace("[Web발신]", "").strip() text = _normalize(raw).replace("[Web발신]", "").strip()
m = HYUNDAI_CARD_APPROVE_RE.search(text) or HYUNDAI_CARD_APPROVE_INLINE_RE.search(text) m = HYUNDAI_CARD_RE.search(text) or HYUNDAI_CARD_INLINE_RE.search(text)
if not m: if not m:
return None return None
amount = int(m.group("amount").replace(",", "")) amount = int(m.group("amount").replace(",", ""))
merchant = re.sub(r"\s+", " ", m.group("merchant").strip()) or "(가맹점없음)" merchant = re.sub(r"\s+", " ", m.group("merchant").strip()) or "(가맹점없음)"
result = { result = {
"kind": "card_approval", "kind": "card_cancel" if m.group("kind") == "취소" else "card_approval",
"entry_date": _iso_to_kst_date(created_at), "entry_date": _iso_to_kst_date(created_at),
"amount": amount, "amount": amount,
"merchant": merchant, "merchant": merchant,
@@ -1,5 +1,5 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
"""후잉 OpenAPI 잔액(bs.json) 조회. """후잉 OpenAPI 클라이언트 — 잔액(bs.json) 조회 + 거래(entries.json) 조회·감액.
Usage: Usage:
whooing_balance.py # 모든 섹션의 현재 잔액 whooing_balance.py # 모든 섹션의 현재 잔액
@@ -11,11 +11,13 @@ from __future__ import annotations
import argparse import argparse
import json import json
import re
import secrets import secrets
import sys import sys
import time import time
import urllib.parse import urllib.parse
import urllib.request import urllib.request
from datetime import datetime, timedelta
from pathlib import Path from pathlib import Path
CRED_PATH = Path("/Users/snowoyh/.openclaw/credentials/whooing.json") CRED_PATH = Path("/Users/snowoyh/.openclaw/credentials/whooing.json")
@@ -41,6 +43,130 @@ def api_get(endpoint: str, api_key: str, params: dict | None = None) -> dict:
return data["results"] return data["results"]
def api_key_from_cred() -> str:
"""credentials 에서 API 키 문자열 1회 생성."""
api_cfg = json.loads(CRED_PATH.read_text())["api"]
return build_api_key(api_cfg["app_id"], api_cfg["token"], api_cfg["signature"])
def api_request(method: str, endpoint: str, api_key: str,
params: dict | None = None, body: dict | None = None) -> dict:
"""후잉 OpenAPI 호출. GET 은 쿼리스트링, PUT 은 본문으로 파라미터를 보낸다.
⚠️ DELETE 는 쓸 수 없다. 후잉 서버가 DELETE 요청의 파라미터를 쿼리·본문(urlencoded/JSON)·
쿠키·경로 어디에서도 읽지 못해 항상 `section_id parameter is required` 로 실패한다
(2026-08-04 전수 실측. 같은 본문을 PUT 으로 보내면 정상이라 후잉 쪽 문제다).
거래를 지우는 대신 PUT 으로 금액을 줄이는 이유가 이것이다.
"""
url = f"{BASE}/{endpoint}"
if params:
url += "?" + urllib.parse.urlencode(params)
data = None
if body:
# 후잉은 '+' 를 공백으로 디코드하지 않는다. quote_via=quote 로 공백을 %20 으로 보낸다.
data = urllib.parse.urlencode(body, quote_via=urllib.parse.quote).encode()
req = urllib.request.Request(url, data=data, method=method, headers={"X-API-KEY": api_key})
if data:
req.add_header("Content-Type", "application/x-www-form-urlencoded")
with urllib.request.urlopen(req, timeout=15) as resp:
parsed = json.loads(resp.read().decode("utf-8"))
if parsed.get("code") != 200:
raise RuntimeError(
f"후잉 API error {parsed.get('code')}: {parsed.get('message')} "
f"{parsed.get('error_parameters') or ''} ({method} {endpoint})"
)
return parsed["results"]
def _section_list(api_key: str) -> list:
sections = api_request("GET", "sections.json", api_key)
if isinstance(sections, dict):
return sections.get("sections") or sections.get("rows") or list(sections.values())
return sections
def _name_to_account_id(api_key: str, section_id) -> dict[str, str]:
raw = api_request("GET", "accounts.json", api_key, {"section_id": section_id})
out: dict[str, str] = {}
for acc_list in raw.values():
if not isinstance(acc_list, list):
continue
for a in acc_list:
aid = str(a.get("account_id"))
out[a.get("title") or aid] = aid
return out
def _memo_has_merchant(memo: str, merchant: str) -> bool:
"""memo 에 merchant 가 토큰 단위로 들어있는지.
단순 substring 이면 '쿠팡''쿠팡페이주' 승인까지 잡아 엉뚱한 거래를 감액한다
(2026-08-04 실제로 두 상호가 같은 날 같은 금액으로 있었다). 카드 SMS 는 상호를
줄바꿈·공백으로 구분하므로 앞뒤가 공백이거나 문자열 끝일 때만 인정한다.
"""
if not memo or not merchant:
return False
for m in re.finditer(re.escape(merchant), memo):
before = memo[m.start() - 1] if m.start() > 0 else " "
after = memo[m.end()] if m.end() < len(memo) else " "
if before.isspace() and after.isspace():
return True
return False
def find_card_entries(card_account: str, money: int, merchant: str,
on_date: str, window_days: int = 30) -> list[dict]:
"""카드 취소의 원본 승인 거래 후보를 찾는다.
card_account 로 결제된 거래 중 memo 에 merchant 가 들어있고 금액이 취소액 이상인 것을
[on_date - window_days, on_date] 구간에서 찾는다. 금액 일치(전액취소)를 우선 반환하고,
없으면 초과분(부분취소 후보)을 반환한다.
⚠️ item 이 아니라 memo 로 매칭한다 — merchant_map 의 contains 룰이 item 을 재작성해서
(동행복권→'복권') item 은 상호와 다를 수 있지만, memo 는 항상 승인 SMS 원문이다.
⚠️ 판단은 호출측이 한다. 정확히 1건일 때만 손대는 게 안전하다.
"""
api_key = api_key_from_cred()
start = (datetime.strptime(on_date, "%Y%m%d") - timedelta(days=window_days)).strftime("%Y%m%d")
exact, over = [], []
for sec in _section_list(api_key):
sid = sec.get("section_id") or sec.get("id")
card_id = _name_to_account_id(api_key, sid).get(card_account)
if not card_id:
continue
rows = api_request("GET", "entries.json", api_key, {
"section_id": sid, "start_date": start, "end_date": on_date,
})
for row in (rows.get("rows") or []):
if str(row.get("r_account_id")) != card_id:
continue
if not _memo_has_merchant(row.get("memo") or "", merchant):
continue
row_money = row.get("money") or 0
if row_money == money:
exact.append({**row, "section_id": sid})
elif row_money > money:
over.append({**row, "section_id": sid})
return exact or over
def set_entry_money(entry: dict, money: int) -> None:
"""거래 금액을 money 로 바꾼다(PUT). money=0 도 후잉이 받는다(2026-08-04 실측).
조회한 나머지 필드를 그대로 되돌려보내 보존한다 — 부분 PUT 의 필드 보존 동작에
기대지 않는 편이 안전하다. entry_date 는 조회 시 '20260804.0000' 형태라 소수부를 뗀다.
"""
api_request("PUT", f"entries/{entry['entry_id']}.json", api_key_from_cred(), body={
"section_id": entry["section_id"],
"entry_date": str(entry.get("entry_date") or "").split(".")[0],
"l_account_id": entry.get("l_account_id"),
"r_account_id": entry.get("r_account_id"),
"item": entry.get("item") or "",
"money": str(money),
"memo": entry.get("memo") or "",
})
def fmt_won(n: int) -> str: def fmt_won(n: int) -> str:
return f"{n:,}" return f"{n:,}"
@@ -12,7 +12,6 @@ from __future__ import annotations
import argparse import argparse
import json import json
import re import re
import subprocess
import sys import sys
import urllib.error import urllib.error
import urllib.parse import urllib.parse
@@ -22,6 +21,7 @@ from pathlib import Path
from zoneinfo import ZoneInfo from zoneinfo import ZoneInfo
import parsers as sms_parsers import parsers as sms_parsers
import imsg_cli
import notify import notify
import whooing_balance import whooing_balance
import gahee_reminder import gahee_reminder
@@ -88,42 +88,49 @@ def _format_balance_mismatch(info: dict, sms_b: int, whoo_b: int, diff: int, pre
kind_word = "누적사용액" if side == "liability" else "잔액" kind_word = "누적사용액" if side == "liability" else "잔액"
actual_whoo_b = info.get("actual_whooing_balance", whoo_b) actual_whoo_b = info.get("actual_whooing_balance", whoo_b)
payment_offset = info.get("liability_payment_offset", 0) or 0 payment_offset = info.get("liability_payment_offset", 0) or 0
if payment_offset and actual_whoo_b != whoo_b: has_offset = bool(payment_offset and actual_whoo_b != whoo_b)
whoo_line = ( matched_word = "후잉(카드대금 보정 후)" if has_offset else "후잉"
f"• 후잉: <b>{actual_whoo_b:,}원</b>"
f" + 카드대금 보정 <b>{payment_offset:,}원</b>"
f" → <b>{whoo_b:,}원</b>"
)
matched_word = "후잉(카드대금 보정 후)"
else:
whoo_line = f"• 후잉: <b>{whoo_b:,}원</b>"
matched_word = "후잉"
if diff == 0: if diff == 0:
recovered = abs(prev_diff) if prev_diff is not None else 0 recovered = abs(prev_diff) if prev_diff is not None else 0
recovered_line = f"\n회복 금액: <b>{recovered:,}원</b>" if recovered else "" lines = [
hint_line = f"\n반영 항목: <b>{notify.escape_html(recovery_hint)}</b>" if recovery_hint else "" f"✅ <b>{kind_word} 정합 회복</b>",
return ( "",
f" <b>{kind_word} 정합 회복</b>\n\n" f"📌 <b>{label}</b> ({acct})",
f"<b>{label}</b> ({acct})\n" f"• SMS · {matched_word}: <b>{sms_b:,}원</b> (일치)",
f"SMS / {matched_word} 모두 <b>{sms_b:,}원</b> 일치" ]
f"{recovered_line}" if recovered:
f"{hint_line}" lines.append(f"• 불일치 해소: <b>{recovered:,}원</b>")
) if recovery_hint:
lines.append("─────────────")
lines.append(f"• 마지막 반영 거래: <b>{notify.escape_html(recovery_hint)}</b>")
return "\n".join(lines)
sign = "+" if diff > 0 else "" sign = "+" if diff > 0 else ""
if side == "liability": if side == "liability":
direction = "결제 누락 의심" if diff > 0 else "사용 거래 누락 의심" direction = "결제 누락 의심" if diff > 0 else "사용 거래 누락 의심"
else: else:
direction = "출금 누락 또는 입금 중복" if diff > 0 else "입금 누락 의심" direction = "출금 누락 또는 입금 중복" if diff > 0 else "입금 누락 의심"
body = ( lines = [
f"⚠️ <b>{kind_word} 불일치</b>\n\n" f"⚠️ <b>{kind_word} 불일치</b>",
f"<b>{label}</b> ({acct})\n" "",
f"• SMS: <b>{sms_b:,}원</b>\n" f"📌 <b>{label}</b> ({acct})",
f"{whoo_line}\n" f"• SMS {kind_word}: <b>{sms_b:,}원</b>",
f"• 차이: <b>{sign}{diff:,}원</b> ({direction})" ]
if has_offset:
lines.append(
f"• 후잉 {kind_word}: <b>{actual_whoo_b:,}원</b>"
f" + 카드대금 보정 <b>{payment_offset:,}원</b>"
f" = <b>{whoo_b:,}원</b>"
) )
else:
lines.append(f"• 후잉 {kind_word}: <b>{whoo_b:,}원</b>")
lines.append(f"• 차이: <b>{sign}{diff:,}원</b> → {direction}")
if prev_diff is not None and prev_diff != diff: if prev_diff is not None and prev_diff != diff:
body += f"\n <i>이전 차이: {prev_diff:+,}→ 변동</i>" lines.append(f"• 직전 차이: {prev_diff:+,}(변동)")
return body + "\n\n<i>SMS 누락·잘못 분개·기간 외 거래 등 점검 필요.</i>" lines.append("")
lines.append("<i>ℹ️ SMS 누락·잘못 분개·기간 외 거래 등 점검이 필요해요.</i>")
return "\n".join(lines)
def _format_sync_failure(f: dict) -> str: def _format_sync_failure(f: dict) -> str:
@@ -202,7 +209,11 @@ MONEY_AMOUNT_RE = re.compile(r"(?:\d[\d,]*\s*원|(?:입금|출금)\s+\d[\d,]*)")
# 주유소 카드 결제는 보통 150,000원 선승인 → 실제 주유금액 승인 → 150,000원 승인취소 순서로 온다. # 주유소 카드 결제는 보통 150,000원 선승인 → 실제 주유금액 승인 → 150,000원 승인취소 순서로 온다.
# 선승인/취소는 후잉에 기록하지 않고, 실제 결제만 차량유지비/주유비로 남긴다. # 선승인/취소는 후잉에 기록하지 않고, 실제 결제만 차량유지비/주유비로 남긴다.
FUEL_KEYWORDS = ("석유", "주유소", "주유") # "현대가스"·"한경에너"는 상호에 주유/석유가 안 들어가는 충전소라 직접 등록 (2026-08-03 관리자님 확인).
# 새 주유소를 만나면 여기와 whooing_merchant_map.json contains **양쪽에** 상호를 추가한다 —
# 이 상수는 선승인/취소 스킵, merchant_map 은 실제 주유 결제 분류로 한 쌍이다.
# ⚠️ 한경에너는 선승인이 149,900원이라 FUEL_PREAUTH_AMOUNT 정확일치엔 안 걸린다(분류만 적용).
FUEL_KEYWORDS = ("석유", "주유소", "주유", "현대가스", "한경에너")
FUEL_PREAUTH_AMOUNT = 150_000 FUEL_PREAUTH_AMOUNT = 150_000
@@ -213,7 +224,7 @@ def _is_fuel_text(text: str) -> bool:
def _should_skip_fuel_preauth(parsed: dict | None, text: str) -> bool: def _should_skip_fuel_preauth(parsed: dict | None, text: str) -> bool:
"""주유소 15만원 선승인/취소 스킵. """주유소 15만원 선승인/취소 스킵.
parsed 가 있으면 구조화 필드 기준으로 판단한다. 현대카드 취소처럼 아직 파서가 없는 형식은 parsed 가 있으면 구조화 필드 기준으로 판단한다. 파서가 못 읽은 형식은 폴백으로
raw 텍스트에서 '취소' + '150,000원' + 주유 키워드 조합만 보수적으로 스킵한다. raw 텍스트에서 '취소' + '150,000원' + 주유 키워드 조합만 보수적으로 스킵한다.
""" """
if parsed: if parsed:
@@ -274,39 +285,33 @@ def resolve_chat_ids(carriers):
needed = set(carriers.keys()) needed = set(carriers.keys())
if needed.issubset(cached_keys): if needed.issubset(cached_keys):
return {k: cached[k] for k in needed} return {k: cached[k] for k in needed}
try: chats, err = imsg_cli.chats(IMSG_TIMEOUT)
chats_raw = subprocess.run( if err:
["imsg", "chats", "--json"], print(f"❌ imsg chats 실행 실패: {err}", file=sys.stderr)
capture_output=True, text=True, timeout=IMSG_TIMEOUT,
)
chats = [json.loads(l) for l in chats_raw.stdout.splitlines() if l.strip()]
except FileNotFoundError:
print("❌ imsg CLI가 설치되어 있지 않습니다.", file=sys.stderr)
sys.exit(3)
except Exception as e:
print(f"❌ imsg chats 실행 실패: {e}", file=sys.stderr)
sys.exit(3) sys.exit(3)
result = {} result = {}
for sender in carriers.keys(): for sender in carriers.keys():
ids = [c["id"] for c in chats if c.get("identifier") == sender and c.get("id") is not None] ids = [c["id"] for c in chats if c.get("identifier") == sender and c.get("id") is not None]
result[sender] = ids result[sender] = ids
# 전 carrier 가 빈 리스트면 조회 자체가 실패한 것으로 본다. 이 상태를 캐시에 저장하면
# 이후 모든 실행(launchd 포함)이 캐시에 적중해 조용히 0건 수집을 영구 반복한다.
# 일부만 비는 건 정상 — 메시지 이력이 없는 carrier 가 있을 수 있다.
if not any(result.values()):
print("❌ imsg chats 결과에 매핑된 발신번호가 하나도 없습니다 — 캐시 저장 안 함", file=sys.stderr)
sys.exit(3)
save_json(CHAT_IDS_CACHE, result) save_json(CHAT_IDS_CACHE, result)
return result return result
def fetch_messages(chat_id, since): def fetch_messages(chat_id, since):
cmd = ["imsg", "history", "--chat-id", str(chat_id), "--limit", str(HISTORY_LIMIT), "--json"] args = ["history", "--chat-id", str(chat_id), "--limit", str(HISTORY_LIMIT), "--json"]
if since: if since:
cmd += ["--start", since] args += ["--start", since]
try: rows, err = imsg_cli.run_json(args, IMSG_TIMEOUT)
raw = subprocess.run(cmd, capture_output=True, text=True, timeout=IMSG_TIMEOUT) if err:
return [json.loads(l) for l in raw.stdout.splitlines() if l.strip()] print(f"⚠️ chat-id {chat_id} history 실패: {err}", file=sys.stderr)
except subprocess.TimeoutExpired:
print(f"⚠️ chat-id {chat_id} history 타임아웃", file=sys.stderr)
return []
except Exception as e:
print(f"⚠️ chat-id {chat_id} history 실패: {e}", file=sys.stderr)
return [] return []
return rows
# --- 룰 엔진 (whooing_overrides.json) ----------------------------------------- # --- 룰 엔진 (whooing_overrides.json) -----------------------------------------
@@ -510,8 +515,9 @@ def build_structured(parsed, sender_info, accounts, merchant_map):
return {**base, "left": cat, "right": carrier_acct} return {**base, "left": cat, "right": carrier_acct}
return {**base, "left": "기타비용", "right": carrier_acct} return {**base, "left": "기타비용", "right": carrier_acct}
if kind == "card_cancel": # card_cancel 은 여기서 payload 를 만들지 않는다 — 처리 루프의 _handle_card_cancel 이
return None # raw 폴백 (후잉이 원거래 찾아 상쇄) # 원본 승인 거래를 찾아 PUT 으로 감액한다. 좌우를 뒤집은 역분개는 후잉이 거부한다
# (비용 계정은 차변 전용 → `r_account 잘못된 값입니다`) — 2026-08-03 회귀의 원인.
if kind == "withdrawal": if kind == "withdrawal":
if rule: if rule:
@@ -542,6 +548,38 @@ def build_structured(parsed, sender_info, accounts, merchant_map):
return None return None
def _handle_card_cancel(parsed, sender_info, accounts, dry_run=False):
"""카드 취소 → 원본 승인 거래를 찾아 취소액만큼 감액.
반환 (ok, detail). ok=False 면 원본을 특정하지 못한 것이니 호출측이 raw 폴백으로 넘긴다.
⚠️ 폴백은 자동 처리가 아니다 — 후잉은 취소 문자를 받아도 원본을 지워주지 않으므로
(공식 FAQ 도 환불은 수동 처리하라고 안내한다) 관리자님이 후잉 UI 에서 손봐야 한다.
그래서 폴백 건은 raw 폴백 알림에 그대로 실어 보낸다.
전액취소면 금액이 0 이 되어 줄은 남는다. 후잉 API 로는 거래를 지울 수 없기 때문이다
(whooing_balance.api_request 주석 참고). 잔액·합계에는 영향이 없다.
"""
carrier_acct = accounts.get("carrier_to_account", {}).get(sender_info.get("carrier"), "")
if not carrier_acct:
return False, "카드 계정 매핑 없음"
money = parsed["amount"]
cands = whooing_balance.find_card_entries(
carrier_acct, money, parsed["merchant"], parsed["entry_date"]
)
if len(cands) != 1:
return False, f"원본 승인 후보 {len(cands)}건 — 1건일 때만 감액"
orig = cands[0]
new_money = (orig.get("money") or 0) - money
detail = (f"{orig.get('item')} {orig.get('money'):,}원 → {new_money:,}"
f"(취소 {money:,}원, entry {orig['entry_id']})")
if dry_run:
return True, f"(dry-run) {detail}"
whooing_balance.set_entry_money(orig, new_money)
return True, detail
def _parse_iso_utc(iso: str) -> datetime: def _parse_iso_utc(iso: str) -> datetime:
return datetime.fromisoformat(iso.replace("Z", "+00:00")) return datetime.fromisoformat(iso.replace("Z", "+00:00"))
@@ -737,6 +775,7 @@ def main():
sent_transfer = 0 sent_transfer = 0
sent_structured = 0 sent_structured = 0
sent_raw = 0 sent_raw = 0
sent_cancel = 0
failed = 0 failed = 0
new_failures = [] new_failures = []
new_raw = [] # raw 폴백으로 성공 처리된 건 (구조화 실패 신호) — 텔레그램 알림용 new_raw = [] # raw 폴백으로 성공 처리된 건 (구조화 실패 신호) — 텔레그램 알림용
@@ -794,8 +833,42 @@ def main():
blocked_at = c["created_at"] blocked_at = c["created_at"]
break break
# 카드 취소는 상쇄 줄을 더하지 않고 원본 승인 거래를 감액한다.
# 원본을 못 찾으면 아래 raw 폴백으로 흘러간다(build_structured 가 None 을 준다).
if parsed and parsed.get("kind") == "card_cancel":
try:
cancel_ok, cancel_detail = _handle_card_cancel(
parsed, c["info"], accounts, args.dry_run
)
except Exception as e:
failed += 1
detail = f"{type(e).__name__}: {e}"
new_failures.append({
"sender": c["sender"], "label": c["info"]["label"],
"created_at": c["created_at"], "text": c["text"],
"mode": "cancel_reduce", "payload": {},
"status": 0, "response": detail[:500],
"failed_at": datetime.now(KST).isoformat(),
})
print(f" ❌ [cancel] {c['info']['label']} {c['created_at']} | {detail[:120]}")
blocked_at = c["created_at"]
break
if cancel_ok:
sent_cancel += 1
carrier_key = c["info"].get("carrier")
if carrier_key:
recovery_hints[carrier_key] = cancel_detail
print(f" [cancel] {c['info']['label']} {c['created_at']} | {cancel_detail}")
if c["created_at"] > (latest or ""):
latest = c["created_at"]
continue
print(f" ↩︎ [cancel→raw] {c['info']['label']} {c['created_at']} | {cancel_detail}")
# card_cancel 이 여기까지 오면 감액 실패 → raw 폴백만 남았다.
# apply_overrides 는 match 에 kind 가 없는 룰을 모든 kind 에 적용하므로, 그런 룰이
# 추가되면 취소가 좌우 뒤집힌 payload 로 새어나갈 수 있어 여기서 끊는다.
structured = None structured = None
if parsed: if parsed and parsed.get("kind") != "card_cancel":
structured = apply_overrides(overrides, parsed, c["info"], accounts, merchant_map, c["created_at"]) structured = apply_overrides(overrides, parsed, c["info"], accounts, merchant_map, c["created_at"])
if structured is None: if structured is None:
structured = build_structured(parsed, c["info"], accounts, merchant_map) structured = build_structured(parsed, c["info"], accounts, merchant_map)
@@ -921,17 +994,27 @@ def main():
if info.get("side") == "liability": if info.get("side") == "liability":
liability_payment_offset = int(liability_payment_offsets.get(info["account"], 0) or 0) liability_payment_offset = int(liability_payment_offsets.get(info["account"], 0) or 0)
whoo_b = actual_whoo_b + liability_payment_offset whoo_b = actual_whoo_b + liability_payment_offset
# 카드사 누적사용액이 카드대금 상환을 반영하는지는 문자 형식/시점에 따라 다르다.
# 실제 후잉 잔액이 보정 후 값보다 SMS에 더 가깝다면 보정치를 소진된 것으로 본다.
if (
liability_payment_offset
and abs(actual_whoo_b - sms_b) < abs(whoo_b - sms_b)
):
liability_payment_offsets[info["account"]] = 0
liability_payment_offset = 0
whoo_b = actual_whoo_b
changed = True
diff = whoo_b - sms_b diff = whoo_b - sms_b
prev = carriers_state.get(carrier, {}) prev = carriers_state.get(carrier, {})
prev_diff = prev.get("last_diff") prev_diff = prev.get("last_diff")
# 카뱅 자동 이자/캐시백 보정: 자산 + 후잉이 SMS보다 적고(deposit 누락), 차이 ≤ 5,000원. # 은행 자동 이자/캐시백 보정: 자산 + 후잉이 SMS보다 적고(deposit 누락), 차이 ≤ 5,000원.
# 횟수·날짜 제한 없이 매번 자동 분개. 매 발화마다 텔레그램 알림으로 누적 가시성 확보. # 횟수·날짜 제한 없이 매번 자동 분개. 매 발화마다 텔레그램 알림으로 누적 가시성 확보.
# 정상 SMS가 와서 deposit이 후잉에 들어가면 diff>=0이 되어 안전하게 미발화. # 정상 SMS가 와서 deposit이 후잉에 들어가면 diff>=0이 되어 안전하게 미발화.
cur_month = datetime.now(KST).strftime("%Y-%m") cur_month = datetime.now(KST).strftime("%Y-%m")
if ( if (
info.get("side") == "asset" info.get("side") == "asset"
and carrier == "kakaobank" and carrier in {"kakaobank", "shinhan_bank", "hana_bank"}
and diff < 0 and diff < 0
and abs(diff) <= 5000 and abs(diff) <= 5000
): ):
@@ -947,7 +1030,7 @@ def main():
ok, status, body = post_to_whooing(webhook_url, interest_payload, dry_run=False) ok, status, body = post_to_whooing(webhook_url, interest_payload, dry_run=False)
if ok: if ok:
notify.send( notify.send(
f"💰 <b>카뱅 은행이자 자동 분개</b>\n" f"💰 <b>{notify.escape_html(info['label'])} 은행이자 자동 분개</b>\n"
f"+{interest_amount:,}원 ({notify.escape_html(info['account'])} ← 기타수익)" f"+{interest_amount:,}원 ({notify.escape_html(info['account'])} ← 기타수익)"
) )
carriers_state[carrier] = { carriers_state[carrier] = {
@@ -1111,9 +1194,9 @@ def main():
save_json(SYNC_STATE_FILE, sync_state) save_json(SYNC_STATE_FILE, sync_state)
if blocked_at: if blocked_at:
print(f"⚠️ 후잉 동기화: transfer {sent_transfer}건, structured {sent_structured}건, raw {sent_raw}건, 실패 {failed}건 — {blocked_at} 에서 중단(다음 cron 재시도)") print(f"⚠️ 후잉 동기화: transfer {sent_transfer}건, structured {sent_structured}건, raw {sent_raw}건, 취소감액 {sent_cancel}건, 실패 {failed}건 — {blocked_at} 에서 중단(다음 cron 재시도)")
else: else:
print(f"✅ 후잉 동기화: transfer {sent_transfer}건, structured {sent_structured}건, raw {sent_raw}건, 실패 {failed}건 (last={final_latest or latest})") print(f"✅ 후잉 동기화: transfer {sent_transfer}건, structured {sent_structured}건, raw {sent_raw}건, 취소감액 {sent_cancel}건, 실패 {failed}건 (last={final_latest or latest})")
# 가희 잔액 리마인더 & 답신 자동 분개 (격리 — 실패해도 결제 sync 결과는 위에서 이미 출력됨) # 가희 잔액 리마인더 & 답신 자동 분개 (격리 — 실패해도 결제 sync 결과는 위에서 이미 출력됨)
run_gahee_reminder() run_gahee_reminder()
+7 -4
View File
@@ -42,17 +42,20 @@
| 라벨 (`ai.openclaw.stock.`) | 일정 | 스크립트 | 핵심 비고 | | 라벨 (`ai.openclaw.stock.`) | 일정 | 스크립트 | 핵심 비고 |
|---|---|---|---| |---|---|---|---|
| `watchlist-monitor` | 평일 10·12·14시 (휴장일 self-skip) | `watchlist_monitor.py check` | buy/target/stop 감지 시 텔레그램 요약 + HTML 메일 1통. 2026-05-12 15분 간격 → 3회 축소 (관리자님 요청) | | `watchlist-monitor` | 평일 10·12·14시 (휴장일 self-skip) | `watchlist_monitor.py check` | buy/target/stop 감지 시 텔레그램 요약 + HTML 메일 1통. 2026-05-12 15분 간격 → 3회 축소 (관리자님 요청) |
| `surge-monitor` | 평일 09:0015:35 **매 1분** (`StartCalendarInterval` 396엔트리, 스크립트 self-skip) | `surge_monitor.py check` | **급등락 알림** (2026-08-04 도입). 자산웹 🔔 토글 켜진 종목만(`state/behive_surge_toggles.json`). 조회·알림 전용이라 `feedback_no_trade_auto_triggers` 예외 아님(주문 API 경로 없음). **세 기준 병행**: 거래소 **상·하한가 도달**(2026-08-06 추가, 그날 끝까지 간 것이라 무엇에도 가리지 않음) + 거래소 **VI 발동**(급등락 여부를 거래소가 판정 → 문턱 불필요) + **자기 이력 분위수**(장중 이탈폭 ≥ 그 종목 과거 이탈폭 `SURGE_PCTL` p90, 확대는 p98). ⚠️ **고정 %를 쓰자는 제안은 거절할 근거가 있다** — 실측(관심·감시 65종목 × 280거래일, 2026-08-04) 장중 이탈폭 중간값 3.8%라 ±3%가 평범한 날이고, 종목별 변동성이 **22배 차**(ATR14 1.0~22.3%)라 ±5% 문턱이면 KODEX 미국S&P500 발생 0회 / SK이터닉스 75회다. 같은 5%가 한쪽엔 도달 불가·한쪽엔 노이즈. ⚠️ **ATR 배수도 폐기됐다 — 2026-08-04 관리자님 지적**("하루 최대 폭이 30%~+30%인데"). 국내 가격제한폭이 ±30%인데 ATR 배수는 상한이 없어 문턱이 제한폭 밖으로 밀려난다: 1차(ATR×1.5) 5/65종목, 확대(ATR×3.0) **31/65(48%)**가 발동 불가였다. 분위수는 실제 관측값이라 구조적으로 제한폭을 못 넘고(p90~p99 전부 30% 초과 0종목) 알림량이 정의상 (1−p)로 확정된다(p90 = 종목당 연 25회). **ATR 배수 재제안 금지.** ⚠️ 평시 사이클 **키움 콜 0** — behive_web `/api/realtime/quotes` 1콜이 현재가와 VI를 함께 준다(VI 1h는 시장 전역 broadcast라 구독 무관). 구독 상한에 걸려 빠진 종목만 ka10095 배치 1콜 폴백. ⚠️ **문턱은 하루 1회만 계산**(`state/surge_thresholds.json`) — `daily_candles_cache.get_candles`가 stale 캐시에 ka10081을 때리므로 매분 × 종목수면 폭주. ⚠️ **ka10081 유량 초당 5건** — 70종목 일괄 산출 시 26종목이 429로 실패(실측). 사이클당 12개·0.35s 간격으로 나눠 계산하고(70종목 ≈ 6분) **조회 실패는 캐시하지 않는다**(이력부족과 같이 `{}`로 굳히면 429 한 번에 그 종목이 하루 내내 VI만 감시). ⚠️ **VI 레그는 behive_web 프로세스 의존** — 죽으면 VI 알림이 조용히 사라지고 stderr 경고만(백업 트리거는 `feedback_no_unsanctioned_failover`대로 의도적 부재). ⚠️ **상·하한가·VI 중 문턱을 넘으면 생략이 아니라 보류**(2026-08-06 관리자님 요청) — `surge_alerts.json``__pending__`에 이탈폭 최대 시점을 적어뒀다가 가림이 풀린 사이클에 방출한다. 그전엔 버려져서 **VI 중 돌파 후 해제 시점에 되밀리면 알림이 아예 없었다**. 가림 여부는 보류 목록이 비었는지가 아니라 `evaluate`**가림사유 반환값**으로 판단해야 한다(VI 중 되밀림도 목록이 비어 조기 방출됨). 방출분은 **발송 성공 시에만** 보류에서 제거. VI가 마감까지 안 풀리면 그날 보류분은 방출 안 됨(강제 flush 없음). ⚠️ **상·하한가는 ka10095 `upl_pric`/`lst_pric`(거래소 계산값)** — 제한폭은 기준가 호가단위로 절사 후 ±하는 규칙이라 직접 계산하면 ETF·가격대별 표를 재현해야 해 틀린다. 장중 불변이라 `state/surge_limits.json`에 하루 1콜 캐시, 일봉 이력 불필요라 **이력 부족 종목도 감시됨**. dedup `state/surge_alerts.json` = 분위수 방향별 1회 + 확대 1회 + 상·하한가 1회, VI는 `vi:<발동시각>`이라 발동 건마다 1회(하루 상한 없음). 로그 `logs/stock-surge-monitor.{log,err.log}` |
| `trailing-monitor` | 평일 09:0015:30 **매 1분** (`StartCalendarInterval` 391엔트리, 스크립트 self-skip) | `trailing_monitor.py check` | **트레일링 스톱 감시** (2026-07-30 도입). ⚠️ **매매 API를 자동 호출하는 유일한 트리거**`feedback_no_trade_auto_triggers` 예외로 관리자님이 명시 승인. 허용 근거: 호출하는 건 `kiwoom_order.modify_order` **하나뿐**이고 신규 발주·수량·방향 변경 경로가 없음. PIN 승인 시 계좌·종목·수량·트레일 폭이 확정되고, 감시는 이미 승인된 스톱주문의 조건단가를 **상향만** 정정. 예약 0건이면 즉시 종료(API 콜 0). 상태 `state/trailing_stops.json`, 로그 `logs/stock-trailing-monitor.{log,err.log}`. ⚠️ **cadence 이력 2분→30초→1분**(전부 2026-07-30 관리자님 지시). launchd 최소 단위가 1분이라 30초는 프로세스 내부 `--repeat 2 --gap 30`(1분 발화 × 30초 간격 2회)으로 구현했고 **CLI 옵션은 살아있다** — 다시 30초로 갈 땐 plist ProgramArguments에 인자만 추가. `StartInterval=30`은 GUI idle 시 발화 보류라 사용 금지(sim-scan이 같은 이유로 캘린더 전환). ⚠️ **스톱주문은 장 마감 후 소멸한다 — 2026-07-30 실증 완료**(가정이 틀렸음). 첫 실주문 TRL-A2Z4(제닉스로보틱스 1주, 14:35 등록, 손절선 4,370→4,455 3회 상향)가 **체결 없이** 사라졌다: 당일매매일지 매도 기록 0건 · 보유수량 3,338주 불변 · 미체결 0건. 감지 시각 **18:21**(15:30 장 마감 즉시가 아니라 몇 시간 뒤 — 감시는 그 사이 매분 정상 발화했고 로그가 조용했으니 주문은 18:20까지 조회에 살아있었다. NXT 시간대엔 손절선이 실제로 유효했던 셈. 1회 관측이라 매일 같은 시각인지는 미확인). ⚠️ **자동 재등록 안 한다**(관리자님 결정) — 알림만 보내고 재등록은 자산웹에서 수동. 소멸 알림에 사유 구분 있음(아래). ⚠️ **예약 종료 알림 3갈래**(`_fill_check`+`_notify_gone`): 미체결 조회에서 사라진 것만으로는 체결·취소·소멸을 구분할 수 없어(셋 다 목록에서 빠짐) 예약이 사라질 때만 ka10170 1콜 추가로 판정 — ✅체결(당일 매도기록 있음, 수량·평균가·실현손익 표시. 관리자님 수동 매도와는 구분 불가라 단정 안 함) / ⚠️소멸(매도기록 없음 = 체결 안 됨 확정 + 재등록 안내) / 🎯판정불가(일지 조회 실패). **조회 실패를 '체결 안 됨'으로 단정하면 안 된다**`_fill_check`가 (기록, 성공여부) 튜플을 반환하는 이유. ⚠️ **초기 고점 = 등록 시점 현재가 고정**, 이후 갱신도 **현재가로만**(당일고가를 쓰면 등록 전 고가 때문에 즉시 발동). ⚠️ **고점 기준 선택 옵션은 2026-07-30 제거 — 다시 넣지 말 것**(`peak_basis`/`52주 전고점`/`매수후 고점`). 과거 고점 기준은 손절선이 현재가 위로 올라가 `TRAIL_IMMEDIATE` 거부되는데, **손실 종목은 등록 자체가 불가**(실측 제닉스로보틱스 현재가 4,805 · 매수후 고점 6,890 → 필요 폭 30.3% / 52주 19,940 → 75.9%, 상한 30% 초과)고 **이익 종목은 과거 고점 ≈ 현재가라 결과가 동일**. 차이 날 때 못 쓰고 쓸 수 있을 때 차이 없어 폐기. ⚠️ **최저 매도가**(`min_sell_price`)로 손절선 하한 지정 가능 — `cond_uv = max(트레일, 최저가)`. 트레일 폭을 넓게 잡아도 이 가격 아래로 안 내려간다. 고점이 올라 트레일이 추월하면 그 뒤론 트레일 지배(전환점 = 최저가÷(1−pct)). 1분 간격이라 그 사이 스파이크는 놓친다(손절선이 덜 올라가는 방향 — 손실 위험 아님). ⚠️ **정밀도 보완 안 함으로 결론**(2026-07-30 관리자님): 최저 매도가로 하한이 통제되니 1분 해상도 누락은 감당 범위. `entry_day_high` 기준선 / `realtime_hub` WS 틱 추적 **둘 다 채택 안 함 — 재제안 금지** |
| `briefing` | 평일 20:10 (휴장일 self-skip) | `stock_portfolio_report.py send` | 메일만 발송. 텔레그램 리포트 요약은 2026-05-14 관리자님 요청으로 비활성화. 실패 시 자가 알림 | | `briefing` | 평일 20:10 (휴장일 self-skip) | `stock_portfolio_report.py send` | 메일만 발송. 텔레그램 리포트 요약은 2026-05-14 관리자님 요청으로 비활성화. 실패 시 자가 알림 |
| `briefing-fallback-2030` | 평일 20:30 (휴장일 self-skip) | `briefing_fallback.py retry` | 스냅샷 있으면 skip(idempotent), 없으면 send 재실행. 알림 없음 | | `briefing-fallback-2030` | 평일 20:30 (휴장일 self-skip) | `briefing_fallback.py retry` | 스냅샷 있으면 skip(idempotent), 없으면 send 재실행. 알림 없음 |
| `briefing-fallback-2100` | 평일 21:00 (휴장일 self-skip) | `briefing_fallback.py final` | 마지막 폴백. 실패 시 레이 텔레그램 알림 | | `briefing-fallback-2100` | 평일 21:00 (휴장일 self-skip) | `briefing_fallback.py final` | 마지막 폴백. 실패 시 레이 텔레그램 알림 |
| `send-balance` | 매월 1일 04:30 | `send_balance_to_budget.py` | 본인 계좌(가희 제외) → 골디 inbox `securities_balance`. 골디 결산 30분 전 | | `send-balance` | 매월 1일 04:30 | `send_balance_to_budget.py` | 본인 계좌(가희 제외) → 골디 inbox `securities_balance`. 골디 결산 30분 전 |
| `ipo-calendar-sync` | 매주 금요일 17:00 | `ipo_calendar_sync.py` | IPO 청약·상장 일정 → Google Calendar | | `ipo-calendar-sync` | 매주 금요일 17:00 | `ipo_calendar_sync.py` | IPO 청약·상장 일정 → Google Calendar |
| `fomc-calendar-sync` | 매월 1일 09:10 | `fomc_calendar_sync.py` | 연준 FOMC 회의 일정 → Google Calendar `[FOMC] YYYY-MM 회의`(+` (SEP)`). 2026-07-29 신설. **캘린더엔 2026-03-23 관리자님이 2027-12까지 11건을 이미 손으로 등록해 두셨고 날짜도 정확** — 스크립트는 그 표기를 승계해 흡수했으므로 당분간 실제 신규 등록은 2028년분부터. **이벤트 기간 = 회의 시작일(ET) ~ 발표일(KST)** 3일 — 성명 발표가 KST로는 회의 종료 다음날 새벽(EDT 03:00·EST 04:00)이라, ET 날짜만 넣으면 한국 장이 결과를 반영하는 날에 캘린더가 비어 브리핑 '오늘 일정'에 안 뜬다(2026-07-29 관리자님 지적으로 수정). colorId 9 보존(`--event-color` 미지정). 삭제 루프가 `old_start <= today`를 건너뛰어 지난 회의는 안 지움. `--list`=파싱만(gog 미호출) |
| `holiday-sync` | 매주 일요일 03:00 | `holiday_sync.py` | investing.com → `state/market_holidays.json`. 실패 시 기존 파일 보존 | | `holiday-sync` | 매주 일요일 03:00 | `holiday_sync.py` | investing.com → `state/market_holidays.json`. 실패 시 기존 파일 보존 |
| `behive-web` | 상시 (`KeepAlive`) | `behive_web.py serve` | 3-탭 워치리스트 웹뷰. Tailscale `100.75.148.12:18790``https://stock.hyowons.net/`(Synology reverse proxy). 코드 변경 후 bootout/bootstrap 필요 | | `behive-web` | 상시 (`KeepAlive`) | `behive_web.py serve` | 3-탭 워치리스트 웹뷰. Tailscale `100.75.148.12:18790``https://stock.hyowons.net/`(Synology reverse proxy). 코드 변경 후 bootout/bootstrap 필요 |
| `trade-journal` | 평일 21:00 (스크립트가 휴장일 self-skip) | `trade_journal.py collect` | ka10170 당일매매일지 4계좌 → `state/trade_journal.jsonl` 누적. NXT 야간 마감 후 발화. 키움이 기간 거래내역 API 미제공이라 일자별 적재만이 유일. `briefing-fallback-2100`(21:00)과 같은 시각이지만 둘 다 read-only 충돌 없음. 재실행 시 (date,account) 단위 idempotent. **시드**: 2026-05-13 1회 `trade_journal.py seed` 로 적재 시작일 이전 보유분을 현재 평단가×(qty - tdy_buyq + tdy_sellq)로 단일 시드 행 압축(28건, seed=true 플래그, `*` 마커). 시드는 가중평균이라 과거 매수 단가와 정확히 일치 X. CLI: `collect`/`seed`/`show <code>`/`query --from --to --account --code` | | `trade-journal` | 평일 21:00 (스크립트가 휴장일 self-skip) | `trade_journal.py collect` | ka10170 당일매매일지 4계좌 → `state/trade_journal.jsonl` 누적. NXT 야간 마감 후 발화. 키움이 기간 거래내역 API 미제공이라 일자별 적재만이 유일. `briefing-fallback-2100`(21:00)과 같은 시각이지만 둘 다 read-only 충돌 없음. 재실행 시 (date,account) 단위 idempotent. **시드**: 2026-05-13 1회 `trade_journal.py seed` 로 적재 시작일 이전 보유분을 현재 평단가×(qty - tdy_buyq + tdy_sellq)로 단일 시드 행 압축(28건, seed=true 플래그, `*` 마커). 시드는 가중평균이라 과거 매수 단가와 정확히 일치 X. CLI: `collect`/`seed`/`show <code>`/`query --from --to --account --code`. **2026-06-15 4번째 명령 추가**: `python3 -m sim universe all` — sim 관찰목록 자동편입/제외. 키움 순위정보(ka90009 외인·기관순매수 + ka10023 거래량급증)에서 ETF·하락·급증률 이상치 거르고 각 15·총 120 상한 편입(origin='auto'), origin=auto·미보유·10거래일 무신호만 자동제외(보유/watch/interest/manual 불가침). 신호추적=scan_all `universe.mark_signals``auto_seen.json` |
| `sim-scan` | 평일 09:0015:30 **매 5** (`StartCalendarInterval` 79엔트리, 엔진이 장외/휴장 self-skip) ⚠️2026-06-09 15분→5분 단축 + `StartInterval` 900s→`StartCalendarInterval` 전환(StartInterval은 GUI세션 idle/디스플레이 sleep 시 timer coalescing으로 발화 보류돼 장중 안 돎. calendar는 git-autopush가 새벽 02:00 정상발화로 검증됨) | `python3 -m sim scan` (내부 `scan_all` — 메인+병렬변이 동시) | **자동매매 시뮬(페이퍼)** 1회 스캔. 가상자본 1천만, 규칙 엔진(LLM 미경유). universe=비하이브 워치+관심+보유(**ETF/ETN은 2026-06-09부터 자동매수 제외** — 애널 방향성 부재로 전략 부정합, `universe.is_etf()` 프리픽스 판별, 보유분은 청산까지 추적). 방향=애널 약한게이트+가점, 타이밍=수급·기술(2026-06-09 시장강약 필터: 하드차단→소프트게이트+장중 실시간 상승비율 + **지수추세 이중확인**). **2026-06-09 4종 추가**: 리스크 기반 사이징(`signals.target_value` 수량=자산×`RISK_PER_TRADE_PCT`÷손절폭, 균등비중 캡)·RSI 필터(돌파 과열/눌림목 과매도 보류)·**시장 국면 6단계**(`market_regime_map``engine.REGIME`: 🔥강세·📈반등·🌤완만상승=매수허용 / ➖혼조·📉약세·❄️급락=보류. 상승비율+지수추세+당일등락 조합. market_ok·시장탭 공용. 강세/약세 2단계가 84% 반등을 약세로 오판해 세분화)·**약세장 매수모드**(`BEAR_ENTRY_MODE` 0현금화/1돌파만/2눌림허용, market_ok False일 때 signals 분기. backtest는 시장중립이라 무영향→병렬변이로 라이브 비교. 2026-06-09 메인(mode1)+약세현금화·약세눌림허용 변이로 비교군 구성)·시간손절(`MAX_HOLD_DAYS` 미진전 청산)·**추세 질 보강**(2026-06-09 trend_ok 게이트에 ①20일선 우상향 기울기 ②5>60 중기정배열 추가〔종목데이터, backtest 반영〕 + ③상대강도〔종목−지수 N일수익률, 라이브 전용 체크〕). 사이징·시간손절은 엔진·백테스트 공용 헬퍼. TUNABLE 26개. 매수=돌파 즉시/눌림목 지정가, 매도=손절·2:1 후 트레일링·추세수급 이탈. 결과 `state/sim/`(portfolio.json·trades.jsonl·last_scan.json). 실주문 `orders/` 불가침. 일봉은 캐시 우선 읽기(ka10081 rate limit 회피). cwd=`agents/stock/workspace` | | `sim-scan` | 평일 09:0015:30 **매 2** (`StartCalendarInterval` 196엔트리, 엔진이 장외/휴장 self-skip) ⚠️2026-06-09 15분→5분, 2026-06-17 5분→2분 단축(스캔 1회 실측 ~3.6초라 2분 cadence 오버랩·rate limit 여유, 1분이 캘린더 한계지만 일봉 신호라 2분 충분) + `StartInterval` 900s→`StartCalendarInterval` 전환(StartInterval은 GUI세션 idle/디스플레이 sleep 시 timer coalescing으로 발화 보류돼 장중 안 돎. calendar는 git-autopush가 새벽 02:00 정상발화로 검증됨) | `python3 -m sim scan` (내부 `scan_all` — 메인+병렬변이 동시) | **자동매매 시뮬(페이퍼)** 1회 스캔. 가상자본 1억(2026-06-10 1천만→1억), 규칙 엔진(LLM 미경유). universe=비하이브 워치+관심+보유(**ETF/ETN은 2026-06-09부터 자동매수 제외** — 애널 방향성 부재로 전략 부정합, `universe.is_etf()` 프리픽스 판별, 보유분은 청산까지 추적). 방향=애널 약한게이트+가점, 타이밍=수급·기술(2026-06-09 시장강약 필터: 하드차단→소프트게이트+장중 실시간 상승비율 + **지수추세 이중확인**). **2026-06-09 4종 추가**: 리스크 기반 사이징(`signals.target_value` 수량=자산×`RISK_PER_TRADE_PCT`÷손절폭, 균등비중 캡)·RSI 필터(돌파 과열/눌림목 과매도 보류)·**시장 국면 6단계**(`market_regime_map``engine.REGIME`: 🔥강세·📈반등·🌤완만상승=매수허용 / ➖혼조·📉약세·❄️급락=보류. 상승비율+지수추세+당일등락 조합. market_ok·시장탭 공용. 강세/약세 2단계가 84% 반등을 약세로 오판해 세분화)·**약세장 매수모드**(`BEAR_ENTRY_MODE` 0현금화/1돌파만/2눌림허용, market_ok False일 때 signals 분기. backtest는 시장중립이라 무영향→병렬변이로 라이브 비교. 2026-06-10 **유형36×모드3=108변이 풀매트릭스**로 확장, 첫 라이브 2026-06-11)·시간손절(`MAX_HOLD_DAYS` 미진전 청산)·**추세 질 보강**(2026-06-09 trend_ok 게이트에 ①20일선 우상향 기울기 ②5>60 중기정배열 추가〔종목데이터, backtest 반영〕 + ③상대강도〔종목−지수 N일수익률, 라이브 전용 체크〕). 사이징·시간손절은 엔진·백테스트 공용 헬퍼. TUNABLE 27개. **2026-06-10 코드리뷰 보강**: ①수급DB 일일증분(trade-journal 21시 묶음 3번째 명령 `-m sim.backfill_flow --pages 1 --force` — stale시 백테스트 수급게이트 중립화됨) ②일별 성과이력 `state/sim/equity_history.json`(EOD 덮어쓰기, ph=파라미터해시) ③당일 재진입 쿨다운(`Portfolio.last_exit`, backtest 동일) ④장중 거래량 하루치 환산(`vol_time_frac` — 이전엔 오전 돌파 불가). ⑤백테스트 체결 현실화(당일종가 판단→다음날 시가 체결 pending큐 + `BT_SLIPPAGE` 0.2% — 낙관분 ~5%p 제거) ⑥3분할 꾸준함 순위(`worst_ret` 1순위 — 한 구간 운빨 배제) ⑧**기준전략(M) 폐지**(2026-06-10 — scan_all 메인 패스 execute=False 판단전용·계좌 동결, 비교/매매는 변이 36개만, 메인 제외 규칙 삭제, 마킹 아이콘 6종 `favorites.json {아이콘:vid}`+`/fav_set`2026-06-11 ☆토글→아이콘 피커, 아이콘당 전략 1개〕, 관심종목 기본 시각=첫 마킹→1위) ⑦비교군 동기화는 **수동 전용**(2026-06-10 자동 동기화 끔 — sweep은 결과 파일만 갱신, 비교군 변경은 관리자님 명시 요청 시만 `python3 -m sim variants sync`. `sync_label_tops`=유형(~36종)별 1위 동기화, 동일params 계좌 유지. 백테스트 탭은 유형별 대표 읽기전용 요약, 수동 추가/제거·튜닝적용 버튼 제거). 잔여 한계: 검증 데이터가 여전히 ~1년 강세 위주(진짜 하락장 검증은 라이브 누적)·생존편향 universe(의도된 설계). 매수=돌파 즉시/눌림목 지정가, 매도=손절·2:1 후 트레일링·추세수급 이탈. 결과 `state/sim/`(portfolio.json·trades.jsonl·last_scan.json). 실주문 `orders/` 불가침. 일봉은 캐시 우선 읽기(ka10081 rate limit 회피). cwd=`agents/stock/workspace` |
| `sim-web` | 상시 (`KeepAlive`) | `python3 -m sim.sim_web serve` | 시뮬 대시보드 **별도 서버 포트 18792** (behive-web 18790과 분리). `sim.hyowons.net` → mac:18792 (Synology reverse proxy, **관리자님 수동 등록 대기**). Tailnet 한정 무인증. ⚠️ 18791은 node 점유라 18792. **5**: 계좌·관심종목·시장(지수/ADR/투자자)·튜닝(파라미터 저장 → `params.json`)·백테스트(스윕 순위표+적용). 읽기전용 원칙이나 `do_POST /save_params`만 쓰기. 시장 탭은 장중엔 네이버 m.stock 실시간(지수+상승하락·ADR·투자자 순매수, `_get_live_market` 60s 캐시), 장외엔 EOD jsonl 폴백 (2026-06-09: 이전엔 상승하락·투자자가 EOD 고정이라 장중 안 바뀌던 것 수정) | | `sim-web` | 상시 (`KeepAlive`) | `python3 -m sim.sim_web serve` | 시뮬 대시보드 **별도 서버 포트 18792** (behive-web 18790과 분리). `sim.hyowons.net` → mac:18792 (Synology reverse proxy, **관리자님 수동 등록 대기**). Tailnet 한정 무인증. ⚠️ 18791은 node 점유라 18792. **3**(2026-06-10~11 개편, 내계좌·튜닝 탭 삭제): **전략**(기본=비교만, 서브탭 버튼 없음 — 백테스트 순위표는 [📊 모의결과보기] 토글)·**관심종목**(전 전략 합산 상태그룹 + 시각 드롭다운 + 👁토스트 맨 위 '▶ 시각' 판단 표시)·**시장**(지수/ADR/투자자). 비교 행 표기: 순위배지 `N위` → 약세장대처 칩(회피/안정/적극 — 2026-06-11 '돌파'→'안정' 개명, 칩 클릭=설명 토스트) → 고유번호 `#N` → 짧은 유형명(`상승장·빠른·공격·추세추종`) → 마킹 아이콘(6종 ⭐🔥💎🎯👀🚀, **아이콘당 전략 1개**, `favorites.json {아이콘:vid}`, `/fav_set`). 펼침 body: 유형(ⓘ=시장적합)→약세장대처(ⓘ)→성적→모의평가(`btN위/36` — 약세모드 3형제는 같은 bt등수 공유). **108변이 = 유형36 × 약세모드3**(2026-06-10 풀매트릭스, v37/38=bt1위의 회피/적극 쌍 순서). 새로고침 탭 보존(라디오↔URL 동기화 + `Cache-Control: no-store`, 2026-06-11). 읽기전용 원칙, 쓰기는 `do_POST` save_params/run_sweep/variants_*/watch_*/fav_set만. 시장 탭은 장중엔 네이버 m.stock 실시간(지수+상승하락·ADR·투자자 순매수, `_get_live_market` 60s 캐시), 장외엔 EOD jsonl 폴백 (2026-06-09: 이전엔 상승하락·투자자가 EOD 고정이라 장중 안 바뀌던 것 수정) |
| (트리거 없음) | on-demand | `python3 -m sim {sweep\|backtest}` | 튜닝 비교용 백테스트 스윕. signals.py 재사용·과거 일봉 되감기. 9파라미터(RR·STOP·SMA·PULLBACK·VOLUME + RSI과열/과매도·시간손절·리스크비율) 1152조합 학습/검증 분리 → `state/sim/backtest_results.json`. ⚠️ 조합당 ~2.3s → 1152조합 44분(GRID 곱셈 폭발 주의). ⚠️ 종가체결·생존편향 → **상대순위**로만. 2026-06-09 스윕: 핵심 레버 `VOLUME_BREAKOUT=1.3`, 신규4종은 강세창선 미미(하락장 보험). 균형값 params.json 적용(RISK 0.01 유지). 수급은 `backfill_flow.py`(ka10059 다년치 → `flow_history.sqlite`, 2026-06-08 54종목 3만행 적재)로 반영됨(`flow_used:true`). 런타임 튜닝은 `params.json`이 config 기본값 오버라이드(엔진 매 스캔 새프로세스라 즉시 반영). **병렬 페이퍼**: `variants.json`+`state/sim/variants/<id>/` — 스윕 상위 튜닝을 각자 가상계좌로 실시간 동시 운영, 같은 라이브 시세에 다른 파라미터(애널 게이트까지 실반영), `variants_compare.json`→웹 비교 탭. `python3 -m sim variants seed N`. sim-scan이 매 스캔 메인+변이 함께 갱신 | | (트리거 없음) | on-demand | `python3 -m sim {sweep\|backtest}` | 튜닝 비교용 백테스트 스윕. signals.py 재사용·과거 일봉 되감기. 9파라미터(RR·STOP·SMA·PULLBACK·VOLUME + RSI과열/과매도·시간손절·리스크비율) 1152조합 학습/검증 분리 → `state/sim/backtest_results.json`. ⚡멀티프로세싱(2026-06-10 spawn, 워커=코어−2)+일봉/수급 프로세스 메모이즈 → 1152조합 44분→~5-7분. 데이터는 sqlite캐시 전용(키움API 0), 병목은 지표 재계산이라 캐싱 아닌 병렬화가 답. GRID 곱셈 폭발 주의. ⚠️ 종가체결·생존편향 → **상대순위**로만. 2026-06-09 스윕: 핵심 레버 `VOLUME_BREAKOUT=1.3`, 신규4종은 강세창선 미미(하락장 보험). 균형값 params.json 적용(RISK 0.01 유지). 수급은 `backfill_flow.py`(ka10059 다년치 → `flow_history.sqlite`, 2026-06-08 54종목 3만행 적재)로 반영됨(`flow_used:true`). 런타임 튜닝은 `params.json`이 config 기본값 오버라이드(엔진 매 스캔 새프로세스라 즉시 반영). **병렬 페이퍼**: `variants.json`+`state/sim/variants/<id>/` — 스윕 상위 튜닝을 각자 가상계좌로 실시간 동시 운영, 같은 라이브 시세에 다른 파라미터(애널 게이트까지 실반영), `variants_compare.json`→웹 비교 탭. `python3 -m sim variants seed N`. sim-scan이 매 스캔 메인+변이 함께 갱신 |
휴장일 self-skip·당일 평가손익 ground truth·3-탭 개편 배경은 일지(2026-05-04·05-06)와 `behive_web.py` 주석 참조. 사고 이력은 `memory/2026-05-07-behive-dup-mail.md` 등. 휴장일 self-skip·당일 평가손익 ground truth·3-탭 개편 배경은 일지(2026-05-04·05-06)와 `behive_web.py` 주석 참조. 사고 이력은 `memory/2026-05-07-behive-dup-mail.md` 등.
@@ -0,0 +1,66 @@
# Session: 2026-07-20 09:12:03 GMT+9
- **Session Key**: agent:stock:telegram:direct:8443122995
- **Session ID**: cb10d003-728f-4145-92ec-22ca9663e308
- **Source**: telegram
## Conversation Summary
user: Conversation info (untrusted metadata):
```json
{
"chat_id": "telegram:8443122995",
"message_id": "1064",
"sender_id": "8443122995",
"sender": "snowoyh bang",
"timestamp": "Mon 2026-07-20 09:11 GMT+9",
"inbound_event_kind": "user_request"
}
```
Sender (untrusted metadata):
```json
{
"label": "snowoyh bang (8443122995)",
"id": "8443122995",
"name": "snowoyh bang",
"username": "snowoyh"
}
```
Conversation context (untrusted, chronological, selected for current message):
#1048 Tue 2026-07-14 22:53 GMT+9 snowoyh bang: 당일종가랑 현재가가 달라
#1050 Tue 2026-07-14 22:54 GMT+9 snowoyh bang: 1928000은 무슨가격이야?
#1052 Tue 2026-07-14 22:57 GMT+9 snowoyh bang: 1941000이 종가고 현재가가 1928000으로 나와
관리자 가희 계좌 통틀어서 삼성전자 하이닉스 제외하고 계좌상태 고려해서 3천만원 예수금 만들려면 뭐를 파는세 좋아?
assistant: [assistant turn failed before producing content]
user: Conversation info (untrusted metadata):
```json
{
"chat_id": "telegram:8443122995",
"message_id": "1064",
"sender_id": "8443122995",
"sender": "snowoyh bang",
"timestamp": "Mon 2026-07-20 09:11 GMT+9",
"inbound_event_kind": "user_request"
}
```
Sender (untrusted metadata):
```json
{
"label": "snowoyh bang (8443122995)",
"id": "8443122995",
"name": "snowoyh bang",
"username": "snowoyh"
}
```
Conversation context (untrusted, chronological, selected for current message):
#1048 Tue 2026-07-14 22:53 GMT+9 snowoyh bang: 당일종가랑 현재가가 달라
#1050 Tue 2026-07-14 22:54 GMT+9 snowoyh bang: 1928000은 무슨가격이야?
#1052 Tue 2026-07-14 22:57 GMT+9 snowoyh bang: 1941000이 종가고 현재가가 1928000으로 나와
관리자 가희 계좌 통틀어서 삼성전자 하이닉스 제외하고 계좌상태 고려해서 3천만원 예수금 만들려면 뭐를 파는세 좋아?
assistant: ⚠️ Something went wrong while processing your request. Please try again, or use /new to start a fresh session.
@@ -0,0 +1,5 @@
{
"version": 1,
"bootstrapSeededAt": "2026-04-17T03:21:06.738Z",
"setupCompletedAt": "2026-04-17T05:20:30.244Z"
}
@@ -5,6 +5,7 @@
- 한국어, 존댓말, 관리자님 호칭. - 한국어, 존댓말, 관리자님 호칭.
- 4개 섹션 순서·제목 그대로 사용 (▣ 최근 가격 흐름 / ▣ 수급 해석 / ▣ 거래량·체결 강도 / ▣ 주의 포인트 / 리스크). - 4개 섹션 순서·제목 그대로 사용 (▣ 최근 가격 흐름 / ▣ 수급 해석 / ▣ 거래량·체결 강도 / ▣ 주의 포인트 / 리스크).
- 각 섹션 5문장 이상, 수치 근거 인용. - 각 섹션 5문장 이상, 수치 근거 인용.
- 각 섹션에서 가장 중요한 핵심 수치·키워드 1~2곳만 `**...**`로 감싸 강조하세요(붉은 글씨로 표시됨). 남발 금지 — 한 문장에 하나 이하, 정말 중요한 곳만.
- 비교업체(peers) 데이터는 종목의 기본정보(가격·PER/PBR/ROE 등 재무비율) 관련 맥락에서만 간단히 짚어주시고, 4개 분석 섹션(가격 흐름·수급·거래량·주의 포인트) 안에서는 비교 코멘트를 넣지 마세요. - 비교업체(peers) 데이터는 종목의 기본정보(가격·PER/PBR/ROE 등 재무비율) 관련 맥락에서만 간단히 짚어주시고, 4개 분석 섹션(가격 흐름·수급·거래량·주의 포인트) 안에서는 비교 코멘트를 넣지 마세요.
- 마지막에 한줄요약·투자의견 JSON을 정확한 형식으로 출력 (파서가 읽음). - 마지막에 한줄요약·투자의견 JSON을 정확한 형식으로 출력 (파서가 읽음).
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,341 @@
#!/usr/bin/env python3
"""미 연준 FOMC 회의 일정 → Google 캘린더 동기화 (조회+등록 전용).
출처: federalreserve.gov 공식 FOMC 일정표. 회의 날짜는 미 동부 기준 그대로 등록한다
(기존 수동 등록분·시황 자막 관례와 동일).
"""
from __future__ import annotations
import argparse
import json
import re
import subprocess
import urllib.request
from dataclasses import dataclass
from datetime import date, datetime, timedelta
from pathlib import Path
from zoneinfo import ZoneInfo
KST = ZoneInfo('Asia/Seoul')
ET = ZoneInfo('America/New_York')
CALENDAR_ID = 'mini.snowoyh@gmail.com'
WORKSPACE = Path('/Users/snowoyh/.openclaw/agents/stock/workspace')
STATE_DIR = WORKSPACE / 'state'
STATE_DIR.mkdir(parents=True, exist_ok=True)
STATE_FILE = STATE_DIR / 'fomc_calendar_sync.json'
SOURCE_URL = 'https://www.federalreserve.gov/monetarypolicy/fomccalendars.htm'
MONTHS = {
'january': 1, 'february': 2, 'march': 3, 'april': 4, 'may': 5, 'june': 6,
'july': 7, 'august': 8, 'september': 9, 'october': 10, 'november': 11, 'december': 12,
}
YEAR_PANEL_RE = re.compile(r'(\d{4})\s+FOMC\s+Meetings')
MEETING_ROW_RE = re.compile(
r'fomc-meeting__month[^>]*>\s*(?:<strong>)?(.*?)(?:</strong>)?\s*</div>'
r'.*?fomc-meeting__date[^>]*>\s*(.*?)\s*</div>',
re.S,
)
@dataclass
class Meeting:
start_date: date # 회의 시작 (미 동부)
end_date: date # 회의 종료 (미 동부, inclusive)
is_sep: bool
@property
def state_key(self) -> str:
# FOMC는 한 달에 두 번 열리지 않으므로 시작월이 고유 키
return f'{self.start_date:%Y-%m}'
@property
def summary(self) -> str:
base = f'[FOMC] {self.state_key} 회의'
return f'{base} (SEP)' if self.is_sep else base
@property
def announce_kst(self) -> datetime:
"""성명 발표 = 회의 마지막날 미 동부 14:00. 서머타임은 zoneinfo가 처리."""
et = datetime(self.end_date.year, self.end_date.month, self.end_date.day, 14, 0, tzinfo=ET)
return et.astimezone(KST)
@property
def cal_start(self) -> date:
return self.start_date
@property
def cal_end(self) -> date:
"""캘린더 이벤트 마지막날 = 발표일(KST). 미 동부 회의 종료 다음날이라
한국 장이 결과를 반영하는 날까지 일정이 덮인다."""
return self.announce_kst.date()
@property
def description(self) -> str:
if self.start_date == self.end_date:
days = self.start_date.isoformat()
else:
days = f'{self.start_date.isoformat()} ~ {self.end_date.isoformat()}'
lines = [
f'회의일(미 동부): {days}',
f'성명 발표: {self.announce_kst:%Y-%m-%d %H:%M} KST (한국 장 반영일)',
]
if self.is_sep:
lines.append('경제전망(SEP)·점도표 공개 회의')
lines.append(f'출처: {SOURCE_URL}')
return '\n'.join(lines)
def run(cmd: list[str]) -> str:
p = subprocess.run(cmd, capture_output=True, text=True)
if p.returncode != 0:
raise RuntimeError(p.stderr.strip() or p.stdout.strip() or 'command failed')
return p.stdout
def fetch(url: str) -> str:
req = urllib.request.Request(url, headers={'User-Agent': 'Mozilla/5.0'})
with urllib.request.urlopen(req, timeout=30) as r:
return r.read().decode('utf-8', 'ignore')
def parse_meetings(html: str, after: date) -> list[Meeting]:
"""연도 패널별로 회의 행을 훑어 캘린더 기간이 아직 안 끝난 회의만 반환.
기준을 회의 시작일이 아니라 `cal_end`(발표일 KST)로 두는 이유: 미 동부 회의가
끝났어도 한국 장 반영일이 남아 있으면 아직 관리 대상이다.
"""
panels = [(m.group(1), m.start()) for m in YEAR_PANEL_RE.finditer(html)]
if not panels:
return []
bounds = panels + [('', len(html))]
meetings: list[Meeting] = []
for (year_raw, start), (_, end) in zip(bounds[:-1], bounds[1:]):
year = int(year_raw)
if year < after.year:
continue
for row in MEETING_ROW_RE.finditer(html[start:end]):
month_txt = re.sub(r'<[^>]+>', '', row.group(1)).strip()
day_txt = re.sub(r'<[^>]+>', '', row.group(2)).strip()
m = parse_row(year, month_txt, day_txt)
if m and m.cal_end > after:
meetings.append(m)
meetings.sort(key=lambda m: m.start_date)
return meetings
def parse_row(year: int, month_txt: str, day_txt: str) -> Meeting | None:
"""'April/May' + '28-1*' 같은 월 경계 표기까지 처리."""
months = [MONTHS[p.strip().lower()] for p in month_txt.split('/') if p.strip().lower() in MONTHS]
if not months:
return None
is_sep = '*' in day_txt
days = [int(d) for d in re.findall(r'\d+', day_txt)]
if not days:
return None
start_month = months[0]
end_month = months[-1]
start_year = year
end_year = year if end_month >= start_month else year + 1 # 12월/1월 회의 대비
try:
start = date(start_year, start_month, days[0])
end = date(end_year, end_month, days[-1])
except ValueError:
return None
if end < start:
return None
return Meeting(start, end, is_sep)
def load_state() -> dict:
if STATE_FILE.exists():
try:
return json.loads(STATE_FILE.read_text())
except Exception:
return {}
return {}
def save_state(state: dict):
STATE_FILE.write_text(json.dumps(state, ensure_ascii=False, indent=2))
def state_key_from_summary(summary: str) -> str | None:
m = re.match(r'\[FOMC\]\s*(\d{4}-\d{2})\b', (summary or '').strip())
return m.group(1) if m else None
def fetch_existing_events(start_date: date, end_date: date) -> dict[str, list[dict]]:
start_dt = datetime(start_date.year, start_date.month, start_date.day, 0, 0, tzinfo=KST)
end_dt = datetime(end_date.year, end_date.month, end_date.day, 0, 0, tzinfo=KST)
out = run([
'gog', 'calendar', 'events', CALENDAR_ID,
'--from', start_dt.isoformat(), '--to', end_dt.isoformat(),
'--all-pages', '--max', '250', '--json'
])
data = json.loads(out)
existing: dict[str, list[dict]] = {}
for ev in data.get('events', []):
key = state_key_from_summary(ev.get('summary', ''))
if key:
existing.setdefault(key, []).append(ev)
return existing
def create_event(m: Meeting, dry_run: bool = False):
start = m.cal_start.isoformat()
end = (m.cal_end + timedelta(days=1)).isoformat() # 종일 이벤트의 end는 exclusive
if dry_run:
print(json.dumps({'create': m.summary, 'from': start, 'to': m.cal_end.isoformat()}, ensure_ascii=False))
return
# --event-color 미지정: 기존 이벤트에 지정된 색을 덮어쓰지 않는다
run([
'gog', 'calendar', 'create', CALENDAR_ID,
'--summary', m.summary,
'--description', m.description,
'--from', start,
'--to', end,
'--all-day',
])
def update_event(event_id: str, m: Meeting, dry_run: bool = False) -> str:
start = m.cal_start.isoformat()
end = (m.cal_end + timedelta(days=1)).isoformat()
if dry_run:
print(json.dumps({'update': m.summary, 'event_id': event_id, 'from': start, 'to': m.cal_end.isoformat()}, ensure_ascii=False))
return 'updated'
try:
run([
'gog', 'calendar', 'update', CALENDAR_ID, event_id,
'--summary', m.summary,
'--description', m.description,
'--from', start,
'--to', end,
'--all-day',
])
return 'updated'
except Exception:
run(['gog', 'calendar', 'delete', CALENDAR_ID, event_id, '--force', '--no-input'])
create_event(m, dry_run=False)
return 'recreated'
def delete_event(event_id: str, dry_run: bool = False):
if dry_run:
print(json.dumps({'delete_event_id': event_id}, ensure_ascii=False))
return
run(['gog', 'calendar', 'delete', CALENDAR_ID, event_id, '--force', '--no-input'])
def event_date_range(ev: dict) -> tuple[str, str]:
start_info = ev.get('start', {})
end_info = ev.get('end', {})
start = start_info.get('date') or start_info.get('dateTime', '')[:10]
end_excl = end_info.get('date') or end_info.get('dateTime', '')[:10]
end = ''
if end_excl:
end = (date.fromisoformat(end_excl) - timedelta(days=1)).isoformat()
return start, end
def main():
parser = argparse.ArgumentParser()
parser.add_argument('--dry-run', action='store_true')
parser.add_argument('--list', action='store_true', help='파싱 결과만 출력 (캘린더 미접근)')
args = parser.parse_args()
today = datetime.now(KST).date()
meetings = parse_meetings(fetch(SOURCE_URL), today)
if args.list:
print(json.dumps({
'today': today.isoformat(),
'total': len(meetings),
'meetings': [
{'key': m.state_key, 'summary': m.summary,
'meeting_et': f'{m.start_date.isoformat()}~{m.end_date.isoformat()}',
'announce_kst': m.announce_kst.strftime('%Y-%m-%d %H:%M'),
'cal_start': m.cal_start.isoformat(), 'cal_end': m.cal_end.isoformat()}
for m in meetings
],
}, ensure_ascii=False, indent=2))
return
state = load_state()
end_date = max((m.cal_end for m in meetings), default=today) + timedelta(days=1)
# 스크래핑 실패 시 기존 일정이 몰살되는 사고 방지 — meetings 비면 cleanup 스킵
# 조회 시작이 today인 건 오늘 걸쳐 있는 진행 중 회의도 갱신 대상이기 때문
existing = {} if not meetings else fetch_existing_events(today, end_date)
created, updated, recreated, deleted, duplicates_removed = [], [], [], [], []
unchanged = 0
changes = []
keys = {m.state_key for m in meetings}
for m in meetings:
existing_list = existing.get(m.state_key, [])
# 같은 키로 여러 건이면 가장 최근 created를 남기고 나머지 삭제
if len(existing_list) > 1:
existing_list.sort(key=lambda e: e.get('created', ''), reverse=True)
for dup in existing_list[1:]:
delete_event(dup['id'], dry_run=args.dry_run)
duplicates_removed.append(m.state_key)
changes.append({'key': m.state_key, 'action': 'duplicate_removed', 'event_id': dup['id']})
existing_ev = existing_list[0] if existing_list else None
if not existing_ev:
create_event(m, dry_run=args.dry_run)
created.append(m.state_key)
changes.append({'key': m.state_key, 'action': 'created',
'new_date': f'{m.cal_start.isoformat()}~{m.cal_end.isoformat()}'})
continue
existing_start, existing_end = event_date_range(existing_ev)
desired_start, desired_end = m.cal_start.isoformat(), m.cal_end.isoformat()
same_summary = (existing_ev.get('summary') or '').strip() == m.summary
same_desc = (existing_ev.get('description') or '').strip() == m.description.strip()
if existing_start != desired_start or existing_end != desired_end or not same_summary or not same_desc:
result = update_event(existing_ev['id'], m, dry_run=args.dry_run)
(recreated if result == 'recreated' else updated).append(m.state_key)
changes.append({'key': m.state_key, 'action': result,
'old_date': f'{existing_start}~{existing_end}',
'new_date': f'{desired_start}~{desired_end}'})
else:
unchanged += 1
# 연준 일정표에서 사라진 미래 회의는 캘린더에서도 삭제 (meetings 비면 existing이 빈 dict라 자동 스킵)
for key, existing_list in existing.items():
if key in keys:
continue
for stale in existing_list:
old_start, old_end = event_date_range(stale)
# 오늘 진행 중이거나 지난 회의는 parse 대상(오늘 이후)에서 빠져 있을 뿐이므로 삭제 금지
if old_start and old_start <= today.isoformat():
continue
delete_event(stale['id'], dry_run=args.dry_run)
deleted.append(key)
changes.append({'key': key, 'action': 'deleted', 'event_id': stale['id'],
'old_date': f'{old_start}~{old_end}'})
state['last_changes'] = changes
state['last_run_at'] = datetime.now(KST).isoformat()
if not args.dry_run:
save_state(state)
print(json.dumps({
'today': today.isoformat(), 'total_found': len(meetings),
'newly_created': len(created), 'updated': len(updated), 'recreated': len(recreated),
'deleted': len(deleted), 'duplicates_removed': len(duplicates_removed),
'unchanged': unchanged, 'dry_run': args.dry_run, 'changes': changes,
}, ensure_ascii=False))
if __name__ == '__main__':
main()
@@ -0,0 +1,449 @@
#!/usr/bin/env python3
"""투자원금(순입금) 집계 — 조회 전용.
투자원금 = 계좌 개설 이후 누적 입금 − 누적 출금. "내 돈 얼마 넣었나"이며,
`총 매입금액`(현재 보유종목 매입원가)이나 `예수금`(남은 현금)과 전혀 다른 값이다.
이 값이 있어야 `순자산 − 투자원금 = 진짜 총수익`(실현+미실현+배당)이 나온다.
키움 kt00018의 평가손익은 현재 보유분 미실현만 잡아 누적 실현손익·배당을 놓친다.
데이터원은 kt00016(일별계좌수익률상세현황)의 기간내총입금·총출금.
⚠️ kt00016은 **조회기간 1년 제한**이라 연도별 창으로 쪼개 누적한다.
캐시 `state/investment_principal.json`:
- frozen : 지난 연도 = 확정값. 한 번 적재 후 재조회 안 함 (0인 연도는 저장 생략)
- current: 올해 창(0101~오늘) 누적. 갱신 대상은 이것뿐 → 계좌당 1콜
- seen : 마지막 갱신 시점의 "당일 입출금" 스냅샷 — 이벤트 감지 기준
갱신은 별도 트리거 없이 behive_web 렌더 경로에서 이벤트로만 일어난다.
당일 입출금(이미 kt00015로 조회 중)이 seen과 다를 때만 올해 창을 재조회하므로
입출금 없는 평시에는 kt00016 호출이 0이다. 안전망으로 7일 초과 시 강제 갱신.
CLI: python3 scripts/investment_principal.py {bootstrap|refresh|show}
"""
from __future__ import annotations
import json
import os
import sys
import time
from contextlib import contextmanager
from datetime import datetime, timedelta, timezone
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parent))
import kiwoom_client as kc
KST = timezone(timedelta(hours=9))
WORKSPACE = Path('/Users/snowoyh/.openclaw/agents/stock/workspace')
STATE_FILE = WORKSPACE / 'state' / 'investment_principal.json'
# 부트스트랩 하한 연도. 계좌 개설 전 기간은 kt00016이 에러 없이 전 필드 0을 주므로
# 넉넉히 잡아도 안전하다 (현재 최고(最古) 계좌는 2018년 개설).
FLOOR_YEAR = 2010
PACE_SEC = 0.35 # 연속 조회 rate limit 페이싱
STALE_DAYS = 7 # 이벤트 감지가 못 잡은 경우의 안전망
# 적요에 이 중 하나가 들어가면 '내가 넣은/뺀 돈'(원금 반영), 아니면 투자 성과(원금 무관).
# 원금 반영 : 이체입금(지급결제)·이체오픈뱅킹입금·이체입금·대체입금·소액이체인증입금
# ·ISA가입인증입금 / 이체출금·대체출금
# 원금 무관 : 배당금입금·수익분배금입금·예탁금이용료(이자)입금·공모주환불금입금
# ·쿠폰현금지급(국내)입금·단주매각대금입금·대여수수료입금
# / 공모불입출금·청약수수료출금
# ⚠️ 추측이 아니라 실증된 규칙 — 이 분류의 합이 kt00016 기간내총입금/총출금과
# 4계좌 18개 (계좌,연도) 구간 전부에서 오차 0으로 일치했다(2026-07-29).
# 새 적요가 등장하면 reconciled=False로 드러나므로 조용히 틀리지 않는다.
_PRINCIPAL_RMRK_KEYS = ('이체', '대체', '인증')
def is_principal_flow(rmrk: str) -> bool:
"""적요가 투자원금에 반영되는 외부 입출금인지. 배당·이자 등은 False."""
return any(k in (rmrk or '') for k in _PRINCIPAL_RMRK_KEYS)
# ---- 캐시 I/O ----
@contextmanager
def _lock():
"""STATE_FILE 직렬화 — behive_web _stock_notes_lock 과 동일 패턴, 별도 lock 파일."""
import fcntl
lock_path = STATE_FILE.with_suffix(STATE_FILE.suffix + '.lock')
lock_path.parent.mkdir(parents=True, exist_ok=True)
f = open(lock_path, 'a')
try:
fcntl.flock(f.fileno(), fcntl.LOCK_EX)
yield
finally:
try:
fcntl.flock(f.fileno(), fcntl.LOCK_UN)
finally:
f.close()
def _load() -> dict | None:
"""캐시 로드. 파일 없거나 깨졌으면 None (호출측이 '미집계'로 처리)."""
if not STATE_FILE.exists():
return None
try:
d = json.loads(STATE_FILE.read_text())
except Exception:
return None
if not isinstance(d, dict) or 'current' not in d:
return None
d.setdefault('frozen', {})
d.setdefault('seen', {})
d['current'].setdefault('labels', {})
return d
def _save(d: dict) -> None:
d['refreshed_at'] = datetime.now(KST).isoformat(timespec='seconds')
STATE_FILE.parent.mkdir(parents=True, exist_ok=True)
tmp = STATE_FILE.with_suffix('.json.tmp')
tmp.write_text(json.dumps(d, ensure_ascii=False, indent=2))
os.replace(tmp, STATE_FILE)
# ---- 조회 ----
def _today_str() -> str:
return datetime.now(KST).strftime('%Y%m%d')
def _this_year() -> int:
return datetime.now(KST).year
def _window(year: int) -> tuple[str, str]:
"""연도별 조회 창. 올해는 오늘까지, 지난 연도는 12/31까지 (1년 제한 내)."""
if year == _this_year():
return f'{year}0101', _today_str()
return f'{year}0101', f'{year}1231'
def _fetch_year(label: str, year: int) -> dict:
"""한 (계좌, 연도) 창의 합계(kt00016) + 입출금 행(kt00015). 2콜.
flows 행의 `pr`은 원금 반영 여부. 분류 합이 kt00016 합계와 맞는지 `rec`에 남겨
새 적요가 등장해 분류가 어긋나면 화면에서 드러나게 한다.
"""
fr, to = _window(year)
r = kc.get_period_return(label, fr, to)
time.sleep(PACE_SEC)
try:
raw = kc.get_cash_flow(label, strt_dt=fr, end_dt=to)
except Exception as e:
sys.stderr.write(f'cash flow {label} {year} 실패: {e}\n')
raw = None
flows = None if raw is None else [
{'d': f['date'], 'io': f['io_tp'], 'amt': f['amount'],
'rk': f['rmrk'], 'pr': is_principal_flow(f['rmrk'])}
for f in raw
]
rec = None
if flows is not None:
pin = sum(f['amt'] for f in flows if f['io'] == 'IN' and f['pr'])
pout = sum(f['amt'] for f in flows if f['io'] == 'OUT' and f['pr'])
rec = (pin == r['cash_in'] and pout == r['cash_out'])
return {
'in': r['cash_in'], 'out': r['cash_out'],
'qin': r['qty_in'], 'qout': r['qty_out'],
'nf': r['net_fr'], 'nt': r['net_to'], 'pl': r['eval_pl'],
'flows': flows, 'rec': rec,
}
def _is_empty(y: dict) -> bool:
"""계좌 개설 전(또는 전면 무활동) 연도 — 저장 생략 대상."""
return not any(y[k] for k in ('in', 'out', 'qin', 'qout', 'nf', 'nt', 'pl'))
def _labels(labels: list[str] | None = None) -> list[str]:
all_lb = [a['label'] for a in kc.list_accounts()]
if labels is None:
return all_lb
wanted = set(labels)
return [lb for lb in all_lb if lb in wanted]
def _flow_totals(cash_flow_by_label: dict) -> dict:
"""behive_web의 kt00015 당일 입출금 → {label: {'in': n, 'out': n}}."""
out: dict[str, dict] = {}
for lb, flows in (cash_flow_by_label or {}).items():
ci = sum(f['amount'] for f in (flows or []) if f.get('io_tp') == 'IN')
co = sum(f['amount'] for f in (flows or []) if f.get('io_tp') == 'OUT')
out[lb] = {'in': ci, 'out': co}
return out
# ---- 공개 API ----
def bootstrap(labels: list[str] | None = None) -> dict:
"""FLOOR_YEAR ~ 올해 전수 조회로 캐시를 새로 만든다 (계좌×연도, 4×17≈68콜 ≈ 25초).
조기 종료 없음 — 잔고가 0으로 비었던 휴면 연도가 중간에 끼어도 그 앞 연도를 놓치지 않는다.
⚠️ 1회성 CLI 전용. 렌더 경로에서 절대 호출하지 말 것.
"""
lbs = _labels(labels)
this_year = _this_year()
frozen: dict[str, dict] = {}
current: dict[str, dict] = {}
for lb in lbs:
frozen[lb] = {}
for year in range(FLOOR_YEAR, this_year + 1):
y = _fetch_year(lb, year)
time.sleep(PACE_SEC)
if year == this_year:
current[lb] = y
elif not _is_empty(y):
frozen[lb][year_key(year)] = y
with _lock():
d = _load() or {}
d['frozen'] = {**(d.get('frozen') or {}), **frozen}
cur = d.get('current') or {}
if cur.get('year') != this_year:
cur = {'year': this_year, 'labels': {}}
cur['labels'] = {**(cur.get('labels') or {}), **current}
d['current'] = cur
d['seen'] = {**(d.get('seen') or {}), **_seen_now(lbs)}
_save(d)
return _load()
def year_key(year: int) -> str:
return str(year)
def _seen_now(labels: list[str]) -> dict:
"""현재 당일 입출금을 seen 형식으로. (CLI refresh/bootstrap 용 — kt00015 계좌당 1콜)"""
today = datetime.now(KST).strftime('%Y-%m-%d')
totals = _flow_totals(kc.get_cash_flow_all(None, labels))
return {lb: {'date': today, **totals.get(lb, {'in': 0, 'out': 0})} for lb in labels}
def refresh_current(labels: list[str], cash_flow_by_label: dict | None = None) -> None:
"""올해 창만 재조회 (라벨당 1콜) + 연도 롤오버 시 작년을 확정값으로 이관.
cash_flow_by_label: 호출측이 이미 들고 있는 kt00015 당일 입출금.
None이면 직접 조회. seen 기록에 쓴다 — kt00016 호출 **전** 시점의 값이어야
그 사이 들어온 입금이 seen에 앞서 반영돼 영구 미갱신되는 일이 없다.
"""
lbs = _labels(labels)
if not lbs:
return
if cash_flow_by_label is None:
seen = _seen_now(lbs)
else:
today = datetime.now(KST).strftime('%Y-%m-%d')
totals = _flow_totals(cash_flow_by_label)
seen = {lb: {'date': today, **totals.get(lb, {'in': 0, 'out': 0})} for lb in lbs}
this_year = _this_year()
with _lock():
d = _load()
if d is None:
return # 부트스트랩 전 — 렌더 경로를 68콜로 막지 않는다
cur = d['current']
prev_year = cur.get('year')
# 연도 롤오버: current에 담긴 작년치는 to_dt가 12/31이 아니라 미완결이므로
# 전체 창(0101~1231)으로 다시 받아 확정 이관한다.
if prev_year and prev_year != this_year:
for lb in lbs:
y = _fetch_year(lb, prev_year)
time.sleep(PACE_SEC)
if not _is_empty(y):
d['frozen'].setdefault(lb, {})[year_key(prev_year)] = y
cur = {'year': this_year, 'labels': {}}
for lb in lbs:
cur['labels'][lb] = _fetch_year(lb, this_year)
time.sleep(PACE_SEC)
cur['year'] = this_year
d['current'] = cur
d['seen'].update(seen)
_save(d)
def needs_refresh(labels: list[str], cash_flow_by_label: dict) -> bool:
"""올해 창 재조회가 필요한지 판정 — 순수 캐시 읽기(키움 콜 0).
캐시가 없으면 False — 부트스트랩 미실행 상태에서 페이지 로드를 68콜로 막지 않는다.
"""
d = _load()
if d is None:
return False
if d['current'].get('year') != _this_year():
return True
today = datetime.now(KST).strftime('%Y-%m-%d')
totals = _flow_totals(cash_flow_by_label)
for lb in labels:
if lb not in totals:
continue # owner 부분 갱신 — 조회 안 된 계좌는 판단 보류
s = d['seen'].get(lb) or {}
base = s if s.get('date') == today else {'in': 0, 'out': 0}
if totals[lb]['in'] != base.get('in', 0) or totals[lb]['out'] != base.get('out', 0):
return True
ts = d.get('refreshed_at')
if not ts:
return True
try:
age = datetime.now(KST) - datetime.fromisoformat(ts)
except Exception:
return True
return age > timedelta(days=STALE_DAYS)
def get_principal(labels: list[str]) -> dict:
"""캐시만 읽어 누적 원금 산출 (키움 콜 0).
반환 principal이 None이면 '미집계' — 요청 라벨 중 부트스트랩 안 된 계좌가 있다는 뜻.
(0으로 떨어뜨리면 그 계좌 입금이 조용히 빠져 원금이 과소계상된다.)
qty_flow=True는 주식 입출고(타사대체) 이력 — 현금 기준 원금이 과소계상됨을 알림.
by_label은 계좌별 순입금 {label: 원} — 자세히보기 토스트용.
"""
miss = {'principal': None, 'cash_in': None, 'cash_out': None,
'qty_flow': False, 'by_label': {}}
d = _load()
if d is None:
return miss
cur = d['current']['labels']
total_in = total_out = 0
qty_flow = False
by_label: dict[str, int] = {}
for lb in labels:
if lb not in cur:
return miss
recs = list((d['frozen'].get(lb) or {}).values()) + [cur[lb]]
lb_in = lb_out = 0
for y in recs:
lb_in += y.get('in', 0)
lb_out += y.get('out', 0)
qty_flow = qty_flow or bool(y.get('qin') or y.get('qout'))
by_label[lb] = lb_in - lb_out
total_in += lb_in
total_out += lb_out
return {
'principal': total_in - total_out,
'cash_in': total_in,
'cash_out': total_out,
'qty_flow': qty_flow,
'by_label': by_label,
}
def get_flows(labels: list[str]) -> dict:
"""입출금 내역 (최신순) — 캐시만 읽는다 (키움 콜 0).
반환:
- rows: [{date, io('IN'|'OUT'), amount, rmrk, principal(bool), label}] 최신순
- other_in / other_out: 원금 무관 입출금 합계 (배당·이자 등)
- reconciled: 전 구간에서 적요 분류 합이 kt00016 합계와 일치했는지
False면 새 적요가 등장해 분류가 어긋났다는 신호
- available: 내역이 캐시에 있는지 (부트스트랩 전 or 조회 실패 시 False)
"""
d = _load()
if d is None:
return {'rows': [], 'other_in': 0, 'other_out': 0,
'reconciled': True, 'available': False}
cur = d['current']['labels']
rows: list[dict] = []
reconciled = True
available = False
for lb in labels:
recs = list((d['frozen'].get(lb) or {}).values())
if lb in cur:
recs.append(cur[lb])
for y in recs:
flows = y.get('flows')
if flows is None:
continue
available = True
if y.get('rec') is False:
reconciled = False
for f in flows:
rows.append({'date': f['d'], 'io': f['io'], 'amount': f['amt'],
'rmrk': f['rk'], 'principal': f['pr'], 'label': lb})
rows.sort(key=lambda r: (r['date'], r['label']), reverse=True)
return {
'rows': rows,
'other_in': sum(r['amount'] for r in rows if r['io'] == 'IN' and not r['principal']),
'other_out': sum(r['amount'] for r in rows if r['io'] == 'OUT' and not r['principal']),
'reconciled': reconciled,
'available': available,
}
# ---- CLI ----
def _show() -> int:
d = _load()
if d is None:
print(f'캐시 없음: {STATE_FILE}\n → python3 scripts/investment_principal.py bootstrap')
return 1
from stock_portfolio_report import derive_owner
print(f'갱신: {d.get("refreshed_at")} (올해 창 {d["current"].get("year")})\n')
lbs = list(d['current']['labels'].keys())
bad = 0
for lb in lbs:
years = sorted((d['frozen'].get(lb) or {}).items())
years.append((year_key(d['current']['year']), d['current']['labels'][lb]))
print(f'===== {lb} =====')
tin = tout = 0
for yk, y in years:
# 항등식: 순자산초 + 입금 − 출금 + 평가손익 = 순자산말
err = y['nf'] + y['in'] - y['out'] + y['pl'] - y['nt']
bad += 1 if err else 0
tin += y['in']
tout += y['out']
q = f' 입고 {y["qin"]:,} 출고 {y["qout"]:,}' if (y['qin'] or y['qout']) else ''
nf = len(y.get('flows') or []) if y.get('flows') is not None else None
rc = {True: '분류OK', False: '분류불일치!', None: '내역없음'}[y.get('rec')]
print(f' {yk}: 입금 {y["in"]:>12,} 출금 {y["out"]:>11,} '
f'순자산 {y["nf"]:>12,}{y["nt"]:>12,} 손익 {y["pl"]:>12,} '
f'항등식오차 {err:,} 내역 {nf if nf is not None else "-":>3}{rc}{q}')
print(f' >> 누적 입금 {tin:,} 출금 {tout:,} = 순입금 {tin - tout:,}\n')
print('항등식 검증:', '전 행 오차 0 ✅' if not bad else f'⚠️ 오차 있는 행 {bad}')
fl = get_flows(lbs)
print(f'적요 분류 검증: {"전 구간 일치 ✅" if fl["reconciled"] else "⚠️ 불일치 구간 있음 — 새 적요 확인 필요"}'
f' (내역 {len(fl["rows"])}행, 원금무관 입금 {fl["other_in"]:,}원 / 출금 {fl["other_out"]:,}원)')
# 라이브 교차검증 — 원금 대비 총수익 vs 실제 순자산
print('\n===== 원금 대비 총수익 (라이브 교차검증) =====')
owners: dict[str, list[str]] = {}
for lb in lbs:
owners.setdefault(derive_owner(lb), []).append(lb)
for owner, olbs in owners.items():
pr = get_principal(olbs)
net = 0
for lb in olbs:
net += sum(p['evlt_amt'] for p in kc.get_positions(lb)) + kc.get_balance(lb)['d2_entra']
p = pr['principal']
ret = net - p
warn = ' ⚠️ 주식 입출고 있음(원금 과소계상)' if pr['qty_flow'] else ''
print(f'[{owner}] 투자원금 {p:,}원 (입금 {pr["cash_in"]:,} 출금 {pr["cash_out"]:,}){warn}')
print(f' 순자산 {net:,}원 → 총수익 {ret:+,}원 ({ret / p * 100:+.2f}%)' if p else ' 원금 0')
return 0 if not bad else 1
def main(argv: list[str]) -> int:
cmd = argv[1] if len(argv) > 1 else 'show'
if cmd == 'bootstrap':
lbs = _labels()
n = len(lbs) * (_this_year() - FLOOR_YEAR + 1)
print(f'{len(lbs)}계좌 × {_this_year() - FLOOR_YEAR + 1}년 = {n}콜 (약 {n * PACE_SEC:.0f}초)...')
bootstrap()
print(f'완료 → {STATE_FILE}\n')
return _show()
if cmd == 'refresh':
refresh_current(_labels())
print(f'올해 창 갱신 완료 → {STATE_FILE}\n')
return _show()
if cmd == 'show':
return _show()
print(__doc__)
return 2
if __name__ == '__main__':
raise SystemExit(main(sys.argv))
+146 -11
View File
@@ -13,9 +13,12 @@
from __future__ import annotations from __future__ import annotations
import json import json
import http.client
import socket
import sys import sys
import threading import threading
import time import time
import urllib.error
import urllib.request import urllib.request
from datetime import datetime, timezone, timedelta from datetime import datetime, timezone, timedelta
from pathlib import Path from pathlib import Path
@@ -32,9 +35,11 @@ ENDPOINT_ACNT = '/api/dostk/acnt'
ENDPOINT_STKINFO = '/api/dostk/stkinfo' ENDPOINT_STKINFO = '/api/dostk/stkinfo'
ENDPOINT_MRKCOND = '/api/dostk/mrkcond' # 시세(market condition) — ka10004 호가 등 ENDPOINT_MRKCOND = '/api/dostk/mrkcond' # 시세(market condition) — ka10004 호가 등
ENDPOINT_CHART = '/api/dostk/chart' # 차트 — ka10081 일봉 ENDPOINT_CHART = '/api/dostk/chart' # 차트 — ka10081 일봉
ENDPOINT_RKINFO = '/api/dostk/rkinfo' # 순위정보 — ka10023 거래량급증, ka90009 외인기관매매상위
TR_DEPOSIT = 'kt00001' # 예수금상세현황요청 TR_DEPOSIT = 'kt00001' # 예수금상세현황요청
TR_ACNT_EVAL = 'kt00004' # 계좌평가현황요청 (acnt_nm·brch_nm 포함) TR_ACNT_EVAL = 'kt00004' # 계좌평가현황요청 (acnt_nm·brch_nm 포함)
TR_TRUST_TRADE = 'kt00015' # 위탁종합거래내역요청 (tp='1' 입출금 — 당일 추가입금/인출 추출용) TR_TRUST_TRADE = 'kt00015' # 위탁종합거래내역요청 (tp='1' 입출금 — 당일 추가입금/인출 추출용)
TR_ACNT_RETURN = 'kt00016' # 일별계좌수익률상세현황요청 (기간내총입금·총출금 — 투자원금 산출용)
TR_POSITIONS = 'kt00018' # 계좌평가잔고내역요청 (종목별 상세, 수수료·세금 포함) TR_POSITIONS = 'kt00018' # 계좌평가잔고내역요청 (종목별 상세, 수수료·세금 포함)
TR_TRADE_DIARY = 'ka10170' # 당일매매일지요청 (round-trip·풀매도 포함, 잔고에 없는 거래도 잡힘) TR_TRADE_DIARY = 'ka10170' # 당일매매일지요청 (round-trip·풀매도 포함, 잔고에 없는 거래도 잡힘)
TR_ORDER_EXEC = 'kt00007' # 계좌별주문체결내역상세 (주문번호·시각·체결가·체결수량 단위, REST/영웅문 출처 구분) TR_ORDER_EXEC = 'kt00007' # 계좌별주문체결내역상세 (주문번호·시각·체결가·체결수량 단위, REST/영웅문 출처 구분)
@@ -47,6 +52,8 @@ TR_MINUTE_CHART = 'ka10080' # 주식분봉차트조회 (1/3/5/10/15/30/45/60분
TR_INVESTOR_FLOW = 'ka10059' # 종목별투자자기관별 (외국인·기관 일별 매매) TR_INVESTOR_FLOW = 'ka10059' # 종목별투자자기관별 (외국인·기관 일별 매매)
STOCK_CODES_CACHE = STATE_DIR / 'stock_codes.json' STOCK_CODES_CACHE = STATE_DIR / 'stock_codes.json'
_HTTP_TRANSIENT_RETRIES = 2
_HTTP_TRANSIENT_BACKOFF_SEC = 0.8
def load_credentials() -> dict: def load_credentials() -> dict:
@@ -85,6 +92,15 @@ def _http_post_full(url: str, body: dict, headers: dict | None = None) -> tuple[
if headers: if headers:
h.update(headers) h.update(headers)
req = urllib.request.Request(url, data=data, method='POST', headers=h) req = urllib.request.Request(url, data=data, method='POST', headers=h)
transient_errors = (
ConnectionResetError,
TimeoutError,
socket.timeout,
urllib.error.URLError,
http.client.RemoteDisconnected,
http.client.IncompleteRead,
)
for attempt in range(_HTTP_TRANSIENT_RETRIES + 1):
try: try:
with urllib.request.urlopen(req, timeout=15) as r: with urllib.request.urlopen(req, timeout=15) as r:
resp_headers = {k.lower(): v for k, v in r.headers.items()} resp_headers = {k.lower(): v for k, v in r.headers.items()}
@@ -92,6 +108,12 @@ def _http_post_full(url: str, body: dict, headers: dict | None = None) -> tuple[
except urllib.error.HTTPError as e: except urllib.error.HTTPError as e:
body_text = e.read().decode('utf-8', 'ignore') body_text = e.read().decode('utf-8', 'ignore')
raise RuntimeError(f'HTTP {e.code} {url}: {body_text}') from e raise RuntimeError(f'HTTP {e.code} {url}: {body_text}') from e
except transient_errors:
if attempt >= _HTTP_TRANSIENT_RETRIES:
raise
time.sleep(_HTTP_TRANSIENT_BACKOFF_SEC * (attempt + 1))
raise RuntimeError(f'HTTP POST failed unexpectedly: {url}')
def _token_cache_path(label: str) -> Path: def _token_cache_path(label: str) -> Path:
@@ -410,25 +432,39 @@ def get_trade_journal_all(base_dt: str | None = None, labels: list[str] | None =
return {a['label']: get_trade_journal(a['label'], base_dt) for a in accs} return {a['label']: get_trade_journal(a['label'], base_dt) for a in accs}
def get_cash_flow(account_label: str, base_dt: str | None = None) -> list[dict]: def get_cash_flow(account_label: str, base_dt: str | None = None,
"""당일 입출금 내역 (kt00015 tp='1'). strt_dt: str | None = None, end_dt: str | None = None) -> list[dict]:
"""입출금 내역 (kt00015 tp='1').
base_dt: YYYYMMDD (None이면 KST 오늘). 시작/종료 동일 → 그날치만. base_dt: YYYYMMDD (None이면 KST 오늘). 시작/종료 동일 → 그날치만.
strt_dt/end_dt: 둘 다 주면 기간 조회 (base_dt 무시).
⚠️ **조회기간 1년 제한** — 넘기면 `[2000](501058:조회기간은 1년 이내로만 가능합니다.)`.
다년치는 연도별로 쪼개 호출한다 (investment_principal.py 참조).
tp='1'(입출금)·gds_tp='0'(전체)로 매매·환전 등은 제외. KRW만 필터. tp='1'(입출금)·gds_tp='0'(전체)로 매매·환전 등은 제외. KRW만 필터.
⚠️ tp='1' 입금에는 **배당금·예탁금이용료(이자)·수익분배금·공모주환불금·단주매각대금**이
섞여 들어온다. 이건 '내가 넣은 돈'이 아니므로 투자원금 합산에 그대로 쓰면 과대계상된다.
kt00016의 기간내총입금/총출금은 이걸 이미 제외한 순수 외부 이체액이다 (전 계좌·연도 실증).
적요 기준 분류는 `investment_principal.is_principal_flow`.
반환 행: 반환 행:
- date: 'YYYYMMDD' (trde_dt)
- time: 'HH:MM:SS' (proc_tm 앞 8자리) - time: 'HH:MM:SS' (proc_tm 앞 8자리)
- io_tp: 'IN' | 'OUT' - io_tp: 'IN' | 'OUT'
- amount: 거래금액 (원, 양수) - amount: 거래금액 (원, 양수)
- signed: +amount (입금) / -amount (출금) — 합산으로 net cash flow 산출 - signed: +amount (입금) / -amount (출금) — 합산으로 net cash flow 산출
- rmrk: 적요명 (예: '타사대체입금', '은행이체출금') - rmrk: 적요명 (예: '이체입금(지급결제)', '배당금입금', '이체출금')
- balance: 거래 후 예수금잔고 (entra_remn) - balance: 거래 후 예수금잔고 (entra_remn)
""" """
if strt_dt and end_dt:
fr, to = strt_dt, end_dt
else:
if base_dt is None: if base_dt is None:
base_dt = datetime.now(KST).strftime('%Y%m%d') base_dt = datetime.now(KST).strftime('%Y%m%d')
fr = to = base_dt
body = { body = {
'strt_dt': base_dt, 'strt_dt': fr,
'end_dt': base_dt, 'end_dt': to,
'tp': '1', 'tp': '1',
'stk_cd': '', 'stk_cd': '',
'crnc_cd': '', 'crnc_cd': '',
@@ -457,6 +493,7 @@ def get_cash_flow(account_label: str, base_dt: str | None = None) -> list[dict]:
continue continue
proc_tm = (it.get('proc_tm') or '').strip() proc_tm = (it.get('proc_tm') or '').strip()
out.append({ out.append({
'date': (it.get('trde_dt') or '').strip(),
'time': proc_tm[:8], 'time': proc_tm[:8],
'io_tp': io_tp, 'io_tp': io_tp,
'amount': amount, 'amount': amount,
@@ -476,6 +513,38 @@ def get_cash_flow_all(base_dt: str | None = None, labels: list[str] | None = Non
return {a['label']: get_cash_flow(a['label'], base_dt) for a in accs} return {a['label']: get_cash_flow(a['label'], base_dt) for a in accs}
def get_period_return(account_label: str, fr_dt: str, to_dt: str) -> dict:
"""기간 계좌수익률 상세 (kt00016) — 기간내 총입금·총출금 포함.
⚠️ **조회기간 1년 제한** — 넘기면 `[2000](505221:조회기간은 1년이내로만 가능합니다.)`.
전체기간 투자원금은 연도별 창으로 쪼개 누적해야 한다 (investment_principal.py 참조).
⚠️ 응답의 `invt_bsamt`는 "투자원금**평잔**"(기간 평균잔고)이라 누적 투자원금이 아니다 —
이름이 비슷해 오용하기 쉬우니 반환하지 않는다. 누적 원금은 cash_in cash_out.
계좌 개설 전 기간은 에러 없이 전 필드 0으로 응답한다.
항등식 `net_fr + cash_in cash_out + eval_pl == net_to` 가 성립 (자체 검증용).
반환:
- cash_in/cash_out: 기간내 총입금/총출금 (원)
- qty_in/qty_out: 기간내 총입고/총출고 (주식 대체 — 0이 아니면 현금 기준 원금이 과소계상)
- net_fr/net_to: 순자산액계 기초/기말
- eval_pl: 평가손익
"""
resp = _call(account_label, TR_ACNT_RETURN, {'fr_dt': fr_dt, 'to_dt': to_dt})
return {
'label': account_label,
'cash_in': _to_int(resp.get('termin_tot_trns')), # 기간내총입금
'cash_out': _to_int(resp.get('termin_tot_pymn')), # 기간내총출금
'qty_in': _to_int(resp.get('termin_tot_inq')), # 기간내총입고
'qty_out': _to_int(resp.get('termin_tot_outq')), # 기간내총출고
'net_fr': _to_int(resp.get('tot_amt_fr')), # 순자산액계_초
'net_to': _to_int(resp.get('tot_amt_to')), # 순자산액계_말
'eval_pl': _to_int(resp.get('evltv_prft')), # 평가손익
'raw': resp,
}
def get_order_executions(account_label: str, base_dt: str | None = None) -> list[dict]: def get_order_executions(account_label: str, base_dt: str | None = None) -> list[dict]:
"""계좌별 주문체결내역 (kt00007) — 주문번호·시각 단위 행 리스트. """계좌별 주문체결내역 (kt00007) — 주문번호·시각 단위 행 리스트.
@@ -615,6 +684,11 @@ def get_open_orders(account_label: str, code: str = '',
'order_price': _to_int(it.get('ord_pric')), 'order_price': _to_int(it.get('ord_pric')),
'unfilled_qty': _to_int(it.get('oso_qty')), 'unfilled_qty': _to_int(it.get('oso_qty')),
'order_type': (it.get('trde_tp') or '').strip(), 'order_type': (it.get('trde_tp') or '').strip(),
# 스톱지정가(trde_tp=28) 주문의 조건단가. 일반 주문은 0.
# 실측 확인: ka10075 응답에 stop_pric 로 실려 온다 (2026-07-30).
'stop_price': _to_int(it.get('stop_pric')),
# 현재가 — 조건단가까지 얼마 남았는지 계산용. 부호 포함 문자열('-4805')이라 abs.
'cur_price': abs(_to_int(it.get('cur_prc'))),
'exchange': (it.get('stex_tp_txt') or '').strip(), 'exchange': (it.get('stex_tp_txt') or '').strip(),
'exchange_code': ex_code, 'exchange_code': ex_code,
'routing_suffix': _EXCHANGE_CODE_TO_SUFFIX.get(ex_code, ''), 'routing_suffix': _EXCHANGE_CODE_TO_SUFFIX.get(ex_code, ''),
@@ -722,11 +796,13 @@ def get_stock_quote(code: str, account_label: str | None = None, exchange: str =
} }
WATCHLIST_BATCH_MAX = 40 # ka10095 한 콜 종목 수 한도 — 초과 시 "허용된 요청 개수 초과[1634]" (2026-06-17, universe 120개에서 발견)
def get_watchlist_quotes(codes: list[str], account_label: str | None = None, def get_watchlist_quotes(codes: list[str], account_label: str | None = None,
exchange: str = 'AL') -> dict[str, dict]: exchange: str = 'AL') -> dict[str, dict]:
"""ka10095 관심종목정보요청 — 다종목 시세 batch (한 콜로 N개). """ka10095 관심종목정보요청 — 다종목 시세 batch. 종목 수가 한도(WATCHLIST_BATCH_MAX) 초과 시 자동 분할 호출.
19종목 ~0.05s. ka10001×N 대비 rate limit 영향 없음.
반환: {clean_code: {price, change, change_pct, name}}. 빈 codes면 빈 dict. 반환: {clean_code: {price, change, change_pct, name}}. 빈 codes면 빈 dict.
""" """
clean_codes = [_clean_code(c) for c in codes if c] clean_codes = [_clean_code(c) for c in codes if c]
@@ -734,8 +810,16 @@ def get_watchlist_quotes(codes: list[str], account_label: str | None = None,
return {} return {}
label = account_label or _default_account_label() label = account_label or _default_account_label()
suffix = f'_{exchange}' if exchange in ('NX', 'AL') else '' suffix = f'_{exchange}' if exchange in ('NX', 'AL') else ''
stk_cd_param = '|'.join(f'{c}{suffix}' for c in clean_codes) out: dict[str, dict] = {}
for i in range(0, len(clean_codes), WATCHLIST_BATCH_MAX):
chunk = clean_codes[i:i + WATCHLIST_BATCH_MAX]
stk_cd_param = '|'.join(f'{c}{suffix}' for c in chunk)
resp = _call(label, TR_WATCHLIST_INFO, {'stk_cd': stk_cd_param}, endpoint=ENDPOINT_STKINFO) resp = _call(label, TR_WATCHLIST_INFO, {'stk_cd': stk_cd_param}, endpoint=ENDPOINT_STKINFO)
out.update(_parse_watchlist_rows(resp))
return out
def _parse_watchlist_rows(resp: dict) -> dict[str, dict]:
out: dict[str, dict] = {} out: dict[str, dict] = {}
for row in resp.get('atn_stk_infr') or []: for row in resp.get('atn_stk_infr') or []:
raw_code = (row.get('stk_cd') or '').strip() raw_code = (row.get('stk_cd') or '').strip()
@@ -754,11 +838,16 @@ def get_watchlist_quotes(codes: list[str], account_label: str | None = None,
'high': abs(_to_int(row.get('high_pric') or '0')), 'high': abs(_to_int(row.get('high_pric') or '0')),
'low': abs(_to_int(row.get('low_pric') or '0')), 'low': abs(_to_int(row.get('low_pric') or '0')),
'volume': _to_int(row.get('trde_qty') or '0'), 'volume': _to_int(row.get('trde_qty') or '0'),
# 거래소가 계산한 가격제한폭. 기준가(전일종가)로 정해져 장중 불변.
# 제한폭은 기준가의 호가단위로 절사한 뒤 ±하는 규칙이라 직접 계산하면
# ETF·가격대별 호가단위 표를 재현해야 해 틀릴 여지가 있다 → 응답값 그대로 쓴다.
'upper_limit': abs(_to_int(row.get('upl_pric') or '0')),
'lower_limit': abs(_to_int(row.get('lst_pric') or '0')),
} }
return out return out
def get_quote_book(code: str, account_label: str | None = None) -> dict: def get_quote_book(code: str, account_label: str | None = None) -> dict: # noqa: E302
"""주식호가 조회 (ka10004) — 10단계 매도/매수 호가 + 잔량. """주식호가 조회 (ka10004) — 10단계 매도/매수 호가 + 잔량.
매매 아님 — 조회 전용. 호가창 표시·체결 가능성 판단에 사용. 매매 아님 — 조회 전용. 호가창 표시·체결 가능성 판단에 사용.
@@ -948,18 +1037,21 @@ def get_daily_candles(code: str, count: int = 250, base_dt: str | None = None,
def get_minute_candles(code: str, tic_scope: int = 5, today_only: bool = True, def get_minute_candles(code: str, tic_scope: int = 5, today_only: bool = True,
account_label: str | None = None) -> list[dict]: account_label: str | None = None, exchange: str = 'KRX') -> list[dict]:
"""주식 분봉 차트 (ka10080). 수정주가 기준. """주식 분봉 차트 (ka10080). 수정주가 기준.
tic_scope: 1/3/5/10/15/30/45/60 분. 한 호출에 ~900봉 (5분봉 ≈ 11일치). tic_scope: 1/3/5/10/15/30/45/60 분. 한 호출에 ~900봉 (5분봉 ≈ 11일치).
today_only: True 면 오늘 봉만 추출. today_only: True 면 오늘 봉만 추출.
exchange: 'KRX'=KRX 단독(기본) / 'NX'=NXT 단독 / 'AL'=통합(KRX→NXT 연속).
NX/AL은 stk_cd에 suffix를 붙여 NXT 시간대(15:30~20:00)에도 분봉이 이어진다.
반환: 시간 오름차순 list of dict — {date, time, open, high, low, close, volume} 반환: 시간 오름차순 list of dict — {date, time, open, high, low, close, volume}
date='YYYYMMDD', time='HHMMSS'. date='YYYYMMDD', time='HHMMSS'.
""" """
label = account_label or _default_account_label() label = account_label or _default_account_label()
suffix = f'_{exchange}' if exchange in ('NX', 'AL') else ''
body = { body = {
'stk_cd': _clean_code(code), 'stk_cd': _clean_code(code) + suffix,
'tic_scope': str(tic_scope), 'tic_scope': str(tic_scope),
'upd_stkpc_tp': '1', 'upd_stkpc_tp': '1',
} }
@@ -1051,6 +1143,49 @@ def _load_code_cache() -> dict:
return {} return {}
def get_volume_surge(account_label: str | None = None, market: str = '000',
min_qty: str = '50') -> list[dict]:
"""거래량 급증 종목 (ka10023). 급증률 정렬·ETF+ETN+스팩 제외·5천원↑·KRX.
반환 [{code, name, price, flu_rt(등락률%), surge_rt(급증률%)}] — 조회 전용."""
label = account_label or _default_account_label()
body = {'mrkt_tp': market, 'sort_tp': '2', 'tm_tp': '2', 'trde_qty_tp': min_qty,
'tm': '', 'stk_cnd': '20', 'pric_tp': '6', 'stex_tp': '1'} # stk_cnd 20=ETF+ETN+스팩제외
resp = _call(label, 'ka10023', body, ENDPOINT_RKINFO)
out = []
for x in resp.get('trde_qty_sdnin', []) or []:
code = _clean_code(x.get('stk_cd', ''))
if not code:
continue
out.append({'code': code, 'name': x.get('stk_nm', ''),
'price': abs(_to_int(x.get('cur_prc'))),
'flu_rt': _to_float(x.get('flu_rt')),
'surge_rt': _to_float(x.get('sdnin_rt'))})
return out
def get_foreign_inst_netbuy(account_label: str | None = None, market: str = '000',
date: str | None = None) -> dict:
"""외국인·기관 순매수 상위 (ka90009). 금액(천만) 기준.
반환 {'foreign': [{code,name,amt}], 'inst': [{code,name,amt}]} — 조회 전용."""
label = account_label or _default_account_label()
if not date:
date = datetime.now(KST).strftime('%Y%m%d')
body = {'mrkt_tp': market, 'amt_qty_tp': '1', 'qry_dt_tp': '1', 'date': date, 'stex_tp': '1'}
resp = _call(label, 'ka90009', body, ENDPOINT_RKINFO)
rows = resp.get('frgnr_orgn_trde_upper', []) or []
foreign, inst = [], []
for x in rows:
fc = _clean_code(x.get('for_netprps_stk_cd', ''))
if fc:
foreign.append({'code': fc, 'name': x.get('for_netprps_stk_nm', ''),
'amt': _to_int(x.get('for_netprps_amt'))})
ic = _clean_code(x.get('orgn_netprps_stk_cd', ''))
if ic:
inst.append({'code': ic, 'name': x.get('orgn_netprps_stk_nm', ''),
'amt': _to_int(x.get('orgn_netprps_amt'))})
return {'foreign': foreign, 'inst': inst}
def refresh_stock_codes(account_label: str | None = None) -> dict: def refresh_stock_codes(account_label: str | None = None) -> dict:
"""ka10099로 KOSPI+KOSDAQ 전체 상장종목 리스트 캐싱. 페이지네이션 처리. """ka10099로 KOSPI+KOSDAQ 전체 상장종목 리스트 캐싱. 페이지네이션 처리.
@@ -50,6 +50,11 @@ def _pct(p: float, digits: int = 2) -> str:
return f'{sign}{p:.{digits}f}%' return f'{sign}{p:.{digits}f}%'
def _num(p) -> str:
"""계단 비율 표기 — 10.0 은 '10', 10.5 는 '10.5' 로. 불필요한 .0 을 지운다."""
return f'{float(p or 0):g}'
def format_card(request: dict, market_data: dict, card_id: str, def format_card(request: dict, market_data: dict, card_id: str,
estimate: Optional[dict] = None, estimate: Optional[dict] = None,
budget_conversion: Optional[dict] = None, budget_conversion: Optional[dict] = None,
@@ -66,6 +71,10 @@ def format_card(request: dict, market_data: dict, card_id: str,
type_marker = f' {cfg["warning_emoji"]} 시장가' type_marker = f' {cfg["warning_emoji"]} 시장가'
elif request['order_type'] == 'AGGRESSIVE_LIMIT': elif request['order_type'] == 'AGGRESSIVE_LIMIT':
type_marker = f' {cfg["warning_emoji"]} 공격적 지정가' type_marker = f' {cfg["warning_emoji"]} 공격적 지정가'
elif request['order_type'] == 'STOP_LIMIT':
type_marker = f' {cfg["warning_emoji"]} 스톱지정가(예약)'
elif request['order_type'] == 'TRAILING_STOP':
type_marker = f' {cfg["warning_emoji"]} 트레일링 스톱(예약)'
amend_marker = ' ✏️ 수정됨' if amended else '' amend_marker = ' ✏️ 수정됨' if amended else ''
lines = [f'{side_emoji} {_md_bold(side_word + " 미리보기")} [#{card_id}]{type_marker}{spouse_marker}{amend_marker}', ''] lines = [f'{side_emoji} {_md_bold(side_word + " 미리보기")} [#{card_id}]{type_marker}{spouse_marker}{amend_marker}', '']
@@ -83,6 +92,41 @@ def format_card(request: dict, market_data: dict, card_id: str,
ratio = (request['price'] - market_data['prev_close']) / market_data['prev_close'] * 100 ratio = (request['price'] - market_data['prev_close']) / market_data['prev_close'] * 100
price_part += f' (전일종가 {_pct(ratio)})' price_part += f' (전일종가 {_pct(ratio)})'
lines.append(f'{marker} 가격: {price_part}') lines.append(f'{marker} 가격: {price_part}')
elif request['order_type'] == 'STOP_LIMIT':
stop_p = request.get('stop_price') or 0
cur = market_data.get('current_price')
cur_part = f' (현재가 {_money(cur)})' if cur else ''
lines.append(f'{marker} 조건: {_md_bold(_money(stop_p) + " 도달 시")}{cur_part}')
lines.append(f'{marker} 매도가격: {_md_bold(_money(request["price"]))} (지정가)')
elif request['order_type'] == 'TRAILING_STOP':
# 승인 대상은 "계단 정의" — 각 계단의 조건단가는 고점이 오르면 제 하락률을 유지하며
# 함께 따라 올라간다. 계단이 1개면 종전의 단일 트레일링과 같다.
cur = market_data.get('current_price')
cur_part = f' (현재가 {_money(cur)})' if cur else ''
# 초기 고점은 항상 등록 시점 현재가 — 과거 고점 기준 옵션은 2026-07-30 제거됨.
peak_v = request.get('trail_peak') or 0
steps = request.get('trail_steps') or []
lines.append(f'{marker} 시작 고점: {_md_bold(_money(peak_v))} (등록 시점){cur_part}')
min_sell = request.get('min_sell_price')
if min_sell:
# 최저 매도가가 손절선을 결정했는지(=트레일보다 높았는지) 명시 — 둘 중 어느 게
# 지배했는지 안 보이면 관리자님이 값을 잘못 읽는다.
tied = sum(1 for s in steps if s.get('floor_applied'))
who = f'{tied}개 계단 적용' if tied else '미적용 (트레일이 더 높음)'
lines.append(f'{marker} 최저 매도가: {_md_bold(_money(min_sell))} ({who})')
lines.append('')
lines.append(f'{marker} 매도 계단 {len(steps)}')
for s in steps:
cum = s.get('cum', 0)
cum_part = '전량' if cum >= 100 else f'누적 {_num(cum)}%'
lines.append(f' {s["n"]}단계 {_num(s["pct"])}% '
f'{_md_bold(_money(s["cond_uv"]) + " 도달")}'
f'{s["qty"]:,}주 ({cum_part})')
rest = request['qty'] - sum(s['qty'] for s in steps)
if rest > 0:
lines.append(f' ↳ 나머지 {rest:,}주는 스톱 없음 (계속 보유)')
lines.append('')
lines.append(f'{marker} 고점이 오르면 계단이 통째로 따라 올라갑니다 (내려가지 않음)')
elif request['order_type'] == 'MARKET': elif request['order_type'] == 'MARKET':
lines.append(f'{marker} 가격: {_md_bold("시장가")}') lines.append(f'{marker} 가격: {_md_bold("시장가")}')
else: else:
@@ -153,6 +197,47 @@ def format_card(request: dict, market_data: dict, card_id: str,
return '\n'.join(lines) return '\n'.join(lines)
def format_card_multi(legs: list, side: str, symbol: str, symbol_name: str,
order_type: str, price: Optional[int], card_id: str,
state_warning: Optional[str] = None) -> str:
"""복수 계좌 동시 주문 카드 — 레그별 계좌·수량·예상회수 나열.
legs: [{'account': str, 'qty': int, 'position_qty': int?}, ...]
"""
cfg = _limits()['card']
side_word = '매수' if side == 'BUY' else '매도'
side_emoji = cfg['buy_emoji'] if side == 'BUY' else cfg['sell_emoji']
marker = cfg['highlight_marker']
spouse_marker = ' 🔐 가희 계좌' if any(_is_spouse(l['account']) for l in legs) else ''
type_marker = f' {cfg["warning_emoji"]} 시장가' if order_type == 'MARKET' else ''
lines = [f'{side_emoji} {_md_bold(side_word + " 미리보기")} [#{card_id}]{type_marker}{spouse_marker}'
f' · 계좌 {len(legs)}개 동시', '']
lines.append(f'{marker} {_md_bold(side_word)}')
lines.append(f'{marker} 종목: {_md_bold(symbol_name)} ({symbol})')
if state_warning:
lines.append(state_warning)
if order_type == 'LIMIT':
lines.append(f'{marker} 가격: {_md_bold(_money(price))}')
else:
lines.append(f'{marker} 가격: {_md_bold("시장가")}')
lines.append('')
total = 0
for l in legs:
part = f'{marker} {_md_bold(_account_display(l["account"]))}: {l["qty"]:,}'
if l.get('position_qty'):
part += f' (보유 {l["position_qty"]:,}주)'
if order_type == 'LIMIT' and price:
part += f'{_money(price * l["qty"])}'
total += price * l['qty']
lines.append(part)
if order_type == 'LIMIT' and price:
money_label = '예상 금액 합계' if side == 'BUY' else '예상 회수 합계'
lines.append(f'{money_label}: {_money(total)}')
lines.append(f'{_limits()["pin"]["expiry_seconds"]}초 후 만료')
return '\n'.join(lines)
def format_pin_message(pin: str) -> str: def format_pin_message(pin: str) -> str:
return pin return pin
@@ -174,6 +259,40 @@ def format_submitted(card_id: str, side: str, symbol_name: str, qty: int,
return f'📨 [#{card_id}] {side_word} 접수: {symbol_name} {qty:,}주 @ {price_str}\n주문번호: {ord_no}' return f'📨 [#{card_id}] {side_word} 접수: {symbol_name} {qty:,}주 @ {price_str}\n주문번호: {ord_no}'
def format_trailing_submitted(info: dict) -> str:
"""트레일링 계단 접수 결과 — 몇 단이 걸렸고 감시가 붙었는지를 한 화면에 담는다.
계단 일부만 접수될 있어(레그 독립 제출) 성공·실패를 나란히 적는다.
실패분을 요약해 버리면 방어선이 개인지 모르는 채로 남게 된다.
"""
placed = info.get('placed') or []
failed = info.get('failed') or []
acct = _account_display(info.get('account', ''))
head = '🧪 [모의] 트레일링' if info.get('dry_run') else '✅ 트레일링'
lines = [f'{head} {len(placed)}단 등록: {info["symbol_name"]}',
f'[{acct}] 총 {info["total_qty"]:,}주 · 시작 고점 {_money(info["peak"])}']
if info.get('min_sell_price'):
lines.append(f'최저 매도가 {_money(info["min_sell_price"])}')
for s in placed:
cum = s.get('cum', 0)
cum_part = '전량' if cum >= 100 else f'누적 {_num(cum)}%'
no = f' · 주문 {s["ord_no"]}' if s.get('ord_no') else ''
lines.append(f'{s["n"]}단계 {_num(s["pct"])}% {_money(s["cond_uv"])} 도달 → '
f'{s["qty"]:,}주 ({cum_part}){no}')
rest = info['total_qty'] - sum(s['qty'] for s in placed)
if rest > 0:
lines.append(f'↳ 나머지 {rest:,}주는 스톱 없음 (계속 보유)')
for s in failed:
lines.append(f'⚠️ {s["n"]}단계 {_num(s["pct"])}% {s["qty"]:,}주 접수 실패 '
f'({s.get("reason")}) {s.get("error", "")}'.rstrip())
if info.get('register_error'):
lines.append('⚠️ 주문은 접수됐지만 트레일링 등록 실패 — 손절선이 따라 올라가지 않습니다. '
f'({info["register_error"]})')
elif info.get('res_id'):
lines.append(f'감시 시작 ({info["res_id"]}) — 고점이 오르면 계단이 함께 올라갑니다')
return '\n'.join(lines)
def format_expired(card_id: str, side: str) -> str: def format_expired(card_id: str, side: str) -> str:
side_word = '매수' if side == 'BUY' else '매도' side_word = '매수' if side == 'BUY' else '매도'
return f'⏱️ [#{card_id}] 승인 만료. {side_word}가 취소되었습니다.' return f'⏱️ [#{card_id}] 승인 만료. {side_word}가 취소되었습니다.'
@@ -251,6 +370,10 @@ def format_card_locked(active: Optional[dict] = None) -> str:
price_str = '시장가' price_str = '시장가'
elif order_type == 'AGGRESSIVE_LIMIT': elif order_type == 'AGGRESSIVE_LIMIT':
price_str = f'공격적 지정가 {_money(price)}' if price else '공격적 지정가' price_str = f'공격적 지정가 {_money(price)}' if price else '공격적 지정가'
elif order_type == 'TRAILING_STOP':
steps = active.get('trail_steps') or []
pcts = '/'.join(f'{_num(s["pct"])}%' for s in steps)
price_str = f'트레일링 {len(steps)}{pcts} (1단계 손절 {_money(active.get("stop_price"))})'
else: else:
price_str = _money(price) if price is not None else '지정가' price_str = _money(price) if price is not None else '지정가'
@@ -156,21 +156,37 @@ def collect_market_data(account_label: str, symbol: str, side: str, qty: int) ->
'stock_meta': stock_meta, 'stock_meta': stock_meta,
} }
try:
open_orders = kc.get_open_orders(account_label)
except Exception:
open_orders = []
if side == 'BUY': if side == 'BUY':
try: try:
bal = kc.get_balance(account_label) bal = kc.get_balance(account_label)
md['balance_d2'] = _to_int(bal.get('d2_entra')) d2 = _to_int(bal.get('d2_entra'))
# d2_entra는 미체결 매수 지정가로 묶인 예수금을 아직 포함 → 실제 가용액에서 차감.
locked = sum(_to_int(o.get('order_price')) * _to_int(o.get('unfilled_qty'))
for o in open_orders
if o.get('side') == 'BUY' and _to_int(o.get('order_price')) > 0)
md['balance_d2'] = max(0, d2 - locked)
except Exception: except Exception:
md['balance_d2'] = 0 md['balance_d2'] = 0
else: else:
try: try:
positions = kc.get_positions(account_label) positions = kc.get_positions(account_label)
md['position_qty'] = next( pos = next((p for p in positions
(_to_int(p.get('trde_able_qty') or p.get('qty') or p.get('hold_qty') or p.get('rmnd_qty'))
for p in positions
if (p.get('code') == symbol) or (p.get('symbol') == symbol) or (p.get('stk_cd') == symbol)), if (p.get('code') == symbol) or (p.get('symbol') == symbol) or (p.get('stk_cd') == symbol)),
0, None)
) if pos:
hold = _to_int(pos.get('qty') or pos.get('hold_qty') or pos.get('rmnd_qty'))
trde_able = _to_int(pos.get('trde_able_qty') or hold)
pend_sell = sum(_to_int(o.get('unfilled_qty')) for o in open_orders
if o.get('side') == 'SELL' and o.get('code') == symbol)
# trde_able이 미체결 매도 제외 여부 불확실 → min으로 이중차감 방지 (check 핸들러와 동일).
md['position_qty'] = max(0, min(trde_able, hold - pend_sell))
else:
md['position_qty'] = 0
except Exception: except Exception:
md['position_qty'] = 0 md['position_qty'] = 0
@@ -503,7 +503,8 @@ def validate_request(request: dict, market_data: dict) -> Result:
return r return r
if request['side'] not in ('BUY', 'SELL'): if request['side'] not in ('BUY', 'SELL'):
return Result.REJECT('INVALID_SIDE', f'잘못된 방향: {request["side"]}') return Result.REJECT('INVALID_SIDE', f'잘못된 방향: {request["side"]}')
if request['order_type'] not in ('LIMIT', 'MARKET', 'AGGRESSIVE_LIMIT'): if request['order_type'] not in ('LIMIT', 'MARKET', 'AGGRESSIVE_LIMIT', 'STOP_LIMIT',
'TRAILING_STOP'):
return Result.REJECT('INVALID_ORDER_TYPE', f'잘못된 주문방식: {request["order_type"]}') return Result.REJECT('INVALID_ORDER_TYPE', f'잘못된 주문방식: {request["order_type"]}')
r = validate_trading_hours(market_data['now'], market_data.get('is_holiday', False), r = validate_trading_hours(market_data['now'], market_data.get('is_holiday', False),
market_data.get('nxt_eligible', False)) market_data.get('nxt_eligible', False))
@@ -525,6 +526,28 @@ def validate_request(request: dict, market_data: dict) -> Result:
market_data['upper_limit'], market_data['lower_limit']) market_data['upper_limit'], market_data['lower_limit'])
if not r.ok: if not r.ok:
return r return r
if request['order_type'] in ('STOP_LIMIT', 'TRAILING_STOP'):
# 스톱지정가: 지정가(체결가)·조건단가(트리거) 둘 다 가격제한 이내 + 매도 전용.
# 보호매도(하락 시 매도)라 트리거는 현재가보다 낮아야 함 — 아니면 즉시 발동돼 스톱 의미 없음.
# 트레일링도 키움엔 스톱지정가로 나가므로 같은 검증을 받는다 (조건단가는 자동 계산값).
if request['side'] != 'SELL':
return Result.REJECT('STOP_SELL_ONLY', '스톱지정가는 현재 매도만 지원')
stop_price = request.get('stop_price')
if not stop_price or stop_price <= 0:
return Result.REJECT('STOP_PRICE_REQUIRED', '조건단가(트리거 가격)를 입력하세요')
r = validate_price_band(request['side'], request['price'],
market_data['upper_limit'], market_data['lower_limit'])
if not r.ok:
return r
r = validate_price_band(request['side'], stop_price,
market_data['upper_limit'], market_data['lower_limit'])
if not r.ok:
return r
cur = market_data.get('current_price') or 0
if cur and stop_price >= cur:
return Result.REJECT('STOP_TRIGGER_NOT_BELOW',
f'조건단가 {stop_price:,}원 ≥ 현재가 {cur:,}원 — '
f'하락 시 매도(스톱)는 현재가보다 낮게 설정해야 함')
if request['side'] == 'BUY': if request['side'] == 'BUY':
basis = None basis = None
if request['order_type'] == 'MARKET': if request['order_type'] == 'MARKET':
@@ -35,7 +35,7 @@ if str(_PARENT) not in sys.path:
import kiwoom_client as kc # noqa: E402 import kiwoom_client as kc # noqa: E402
from . import card, datasource, fill_watcher, guards, kiwoom_order, ledger, pin, sidecar # noqa: E402 from . import card, datasource, fill_watcher, guards, kiwoom_order, ledger, pin, sidecar, trailing # noqa: E402
LIMITS_FILE = Path(__file__).resolve().parent / 'limits.json' LIMITS_FILE = Path(__file__).resolve().parent / 'limits.json'
OPENCLAW_CONFIG = Path.home() / '.openclaw' / 'openclaw.json' OPENCLAW_CONFIG = Path.home() / '.openclaw' / 'openclaw.json'
@@ -164,16 +164,58 @@ def propose_trade(
price: Optional[int] = None, price: Optional[int] = None,
routing_force: Optional[str] = None, routing_force: Optional[str] = None,
budget: Optional[int] = None, budget: Optional[int] = None,
stop_price: Optional[int] = None,
trail_steps: Optional[list] = None,
min_sell_price: Optional[int] = None,
) -> dict: ) -> dict:
sidecar.guard_or_raise() sidecar.guard_or_raise()
_sweep_expired_and_notify() _sweep_expired_and_notify()
if order_type not in ('LIMIT', 'MARKET', 'AGGRESSIVE_LIMIT'): if order_type not in ('LIMIT', 'MARKET', 'AGGRESSIVE_LIMIT', 'STOP_LIMIT', 'TRAILING_STOP'):
return {'ok': False, return {'ok': False,
'message': card.format_rejected('INVALID_ORDER_TYPE', f'잘못된 주문방식: {order_type}')} 'message': card.format_rejected('INVALID_ORDER_TYPE', f'잘못된 주문방식: {order_type}')}
if side not in ('BUY', 'SELL'): if side not in ('BUY', 'SELL'):
return {'ok': False, return {'ok': False,
'message': card.format_rejected('INVALID_SIDE', f'잘못된 방향: {side}')} 'message': card.format_rejected('INVALID_SIDE', f'잘못된 방향: {side}')}
if order_type == 'STOP_LIMIT':
if side != 'SELL':
return {'ok': False,
'message': card.format_rejected('STOP_SELL_ONLY', '스톱지정가는 현재 매도만 지원')}
if not price or price <= 0 or not stop_price or stop_price <= 0:
return {'ok': False,
'message': card.format_rejected('STOP_INPUT',
'스톱지정가는 지정가와 조건단가(트리거)가 모두 필요')}
norm_steps = None
if order_type == 'TRAILING_STOP':
# 트레일링은 계단 정의(하락률·누적 비중)만 입력받고, 계단별 조건단가·지정가·주수는
# 현재가와 보유수량 기준으로 자동 계산한다 (md 수집 후).
if side != 'SELL':
return {'ok': False,
'message': card.format_rejected('STOP_SELL_ONLY', '트레일링 스톱은 매도 전용')}
try:
norm_steps = trailing.normalize_steps(trail_steps or [])
except (ValueError, KeyError, TypeError) as e:
return {'ok': False,
'message': card.format_rejected('TRAIL_STEPS', f'계단 정의 오류: {e}')}
if budget is not None:
# 계단별 주수는 보유수량을 나눠 만든다 — 예산 환산이 끼면 기준이 두 개가 된다.
return {'ok': False,
'message': card.format_rejected('TRAIL_BUDGET',
'트레일링은 수량으로만 지정 (예산 환산 불가)')}
if min_sell_price is not None and min_sell_price <= 0:
return {'ok': False,
'message': card.format_rejected('TRAIL_MIN_PRICE',
'최저 매도가는 0보다 커야 함 (제한 없으면 비우세요)')}
dup = trailing.find_by_symbol(account, symbol)
if dup:
dup_steps = dup.get('steps') or []
top_uv = max((s['cond_uv'] for s in dup_steps), default=0)
return {'ok': False,
'message': card.format_rejected(
'TRAIL_DUPLICATE',
f'{symbol_name or symbol} 트레일링 예약이 이미 있음 '
f'({dup["id"]} · {len(dup_steps)}단 · 1단계 손절 {top_uv:,}원) '
f'— 먼저 취소하세요')}
if budget is not None and qty is not None: if budget is not None and qty is not None:
return {'ok': False, return {'ok': False,
'message': card.format_rejected('AMBIGUOUS_INPUT', 'message': card.format_rejected('AMBIGUOUS_INPUT',
@@ -186,6 +228,46 @@ def propose_trade(
# collect_market_data 의 잔고/보유 조회는 qty 와 무관. # collect_market_data 의 잔고/보유 조회는 qty 와 무관.
md = datasource.collect_market_data(account, symbol, side, qty or 0) md = datasource.collect_market_data(account, symbol, side, qty or 0)
trail_final = None
trail_peak = None
if order_type == 'TRAILING_STOP':
# 현재가를 못 받으면 손절선을 정할 수 없어 진행 불가 (호가 fallback 금지 — 기준이 흔들림).
cur = md.get('current_price') or 0
if cur <= 0:
return {'ok': False,
'message': card.format_rejected('TRAIL_NO_PRICE',
'현재가를 못 받아 트레일링 손절선을 정할 수 없음')}
# 초기 고점은 등록 시점 현재가로 고정. 과거 고점(52주·매수후)을 쓰면 손절선이 현재가
# 위로 올라가 등록 즉시 발동한다 — 손실 종목은 아예 등록 불가, 이익 종목은 현재가와
# 결과가 같아 옵션 자체를 제거했다(2026-07-30 실측 근거로 관리자님 결정).
trail_peak = cur
try:
leveled = trailing.compute_step_levels(trail_peak, norm_steps, min_sell_price)
except ValueError as e:
return {'ok': False, 'message': card.format_rejected('TRAIL_LEVEL', str(e))}
# 계단별 주수 배분. 수량이 적어 0주가 된 계단은 발주할 수 없으니 떨어낸다 —
# 단계 번호(n)는 그대로 두어 "몇 단계가 빠졌는지" 가 카드에서 보이게 한다.
qtys = trailing.allocate_step_qty(qty, [s['weight'] for s in norm_steps])
trail_final = [dict(s, qty=q) for s, q in zip(leveled, qtys) if q > 0]
if not trail_final:
return {'ok': False,
'message': card.format_rejected(
'TRAIL_QTY', f'{qty:,}주로는 계단을 나눌 수 없음 — 수량을 늘리거나 계단을 줄이세요')}
# 가장 얕은 계단이 제일 먼저 발동한다. 이게 현재가 이상이면 등록하는 순간 터진다.
# 고점=현재가로 고정된 뒤로는 최저 매도가가 현재가보다 높은 경우만 남는다
# (트레일 폭은 항상 현재가 아래로 내려감).
top = trail_final[0]
if top['cond_uv'] >= cur:
if top['floor_applied']:
msg = (f'최저 매도가 {min_sell_price:,}원이 현재가 {cur:,}원보다 높아 '
f'등록 즉시 발동됩니다 — 현재가보다 낮게 설정하세요')
else:
msg = (f'1단계 손절선 {top["cond_uv"]:,}원이 현재가 {cur:,}원 이상이라 '
f'등록 즉시 발동됩니다')
return {'ok': False, 'message': card.format_rejected('TRAIL_IMMEDIATE', msg)}
price = top['ord_uv']
stop_price = top['cond_uv']
budget_conversion = None budget_conversion = None
if budget is not None: if budget is not None:
conv = guards.convert_budget_to_qty(side, budget, md.get('orderbook'), conv = guards.convert_budget_to_qty(side, budget, md.get('orderbook'),
@@ -211,6 +293,13 @@ def propose_trade(
} }
if order_type == 'LIMIT': if order_type == 'LIMIT':
request['price'] = price request['price'] = price
elif order_type in ('STOP_LIMIT', 'TRAILING_STOP'):
request['price'] = price
request['stop_price'] = stop_price
if order_type == 'TRAILING_STOP':
request['trail_steps'] = trail_final
request['min_sell_price'] = min_sell_price
request['trail_peak'] = trail_peak
r = guards.validate_request(request, md) r = guards.validate_request(request, md)
if not r.ok: if not r.ok:
@@ -254,6 +343,15 @@ def propose_trade(
'account': account, 'side': side, 'symbol': symbol, 'symbol_name': symbol_name, 'account': account, 'side': side, 'symbol': symbol, 'symbol_name': symbol_name,
'qty': qty, 'price': final_price, 'order_type': order_type, 'routing_suffix': suffix, 'qty': qty, 'price': final_price, 'order_type': order_type, 'routing_suffix': suffix,
} }
if order_type == 'STOP_LIMIT':
payload['stop_price'] = stop_price
elif order_type == 'TRAILING_STOP':
# 승인 시점에 확정되는 것: 계좌·종목·계단별 수량·하락률·최저 매도가.
# 이후 감시 루프는 계단별 조건단가만 올린다 (수량·계단 구성은 불변).
payload['stop_price'] = stop_price
payload['trail_steps'] = trail_final
payload['trail_peak'] = trail_peak
payload['min_sell_price'] = min_sell_price
try: try:
pending = _pin_store.issue(account, payload) pending = _pin_store.issue(account, payload)
@@ -280,6 +378,117 @@ def propose_trade(
} }
def propose_trade_multi(
legs: list,
side: str,
symbol: str,
symbol_name: str,
order_type: str,
price: Optional[int] = None,
) -> dict:
"""복수 계좌 동시 주문 — 같은 종목·방향·가격을 여러 계좌에서 카드 1장 + PIN 1개로.
legs: [{'account': str, 'qty': int}, ...] (2 이상)
거래 모달 '두 계좌 모두 매도' 진입점. SELL + LIMIT/MARKET 지원.
레그별 검증은 propose_trade 동일 경로(collect_market_data + validate_request),
하나라도 거부면 전체 거부. PIN 형식 일관성을 위해 같은 소유자 그룹 계좌만 허용.
"""
sidecar.guard_or_raise()
_sweep_expired_and_notify()
if side != 'SELL':
return {'ok': False,
'message': card.format_rejected('INVALID_SIDE', '복수 계좌 동시 주문은 매도만 지원')}
if order_type not in ('LIMIT', 'MARKET'):
return {'ok': False,
'message': card.format_rejected('INVALID_ORDER_TYPE', f'잘못된 주문방식: {order_type}')}
if not legs or len(legs) < 2:
return {'ok': False,
'message': card.format_rejected('INVALID_LEGS', '계좌 2개 이상 필요')}
accounts = [str(l.get('account') or '') for l in legs]
if len(set(accounts)) != len(accounts):
return {'ok': False,
'message': card.format_rejected('INVALID_LEGS', '계좌 중복')}
limits = _limits()
owners, spouses = set(limits['owner_accounts']), set(limits['spouse_accounts'])
if not (all(a in owners for a in accounts) or all(a in spouses for a in accounts)):
return {'ok': False,
'message': card.format_rejected('INVALID_LEGS', '같은 소유자 그룹 계좌만 동시 주문 가능')}
validated = []
state_warning = None
suffix = None
for leg in legs:
account = leg['account']
try:
qty = int(leg.get('qty') or 0)
except (TypeError, ValueError):
qty = 0
if qty <= 0:
return {'ok': False,
'message': card.format_rejected('MISSING_QTY', f'[{account}] 수량 필요')}
md = datasource.collect_market_data(account, symbol, side, qty)
request = {'account': account, 'side': side, 'symbol': symbol,
'symbol_name': symbol_name, 'qty': qty, 'order_type': order_type}
if order_type == 'LIMIT':
request['price'] = price
r = guards.validate_request(request, md)
if not r.ok:
ledger.append('rejected', {'account': account, 'side': side, 'symbol': symbol,
'qty': qty, 'price': price, 'reason': r.code,
'message': r.message, 'multi': True})
return {'ok': False, 'message': card.format_rejected(r.code, f'[{account}] {r.message}')}
state_eval = guards.evaluate_stock_state(md.get('stock_meta'))
if not state_eval['result'].ok:
sr = state_eval['result']
ledger.append('rejected', {'account': account, 'side': side, 'symbol': symbol,
'qty': qty, 'price': price, 'reason': sr.code,
'message': sr.message, 'multi': True,
'stock_state': state_eval['state'],
'order_warning': state_eval['order_warning']})
return {'ok': False, 'message': card.format_rejected(sr.code, sr.message)}
if state_eval['warning']:
state_warning = state_eval['warning']
if suffix is None:
suffix = guards.determine_routing(md['now'], md['nxt_eligible'], None)
validated.append({'account': account, 'qty': qty,
'position_qty': md.get('position_qty', 0)})
payload = {
'multi': True,
'side': side, 'symbol': symbol, 'symbol_name': symbol_name,
'order_type': order_type, 'price': price, 'routing_suffix': suffix,
'legs': [{'account': v['account'], 'qty': v['qty']} for v in validated],
# 단일 payload 필드(account/qty)를 읽는 경로(format_card_locked 등) 호환용 요약
'account': '+'.join(accounts),
'qty': sum(v['qty'] for v in validated),
}
try:
pending = _pin_store.issue(accounts[0], payload)
except RuntimeError:
active = _pin_store.peek()
info = _active_card_info(active) if active else None
return {'ok': False, 'message': card.format_card_locked(info)}
card_msg = card.format_card_multi(validated, side, symbol, symbol_name, order_type,
price, pending.card_id, state_warning)
pin_msg = card.format_pin_message(pending.pin)
ledger.append('card_issued', {'card_id': pending.card_id, **payload})
ledger.append('pin_issued', {'card_id': pending.card_id, 'account': accounts[0],
'pin_length': len(pending.pin)})
return {
'ok': True,
'card_id': pending.card_id,
'card_message': card_msg,
'pin_message': pin_msg,
'expiry_seconds': pending.expiry_seconds,
'is_spouse': pending.account_label in spouses,
}
def propose_and_send(account, side, symbol, symbol_name, qty, order_type, def propose_and_send(account, side, symbol, symbol_name, qty, order_type,
price=None, routing_force=None, budget=None) -> dict: price=None, routing_force=None, budget=None) -> dict:
"""propose_trade 후 카드+PIN 을 텔레그램에 분리 발송. skill / launchd 진입점용.""" """propose_trade 후 카드+PIN 을 텔레그램에 분리 발송. skill / launchd 진입점용."""
@@ -325,6 +534,11 @@ def submit_with_pin(pin_input: str, dry_run: bool = True) -> dict:
p = card_obj.payload p = card_obj.payload
ledger.append('approved', {'card_id': card_obj.card_id, **p}) ledger.append('approved', {'card_id': card_obj.card_id, **p})
if p.get('multi'):
return _submit_multi_legs(card_obj, dry_run)
if p['order_type'] == 'TRAILING_STOP':
return _submit_trailing_steps(card_obj, dry_run)
submit_order_type = 'LIMIT' if p['order_type'] == 'AGGRESSIVE_LIMIT' else p['order_type'] submit_order_type = 'LIMIT' if p['order_type'] == 'AGGRESSIVE_LIMIT' else p['order_type']
res = kiwoom_order.submit( res = kiwoom_order.submit(
account_label=p['account'], account_label=p['account'],
@@ -336,6 +550,7 @@ def submit_with_pin(pin_input: str, dry_run: bool = True) -> dict:
routing_suffix=p['routing_suffix'], routing_suffix=p['routing_suffix'],
dry_run=dry_run, dry_run=dry_run,
card_id=card_obj.card_id, card_id=card_obj.card_id,
stop_price=p.get('stop_price'),
) )
if res['ok']: if res['ok']:
@@ -346,9 +561,9 @@ def submit_with_pin(pin_input: str, dry_run: bool = True) -> dict:
msg = card.format_submitted(card_obj.card_id, p['side'], msg = card.format_submitted(card_obj.card_id, p['side'],
p.get('symbol_name', p['symbol']), p.get('symbol_name', p['symbol']),
p['qty'], p.get('price'), ord_no) p['qty'], p.get('price'), ord_no)
if ord_no:
# 키움에서 ord_no 받으면 백그라운드 체결 추적 시작 (kt00007 폴링). # 키움에서 ord_no 받으면 백그라운드 체결 추적 시작 (kt00007 폴링).
# 부분체결·완전체결·사후거절·30분 미체결 시 텔레그램 자동 알림. # 부분체결·완전체결·사후거절·30분 미체결 시 텔레그램 자동 알림.
if ord_no:
fill_watcher.watch( fill_watcher.watch(
ord_no=ord_no, account=p['account'], side=p['side'], ord_no=ord_no, account=p['account'], side=p['side'],
symbol=p['symbol'], symbol_name=p.get('symbol_name', p['symbol']), symbol=p['symbol'], symbol_name=p.get('symbol_name', p['symbol']),
@@ -361,6 +576,131 @@ def submit_with_pin(pin_input: str, dry_run: bool = True) -> dict:
'detail': res} 'detail': res}
def _submit_trailing_steps(card_obj, dry_run: bool) -> dict:
"""트레일링 계단 카드 — 계단마다 스톱주문을 내고 예약 1건으로 묶어 등록한다.
키움엔 스톱지정가(trde_tp=28) 나간다 트레일링은 우리 개념이다.
얕은 계단(먼저 발동할 )부터 접수해, 중간에 막히더라도 가장 가까운 방어선이 먼저 걸리게 한다.
레그가 실패해도 나머지는 계속 시도하고, 접수된 레그만 예약에 등록한다. 이미 나간 주문을
되돌리지 않는 이유는 취소 자체도 실패할 있어 상태가 불분명해지기 때문이다
대신 단이 걸리고 단이 실패했는지를 메시지에 그대로 드러낸다.
fill_watcher 걸지 않는다. 스톱 예약은 조건 도달까지 미체결로 남는 정상이라
30 미체결 알림이 오탐이 된다 생존·체결 감시는 trailing_monitor 담당한다.
"""
p = card_obj.payload
steps = p.get('trail_steps') or []
name = p.get('symbol_name', p['symbol'])
placed, failed, details = [], [], []
for s in steps:
res = kiwoom_order.submit(
account_label=p['account'],
side='SELL',
symbol=p['symbol'],
qty=s['qty'],
price=s['ord_uv'],
order_type='STOP_LIMIT',
routing_suffix=p['routing_suffix'],
dry_run=dry_run,
card_id=card_obj.card_id,
stop_price=s['cond_uv'],
)
details.append(res)
if res['ok']:
# dry_run 은 주문번호가 없다 — 예약 등록 없이 접수될 내용만 확인한다.
placed.append(dict(s, ord_no=res.get('ord_no', '')))
else:
failed.append(dict(s, reason=res.get('reason', 'UNKNOWN'),
error=str(res.get('error', ''))))
if not placed:
return {'ok': False,
'message': card.format_rejected(
(failed[0]['reason'] if failed else 'UNKNOWN'),
f'{name} 계단 {len(steps)}단 전부 접수 실패 — '
+ (failed[0]['error'] if failed else '')),
'detail': details}
info = {'card_id': card_obj.card_id, 'symbol_name': name, 'account': p['account'],
'total_qty': p['qty'], 'peak': p['trail_peak'],
'min_sell_price': p.get('min_sell_price'),
'placed': placed, 'failed': failed, 'dry_run': dry_run,
'res_id': None, 'register_error': None}
if not dry_run:
registerable = [s for s in placed if s['ord_no']]
if not registerable:
# 접수는 됐는데 주문번호를 못 받았다 — 감시가 붙을 수 없으니 반드시 알린다.
ledger.append('trailing_register_failed',
{'card_id': card_obj.card_id, 'error': 'no ord_no', **p})
info['register_error'] = '주문번호를 못 받아 감시를 걸지 못했습니다'
else:
try:
res_trl = trailing.register_steps(
account=p['account'], symbol=p['symbol'], symbol_name=name,
total_qty=p['qty'], peak=p['trail_peak'], steps=registerable,
routing_suffix=p['routing_suffix'], card_id=card_obj.card_id,
min_sell_price=p.get('min_sell_price'),
)
info['res_id'] = res_trl['id']
except Exception as e:
# 주문은 이미 접수됨 — 등록 실패를 숨기면 트레일링이 안 도는 걸 모른다.
ledger.append('trailing_register_failed',
{'card_id': card_obj.card_id, 'error': repr(e), **p})
info['register_error'] = str(e)
return {'ok': True, 'message': card.format_trailing_submitted(info), 'detail': details}
def _submit_multi_legs(card_obj, dry_run: bool) -> dict:
"""multi 카드(propose_trade_multi)의 레그별 키움 제출 — 레그 독립 실행·독립 보고.
레그가 실패해도 나머지 레그는 계속 시도. ok = 레그라도 접수 성공.
접수된 레그는 각각 fill_watcher 추적 ( 기반이라 동시 다건 OK).
"""
p = card_obj.payload
submit_order_type = 'LIMIT' if p['order_type'] == 'AGGRESSIVE_LIMIT' else p['order_type']
msgs = []
details = []
any_ok = False
for leg in p.get('legs') or []:
res = kiwoom_order.submit(
account_label=leg['account'],
side=p['side'],
symbol=p['symbol'],
qty=leg['qty'],
price=p.get('price'),
order_type=submit_order_type,
routing_suffix=p['routing_suffix'],
dry_run=dry_run,
card_id=card_obj.card_id,
)
details.append(res)
acc_disp = card.ACCOUNT_DISPLAY.get(leg['account'], leg['account'])
if res['ok']:
any_ok = True
if dry_run:
msgs.append(f'[{acc_disp}] ' + card.format_dryrun(res.get('payload', {})))
continue
ord_no = res.get('ord_no', '')
msgs.append(f'[{acc_disp}] ' + card.format_submitted(
card_obj.card_id, p['side'], p.get('symbol_name', p['symbol']),
leg['qty'], p.get('price'), ord_no))
if ord_no:
fill_watcher.watch(
ord_no=ord_no, account=leg['account'], side=p['side'],
symbol=p['symbol'], symbol_name=p.get('symbol_name', p['symbol']),
order_qty=leg['qty'], price=p.get('price'),
order_type=p['order_type'], card_id=card_obj.card_id,
)
else:
msgs.append(f'[{acc_disp}] ' + card.format_rejected(
res.get('reason', 'UNKNOWN'), str(res.get('error', ''))))
return {'ok': any_ok, 'message': '\n'.join(msgs), 'detail': details}
def cancel_active_card() -> dict: def cancel_active_card() -> dict:
sidecar.guard_or_raise() sidecar.guard_or_raise()
card_obj = _pin_store.cancel() card_obj = _pin_store.cancel()
@@ -31,6 +31,7 @@ TR_CANCEL = 'kt10003'
# 매매구분 코드 # 매매구분 코드
TRDE_TP_LIMIT = '0' # 보통가 (지정가) TRDE_TP_LIMIT = '0' # 보통가 (지정가)
TRDE_TP_MARKET = '3' # 시장가 TRDE_TP_MARKET = '3' # 시장가
TRDE_TP_STOP = '28' # 스톱지정가 — cond_uv(조건단가) 도달 시 ord_uv(지정가)로 발주
# 거래소 코드 (라우팅 suffix → API 거래소 구분) # 거래소 코드 (라우팅 suffix → API 거래소 구분)
_EXCHANGE_BY_SUFFIX = { _EXCHANGE_BY_SUFFIX = {
@@ -52,27 +53,38 @@ def _exchange_for(suffix: str) -> str:
def submit(account_label: str, side: str, symbol: str, qty: int, def submit(account_label: str, side: str, symbol: str, qty: int,
price: Optional[int], order_type: str, routing_suffix: str, price: Optional[int], order_type: str, routing_suffix: str,
dry_run: bool = True, card_id: Optional[str] = None) -> dict: dry_run: bool = True, card_id: Optional[str] = None,
stop_price: Optional[int] = None) -> dict:
sidecar.guard_or_raise() sidecar.guard_or_raise()
if side not in ('BUY', 'SELL'): if side not in ('BUY', 'SELL'):
raise ValueError(f'invalid side: {side}') raise ValueError(f'invalid side: {side}')
if order_type not in ('LIMIT', 'MARKET', 'AGGRESSIVE_LIMIT'): if order_type not in ('LIMIT', 'MARKET', 'AGGRESSIVE_LIMIT', 'STOP_LIMIT'):
raise ValueError(f'invalid order_type: {order_type}') raise ValueError(f'invalid order_type: {order_type}')
if order_type in ('LIMIT', 'AGGRESSIVE_LIMIT') and not price: if order_type in ('LIMIT', 'AGGRESSIVE_LIMIT') and not price:
raise ValueError(f'{order_type} requires price') raise ValueError(f'{order_type} requires price')
if order_type == 'STOP_LIMIT' and (not price or not stop_price):
raise ValueError('STOP_LIMIT requires price(지정가) and stop_price(조건단가)')
tr_id = TR_BUY if side == 'BUY' else TR_SELL tr_id = TR_BUY if side == 'BUY' else TR_SELL
exchange = _exchange_for(routing_suffix) exchange = _exchange_for(routing_suffix)
is_market = order_type == 'MARKET' is_market = order_type == 'MARKET'
is_stop = order_type == 'STOP_LIMIT'
if is_market:
trde_tp = TRDE_TP_MARKET
elif is_stop:
trde_tp = TRDE_TP_STOP
else:
trde_tp = TRDE_TP_LIMIT
body = { body = {
'dmst_stex_tp': exchange, 'dmst_stex_tp': exchange,
'stk_cd': symbol, 'stk_cd': symbol,
'ord_qty': str(qty), 'ord_qty': str(qty),
'ord_uv': '' if is_market else str(price), 'ord_uv': '' if is_market else str(price),
'trde_tp': TRDE_TP_MARKET if is_market else TRDE_TP_LIMIT, 'trde_tp': trde_tp,
'cond_uv': '', 'cond_uv': str(stop_price) if is_stop else '',
} }
payload = { payload = {
@@ -82,6 +94,7 @@ def submit(account_label: str, side: str, symbol: str, qty: int,
'symbol': symbol, 'symbol': symbol,
'qty': qty, 'qty': qty,
'price': price, 'price': price,
'stop_price': stop_price if is_stop else None,
'order_type': order_type, 'order_type': order_type,
'routing_suffix': routing_suffix, 'routing_suffix': routing_suffix,
'exchange': exchange, 'exchange': exchange,
@@ -199,13 +212,18 @@ def cancel_order(account_label: str, orig_ord_no: str, symbol: str,
def modify_order(account_label: str, orig_ord_no: str, symbol: str, def modify_order(account_label: str, orig_ord_no: str, symbol: str,
modify_qty: int, modify_price: int, modify_qty: int, modify_price: int,
routing_suffix: str = '', routing_suffix: str = '',
dry_run: bool = True, card_id: Optional[str] = None) -> dict: dry_run: bool = True, card_id: Optional[str] = None,
modify_cond_price: Optional[int] = None) -> dict:
"""미체결 주문 정정 (kt10002). """미체결 주문 정정 (kt10002).
modify_qty / modify_price 필수 키움 명세상 mdfy_qty/mdfy_uv 모두 Required. modify_qty / modify_price 필수 키움 명세상 mdfy_qty/mdfy_uv 모두 Required.
수량만 바꿀 기존 가격, 가격만 바꿀 기존 수량을 그대로 전달. 수량만 바꿀 기존 가격, 가격만 바꿀 기존 수량을 그대로 전달.
시장가 주문은 정정 불가 (mdfy_uv 가격이라 0 불가) 호출 전에 차단. 시장가 주문은 정정 불가 (mdfy_uv 가격이라 0 불가) 호출 전에 차단.
routing_suffix 원주문의 거래소와 동일해야 . routing_suffix 원주문의 거래소와 동일해야 .
modify_cond_price: 스톱지정가(trde_tp=28) 주문의 조건단가 정정용 (mdfy_cond_uv).
트레일링 스톱이 고점 갱신 조건단가를 올리는 사용. 일반 주문은 None.
정정 응답의 ord_no 신규 주문번호 다음 정정은 번호를 orig_ord_no 써야 .
""" """
sidecar.guard_or_raise() sidecar.guard_or_raise()
@@ -217,6 +235,8 @@ def modify_order(account_label: str, orig_ord_no: str, symbol: str,
raise ValueError(f'modify_qty must be > 0 (got {modify_qty})') raise ValueError(f'modify_qty must be > 0 (got {modify_qty})')
if modify_price <= 0: if modify_price <= 0:
raise ValueError(f'modify_price must be > 0 — 시장가 주문은 정정 불가, 취소 후 신규 발주') raise ValueError(f'modify_price must be > 0 — 시장가 주문은 정정 불가, 취소 후 신규 발주')
if modify_cond_price is not None and modify_cond_price <= 0:
raise ValueError(f'modify_cond_price must be > 0 (got {modify_cond_price})')
exchange = _exchange_for(routing_suffix) exchange = _exchange_for(routing_suffix)
body = { body = {
@@ -225,7 +245,7 @@ def modify_order(account_label: str, orig_ord_no: str, symbol: str,
'stk_cd': symbol, 'stk_cd': symbol,
'mdfy_qty': str(modify_qty), 'mdfy_qty': str(modify_qty),
'mdfy_uv': str(modify_price), 'mdfy_uv': str(modify_price),
'mdfy_cond_uv': '', 'mdfy_cond_uv': str(modify_cond_price) if modify_cond_price else '',
} }
payload = { payload = {
@@ -235,6 +255,7 @@ def modify_order(account_label: str, orig_ord_no: str, symbol: str,
'orig_ord_no': orig_ord_no, 'orig_ord_no': orig_ord_no,
'modify_qty': modify_qty, 'modify_qty': modify_qty,
'modify_price': modify_price, 'modify_price': modify_price,
'modify_cond_price': modify_cond_price,
'routing_suffix': routing_suffix, 'routing_suffix': routing_suffix,
'exchange': exchange, 'exchange': exchange,
'tr_id': TR_MODIFY, 'tr_id': TR_MODIFY,
@@ -0,0 +1,363 @@
"""계단식 트레일링 단위테스트 (2026-07-31).
층을 본다:
1. 순수 함수 누적추가 환산, 수량 배분, 계단별 손절선, 상향 판단
2. 감시 루프 레그 체결/소멸 판정과 알림 (키움 호출은 전부 stub, 상태파일은 임시경로로 격리)
3. JS 대조 렌더된 페이지의 미리보기 계산이 서버 계산과 같은 값을 내는지 (node 있을 때만)
3번이 특히 중요하다. 미리보기와 발주값이 어긋나면 관리자님이 것과 다른 주문이 나간다.
"""
from __future__ import annotations
import json
import random
import shutil
import subprocess
import sys
import tempfile
import unittest
from pathlib import Path
from orders import trailing as t
class NormalizeStepsTests(unittest.TestCase):
"""입력한 누적 비중 → 내부 추가 비중."""
def test_cumulative_to_incremental(self):
st = t.normalize_steps([{'pct': 10, 'cum': 20}, {'pct': 20, 'cum': 50},
{'pct': 30, 'cum': 100}])
self.assertEqual([s['weight'] for s in st], [20.0, 30.0, 50.0])
self.assertEqual([s['n'] for s in st], [1, 2, 3])
self.assertEqual([s['pct'] for s in st], [10.0, 20.0, 30.0])
def test_single_step(self):
st = t.normalize_steps([{'pct': 8, 'cum': 100}])
self.assertEqual([(s['pct'], s['weight']) for s in st], [(8.0, 100.0)])
def test_partial_liquidation_allowed(self):
"""마지막 누적이 100 미만이어도 통과 — 일부만 계단 청산하고 나머지는 계속 보유."""
st = t.normalize_steps([{'pct': 10, 'cum': 30}, {'pct': 20, 'cum': 60}])
self.assertEqual([s['weight'] for s in st], [30.0, 30.0])
def test_rejects(self):
cases = [
('빈 입력', [], '비어'),
('계단 초과', [{'pct': i, 'cum': i * 10} for i in range(1, 7)], '최대'),
('하락률 역순', [{'pct': 20, 'cum': 30}, {'pct': 10, 'cum': 60}], '깊지 않음'),
('하락률 동일', [{'pct': 10, 'cum': 30}, {'pct': 10, 'cum': 60}], '깊지 않음'),
('누적 역순', [{'pct': 10, 'cum': 60}, {'pct': 20, 'cum': 30}], '크지 않음'),
('누적 100 초과', [{'pct': 10, 'cum': 50}, {'pct': 20, 'cum': 120}], '100'),
('하락률 상한 초과', [{'pct': 40, 'cum': 100}], '범위'),
('하락률 하한 미만', [{'pct': 0.1, 'cum': 100}], '범위'),
]
for label, raw, needle in cases:
with self.subTest(label):
with self.assertRaises(ValueError) as cm:
t.normalize_steps(raw)
self.assertIn(needle, str(cm.exception))
class AllocateStepQtyTests(unittest.TestCase):
"""계단별 주수 배분 — 최대잔여법."""
def test_exact(self):
self.assertEqual(t.allocate_step_qty(100, [20, 30, 50]), [20, 30, 50])
self.assertEqual(t.allocate_step_qty(1943, [20, 30, 50]), [389, 583, 971])
def test_remainder_goes_to_largest_fraction(self):
self.assertEqual(t.allocate_step_qty(7, [20, 30, 50]), [1, 2, 4])
def test_small_qty_keeps_shallow_step_alive(self):
"""2주를 3계단에 나누면 [0,1,1] — '마지막에 몰아주기'였다면 [0,0,2]로 1계단만 남는다."""
self.assertEqual(t.allocate_step_qty(2, [20, 30, 50]), [0, 1, 1])
self.assertEqual(t.allocate_step_qty(1, [20, 30, 50]), [0, 0, 1])
self.assertEqual(t.allocate_step_qty(0, [20, 30, 50]), [0, 0, 0])
def test_sum_preserved_exhaustive(self):
"""전량(합 100%) 조합은 배분 합이 정확히 보유수량이어야 한다."""
for total in range(1, 400):
for w in ([20, 30, 50], [30, 30, 40], [10, 20, 30, 40], [50, 50], [100]):
got = t.allocate_step_qty(total, w)
self.assertEqual(sum(got), total, f'total={total} w={w}{got}')
self.assertTrue(all(x >= 0 for x in got))
def test_partial_never_exceeds_holding(self):
for total in range(1, 400):
self.assertLessEqual(sum(t.allocate_step_qty(total, [30, 30])), total)
class ComputeLevelsTests(unittest.TestCase):
def test_step_prices(self):
st = t.normalize_steps([{'pct': 10, 'cum': 20}, {'pct': 20, 'cum': 50},
{'pct': 30, 'cum': 100}])
lv = t.compute_step_levels(5000, st)
self.assertEqual([x['cond_uv'] for x in lv], [4500, 4000, 3500])
self.assertEqual([x['ord_uv'] for x in lv], [4490, 3990, 3490]) # 각 2틱 아래
def test_float_noise_removed(self):
"""5500×(130/100) 이 3849.9999999999995 라 int() 가 3849 로 깎고
호가내림이 3845 까지 끌어내리던 버그(2026-07-31 수정). 의도는 3850."""
self.assertEqual(t.compute_levels(5500, 30)['cond_uv'], 3850)
self.assertEqual(t.compute_levels(5500, 10)['cond_uv'], 4950)
self.assertEqual(t.compute_levels(4870, 10)['cond_uv'], 4380)
def test_no_tick_loss_when_exact(self):
"""정수로 딱 떨어지는 (고점,폭)은 호가단위 내림 결과와 정확히 같아야 한다."""
for peak in range(1000, 300000, 977):
for pct in (5, 10, 15, 20, 25, 30):
exact = peak * (100 - pct) / 100.0
if abs(exact - round(exact)) > 1e-9:
continue
want = t.floor_to_tick(int(round(exact)))
self.assertEqual(t.compute_levels(peak, pct)['cond_uv'], want,
f'peak={peak} pct={pct}')
def test_floor_ties_all_steps_then_they_spread(self):
"""최저 매도가는 모든 계단에 같은 하한 → 처음엔 뭉치고, 고점이 오르면 다시 벌어진다.
(그래서 주문을 병합하면 된다 정정만으로는 다시 쪼갠다.)"""
st = t.normalize_steps([{'pct': 10, 'cum': 20}, {'pct': 20, 'cum': 50},
{'pct': 30, 'cum': 100}])
tied = t.compute_step_levels(5000, st, min_sell_price=4600)
self.assertEqual([x['cond_uv'] for x in tied], [4600, 4600, 4600])
self.assertTrue(all(x['floor_applied'] for x in tied))
spread = t.compute_step_levels(6000, st, min_sell_price=4600)
self.assertEqual([x['cond_uv'] for x in spread], [5400, 4800, 4600])
class NextStepLevelsTests(unittest.TestCase):
def setUp(self):
st = t.normalize_steps([{'pct': 10, 'cum': 20}, {'pct': 20, 'cum': 50},
{'pct': 30, 'cum': 100}])
self.res = {'peak': 5000, 'min_sell_price': None,
'steps': [dict(s, cond_uv=c, ord_uv=o) for s, c, o in
zip(st, [4500, 4000, 3500], [4490, 3990, 3490])]}
def test_no_new_high(self):
for price in (0, 4900, 5000):
self.assertIsNone(t.next_step_levels(self.res, price))
def test_all_steps_raise(self):
up = t.next_step_levels(self.res, 6000)
self.assertEqual(up['peak'], 6000)
self.assertEqual([(s['n'], s['cond_uv']) for s in up['steps']],
[(1, 5400), (2, 4800), (3, 4200)])
def test_peak_updates_even_when_no_step_moves(self):
"""호가단위 내림 탓에 올릴 조건단가가 없어도 고점은 갱신돼야 한다(정정 콜은 0)."""
res = {'peak': 5000, 'min_sell_price': None,
'steps': [{'n': 1, 'pct': 10.0, 'cum': 100.0, 'weight': 100.0,
'cond_uv': 4500, 'ord_uv': 4490}]}
up = t.next_step_levels(res, 5001)
self.assertEqual(up['peak'], 5001)
self.assertEqual(up['steps'], [])
def test_floor_dominant_then_overtaken(self):
res = {'peak': 5000, 'min_sell_price': 4600,
'steps': [{'n': 1, 'pct': 10.0, 'cum': 100.0, 'weight': 100.0,
'cond_uv': 4600, 'ord_uv': 4590}]}
self.assertEqual(t.next_step_levels(res, 5050)['steps'], []) # 아직 floor 지배
self.assertEqual([(s['n'], s['cond_uv'])
for s in t.next_step_levels(res, 5200)['steps']], [(1, 4680)])
def test_stop_never_moves_down(self):
"""무작위 시세에도 손절선은 단조 증가여야 한다 (상향 전용 불변식)."""
cur = {'peak': 5000, 'min_sell_price': None,
'steps': [{'n': 1, 'pct': 10.0, 'cum': 100.0, 'weight': 100.0,
'cond_uv': 4500, 'ord_uv': 4490}]}
rnd = random.Random(7)
prev = 4500
for _ in range(3000):
nx = t.next_step_levels(cur, rnd.randint(3000, 9000))
if nx is None:
continue
cur['peak'] = nx['peak']
for s in nx['steps']:
self.assertGreaterEqual(s['cond_uv'], prev)
prev = s['cond_uv']
cur['steps'][0]['cond_uv'] = s['cond_uv']
class MonitorFlowTests(unittest.TestCase):
"""감시 루프 — 레그 단위 생존 판정·정정·알림. 키움 호출은 stub."""
def setUp(self):
self.tmp = Path(tempfile.mkdtemp()) / 'trailing_stops.json'
self._orig = (t.STATE_FILE, t._LOCK_FILE)
t.STATE_FILE = self.tmp
t._LOCK_FILE = self.tmp.with_suffix('.json.lock')
import trailing_monitor as tm
self.tm = tm
self.sent = []
self.state = {'open': {}, 'quote': 0, 'execs': [], 'modify': []}
self._orig_fns = (tm.kc.get_open_orders, tm.kc.get_watchlist_quotes,
tm.kc.get_order_executions, tm.kiwoom_order.modify_order,
tm.send_telegram)
tm.kc.get_open_orders = lambda acct, side=None: list(self.state['open'].get(acct, []))
tm.kc.get_watchlist_quotes = lambda codes, exchange='AL': {
c: {'price': self.state['quote']} for c in codes}
tm.kc.get_order_executions = lambda acct: list(self.state['execs'])
tm.kiwoom_order.modify_order = self._fake_modify
tm.send_telegram = lambda msg, parse_mode=None: self.sent.append(msg)
st = t.normalize_steps([{'pct': 10, 'cum': 20}, {'pct': 20, 'cum': 50},
{'pct': 30, 'cum': 100}])
lv = t.compute_step_levels(5500, st, None)
qtys = t.allocate_step_qty(1943, [s['weight'] for s in st])
legs = [dict(s, qty=q, ord_no=f'A{s["n"]:04d}') for s, q in zip(lv, qtys)]
self.res = t.register_steps(account='일반', symbol='381620',
symbol_name='제닉스로보틱스', total_qty=1943,
peak=5500, steps=legs)
self.state['open']['일반'] = [{'ord_no': s['ord_no'], 'unfilled_qty': s['qty'],
'routing_suffix': ''} for s in legs]
def tearDown(self):
(self.tm.kc.get_open_orders, self.tm.kc.get_watchlist_quotes,
self.tm.kc.get_order_executions, self.tm.kiwoom_order.modify_order,
self.tm.send_telegram) = self._orig_fns
t.STATE_FILE, t._LOCK_FILE = self._orig
shutil.rmtree(self.tmp.parent, ignore_errors=True)
def _fake_modify(self, account_label, orig_ord_no, symbol, modify_qty, modify_price,
routing_suffix='', dry_run=False, card_id=None, modify_cond_price=None):
self.state['modify'].append({'orig': orig_ord_no, 'cond': modify_cond_price})
new_no = f'N{len(self.state["modify"]):04d}'
for row in self.state['open'].get(account_label, []):
if row['ord_no'] == orig_ord_no:
row['ord_no'] = new_no # 정정하면 키움이 새 주문번호를 발급한다
return {'ok': True, 'new_ord_no': new_no}
def test_registered_shape(self):
r = t.get(self.res['id'])
self.assertEqual([s['cond_uv'] for s in r['steps']], [4950, 4400, 3850])
self.assertEqual(sum(s['qty'] for s in r['steps']), 1943)
def test_price_drop_does_nothing(self):
self.state['quote'] = 5200
self.tm.check(force=True)
self.assertEqual(self.state['modify'], [])
self.assertEqual(t.get(self.res['id'])['peak'], 5500)
self.assertEqual(self.sent, [])
def test_new_high_raises_every_leg_and_rotates_ord_no(self):
self.state['quote'] = 6000
self.tm.check(force=True)
self.assertEqual([c['cond'] for c in self.state['modify']], [5400, 4800, 4200])
r = t.get(self.res['id'])
self.assertEqual(r['peak'], 6000)
# ord_no 를 갱신하지 않으면 다음 정정이 전부 실패한다 — 최대 함정
self.assertEqual([s['ord_no'] for s in r['steps']], ['N0001', 'N0002', 'N0003'])
self.assertEqual([s['modify_count'] for s in r['steps']], [1, 1, 1])
self.assertEqual(self.sent, []) # 상향은 조용히
def test_one_leg_fills_others_keep_watching(self):
self.state['quote'] = 5500
gone = self.state['open']['일반'].pop(0)
self.state['execs'] = [{'ord_no': gone['ord_no'], 'cntr_qty': 389, 'cntr_uv': 4948}]
self.tm.check(force=True)
r = t.get(self.res['id'])
self.assertEqual([s['n'] for s in r['steps']], [2, 3])
self.assertEqual(len(self.sent), 1)
self.assertIn('체결 389주', self.sent[0])
self.assertIn('남은 계단 2개', self.sent[0])
def test_expiry_not_misread_as_fill(self):
"""1단계가 체결된 날 나머지가 장 마감으로 소멸 — 종목 매도기록이 있어도 소멸로 갈려야 한다.
(종목 단위 ka10170 으로 판정하면 여기서 '체결' 오판한다.)"""
self.state['quote'] = 5500
self.state['execs'] = [{'ord_no': 'A0001', 'cntr_qty': 389, 'cntr_uv': 4948}]
self.state['open']['일반'] = []
self.tm.check(force=True)
self.assertIsNone(t.get(self.res['id']))
self.assertEqual(len(self.sent), 1) # 레그마다가 아니라 예약 단위 1건
self.assertIn('미체결 소멸', self.sent[0])
self.assertIn('다시 등록', self.sent[0])
def test_open_order_query_failure_preserves_reservation(self):
"""조회 실패를 '사라짐'으로 단정하면 살아있는 예약을 지운다."""
def boom(acct, side=None):
raise RuntimeError('조회 실패')
self.tm.kc.get_open_orders = boom
self.tm.check(force=True)
self.assertEqual(len(t.get(self.res['id'])['steps']), 3)
self.assertEqual(self.sent, [])
def _node_available() -> bool:
return shutil.which('node') is not None
@unittest.skipUnless(_node_available(), 'node 없음 — JS 대조 생략')
class JsParityTests(unittest.TestCase):
"""렌더된 페이지의 미리보기 계산 == 서버 발주 계산.
손으로 옮긴 사본이 아니라 실제 페이지에서 함수 소스를 뽑아 돌린다.
어긋나면 관리자님이 화면에서 것과 다른 주문이 나간다.
"""
@classmethod
def setUpClass(cls):
import behive_web
cls.html = behive_web.render_html()
def _grab(self, name: str) -> str:
i = self.html.index(f'function {name}(')
depth, j, started = 0, i, False
while j < len(self.html):
if self.html[j] == '{':
depth += 1
started = True
elif self.html[j] == '}':
depth -= 1
if started and depth == 0:
return self.html[i:j + 1]
j += 1
raise AssertionError(f'{name} 추출 실패 — 함수명이 바뀌었나?')
def test_parity(self):
src = '\n'.join(self._grab(f) for f in
('tickSize', 'floorTick', 'trailCondPrice',
'allocStepQty', 'trailWeights'))
cond_cases = [{'peak': p, 'pct': c, 'floor': f}
for p in (1000, 1943, 4805, 4870, 5500, 12345, 55500, 262500, 1718000)
for c in (0.5, 1, 3, 5, 7.5, 10, 15, 20, 25, 30)
for f in (0, 4500, 5000, 250000)]
qty_cases = [{'total': q, 'w': w}
for q in (1, 2, 3, 7, 19, 100, 218, 1395, 1943)
for w in ([20, 30, 50], [30, 30, 40], [10, 20, 30, 40],
[50, 50], [100], [30, 30])]
cum_cases = [[20, 50, 100], [30, 70, 100], [25, 50, 100], [100]]
js = src + f'''
const out = {{
cond: {json.dumps(cond_cases)}.map(c => {{
const r = trailCondPrice(c.peak, c.pct, c.floor); return [r.cond, r.floorApplied]; }}),
qty: {json.dumps(qty_cases)}.map(c => allocStepQty(c.total, c.w)),
cum: {json.dumps(cum_cases)}.map(cs => trailWeights(cs.map(x => ({{cum: x}})))),
}};
console.log(JSON.stringify(out));
'''
proc = subprocess.run([shutil.which('node'), '-e', js],
capture_output=True, text=True)
self.assertEqual(proc.returncode, 0, proc.stderr)
got = json.loads(proc.stdout)
for c, (jcond, jfloor) in zip(cond_cases, got['cond']):
lv = t.compute_levels(c['peak'], c['pct'], c['floor'] or None)
self.assertEqual((lv['cond_uv'], bool(lv['floor_applied'])),
(jcond, bool(jfloor)),
f"손절선 peak={c['peak']} pct={c['pct']} floor={c['floor']}")
for c, jq in zip(qty_cases, got['qty']):
self.assertEqual(t.allocate_step_qty(c['total'], c['w']), jq,
f"수량배분 total={c['total']} w={c['w']}")
for cums, jw in zip(cum_cases, got['cum']):
raw = [{'pct': (i + 1) * 3, 'cum': v} for i, v in enumerate(cums)]
self.assertEqual([s['weight'] for s in t.normalize_steps(raw)], jw,
f'비중환산 {cums}')
if __name__ == '__main__':
sys.path.insert(0, str(Path(__file__).resolve().parents[2]))
unittest.main(verbosity=2)
@@ -0,0 +1,401 @@
"""트레일링 스톱 예약 상태 관리 (계단식 분할 매도).
키움에 REST 트레일링 주문 TR 없어서, 스톱지정가(trde_tp=28) 주문을 실제로 걸어두고
고점이 갱신될 때마다 조건단가를 kt10002 정정으로 올려 트레일링을 구현한다.
**예약 1 = 계단(레그) N개 = 키움 스톱주문 N건.** 고점 대비 하락률이 깊어질수록 많이
파는 계단식 청산이다 (: 10% 20% / 20% 50% / 30% 전량). 계단별로 수량과 조건단가가
다른 스톱주문을 동시에 걸어두고, 고점이 오르면 살아있는 레그를 전부 상향 정정한다.
주문이 키움 서버에 있으므로 감시 루프가 죽어도 계단별 손절선은 살아있다.
감시 루프가 하는 일은 "이미 승인된 주문의 조건단가 상향" 신규 발주·수량 변경 없음.
계단 비중은 관리자님이 **누적**으로 입력하고(20/50/100 = 전량), 내부에는 계단별
**추가분**(20/30/50)으로 환산해 저장한다. 주문 수량이 추가분이기 때문이다.
계단이 체결된 반등해 신고점을 찍어도 **남은 계단만 고점 기준으로 따라 올린다**.
남은 수량을 계단 비율대로 재배치하려면 기존 주문 취소 + 신규 발주가 필요한데, 그러면
감시 루프에 자동 발주 경로가 생긴다(매매 자동 트리거 금지). 2026-07-31 관리자님 결정.
kt10002 정정 응답의 ord_no 신규 주문번호다. 정정할 때마다 ord_no 갱신하지 않으면
번째 정정부터 orig_ord_no 틀려서 전부 실패한다. commit_step_modify 이걸 담당.
상태는 파일(state/trailing_stops.json) 저장 ·감시 루프가 각각 다른 프로세스라
같은 예약 목록을 봐야 한다. 동시성은 fcntl flock 으로 직렬화 (pin.py 같은 패턴).
"""
from __future__ import annotations
import fcntl
import json
import os
import secrets
from datetime import datetime, timedelta, timezone
from pathlib import Path
from typing import Optional
from .guards import tick_size
WORKSPACE_ROOT = Path(__file__).resolve().parent.parent.parent
STATE_FILE = WORKSPACE_ROOT / 'state' / 'trailing_stops.json'
KST = timezone(timedelta(hours=9))
# 트레일 폭 허용 범위 (%). 너무 좁으면 정상 출렁임에 즉시 털리고, 너무 넓으면 스톱 의미가 없다.
# ⚠️ 상한을 바꾸면 **세 곳**이 같이 움직여야 한다 — 여기(서버 검증) /
# behive_web 트레일 폭 드롭다운 옵션 / behive_web `trailBlockReason` 의 범위 체크.
# 하나만 고치면 드롭다운에서 고를 수 있는데 서버가 거부하거나 그 반대가 된다.
MIN_TRAIL_PCT = 0.5
MAX_TRAIL_PCT = 30.0
# 지정가(ord_uv) = 조건단가(cond_uv) 보다 이 틱수만큼 아래.
# 조건단가와 같게 두면 발동 후 그 가격 아래로는 안 팔려 미체결로 남는다.
# 반대로 너무 벌리면 급락 시 헐값 매도가 되니 2틱.
ORD_UV_GAP_TICKS = 2
# 계단 개수 상한. 고점이 오를 때마다 살아있는 레그를 전부 정정하므로 정정 콜이 계단 수에
# 비례한다 (예약 3건 × 5계단 = 분당 15콜). 키움 rate limit 여유를 보고 5로 둔다.
MAX_STEPS = 5
def _now_iso() -> str:
return datetime.now(KST).isoformat(timespec='seconds')
def floor_to_tick(price: int) -> int:
"""호가단위로 내림. 매도 조건단가·지정가는 내림이 안전(더 빨리 발동/체결)."""
t = tick_size(price)
return price - (price % t)
def compute_levels(peak: int, trail_pct: float, min_sell_price: Optional[int] = None) -> dict:
"""고점·트레일 폭(·최저 매도가) → 조건단가(트리거)·지정가(체결가).
cond_uv = max(peak × (1 pct/100), min_sell_price) 호가단위 내림
ord_uv = cond_uv ORD_UV_GAP_TICKS
min_sell_price(최저 매도가) = 손절선의 하한. 트레일 폭을 넓게 잡아도 가격 아래로는
손절선이 내려가지 않는다 초기 구간 손실 제한용. 고점이 올라 트레일 손절선이 값을
추월하면 뒤로는 트레일이 지배한다(최저가는 자연히 무의미해짐).
"""
if peak <= 0:
raise ValueError(f'peak must be > 0 (got {peak})')
if not (MIN_TRAIL_PCT <= trail_pct <= MAX_TRAIL_PCT):
raise ValueError(f'trail_pct out of range: {trail_pct}')
# round(_, 6) 은 부동소수점 잡음만 걷어낸다 — 5500×(130/100) 이 3849.9999999999995 로
# 나오는 탓에 int() 가 3849 로 깎고 호가단위 내림이 3845 까지 끌어내리던 버그가 있었다
# (의도는 3850). 잡음을 없앤 뒤 내림하므로 "정확히 그 폭 아래" 성격은 그대로다.
cond_uv = floor_to_tick(int(round(peak * (1 - trail_pct / 100), 6)))
floor_applied = False
if min_sell_price:
if min_sell_price <= 0:
raise ValueError(f'min_sell_price must be > 0 (got {min_sell_price})')
floor_uv = floor_to_tick(int(min_sell_price))
if floor_uv > cond_uv:
cond_uv = floor_uv
floor_applied = True
ord_uv = floor_to_tick(cond_uv - ORD_UV_GAP_TICKS * tick_size(cond_uv))
if cond_uv <= 0 or ord_uv <= 0:
raise ValueError(f'computed level <= 0 (peak={peak}, pct={trail_pct})')
return {'cond_uv': cond_uv, 'ord_uv': ord_uv, 'floor_applied': floor_applied}
def normalize_steps(raw: list) -> list:
"""입력한 계단 정의(누적 비중)를 내부 표현(추가 비중)으로 환산·검증한다.
입력 [{'pct': 10, 'cum': 20}, {'pct': 20, 'cum': 50}, {'pct': 30, 'cum': 100}]
출력 [{'n': 1, 'pct': 10.0, 'cum': 20.0, 'weight': 20.0}, ... weight 30, 50]
cum(누적 비중) "이 하락률에 닿았을 때 최초 보유의 몇 %가 팔려 있어야 하는가".
주문 수량은 계단마다의 추가분이므로 weight = cum 직전 cum 으로 환산한다.
마지막 cum 100 미만이어도 허용한다(일부만 계단 청산하고 나머지는 계속 보유).
남는 수량은 스톱이 걸리지 않으므로 호출측이 화면에 표시해 준다.
"""
if not raw:
raise ValueError('계단이 비어 있음')
if len(raw) > MAX_STEPS:
raise ValueError(f'계단은 최대 {MAX_STEPS}개 (입력 {len(raw)}개)')
steps = []
prev_pct = 0.0
prev_cum = 0.0
for i, s in enumerate(raw, start=1):
pct = float(s['pct'])
cum = float(s['cum'])
if not (MIN_TRAIL_PCT <= pct <= MAX_TRAIL_PCT):
raise ValueError(f'{i}단계 하락률 {pct}% 는 {MIN_TRAIL_PCT}~{MAX_TRAIL_PCT}% 범위를 벗어남')
if pct <= prev_pct:
raise ValueError(f'{i}단계 하락률 {pct}% 가 앞 계단({prev_pct}%)보다 깊지 않음')
if cum <= prev_cum:
raise ValueError(f'{i}단계 누적 비중 {cum}% 가 앞 계단({prev_cum}%)보다 크지 않음')
if cum > 100:
raise ValueError(f'{i}단계 누적 비중 {cum}% 가 100% 를 넘음')
steps.append({'n': i, 'pct': pct, 'cum': cum, 'weight': cum - prev_cum})
prev_pct, prev_cum = pct, cum
return steps
def allocate_step_qty(total_qty: int, weights: list) -> list:
"""계단별 추가 비중(%) → 정수 주수. 최대잔여법(Hare quota).
내림으로 나눈 남는 주를 소수부가 계단부터 1주씩 배분한다.
"내림 후 마지막 계단에 몰아주기" 보다 얕은 계단이 0주로 죽는 일이 적다
(2 · 20/30/50 최대잔여 [0,1,1] 2계단 생존 / 몰아주기 [0,0,2] 1계단).
수량이 적어 0주가 되는 계단은 그대로 0 반환한다 발주할 없으므로
호출측이 걸러내고 "몇 계단으로 줄었는지" 사용자에게 알린다.
"""
if total_qty <= 0 or not weights:
return [0] * len(weights)
exact = [total_qty * w / 100.0 for w in weights]
base = [int(x) for x in exact]
remain = int(round(sum(exact))) - sum(base)
order = sorted(range(len(weights)), key=lambda i: exact[i] - base[i], reverse=True)
for i in order[:max(0, remain)]:
base[i] += 1
return base
def compute_step_levels(peak: int, steps: list, min_sell_price: Optional[int] = None) -> list:
"""고점 + 계단 정의 → 계단별 조건단가·지정가.
최저 매도가는 모든 계단에 같은 하한으로 걸린다. 그래서 초기에는 여러 계단이 같은
가격으로 뭉칠 있다(전부 최저 매도가). 그래도 주문을 병합하지 않는 이유는, 고점이
올라 트레일 손절선이 최저 매도가를 추월하면 계단이 하락률대로 다시 벌어지기
때문이다 병합해 버리면 정정만으로는 다시 쪼갤 없다(신규 발주가 필요해진다).
"""
out = []
for s in steps:
lv = compute_levels(peak, s['pct'], min_sell_price)
out.append({**s, 'cond_uv': lv['cond_uv'], 'ord_uv': lv['ord_uv'],
'floor_applied': lv['floor_applied']})
return out
def next_step_levels(res: dict, cur_price: int) -> Optional[dict]:
"""현재가가 고점을 넘었으면 새 고점과 상향 대상 레그를 반환 (순수 함수 — 단위테스트 대상).
반환 {'peak': 고점, 'steps': [{'n', 'cond_uv', 'ord_uv'}, ...]}.
고점이 올랐으면 None.
steps 리스트일 있다 고점은 올랐지만 호가단위 내림이나 최저 매도가 지배로
조건단가가 하나도 올라간 경우다. 이때 호출측은 정정 API 없이 고점만 갱신한다
(불필요한 0, 화면의 고점 표시는 정확하게 유지).
"""
if cur_price <= 0 or cur_price <= res['peak']:
return None
ups = []
for s in res.get('steps') or []:
lv = compute_levels(cur_price, s['pct'], res.get('min_sell_price'))
if lv['cond_uv'] > s['cond_uv']:
ups.append({'n': s['n'], 'cond_uv': lv['cond_uv'], 'ord_uv': lv['ord_uv']})
return {'peak': cur_price, 'steps': ups}
class _FileLock:
def __init__(self, path: Path):
self.path = path
self._fp = None
def __enter__(self):
self.path.parent.mkdir(parents=True, exist_ok=True)
self._fp = open(self.path, 'w')
fcntl.flock(self._fp, fcntl.LOCK_EX)
return self
def __exit__(self, *args):
try:
fcntl.flock(self._fp, fcntl.LOCK_UN)
finally:
self._fp.close()
_LOCK_FILE = STATE_FILE.with_suffix(STATE_FILE.suffix + '.lock')
def _read() -> list:
if not STATE_FILE.exists():
return []
try:
data = json.loads(STATE_FILE.read_text(encoding='utf-8'))
except (OSError, ValueError):
return []
return data.get('reservations') or []
def _write(reservations: list) -> None:
STATE_FILE.parent.mkdir(parents=True, exist_ok=True)
tmp = STATE_FILE.with_suffix(STATE_FILE.suffix + '.tmp')
tmp.write_text(json.dumps({'reservations': reservations}, ensure_ascii=False, indent=2),
encoding='utf-8')
os.replace(tmp, STATE_FILE)
def list_active() -> list:
"""등록된 예약 전체 (락 없이 읽기 — 감시 루프의 스냅샷용)."""
return _read()
def get(res_id: str) -> Optional[dict]:
for r in _read():
if r['id'] == res_id:
return r
return None
def find_by_symbol(account: str, symbol: str) -> Optional[dict]:
"""같은 계좌·종목의 기존 예약. 중복 등록 차단용."""
for r in _read():
if r['account'] == account and r['symbol'] == symbol:
return r
return None
def register_steps(account: str, symbol: str, symbol_name: str, total_qty: int,
peak: int, steps: list, routing_suffix: str = '',
card_id: Optional[str] = None,
min_sell_price: Optional[int] = None) -> dict:
"""키움에 계단별 스톱주문이 접수된 직후 호출 — 레그 목록을 예약 1건으로 등록.
steps 항목은 접수 결과까지 채워져 있어야 한다:
{'n', 'pct', 'cum', 'weight', 'qty', 'ord_no', 'cond_uv', 'ord_uv'}
접수에 실패한 레그는 호출측이 빼고 넘긴다 여기 등록된 것은 전부 키움에 살아있는
주문이어야 감시 루프의 생존 판정이 성립한다.
초기 고점(peak) 등록 시점 현재가다. 과거 고점(52·매수후) 기준 옵션은 손절선이
현재가 위로 올라가 즉시 발동하는 구조라 2026-07-30 제거됐다.
"""
if not steps:
raise ValueError('등록할 계단이 없음 — 접수 성공한 레그가 하나도 없다')
for s in steps:
if not s.get('ord_no'):
raise ValueError(f'{s.get("n")}단계 ord_no 없음 — 접수 확인된 주문만 등록')
res = {
'id': 'TRL-' + ''.join(secrets.choice('ABCDEFGHJKLMNPQRSTUVWXYZ23456789') for _ in range(4)),
'account': account,
'symbol': symbol,
'symbol_name': symbol_name,
'qty': total_qty,
'min_sell_price': min_sell_price,
'peak': peak,
'steps': [{'n': s['n'], 'pct': s['pct'], 'cum': s['cum'], 'weight': s['weight'],
'qty': s['qty'], 'ord_no': s['ord_no'],
'cond_uv': s['cond_uv'], 'ord_uv': s['ord_uv'],
'entry_cond_uv': s['cond_uv'], 'modify_count': 0} for s in steps],
'routing_suffix': routing_suffix,
'card_id': card_id,
'created_at': _now_iso(),
'updated_at': _now_iso(),
'entry_peak': peak,
}
with _FileLock(_LOCK_FILE):
reservations = _read()
reservations.append(res)
_write(reservations)
return res
def commit_peak(res_id: str, peak: int) -> Optional[dict]:
"""고점만 갱신 (정정할 레그가 없었던 경우). 화면의 고점 표시를 정확하게 유지한다."""
with _FileLock(_LOCK_FILE):
reservations = _read()
for r in reservations:
if r['id'] == res_id:
r['peak'] = peak
r['updated_at'] = _now_iso()
_write(reservations)
return r
return None
def commit_step_modify(res_id: str, step_n: int, new_ord_no: str, peak: int,
cond_uv: int, ord_uv: int) -> Optional[dict]:
"""레그 정정 성공 후 상태 갱신. new_ord_no 는 kt10002 응답의 신규 주문번호.
ord_no 갱신이 함수의 핵심 하면 레그의 다음 정정이 전부 실패한다.
고점은 예약 단위라 레그마다 같은 값으로 덮어써도 무해하다.
"""
if not new_ord_no:
raise ValueError('new_ord_no required')
with _FileLock(_LOCK_FILE):
reservations = _read()
for r in reservations:
if r['id'] != res_id:
continue
for s in r.get('steps') or []:
if s['n'] != step_n:
continue
s['ord_no'] = new_ord_no
s['cond_uv'] = cond_uv
s['ord_uv'] = ord_uv
s['modify_count'] = s.get('modify_count', 0) + 1
r['peak'] = peak
r['updated_at'] = _now_iso()
_write(reservations)
return r
return None
return None
def remove_step(res_id: str, step_n: int, reason: str = '') -> Optional[dict]:
"""레그 하나를 예약에서 제거 (체결·취소·소멸). 마지막 레그면 예약 자체를 지운다.
반환 {'step': 제거된 레그, 'reservation': 예약 스냅샷, 'remaining': 남은 레그 ,
'reservation_removed': bool} 알림 메시지 조립용.
"""
with _FileLock(_LOCK_FILE):
reservations = _read()
for i, r in enumerate(reservations):
if r['id'] != res_id:
continue
steps = r.get('steps') or []
hit = next((s for s in steps if s['n'] == step_n), None)
if hit is None:
return None
steps.remove(hit)
hit['removed_reason'] = reason
snapshot = json.loads(json.dumps(r))
if not steps:
reservations.pop(i)
_write(reservations)
return {'step': hit, 'reservation': snapshot, 'remaining': 0,
'reservation_removed': True}
r['updated_at'] = _now_iso()
_write(reservations)
return {'step': hit, 'reservation': snapshot, 'remaining': len(steps),
'reservation_removed': False}
return None
def should_notify_failure(res_id: str, now_ts: float, cooldown_sec: int) -> bool:
"""정정 실패 알림을 보낼지. 보낸다고 판단하면 그 시점을 기록한다 (락 안에서 원자적).
NXT 시간대에 KRX/SOR 원주문 정정이 거부되면 사이클 실패가 반복된다
쿨다운 없이 알리면 20:00까지 매분 텔레그램이 쏟아진다.
"""
with _FileLock(_LOCK_FILE):
reservations = _read()
for r in reservations:
if r['id'] != res_id:
continue
last = r.get('last_fail_notice_ts') or 0
if now_ts - last < cooldown_sec:
return False
r['last_fail_notice_ts'] = now_ts
_write(reservations)
return True
return False
def remove(res_id: str, reason: str = '') -> Optional[dict]:
"""예약 종료 (체결·취소·소멸). 반환값은 제거된 예약 — 알림 메시지용."""
with _FileLock(_LOCK_FILE):
reservations = _read()
for i, r in enumerate(reservations):
if r['id'] == res_id:
gone = reservations.pop(i)
_write(reservations)
gone['removed_reason'] = reason
return gone
return None
+36 -6
View File
@@ -45,6 +45,8 @@ _BACKOFF_MAX = 30.0
_MAX_CONN_AGE = 25 * 60 _MAX_CONN_AGE = 25 * 60
# recv 타임아웃 — 이 시간 내 아무것도 안 오면 루프 돌며 stop/age 체크 # recv 타임아웃 — 이 시간 내 아무것도 안 오면 루프 돌며 stop/age 체크
_RECV_TIMEOUT = 5.0 _RECV_TIMEOUT = 5.0
# VI 배지 자동 만료 (초) — 해제 1h 메시지 미수신 대비. VI 단일가 2분 + 임의연장 ≤30초 + 여유 30초.
_VI_ACTIVE_TTL = 180.0
# 장 마감 시간대 대기 — 개장 임박(평일 07:00~08:00)엔 1분, 그 외엔 다음 영업일 07:00까지 자되 6시간 상한. # 장 마감 시간대 대기 — 개장 임박(평일 07:00~08:00)엔 1분, 그 외엔 다음 영업일 07:00까지 자되 6시간 상한.
_PREOPEN_POLL_SEC = 60.0 # 개장 임박: 1분마다 → 08:00 개장을 1분 안에 포착 _PREOPEN_POLL_SEC = 60.0 # 개장 임박: 1분마다 → 08:00 개장을 1분 안에 포착
_CLOSED_WAIT_CAP = 6 * 3600.0 # 밤·주말·휴장: 다음 개장까지 자되 이 상한(자가교정용 — 날짜 계산 오류 시에도 6h마다 재확인) _CLOSED_WAIT_CAP = 6 * 3600.0 # 밤·주말·휴장: 다음 개장까지 자되 이 상한(자가교정용 — 날짜 계산 오류 시에도 6h마다 재확인)
@@ -97,11 +99,31 @@ class RealtimeHub:
def get_vi(self, code: str) -> dict | None: def get_vi(self, code: str) -> dict | None:
with self._lock: with self._lock:
v = self._vi.get(kc._clean_code(code)) v = self._vi.get(kc._clean_code(code))
return dict(v) if v else None return self._vi_expired(v) if v else None
def active_vis(self) -> dict[str, dict]: def active_vis(self) -> dict[str, dict]:
with self._lock: with self._lock:
return {c: dict(v) for c, v in self._vi.items() if v.get('active')} out = {}
for c, v in self._vi.items():
ev = self._vi_expired(v)
if ev.get('active'):
out[c] = ev
return out
@staticmethod
def _vi_expired(v: dict) -> dict:
"""VI 자동 만료 — 해제(1h) 메시지가 안 오는 경우 대비.
VI 단일가는 2 + 임의연장 30초라, 발동 _VI_ACTIVE_TTL 초과 읽기 시점에 active=False.
저장 상태는 건드리지 않는다(실증·디버깅용 원본 유지)."""
ev = dict(v)
if ev.get('active') and ev.get('ts'):
try:
age = (datetime.now(KST) - datetime.fromisoformat(ev['ts'])).total_seconds()
if age > _VI_ACTIVE_TTL:
ev['active'] = False
except Exception:
pass
return ev
def is_connected(self) -> bool: def is_connected(self) -> bool:
return self._connected.is_set() return self._connected.is_set()
@@ -323,21 +345,29 @@ class RealtimeHub:
'open': _abs_int(vals.get('16')), # 시가 'open': _abs_int(vals.get('16')), # 시가
'high': _abs_int(vals.get('17')), # 고가 'high': _abs_int(vals.get('17')), # 고가
'low': _abs_int(vals.get('18')), # 저가 'low': _abs_int(vals.get('18')), # 저가
'volume': _abs_int(vals.get('13')), # 누적거래량 (RVOL 배지용)
'exchange': (vals.get('9081') or '').strip(), 'exchange': (vals.get('9081') or '').strip(),
'ts': datetime.now(KST).isoformat(), 'ts': datetime.now(KST).isoformat(),
} }
elif typ == '1h': # VI 발동/해제 elif typ == '1h': # VI 발동/해제
# active 판정: 9068 VI발동구분. 해제시각(1224) 유무와 함께 실증 확인 예정(A단계). # 매핑 실증 완료 (2026-06-12 사이드카 날 VI 폭주 ~1,000건 관찰):
# - 9068 = VI 종류 (1=정적, 2=동적, 3=동적+정적) — 발동/해제 구분 아님
# - 1223 = 발동시각, 1224 = 해제시각. 발동 이벤트는 1224='000000', 해제 이벤트는 시각이 참
# - 1h는 구독 무관 시장 전역 broadcast (모든 종목 VI가 들어옴)
# 해제 메시지 유실 대비 백스톱으로 읽기 시점 TTL(_vi_expired)은 유지.
kind_raw = (vals.get('9068') or '').strip() kind_raw = (vals.get('9068') or '').strip()
release_t = (vals.get('1224') or '').strip()
with self._lock: with self._lock:
self._vi[code] = { self._vi[code] = {
'active': kind_raw not in ('', '0', '2'), # ⚠️ 매핑 실증 확인 필요 'active': release_t in ('', '000000'), # 해제시각 없음 = 발동 중
'vi_gubun': kind_raw, 'vi_gubun': kind_raw, # VI 종류 (1정적/2동적/3동적+정적)
'apply_kind': (vals.get('1225') or '').strip(), # 정적/동적/동적+정적 'apply_kind': (vals.get('1225') or '').strip(), # 정적/동적/동적+정적
'trigger_price': _abs_int(vals.get('1221')), 'trigger_price': _abs_int(vals.get('1221')),
'trigger_pct': kc._to_float(vals.get('1489')), 'trigger_pct': kc._to_float(vals.get('1489')),
'release_time': (vals.get('1224') or '').strip(), 'trigger_time': (vals.get('1223') or '').strip(),
'release_time': release_t,
'direction': (vals.get('9069') or '').strip(), 'direction': (vals.get('9069') or '').strip(),
'count': kc._to_int(vals.get('1490')), # 당일 VI 발동 횟수
'ts': datetime.now(KST).isoformat(), 'ts': datetime.now(KST).isoformat(),
} }
@@ -1,7 +1,8 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
"""매월 1일 04:30 — 본인 계좌 잔액을 골디 inbox에 envelope로 떨어뜨린다. """매월 1일 04:30 — 본인+가희 계좌 잔액을 골디 inbox에 envelope로 떨어뜨린다.
가희 계좌는 제외 (label prefix '가희_'). 본인 계좌별 평가액(kt00018)·예수금(kt00001)·총자산을 집계. 소유자별(본인 self / 가희 gahee, label prefix '가희_' 판별) 평가액(kt00018)·예수금(kt00001)·
총자산을 집계해 payload.by_owner에 담는다. 골디는 self증권(효원), gahee증권(가희) reconcile.
LLM 불필요 launchd로 실행. 실패 레이 텔레그램으로 자가 알림. LLM 불필요 launchd로 실행. 실패 레이 텔레그램으로 자가 알림.
""" """
from __future__ import annotations from __future__ import annotations
@@ -26,7 +27,7 @@ INBOX_DIR = Path('/Users/snowoyh/.openclaw/agents/budget/inbox/incoming')
CONFIG_PATH = Path('/Users/snowoyh/.openclaw/openclaw.json') CONFIG_PATH = Path('/Users/snowoyh/.openclaw/openclaw.json')
TELEGRAM_ACCOUNT = 'stock' TELEGRAM_ACCOUNT = 'stock'
TOPIC = 'securities_balance' TOPIC = 'securities_balance'
SCHEMA_VERSION = 1 SCHEMA_VERSION = 2
GAHEE_PREFIX = '가희_' GAHEE_PREFIX = '가희_'
@@ -60,13 +61,12 @@ def send_telegram(text: str) -> bool:
return ok return ok
def collect_owner_accounts() -> list[dict]: def collect_accounts() -> list[dict]:
accounts = kw.list_accounts() accounts = kw.list_accounts()
out = [] out = []
for a in accounts: for a in accounts:
label = a['label'] label = a['label']
if label.startswith(GAHEE_PREFIX): owner = 'gahee' if label.startswith(GAHEE_PREFIX) else 'self'
continue
balance = kw.get_balance(label) balance = kw.get_balance(label)
positions = kw.get_positions(label) positions = kw.get_positions(label)
eval_amount = sum(p.get('evlt_amt', 0) for p in positions) eval_amount = sum(p.get('evlt_amt', 0) for p in positions)
@@ -75,6 +75,7 @@ def collect_owner_accounts() -> list[dict]:
deposit = balance.get('d2_entra', 0) deposit = balance.get('d2_entra', 0)
out.append({ out.append({
'label': label, 'label': label,
'owner': owner,
'account_no': a.get('account_no', ''), 'account_no': a.get('account_no', ''),
'deposit': deposit, 'deposit': deposit,
'eval_amount': eval_amount, 'eval_amount': eval_amount,
@@ -86,6 +87,12 @@ def collect_owner_accounts() -> list[dict]:
def build_message(accounts: list[dict]) -> dict: def build_message(accounts: list[dict]) -> dict:
now = datetime.now(KST) now = datetime.now(KST)
by_owner: dict[str, dict] = {}
for a in accounts:
o = by_owner.setdefault(a['owner'], {'deposit': 0, 'eval_amount': 0, 'total': 0})
o['deposit'] += a['deposit']
o['eval_amount'] += a['eval_amount']
o['total'] += a['total']
return { return {
'message_id': str(uuid.uuid4()), 'message_id': str(uuid.uuid4()),
'from': 'stock', 'from': 'stock',
@@ -95,8 +102,9 @@ def build_message(accounts: list[dict]) -> dict:
'schema_version': SCHEMA_VERSION, 'schema_version': SCHEMA_VERSION,
'payload': { 'payload': {
'as_of': now.strftime('%Y-%m-%d'), 'as_of': now.strftime('%Y-%m-%d'),
'owner_scope': 'self_only', 'owner_scope': 'self_and_gahee',
'accounts': accounts, 'accounts': accounts,
'by_owner': by_owner,
'totals': { 'totals': {
'deposit': sum(a['deposit'] for a in accounts), 'deposit': sum(a['deposit'] for a in accounts),
'eval_amount': sum(a['eval_amount'] for a in accounts), 'eval_amount': sum(a['eval_amount'] for a in accounts),
@@ -117,9 +125,9 @@ def write_message(msg: dict) -> Path:
def main() -> int: def main() -> int:
try: try:
accounts = collect_owner_accounts() accounts = collect_accounts()
if not accounts: if not accounts:
raise RuntimeError('본인 계좌 0개 — 자격증명 또는 prefix 필터 점검 필요') raise RuntimeError('계좌 0개 — 자격증명 점검 필요')
msg = build_message(accounts) msg = build_message(accounts)
path = write_message(msg) path = write_message(msg)
total = msg['payload']['totals']['total'] total = msg['payload']['totals']['total']
+272 -49
View File
@@ -18,6 +18,7 @@ from __future__ import annotations
import json import json
import os import os
import re
import sys import sys
import subprocess import subprocess
import threading import threading
@@ -47,7 +48,7 @@ REPORTS_DIR.mkdir(parents=True, exist_ok=True)
PROMPT_FILE = WORKSPACE / 'prompts' / 'stock_analysis.md' PROMPT_FILE = WORKSPACE / 'prompts' / 'stock_analysis.md'
ALIAS_FILE = WORKSPACE / 'prompts' / 'name_aliases.json' ALIAS_FILE = WORKSPACE / 'prompts' / 'name_aliases.json'
LLM_MODEL = 'openai-codex/gpt-5.5' LLM_MODEL = 'openai/gpt-5.5'
LLM_TIMEOUT_SEC = 120 LLM_TIMEOUT_SEC = 120
@@ -61,6 +62,59 @@ def now_kst() -> datetime:
return datetime.now() return datetime.now()
def session_vol_frac(candles_asc: list[dict]) -> float | None:
"""마지막 봉이 오늘·정규장(09:00~15:30) 진행형이면 세션경과 비율(0.15~1.0), 아니면 None.
장중 누적 거래량을 하루치로 환산(RVOL·회전율)하는 분모. 휴장/주말은 오늘 봉이 없어 자연 배제.
NXT(15:30~) 시간대는 KRX 마감 후라 완성봉 취급(None)."""
if not candles_asc:
return None
now = now_kst()
if candles_asc[-1].get('date') != now.strftime('%Y%m%d'):
return None
hm = now.hour * 60 + now.minute
if not (9 * 60 <= hm < 15 * 60 + 30):
return None
return min(1.0, max(0.15, (hm - 9 * 60) / 390.0)) # 09:00~15:30 = 390분
def turnover_today(candles_asc: list[dict], vol_time_frac: float | None = None) -> tuple[float | None, bool]:
"""오늘 회전율(%)과 장중환산 여부. 마지막 봉 turnover_rate 우선, 없으면 최근 완성봉에서
상장주식수 역산 오늘 거래량으로 산출. vol_time_frac 있으면 오늘 누적을 하루치로 투영('예상').
데이터 없으면 (None, scaled)."""
if not candles_asc:
return None, False
scaled = bool(vol_time_frac and 0 < vol_time_frac < 1.0)
vols = [c.get('volume') or 0 for c in candles_asc]
today_v = vols[-1] if vols else 0
proj_v = (today_v / vol_time_frac) if scaled and today_v else today_v
last_c = candles_asc[-1]
if last_c.get('turnover_rate') and not scaled:
return last_c['turnover_rate'], scaled
for c in reversed(candles_asc[:-1]):
tr, cv = c.get('turnover_rate'), c.get('volume')
if tr and cv:
listed = cv / (tr / 100.0)
return (proj_v / listed * 100.0, scaled) if listed > 0 else (None, scaled)
return None, scaled
def rvol_today(candles_asc: list[dict], vol_time_frac: float | None = None) -> tuple[float | None, bool]:
"""상대거래량(RVOL) = 오늘 거래량 ÷ 직전 20거래일 평균, 장중환산 여부.
vol_time_frac 있으면 오늘 누적을 하루치로 투영('예상'). 데이터<21봉이면 (None, scaled)."""
if not candles_asc:
return None, False
scaled = bool(vol_time_frac and 0 < vol_time_frac < 1.0)
vols = [c.get('volume') or 0 for c in candles_asc]
if len(vols) < 21:
return None, scaled
avg20 = sum(vols[-21:-1]) / 20.0
if avg20 <= 0:
return None, scaled
today_v = vols[-1]
proj_v = (today_v / vol_time_frac) if scaled and today_v else today_v
return proj_v / avg20, scaled
def ts_for_filename() -> str: def ts_for_filename() -> str:
return now_kst().strftime('%Y-%m-%d_%H-%M-%S') return now_kst().strftime('%Y-%m-%d_%H-%M-%S')
@@ -117,6 +171,7 @@ def collect_snapshot(code: str, holding: dict | None = None) -> dict:
sma5 = sma(closes, 5) sma5 = sma(closes, 5)
sma20 = sma(closes, 20) sma20 = sma(closes, 20)
sma60 = sma(closes, 60) sma60 = sma(closes, 60)
sma120 = sma(closes, 120)
flow = kc.get_investor_flow(code, days=20) flow = kc.get_investor_flow(code, days=20)
flow_summary = _summarize_flow(flow) flow_summary = _summarize_flow(flow)
@@ -137,6 +192,7 @@ def collect_snapshot(code: str, holding: dict | None = None) -> dict:
'sma5': sma5, 'sma5': sma5,
'sma20': sma20, 'sma20': sma20,
'sma60': sma60, 'sma60': sma60,
'sma120': sma120,
'flow': flow, 'flow': flow,
'flow_summary': flow_summary, 'flow_summary': flow_summary,
'holding': holding, 'holding': holding,
@@ -529,7 +585,7 @@ def remove_peer(stock_code: str, peer_code: str) -> bool:
# ============================================================================ # ============================================================================
CHART_W = 1000 CHART_W = 1000
CHART_H = 720 # crosshair 박스 영역(상단) + X축 날짜 라벨 영역 확보 CHART_H = 660 # X축 날짜 라벨 아래 여백 최소화 (라벨 baseline VOL_BOT+26=642)
CHART_PAD_L = 20 # 좌측 라벨 없음 (가격 라벨 우측으로 이동) CHART_PAD_L = 20 # 좌측 라벨 없음 (가격 라벨 우측으로 이동)
CHART_PAD_R = 140 # 우측 가격·거래량 라벨 영역 (28px 폰트 = 6자리+쉼표 약 140px) CHART_PAD_R = 140 # 우측 가격·거래량 라벨 영역 (28px 폰트 = 6자리+쉼표 약 140px)
CHART_PAD_T = 60 # SMA legend 영역 (y=4~50). OHLC 팝업은 차트 안 floating tooltip. CHART_PAD_T = 60 # SMA legend 영역 (y=4~50). OHLC 팝업은 차트 안 floating tooltip.
@@ -543,13 +599,21 @@ VOL_TOP = PRICE_BOT + PANEL_GAP
VOL_BOT = VOL_TOP + VOL_PANEL_H VOL_BOT = VOL_TOP + VOL_PANEL_H
CHART_RANGE_DAYS = {'1Y': 250, '6M': 120, '1M': 21} CHART_RANGE_DAYS = {'1Y': 250, '6M': 120, '3M': 63, '1M': 21}
# 사용자 수평선 색상 팔레트 — 정렬(내림차순) 인덱스로 순환. SVG·칩 UI가 같은 매핑 사용.
# 모두 밝은 톤이라 태그 위 어두운 글자(#1a0f1f) 가독성 확보.
HLINE_COLORS = ['#e879f9', '#38bdf8', '#fbbf24', '#4ade80', '#fb7185', '#a78bfa', '#22d3ee', '#facc15']
def render_svg_chart(snap: dict, range_key: str = '1Y') -> str: def render_svg_chart(snap: dict, range_key: str = '1Y', ref_price: float | None = None,
"""캔들 + SMA 3선 + 거래량 막대 인라인 SVG. intraday: bool = False, hlines: list | None = None) -> str:
"""캔들 + SMA 3선 + 거래량 막대(+일봉 20일 거래량 이동평균선) 인라인 SVG.
range_key: '1Y' (250) | '6M' (120) | '1M' (21). 같은 snapshot 데이터에서 슬라이스만. range_key: '1Y' (250) | '6M' (120) | '3M' (63) | '1M' (21). 같은 snapshot 데이터에서 슬라이스만.
ref_price: 기준가(전일종가 ) 지정 노란 점선 기준선 + 마지막 종가의 대비 등락률 표시 (분봉용).
hlines: 사용자가 등록한 수평선 가격 리스트(지지/저항 ). 표시 구간 안에 드는 값만 그린다(스케일 미확장).
회전율 값은 차트에 그리지 않고 caller가 turnover_today() 별도 표시 (차트 아래).
snap: collect_snapshot 결과. candles_asc·sma5/20/60 사용. snap: collect_snapshot 결과. candles_asc·sma5/20/60 사용.
외부 JS 의존성 0. CSS는 inline. 외부 JS 의존성 0. CSS는 inline.
""" """
@@ -562,14 +626,18 @@ def render_svg_chart(snap: dict, range_key: str = '1Y') -> str:
sma5 = (snap.get('sma5') or [])[-n_take:] sma5 = (snap.get('sma5') or [])[-n_take:]
sma20 = (snap.get('sma20') or [])[-n_take:] sma20 = (snap.get('sma20') or [])[-n_take:]
sma60 = (snap.get('sma60') or [])[-n_take:] sma60 = (snap.get('sma60') or [])[-n_take:]
sma120 = (snap.get('sma120') or [])[-n_take:]
# ---- 스케일 ---- # ---- 스케일 ----
highs = [c['high'] for c in candles] highs = [c['high'] for c in candles]
lows = [c['low'] for c in candles] lows = [c['low'] for c in candles]
# SMA 값도 가격축 범위에 포함 (선이 잘리지 않도록) # SMA 값도 가격축 범위에 포함 (선이 잘리지 않도록)
sma_vals = [v for v in (sma5 + sma20 + sma60) if v is not None] sma_vals = [v for v in (sma5 + sma20 + sma60 + sma120) if v is not None]
y_max = max(max(highs), max(sma_vals) if sma_vals else 0) y_max = max(max(highs), max(sma_vals) if sma_vals else 0)
y_min = min(min(lows), min(sma_vals) if sma_vals else float('inf')) y_min = min(min(lows), min(sma_vals) if sma_vals else float('inf'))
if ref_price:
y_max = max(y_max, ref_price) # 기준선이 항상 보이게 스케일에 포함
y_min = min(y_min, ref_price)
if y_min == y_max: if y_min == y_max:
y_max = y_min + 1 y_max = y_min + 1
# 위·아래 패딩 5% # 위·아래 패딩 5%
@@ -607,6 +675,8 @@ def render_svg_chart(snap: dict, range_key: str = '1Y') -> str:
], ],
'ymin': y_min, 'ymin': y_min,
'ymax': y_max, 'ymax': y_max,
# 분봉일 때만 전일종가(ref_price) — 크로스헤어 툴팁의 '전일대비 등락률'용 (현재 등락율과 일치).
'prevClose': (int(ref_price) if (intraday and ref_price) else 0),
'priceTop': PRICE_TOP, 'priceTop': PRICE_TOP,
'priceBot': PRICE_BOT, 'priceBot': PRICE_BOT,
'volTop': VOL_TOP, 'volTop': VOL_TOP,
@@ -695,19 +765,32 @@ def render_svg_chart(snap: dict, range_key: str = '1Y') -> str:
parts.append(sma_path(sma5, '#fbbf24', 'SMA5')) # 노랑 parts.append(sma_path(sma5, '#fbbf24', 'SMA5')) # 노랑
parts.append(sma_path(sma20, '#34d399', 'SMA20')) # 초록 parts.append(sma_path(sma20, '#34d399', 'SMA20')) # 초록
parts.append(sma_path(sma60, '#a78bfa', 'SMA60')) # 보라 parts.append(sma_path(sma60, '#a78bfa', 'SMA60')) # 보라
parts.append(sma_path(sma120, '#22d3ee', 'SMA120')) # 청록
# ---- 전일종가 기준선 + 대비 등락률 (ref_price 지정 시 — 분봉) ----
if ref_price:
ry = price_y(ref_price)
parts.append(
f'<line x1="{CHART_PAD_L}" y1="{ry:.1f}" x2="{CHART_W-CHART_PAD_R}" y2="{ry:.1f}" '
f'stroke="#eab308" stroke-width="1.5" stroke-dasharray="7 5" opacity="0.85"/>'
)
parts.append(
f'<text x="{CHART_W - CHART_PAD_R + 6}" y="{ry-4:.1f}" text-anchor="start" fill="#eab308" font-size="24">전일</text>'
)
# 우상단 '전일대비 X%' 텍스트는 제거(관리자 요청) — 전일종가 기준선만 유지.
# SMA 범례 # SMA 범례
legend_y = PRICE_TOP + 14 legend_y = PRICE_TOP + 14
legend_items = [('SMA5', '#fbbf24'), ('SMA20', '#34d399'), ('SMA60', '#a78bfa')] legend_items = [('5일', '#fbbf24'), ('20일', '#34d399'), ('60일', '#a78bfa'), ('120일', '#22d3ee')]
lx = CHART_PAD_L + 8 lx = CHART_PAD_L + 8
for name, color in legend_items: for name, color in legend_items:
parts.append( parts.append(
f'<rect x="{lx}" y="{legend_y-8}" width="10" height="3" fill="{color}"/>' f'<rect x="{lx}" y="{legend_y-8}" width="10" height="3" fill="{color}"/>'
) )
parts.append( parts.append(
f'<text x="{lx+14}" y="{legend_y-2}" fill="#cfd5df">{name}</text>' f'<text x="{lx+14}" y="{legend_y-2}" fill="#cfd5df" font-size="20">{name}</text>'
) )
lx += 70 lx += 96
# ---- 거래량 패널 배경 ---- # ---- 거래량 패널 배경 ----
parts.append( parts.append(
@@ -728,12 +811,30 @@ def render_svg_chart(snap: dict, range_key: str = '1Y') -> str:
f'<rect x="{x-body_w/2:.2f}" y="{bar_top:.2f}" width="{body_w:.2f}" height="{bar_h:.2f}" ' f'<rect x="{x-body_w/2:.2f}" y="{bar_top:.2f}" width="{body_w:.2f}" height="{bar_h:.2f}" '
f'fill="{color}" opacity="0.7"/>' f'fill="{color}" opacity="0.7"/>'
) )
# 거래량 20일 이동평균선 — 일봉에서만 (분봉은 '20분 평균'이 돼 의미 없음)
vols_full = [c['volume'] for c in candles_full]
if not intraday:
vma = (sma(vols_full, 20))[-n_take:]
vma_pts = [f'{slot_x(i):.2f},{vol_y(v):.2f}' for i, v in enumerate(vma) if v is not None]
if len(vma_pts) >= 2:
parts.append(
f'<polyline points="{" ".join(vma_pts)}" fill="none" stroke="#f5a623" '
f'stroke-width="2" opacity="0.9"/>'
)
# 거래량 Y 레이블 (max 만) — 우측 # 거래량 Y 레이블 (max 만) — 우측
parts.append( parts.append(
f'<text x="{CHART_W - CHART_PAD_R + 6}" y="{VOL_TOP+22}" text-anchor="start" fill="#7a8493" font-size="28">' f'<text x="{CHART_W - CHART_PAD_R + 6}" y="{VOL_TOP+22}" text-anchor="start" fill="#7a8493" font-size="28">'
f'{_fmt_vol(v_max)}</text>' f'{_fmt_vol(v_max)}</text>'
) )
# 20MA 범례 (거래량 패널 하단 좌측) — 일봉 전용. RVOL·회전율 텍스트는 차트에 안 그림(차트 아래 표시).
if not intraday:
parts.append(
f'<text x="{CHART_PAD_L+8}" y="{VOL_BOT-8}" text-anchor="start" fill="#f5a623" font-size="24">'
f'— 거래량 20일평균</text>'
)
# ---- X축 날짜 (시작·중간·끝) ---- # ---- X축 날짜 (시작·중간·끝) ----
for i in (0, n // 2, n - 1): for i in (0, n // 2, n - 1):
x = slot_x(i) x = slot_x(i)
@@ -744,6 +845,64 @@ def render_svg_chart(snap: dict, range_key: str = '1Y') -> str:
f'{_fmt_date(candles[i]["date"])}</text>' f'{_fmt_date(candles[i]["date"])}</text>'
) )
# ---- 구간 고점선 + 현재가 태그 (고점·현재가 강조) ----
# 고점: 표시 구간 내 최고 고가에 노란 점선 + 우측 '고 N' 라벨.
hi_price = max(highs)
hy = price_y(hi_price)
parts.append(
f'<line x1="{CHART_PAD_L}" y1="{hy:.1f}" x2="{CHART_W-CHART_PAD_R}" y2="{hy:.1f}" '
f'stroke="#fbbf24" stroke-width="1" stroke-dasharray="4 4" opacity="0.55"/>'
)
# 고가 금액 — 가격패널 좌하단 안 (구간별 최고 고가). 상단 우측 대신 아래로 이동.
parts.append(
f'<text x="{CHART_PAD_L + 8}" y="{PRICE_BOT - 10:.1f}" text-anchor="start" fill="#fbbf24" '
f'font-size="26" font-weight="600">고가 {int(round(hi_price)):,}</text>'
)
# 현재가(마지막 종가): 얇은 기준선 + 우측 축 강조 태그(상승=빨강/하락=파랑).
cur_price = candles[-1]['close']
cy = price_y(cur_price)
last_up = candles[-1]['close'] >= candles[-1]['open']
cur_color = '#ef4444' if last_up else '#3b82f6'
parts.append(
f'<line x1="{CHART_PAD_L}" y1="{cy:.1f}" x2="{CHART_W-CHART_PAD_R}" y2="{cy:.1f}" '
f'stroke="{cur_color}" stroke-width="1" stroke-dasharray="2 3" opacity="0.5"/>'
)
tag_cy = min(max(cy, PRICE_TOP + 15), PRICE_BOT - 15)
parts.append(
f'<rect x="{CHART_W - CHART_PAD_R + 2}" y="{tag_cy-15:.1f}" width="{CHART_PAD_R-6}" height="30" '
f'fill="{cur_color}" rx="3"/>'
)
parts.append(
f'<text x="{CHART_W - CHART_PAD_R + 8}" y="{tag_cy+8:.1f}" text-anchor="start" fill="#fff" '
f'font-size="26" font-weight="700">{int(round(cur_price)):,}</text>'
)
# ---- 사용자 수평선 (hlines) — 지지/저항 등 수동 등록 가격선 ----
# 표시 구간(y_min~y_max) 안에 드는 값만 그린다. 스케일은 확장하지 않음(캔들 가독성 우선).
# 좌측에 분홍 가격 태그를 둔다(우측은 가격축·현재가 태그가 이미 점유).
for _hi, hp in enumerate(hlines or []):
try:
hp = float(hp)
except (TypeError, ValueError):
continue
if hp < y_min or hp > y_max:
continue
hcolor = HLINE_COLORS[_hi % len(HLINE_COLORS)]
hly = price_y(hp)
parts.append(
f'<line x1="{CHART_PAD_L}" y1="{hly:.1f}" x2="{CHART_W-CHART_PAD_R}" y2="{hly:.1f}" '
f'stroke="{hcolor}" stroke-width="1.6" stroke-dasharray="6 4" opacity="0.9"/>'
)
htag_y = min(max(hly, PRICE_TOP + 15), PRICE_BOT - 15)
parts.append(
f'<rect x="{CHART_PAD_L+2}" y="{htag_y-15:.1f}" width="122" height="30" '
f'fill="{hcolor}" rx="3" opacity="0.95"/>'
)
parts.append(
f'<text x="{CHART_PAD_L+8}" y="{htag_y+8:.1f}" text-anchor="start" fill="#1a0f1f" '
f'font-size="26" font-weight="700">{int(round(hp)):,}</text>'
)
parts.append('</svg>') parts.append('</svg>')
return ''.join(parts) return ''.join(parts)
@@ -841,7 +1000,7 @@ def _build_data_block(snap: dict) -> str:
lines.append(f'### 종목: {snap["name"]} ({snap["code"]})') lines.append(f'### 종목: {snap["name"]} ({snap["code"]})')
lines.append(f'- 현재가: {b["price"]:,}원 ({b["change"]:+,} / {b["change_pct"]:+.2f}%)') lines.append(f'- 현재가: {b["price"]:,}원 ({b["change"]:+,} / {b["change_pct"]:+.2f}%)')
lines.append(f'- 오늘 시고저: 시 {b["open"]:,} / 고 {b["high"]:,} / 저 {b["low"]:,}') lines.append(f'- 오늘 시고저: 시 {b["open"]:,} / 고 {b["high"]:,} / 저 {b["low"]:,}')
lines.append(f'- 시가총액: {b["market_cap"]:,} (단위 키움원본) · 상장주식수: {b["listed_shares"]:,}') lines.append(f'- 시가총액: {_fmt_market_cap(b["market_cap"])} · 상장주식수: {b["listed_shares"]:,}')
lines.append(f'- 52주 고저: 고 {b["high_52w"]:,}원 ({_fmt_date(b["high_52w_dt"])}) / 저 {b["low_52w"]:,}원 ({_fmt_date(b["low_52w_dt"])})') lines.append(f'- 52주 고저: 고 {b["high_52w"]:,}원 ({_fmt_date(b["high_52w_dt"])}) / 저 {b["low_52w"]:,}원 ({_fmt_date(b["low_52w_dt"])})')
lines.append(f'- 회전율(오늘): {b["turnover_rate"]:.2f}% · 외국인 보유비율: {b["foreign_holding_pct"]:.2f}%') lines.append(f'- 회전율(오늘): {b["turnover_rate"]:.2f}% · 외국인 보유비율: {b["foreign_holding_pct"]:.2f}%')
lines.append(f'- PER {b["per"]} · PBR {b["pbr"]} · ROE {b["roe"]} · EPS {b["eps"]:,} · BPS {b["bps"]:,}') lines.append(f'- PER {b["per"]} · PBR {b["pbr"]} · ROE {b["roe"]} · EPS {b["eps"]:,} · BPS {b["bps"]:,}')
@@ -1103,11 +1262,50 @@ def _fmt_pct_signed(v: float) -> str:
return f'{v:+.2f}%' return f'{v:+.2f}%'
_EM_RE = re.compile(r'\*\*(.+?)\*\*')
def _emphasize(escaped: str) -> str:
"""이스케이프된 텍스트의 **강조** → 붉은 강조 글씨. 입력은 이미 _esc 처리된 상태."""
return _EM_RE.sub(r'<span class="rpt-em">\1</span>', escaped)
def _fmt_eok_jo(eok) -> str:
"""억 단위 금액 → 조 단위. 1,997,447억 → 199.7조. 1조 미만은 소수 둘째자리. 비숫자는 —."""
if not isinstance(eok, (int, float)):
return ''
jo = eok / 10000
return f'{jo:,.2f}' if abs(jo) < 1 else f'{jo:,.1f}'
def _fmt_market_cap(eok) -> str:
"""키움 mac(억원) → 사람이 읽는 '2,084조 1,983억원'. 0/None은 ''."""
if not isinstance(eok, (int, float)) or eok <= 0:
return ''
eok = int(eok)
jo, rem = divmod(eok, 10000)
if jo and rem:
return f'{jo:,}{rem:,}억원'
if jo:
return f'{jo:,}조원'
return f'{rem:,}억원'
def _fmt_date(s) -> str: def _fmt_date(s) -> str:
"""20260519 2026-05-19. 형식 다르면 원본 반환.""" """날짜를 yy/mm/dd로. 20260519 · 2026-05-19 · 2026/05/19 → 26/05/19. 형식 다르면 원본."""
s = str(s or '').strip() s = str(s or '').strip()
if len(s) == 8 and s.isdigit(): d = s.replace('-', '').replace('/', '').replace('.', '')
return f'{s[:4]}-{s[4:6]}-{s[6:]}' if len(d) == 8 and d.isdigit():
return f'{d[2:4]}/{d[4:6]}/{d[6:]}'
return s
def _fmt_period(s) -> str:
"""회계기간 2021/12 · 2021.12 · 202112 → 21/12. 형식 다르면 원본."""
s = str(s or '').strip()
d = s.replace('-', '').replace('/', '').replace('.', '')
if len(d) == 6 and d.isdigit():
return f'{d[2:4]}/{d[4:6]}'
return s return s
@@ -1140,9 +1338,9 @@ _KV_HINTS = {
'BPS': '주당순자산. 1주당 회사가 가진 순자산 가치(원).', 'BPS': '주당순자산. 1주당 회사가 가진 순자산 가치(원).',
'외국인 보유비율': '전체 발행 주식 중 외국인이 보유한 비율(%).', '외국인 보유비율': '전체 발행 주식 중 외국인이 보유한 비율(%).',
# ── 성장성·펀더멘털 (FnGuide) ── # ── 성장성·펀더멘털 (FnGuide) ──
'매출액()': '회사가 1년에 물건·서비스를 팔아 벌어들인 총액(원). 회사 덩치가 커지는지 보는 지표.', '매출액()': '회사가 1년에 물건·서비스를 팔아 벌어들인 총액(원). 회사 덩치가 커지는지 보는 지표.',
'매출증가율': '작년보다 매출이 몇 % 늘었는지. +면 성장, −면 역성장. 꾸준히 +면 좋아요.', '매출증가율': '작년보다 매출이 몇 % 늘었는지. +면 성장, −면 역성장. 꾸준히 +면 좋아요.',
'영업이익()': '본업으로 번 이익(원). 매출에서 원가·판관비를 뺀 것. 회사가 장사를 잘하는지.', '영업이익()': '본업으로 번 이익(원). 매출에서 원가·판관비를 뺀 것. 회사가 장사를 잘하는지.',
'EPS(원)': '주당순이익. 1주가 1년에 번 순이익(원). 높을수록, 그리고 늘어날수록 좋아요.', 'EPS(원)': '주당순이익. 1주가 1년에 번 순이익(원). 높을수록, 그리고 늘어날수록 좋아요.',
'EPS증가율': '작년보다 주당순이익이 몇 % 늘었는지. 이익이 실제로 커지는지 보는 핵심 지표.', 'EPS증가율': '작년보다 주당순이익이 몇 % 늘었는지. 이익이 실제로 커지는지 보는 핵심 지표.',
'목표주가': '증권사들이 "이 정도까진 오를 만하다"고 본 가격의 평균. 현재가보다 높으면 상승 기대.', '목표주가': '증권사들이 "이 정도까진 오를 만하다"고 본 가격의 평균. 현재가보다 높으면 상승 기대.',
@@ -1155,7 +1353,7 @@ _KV_HINTS = {
'목표주가 리비전': '최근 3개월간 증권사 목표주가 평균이 오르고(+) 있는지 내리고(−) 있는지. 오르는 중이면 시장 기대가 좋아지는 신호.', '목표주가 리비전': '최근 3개월간 증권사 목표주가 평균이 오르고(+) 있는지 내리고(−) 있는지. 오르는 중이면 시장 기대가 좋아지는 신호.',
'추정치 리비전': '최근 3개월간 예상 실적(EPS 등)이 상향(+)/하향(−)되는 중인지. 상향이면 전망이 밝아지는 거예요.', '추정치 리비전': '최근 3개월간 예상 실적(EPS 등)이 상향(+)/하향(−)되는 중인지. 상향이면 전망이 밝아지는 거예요.',
'서프라이즈': '실제 발표 실적이 직전 예상치보다 잘 나왔으면(+) 어닝 서프라이즈, 못 나왔으면(−) 어닝 쇼크.', '서프라이즈': '실제 발표 실적이 직전 예상치보다 잘 나왔으면(+) 어닝 서프라이즈, 못 나왔으면(−) 어닝 쇼크.',
'실적()': '실제로 확정된 작년 실적 금액(원). 예상치가 아니라 진짜 나온 숫자.', '실적()': '실제로 확정된 작년 실적 금액(원). 예상치가 아니라 진짜 나온 숫자.',
} }
@@ -1247,23 +1445,23 @@ def _render_fundamentals_html(fund: dict | None) -> str:
roe = r.get('roe') roe = r.get('roe')
body.append( body.append(
'<tr>' '<tr>'
f'<td>{_esc(r.get("period",""))}</td>' f'<td>{_esc(_fmt_period(r.get("period","")))}</td>'
f'<td style="text-align:right">{_fmt_num(round(sales)) if isinstance(sales,(int,float)) else ""}</td>' f'<td style="text-align:right">{_fmt_eok_jo(sales)}</td>'
f'<td style="text-align:right">{_fmt_growth(r.get("sales_growth"))}</td>' f'<td style="text-align:right">{_fmt_growth(r.get("sales_growth"))}</td>'
f'<td style="text-align:right">{_fmt_num(round(oper)) if isinstance(oper,(int,float)) else ""}</td>' f'<td style="text-align:right">{_fmt_eok_jo(oper)}</td>'
f'<td style="text-align:right">{_fmt_num(round(eps)) if isinstance(eps,(int,float)) else ""}</td>' f'<td style="text-align:right">{_fmt_num(round(eps)) if isinstance(eps,(int,float)) else ""}</td>'
f'<td style="text-align:right">{_fmt_growth(r.get("eps_growth"))}</td>' f'<td style="text-align:right">{_fmt_growth(r.get("eps_growth"))}</td>'
f'<td style="text-align:right">{(str(roe)+"%") if isinstance(roe,(int,float)) else ""}</td>' f'<td style="text-align:right">{(str(roe)+"%") if isinstance(roe,(int,float)) else ""}</td>'
'</tr>' '</tr>'
) )
table_html = ( table_html = (
'<table class="flowtable">' '<div class="tbl-scroll"><table class="flowtable">'
'<thead><tr>' '<thead><tr>'
f'<th>기간</th><th>{_lbl("매출액()")}</th><th>{_lbl("매출증가율")}</th>' f'<th>기간</th><th>{_lbl("매출액()")}</th><th>{_lbl("매출증가율")}</th>'
f'<th>{_lbl("영업이익()")}</th><th>{_lbl("EPS(원)")}</th>' f'<th>{_lbl("영업이익()")}</th><th>{_lbl("EPS(원)")}</th>'
f'<th>{_lbl("EPS증가율")}</th><th>{_lbl("ROE")}</th>' f'<th>{_lbl("EPS증가율")}</th><th>{_lbl("ROE")}</th>'
'</tr></thead>' '</tr></thead>'
'<tbody>' + ''.join(body) + '</tbody></table>' '<tbody>' + ''.join(body) + '</tbody></table></div>'
) )
# ---- 컨센서스 카드 ---- # ---- 컨센서스 카드 ----
@@ -1289,7 +1487,7 @@ def _render_fundamentals_html(fund: dict | None) -> str:
parts.append(f'<tr><th>{_lbl("참여 기관수")}</th><td>{int(oc)}개</td></tr>') parts.append(f'<tr><th>{_lbl("참여 기관수")}</th><td>{int(oc)}개</td></tr>')
if parts: if parts:
cdate = consensus.get('date') cdate = consensus.get('date')
date_html = (f'<span style="color:#7a8493;font-size:11px"> · 기준 {_esc(cdate)}</span>' date_html = (f'<span style="color:#7a8493;font-size:11px"> · 기준 {_esc(_fmt_date(cdate))}</span>'
if cdate else '') if cdate else '')
cons_html = ( cons_html = (
f'<h4 style="margin:10px 0 4px">📋 컨센서스{date_html}</h4>' f'<h4 style="margin:10px 0 4px">📋 컨센서스{date_html}</h4>'
@@ -1354,7 +1552,7 @@ def _render_consensus_html(cons: dict | None) -> str:
sup_rows.append( sup_rows.append(
'<tr>' '<tr>'
f'<td>{_esc(label)}</td>' f'<td>{_esc(label)}</td>'
f'<td style="text-align:right">{_fmt_num(round(act)) if isinstance(act,(int,float)) else ""}</td>' f'<td style="text-align:right">{_fmt_eok_jo(act)}</td>'
f'<td style="text-align:right">{_fmt_growth(sp)}</td>' f'<td style="text-align:right">{_fmt_growth(sp)}</td>'
'</tr>' '</tr>'
) )
@@ -1364,7 +1562,7 @@ def _render_consensus_html(cons: dict | None) -> str:
f'<h4 style="margin:10px 0 4px">🎯 어닝 서프라이즈 ' f'<h4 style="margin:10px 0 4px">🎯 어닝 서프라이즈 '
f'<span style="color:#7a8493;font-size:11px">({_esc(any_year)} 실적 vs 직전 컨센서스)</span></h4>' f'<span style="color:#7a8493;font-size:11px">({_esc(any_year)} 실적 vs 직전 컨센서스)</span></h4>'
'<table class="flowtable">' '<table class="flowtable">'
f'<thead><tr><th>항목</th><th>{_lbl("실적()")}</th><th>{_lbl("서프라이즈")}</th></tr></thead>' f'<thead><tr><th>항목</th><th>{_lbl("실적()")}</th><th>{_lbl("서프라이즈")}</th></tr></thead>'
'<tbody>' + ''.join(sup_rows) + '</tbody></table>' '<tbody>' + ''.join(sup_rows) + '</tbody></table>'
) )
@@ -1378,10 +1576,10 @@ def _render_consensus_html(cons: dict | None) -> str:
sales = r.get('sales'); op = r.get('op'); eps = r.get('eps'); roe = r.get('roe') sales = r.get('sales'); op = r.get('op'); eps = r.get('eps'); roe = r.get('roe')
body.append( body.append(
'<tr' + (' style="opacity:.85"' if est else '') + '>' '<tr' + (' style="opacity:.85"' if est else '') + '>'
f'<td>{_esc(r.get("period",""))}{tag}</td>' f'<td>{_esc(_fmt_period(r.get("period","")))}{tag}</td>'
f'<td style="text-align:right">{_fmt_num(round(sales)) if isinstance(sales,(int,float)) else ""}</td>' f'<td style="text-align:right">{_fmt_eok_jo(sales)}</td>'
f'<td style="text-align:right">{_fmt_growth(r.get("sales_yoy"))}</td>' f'<td style="text-align:right">{_fmt_growth(r.get("sales_yoy"))}</td>'
f'<td style="text-align:right">{_fmt_num(round(op)) if isinstance(op,(int,float)) else ""}</td>' f'<td style="text-align:right">{_fmt_eok_jo(op)}</td>'
f'<td style="text-align:right">{_fmt_num(round(eps)) if isinstance(eps,(int,float)) else ""}</td>' f'<td style="text-align:right">{_fmt_num(round(eps)) if isinstance(eps,(int,float)) else ""}</td>'
f'<td style="text-align:right">{(str(roe)+"%") if isinstance(roe,(int,float)) else ""}</td>' f'<td style="text-align:right">{(str(roe)+"%") if isinstance(roe,(int,float)) else ""}</td>'
'</tr>' '</tr>'
@@ -1389,10 +1587,10 @@ def _render_consensus_html(cons: dict | None) -> str:
parts.append( parts.append(
'<h4 style="margin:10px 0 4px">📅 연도별 추정 재무 ' '<h4 style="margin:10px 0 4px">📅 연도별 추정 재무 '
'<span style="color:#7a8493;font-size:11px">(IFRS연결 · A 실적 / E 추정)</span></h4>' '<span style="color:#7a8493;font-size:11px">(IFRS연결 · A 실적 / E 추정)</span></h4>'
'<table class="flowtable">' '<div class="tbl-scroll"><table class="flowtable">'
f'<thead><tr><th>기간</th><th>{_lbl("매출액()")}</th><th>{_lbl("YoY")}</th>' f'<thead><tr><th>기간</th><th>{_lbl("매출액()")}</th><th>{_lbl("YoY")}</th>'
f'<th>{_lbl("영업이익()")}</th><th>{_lbl("EPS(원)")}</th><th>{_lbl("ROE")}</th></tr></thead>' f'<th>{_lbl("영업이익()")}</th><th>{_lbl("EPS(원)")}</th><th>{_lbl("ROE")}</th></tr></thead>'
'<tbody>' + ''.join(body) + '</tbody></table>' '<tbody>' + ''.join(body) + '</tbody></table></div>'
) )
if not parts: if not parts:
@@ -1459,6 +1657,12 @@ def build_report_html(snap: dict, parsed: dict) -> str:
v = p.get(field) v = p.get(field)
return f'{v:,}{suffix}' if isinstance(v, (int, float)) else '' return f'{v:,}{suffix}' if isinstance(v, (int, float)) else ''
def _peer_mac(p: dict) -> str:
if p.get('error'):
return '<span style="color:#ef4444;font-size:11px">조회 실패</span>'
v = p.get('market_cap')
return _fmt_market_cap(v) if isinstance(v, (int, float)) else ''
def _peer_pct(p: dict, field: str) -> str: def _peer_pct(p: dict, field: str) -> str:
if p.get('error'): if p.get('error'):
return '<span style="color:#ef4444;font-size:11px">조회 실패</span>' return '<span style="color:#ef4444;font-size:11px">조회 실패</span>'
@@ -1483,8 +1687,7 @@ def build_report_html(snap: dict, parsed: dict) -> str:
('오늘 시가', f'{b["open"]:,}', lambda p: _peer_int(p, 'open', '')), ('오늘 시가', f'{b["open"]:,}', lambda p: _peer_int(p, 'open', '')),
('오늘 고가', f'{b["high"]:,}', lambda p: _peer_int(p, 'high', '')), ('오늘 고가', f'{b["high"]:,}', lambda p: _peer_int(p, 'high', '')),
('오늘 저가', f'{b["low"]:,}', lambda p: _peer_int(p, 'low', '')), ('오늘 저가', f'{b["low"]:,}', lambda p: _peer_int(p, 'low', '')),
('시가총액', f'{b["market_cap"]:,} <span style="color:#7a8493;font-size:11px">(키움 원본 단위)</span>', ('시가총액', _fmt_market_cap(b["market_cap"]), _peer_mac),
lambda p: _peer_int(p, 'market_cap', '')),
('상장주식수', f'{b["listed_shares"]:,}', lambda p: _peer_int(p, 'listed_shares', '')), ('상장주식수', f'{b["listed_shares"]:,}', lambda p: _peer_int(p, 'listed_shares', '')),
('52주 최고', f'{b["high_52w"]:,}원 <span style="color:#7a8493;font-size:11px">({_fmt_date(b["high_52w_dt"])})</span>', ('52주 최고', f'{b["high_52w"]:,}원 <span style="color:#7a8493;font-size:11px">({_fmt_date(b["high_52w_dt"])})</span>',
lambda p: _peer_52w(p, 'high_52w', 'high_52w_dt')), lambda p: _peer_52w(p, 'high_52w', 'high_52w_dt')),
@@ -1534,6 +1737,20 @@ def build_report_html(snap: dict, parsed: dict) -> str:
chart_1y = render_svg_chart(snap, '1Y') chart_1y = render_svg_chart(snap, '1Y')
chart_6m = render_svg_chart(snap, '6M') chart_6m = render_svg_chart(snap, '6M')
chart_1m = render_svg_chart(snap, '1M') chart_1m = render_svg_chart(snap, '1M')
# 오늘 회전율·RVOL 값 — 차트 아래 표시. 장중 생성 시 종가 기준 환산('예상').
_vfrac = session_vol_frac(snap.get('candles_asc') or [])
_cands = snap.get('candles_asc') or []
_turn, _tscaled = turnover_today(_cands, _vfrac)
_rvol, _rscaled = rvol_today(_cands, _vfrac)
_cap_bits = []
if _rvol is not None:
_cap_bits.append(f'<b>RVOL</b> x{_rvol:.1f}')
if _turn is not None:
_cap_bits.append(f'<b>회전율</b> {_turn:.2f}%')
_turn_cap = (
f'<div class="chart-cap">{" · ".join(_cap_bits)}{" (예상)" if (_tscaled or _rscaled) else ""}</div>'
if _cap_bits else ''
)
chart_block = ( chart_block = (
'<div class="chart-tabs">' '<div class="chart-tabs">'
'<button type="button" data-range="1Y" class="active">1년</button>' '<button type="button" data-range="1Y" class="active">1년</button>'
@@ -1543,6 +1760,7 @@ def build_report_html(snap: dict, parsed: dict) -> str:
f'<div class="chart-panel active" data-range="1Y">{chart_1y}</div>' f'<div class="chart-panel active" data-range="1Y">{chart_1y}</div>'
f'<div class="chart-panel" data-range="6M">{chart_6m}</div>' f'<div class="chart-panel" data-range="6M">{chart_6m}</div>'
f'<div class="chart-panel" data-range="1M">{chart_1m}</div>' f'<div class="chart-panel" data-range="1M">{chart_1m}</div>'
+ _turn_cap
) )
# ---- 외국인/기관 수급 표 (최근 20일) ---- # ---- 외국인/기관 수급 표 (최근 20일) ----
@@ -1565,11 +1783,11 @@ def build_report_html(snap: dict, parsed: dict) -> str:
'<thead><tr><th>일자</th><th>종가</th><th>외국인</th><th>기관</th><th>개인</th></tr></thead>' '<thead><tr><th>일자</th><th>종가</th><th>외국인</th><th>기관</th><th>개인</th></tr></thead>'
'<tbody>' + ''.join(flow_rows) + '</tbody>' '<tbody>' + ''.join(flow_rows) + '</tbody>'
'</table>' '</table>'
f'<p class="flowsum">20일 누적' f'<p class="flowsum"><b>20일 누적</b><br>'
f'<b style="color:{"#ef4444" if fs["foreign_net"]>0 else "#3b82f6"}">외국인 {fs["foreign_net"]*1000:+,}주</b> ' f'<b style="color:{"#ef4444" if fs["foreign_net"]>0 else "#3b82f6"}">외국인 {fs["foreign_net"]*1000:+,}주</b> '
f'(매수일 {fs["foreign_buy_days"]}/20) · ' f'(매수일 {fs["foreign_buy_days"]}/20)<br>'
f'<b style="color:{"#ef4444" if fs["institution_net"]>0 else "#3b82f6"}">기관 {fs["institution_net"]*1000:+,}주</b> ' f'<b style="color:{"#ef4444" if fs["institution_net"]>0 else "#3b82f6"}">기관 {fs["institution_net"]*1000:+,}주</b> '
f'(매수일 {fs["institution_buy_days"]}/20) · ' f'(매수일 {fs["institution_buy_days"]}/20)<br>'
f'개인 {fs["individual_net"]*1000:+,}주</p>' f'개인 {fs["individual_net"]*1000:+,}주</p>'
) )
@@ -1598,7 +1816,7 @@ def build_report_html(snap: dict, parsed: dict) -> str:
paras = [p.strip() for p in s['body'].split('\n\n') if p.strip()] paras = [p.strip() for p in s['body'].split('\n\n') if p.strip()]
if not paras: if not paras:
paras = [s['body']] paras = [s['body']]
body_html = ''.join(f'<p>{_esc(para).replace(chr(10), "<br>")}</p>' for para in paras) body_html = ''.join(f'<p>{_emphasize(_esc(para)).replace(chr(10), "<br>")}</p>' for para in paras)
comment_html_parts.append( comment_html_parts.append(
f'<div class="rpt-llm-block"><h4>{title}</h4>{body_html}</div>' f'<div class="rpt-llm-block"><h4>{title}</h4>{body_html}</div>'
) )
@@ -1768,16 +1986,19 @@ body{background:#0f1419;color:#cfd5df;font-family:-apple-system,BlinkMacSystemFo
/* 보조 섹션 2(넓으면 다단) 그리드 화면에 모이게 */ /* 보조 섹션 2(넓으면 다단) 그리드 화면에 모이게 */
.rpt-cols{display:grid;grid-template-columns:repeat(auto-fit,minmax(340px,1fr));gap:14px;align-items:start;margin:14px 0} .rpt-cols{display:grid;grid-template-columns:repeat(auto-fit,minmax(340px,1fr));gap:14px;align-items:start;margin:14px 0}
.rpt-cols>.rpt-section{margin:0;height:100%} .rpt-cols>.rpt-section{margin:0;height:100%}
.kvtable{border-collapse:collapse;width:100%} .kvtable{border-collapse:collapse;width:100%;font-size:12px}
.kvtable th{text-align:left;padding:7px 10px;color:#7a8493;font-weight:500;width:160px;border-bottom:1px solid #1f2937;font-size:13px} .kvtable th{text-align:left;padding:6px 9px;color:#7a8493;font-weight:500;width:160px;border-bottom:1px solid #1f2937;font-size:12px}
.kvtable td{padding:7px 10px;border-bottom:1px solid #1f2937} .kvtable td{padding:6px 9px;border-bottom:1px solid #1f2937}
.flowtable{border-collapse:collapse;width:100%;font-size:13px} .tbl-scroll{overflow-x:auto;-webkit-overflow-scrolling:touch}
.flowtable th{padding:6px 10px;color:#7a8493;border-bottom:1px solid #2a2f3a;text-align:left} .tbl-scroll>table{min-width:100%;width:max-content}
.flowtable td{padding:5px 10px;border-bottom:1px solid #1a1f28} .flowtable{border-collapse:collapse;width:100%;font-size:12px}
.flowsum{margin:10px 0 0;padding:10px;background:#0f1419;border-radius:6px;font-size:13px} .flowtable th{padding:5px 9px;color:#7a8493;border-bottom:1px solid #2a2f3a;text-align:left;white-space:nowrap}
.flowtable td{padding:5px 9px;border-bottom:1px solid #1a1f28;white-space:nowrap}
.flowsum{margin:10px 0 0;padding:10px;background:#0f1419;border-radius:6px;font-size:13px;line-height:1.8}
.rpt-llm-block{margin:16px 0;padding:14px;background:#0f1419;border-radius:6px} .rpt-llm-block{margin:16px 0;padding:14px;background:#0f1419;border-radius:6px}
.rpt-llm-block h4{margin:0 0 10px;color:#fbbf24;font-size:14px} .rpt-llm-block h4{margin:0 0 10px;color:#fbbf24;font-size:14px}
.rpt-llm-block p{margin:8px 0;text-align:justify} .rpt-llm-block p{margin:8px 0;text-align:justify}
.rpt-em{color:#ff6b6b;font-weight:600}
.rpt-verdict{background:linear-gradient(135deg,#1f2937 0%,#161b22 100%)} .rpt-verdict{background:linear-gradient(135deg,#1f2937 0%,#161b22 100%)}
.verdict-line{font-size:16px;font-weight:600;margin:10px 0 6px;color:#fff} .verdict-line{font-size:16px;font-weight:600;margin:10px 0 6px;color:#fff}
.rpt-disclaimer{color:#7a8493;font-size:12px;margin:6px 0 0} .rpt-disclaimer{color:#7a8493;font-size:12px;margin:6px 0 0}
@@ -1788,6 +2009,8 @@ body{background:#0f1419;color:#cfd5df;font-family:-apple-system,BlinkMacSystemFo
.chart-tabs button.active{background:rgba(251,191,36,0.12);color:#fbbf24;border-color:#fbbf24} .chart-tabs button.active{background:rgba(251,191,36,0.12);color:#fbbf24;border-color:#fbbf24}
.chart-panel{display:none} .chart-panel{display:none}
.chart-panel.active{display:block} .chart-panel.active{display:block}
.chart-cap{margin:8px 0 4px;padding:8px 10px 0;font-size:9px;line-height:1.5;color:#7a8493;border-top:1px solid #1d222b}
.chart-cap b{color:#9aa4b2;font-weight:600}
.kvtable th{vertical-align:top} .kvtable th{vertical-align:top}
.info-label{cursor:pointer;user-select:none;-webkit-user-select:none;-webkit-touch-callout:none;border-bottom:1px dotted #5b6473;display:inline-flex;align-items:center;gap:4px;color:#7a8493;padding:1px 2px} .info-label{cursor:pointer;user-select:none;-webkit-user-select:none;-webkit-touch-callout:none;border-bottom:1px dotted #5b6473;display:inline-flex;align-items:center;gap:4px;color:#7a8493;padding:1px 2px}
.info-label::after{content:'';font-size:11px;color:#5b6473;font-weight:normal} .info-label::after{content:'';font-size:11px;color:#5b6473;font-weight:normal}
@@ -1818,8 +2041,8 @@ body{background:#0f1419;color:#cfd5df;font-family:-apple-system,BlinkMacSystemFo
.peertable th:not(:first-child){text-align:right} .peertable th:not(:first-child){text-align:right}
.peertable td{padding:7px 10px;border-bottom:1px solid #1a1f28} .peertable td{padding:7px 10px;border-bottom:1px solid #1a1f28}
.peers-note{margin:10px 0 0;color:#7a8493;font-size:11px} .peers-note{margin:10px 0 0;color:#7a8493;font-size:11px}
.basicpeertable{border-collapse:collapse;width:100%;font-size:13px;table-layout:fixed} .basicpeertable{border-collapse:collapse;width:100%;font-size:12px;table-layout:fixed}
.basicpeertable th.lbl{text-align:left;padding:7px 10px;color:#7a8493;font-weight:500;width:140px;border-bottom:1px solid #1f2937;font-size:13px;vertical-align:top} .basicpeertable th.lbl{text-align:left;padding:6px 9px;color:#7a8493;font-weight:500;width:130px;border-bottom:1px solid #1f2937;font-size:12px;vertical-align:top}
.basicpeertable thead th{padding:8px 10px;color:#cfd5df;border-bottom:1px solid #2a2f3a;font-weight:600;text-align:left;background:#0f1419} .basicpeertable thead th{padding:8px 10px;color:#cfd5df;border-bottom:1px solid #2a2f3a;font-weight:600;text-align:left;background:#0f1419}
.basicpeertable thead th:nth-child(2){color:#fbbf24} .basicpeertable thead th:nth-child(2){color:#fbbf24}
.basicpeertable td{padding:7px 10px;border-bottom:1px solid #1f2937;vertical-align:top;word-break:break-word} .basicpeertable td{padding:7px 10px;border-bottom:1px solid #1f2937;vertical-align:top;word-break:break-word}
@@ -520,14 +520,34 @@ def _render_html_owner(idx: int, owner: str, d: dict, balances: dict, prev_key,
) )
# behive_web _render_owner_kpi 와 동일한 순서·라벨로 통일. # behive_web _render_owner_kpi 와 동일한 순서·라벨로 통일.
# 1) 총평가 → 2) 총매입 → 3) 총평가손익 → 4) 당일평가손익 → 5) 예수금 → 6) 순자산 → 7) 보유 종목 → 8) 당일 매매 # '총'은 계좌 전체(현금 포함)일 때만: 총자산 = 평가금액 + 예수금.
# 총자산 → 매입금액 → 평가금액 → 평가손익 → 예수금 → [당일 입출금] → 보유종목/당일매매 → 당일 평가손익
held = [r for r in d['consolidated'] if not r.get('phantom')] held = [r for r in d['consolidated'] if not r.get('phantom')]
parts.append(kpi(' 평가금액', f'{d["total_value"]:,}')) parts.append(kpi('자산', f'{d["total_net"]:,}'))
parts.append(kpi('매입금액', f'{d["total_cost"]:,}')) parts.append(kpi('매입금액', f'{d["total_cost"]:,}'))
parts.append(kpi('평가금액', f'{d["total_value"]:,}'))
parts.append(kpi( parts.append(kpi(
'평가손익', '평가손익',
f'{_signed(d["total_profit"])} ({_signed_pct(d["total_profit_rate"])})' f'{_signed(d["total_profit"])} ({_signed_pct(d["total_profit_rate"])})'
)) ))
parts.append(kpi('예수금', f'{d["deposit"]:,}'))
# 당일 입출금은 예수금 바로 아래 (현금 잔액 ↔ 그날 현금 이동)
cash_in = d.get('cash_in', 0)
cash_out = d.get('cash_out', 0)
if cash_in or cash_out:
net = cash_in - cash_out
nsign = '+' if net >= 0 else ''
ncolor = '#0a7' if net > 0 else ('#d33' if net < 0 else '#666')
# 한쪽만 있으면 순액과 같은 값이라 생략 (둘 다 있을 때만 쪼갠다)
detail = ''
if cash_in and cash_out:
detail = (f' <span style="color:#888;font-size:13px;">'
f'· 입금 {cash_in:,}원 · 출금 {cash_out:,}원</span>')
parts.append(kpi(
'당일 입출금',
f'<span style="color:{ncolor};">{nsign}{net:,}원</span>{detail}'
))
parts.append(kpi('보유종목/당일매매', f'{len(held)}개 / {len(d["traded_today"])}'))
day_pl_total = d.get('day_pl_total') day_pl_total = d.get('day_pl_total')
if day_pl_total is None: if day_pl_total is None:
if prev_key: if prev_key:
@@ -540,26 +560,6 @@ def _render_html_owner(idx: int, owner: str, d: dict, balances: dict, prev_key,
pct_html = f' ({_signed_pct(pct)})' pct_html = f' ({_signed_pct(pct)})'
suffix = f' <span style="color:#888;font-size:13px;"{prev_key} 대비</span>' if prev_key else '' suffix = f' <span style="color:#888;font-size:13px;"{prev_key} 대비</span>' if prev_key else ''
parts.append(kpi('당일 평가손익', f'{_signed(day_pl_total)}{pct_html}{suffix}')) parts.append(kpi('당일 평가손익', f'{_signed(day_pl_total)}{pct_html}{suffix}'))
parts.append(kpi('예수금', f'{d["deposit"]:,}'))
parts.append(kpi('순자산', f'{d["total_net"]:,}'))
cash_in = d.get('cash_in', 0)
cash_out = d.get('cash_out', 0)
if cash_in or cash_out:
net = cash_in - cash_out
nsign = '+' if net >= 0 else ''
ncolor = '#0a7' if net > 0 else ('#d33' if net < 0 else '#666')
detail_parts = []
if cash_in:
detail_parts.append(f'입금 {cash_in:,}')
if cash_out:
detail_parts.append(f'출금 {cash_out:,}')
detail = f' <span style="color:#888;font-size:13px;"{" · ".join(detail_parts)}</span>' if detail_parts else ''
parts.append(kpi(
'당일 입출금',
f'<span style="color:{ncolor};">{nsign}{net:,}원</span>{detail}'
))
parts.append(kpi('보유 종목', f'{len(held)}'))
parts.append(kpi('당일 매매', f'{len(d["traded_today"])}'))
realized_pl = d.get('realized_pl_total', 0) realized_pl = d.get('realized_pl_total', 0)
realized_fees = d.get('realized_fees_total', 0) realized_fees = d.get('realized_fees_total', 0)
if d.get('traded_today') and (realized_pl or realized_fees): if d.get('traded_today') and (realized_pl or realized_fees):
@@ -710,13 +710,29 @@ def _render_html_body(owner_data: dict, ordered: list, balances: dict, today_key
f'<td style="{S["kpi_value"]}">{value_html}</td></tr>' f'<td style="{S["kpi_value"]}">{value_html}</td></tr>'
) )
# behive_web KPI 순서로 통일 # behive_web KPI 순서·라벨로 통일 (블록 자체가 전체 합산이라 '총' 중복 접두 제거)
parts.append(kpi(' 평가금액', f'{grand_value:,}')) parts.append(kpi('자산', f'{grand_net:,}'))
parts.append(kpi('매입금액', f'{grand_cost:,}')) parts.append(kpi('매입금액', f'{grand_cost:,}'))
parts.append(kpi('평가금액', f'{grand_value:,}'))
parts.append(kpi( parts.append(kpi(
'평가손익', '평가손익',
f'{_signed(grand_profit)} ({_signed_pct(grand_rate)})' f'{_signed(grand_profit)} ({_signed_pct(grand_rate)})'
)) ))
parts.append(kpi('예수금', f'{grand_deposit:,}'))
# 당일 입출금은 예수금 바로 아래
if grand_cash_in or grand_cash_out:
gn = grand_net_cash_flow
gsign = '+' if gn >= 0 else ''
gcolor = '#0a7' if gn > 0 else ('#d33' if gn < 0 else '#666')
# 한쪽만 있으면 순액과 같은 값이라 생략
gdetail = ''
if grand_cash_in and grand_cash_out:
gdetail = (f' <span style="color:#888;font-size:13px;">'
f'· 입금 {grand_cash_in:,}원 · 출금 {grand_cash_out:,}원</span>')
parts.append(kpi(
'당일 입출금',
f'<span style="color:{gcolor};">{gsign}{gn:,}원</span>{gdetail}'
))
if grand_day_pl_total is not None: if grand_day_pl_total is not None:
pct_html = '' pct_html = ''
if grand_prev_net: if grand_prev_net:
@@ -726,22 +742,6 @@ def _render_html_body(owner_data: dict, ordered: list, balances: dict, today_key
parts.append(kpi('당일 평가손익', f'{_signed(grand_day_pl_total)}{pct_html}{suffix}')) parts.append(kpi('당일 평가손익', f'{_signed(grand_day_pl_total)}{pct_html}{suffix}'))
elif prev_key: elif prev_key:
parts.append(kpi('당일 평가손익', '<span style="color:#888;">전날 스냅샷 없음</span>')) parts.append(kpi('당일 평가손익', '<span style="color:#888;">전날 스냅샷 없음</span>'))
parts.append(kpi('총 예수금', f'{grand_deposit:,}'))
parts.append(kpi('총 순자산', f'{grand_net:,}'))
if grand_cash_in or grand_cash_out:
gn = grand_net_cash_flow
gsign = '+' if gn >= 0 else ''
gcolor = '#0a7' if gn > 0 else ('#d33' if gn < 0 else '#666')
gd = []
if grand_cash_in:
gd.append(f'입금 {grand_cash_in:,}')
if grand_cash_out:
gd.append(f'출금 {grand_cash_out:,}')
gdetail = f' <span style="color:#888;font-size:13px;"{" · ".join(gd)}</span>'
parts.append(kpi(
'당일 입출금',
f'<span style="color:{gcolor};">{gsign}{gn:,}원</span>{gdetail}'
))
grand_realized_pl = sum(d.get('realized_pl_total', 0) for d in owner_data.values()) grand_realized_pl = sum(d.get('realized_pl_total', 0) for d in owner_data.values())
grand_realized_fees = sum(d.get('realized_fees_total', 0) for d in owner_data.values()) grand_realized_fees = sum(d.get('realized_fees_total', 0) for d in owner_data.values())
if any(d.get('traded_today') for d in owner_data.values()) and (grand_realized_pl or grand_realized_fees): if any(d.get('traded_today') for d in owner_data.values()) and (grand_realized_pl or grand_realized_fees):
@@ -767,6 +767,20 @@ def build_report(by_account: bool = False) -> tuple[str, str, str]:
raise RuntimeError('키움 REST 응답에 보유종목이 없습니다.') raise RuntimeError('키움 REST 응답에 보유종목이 없습니다.')
today_key = datetime.now(KST).strftime('%Y-%m-%d') today_key = datetime.now(KST).strftime('%Y-%m-%d')
# 당일 매수 동반 매도행의 pl을 '전일 보유 평단' 기준으로 재계산 (ka10170 round-trip 오표시 교정).
# 자산웹과 동일 기준 — 전일 평단은 파일 이력 재생(prev_avg_map, 당일분 제외)에서.
try:
import trade_journal as tj
_prev_avgs = tj.prev_avg_map(today_key)
for _lb, _trs in journal_by_label.items():
for _t in _trs:
_pa = _prev_avgs.get((_lb, _t.get('code')), 0)
if (_t.get('sell_qty') or 0) > 0 and (_t.get('buy_qty') or 0) > 0 and _pa > 0:
tj._apply_rebase(_t, float(_t.get('sell_avg') or 0), int(_t['sell_qty']), _pa)
except Exception as e:
print(f'[journal rebase] failed: {e}', file=sys.stderr)
all_labels = [a['label'] for a in list_accounts()] all_labels = [a['label'] for a in list_accounts()]
owner_groups = group_by_owner(all_labels) owner_groups = group_by_owner(all_labels)
@@ -998,14 +1012,18 @@ def build_report(by_account: bool = False) -> tuple[str, str, str]:
title = OWNER_LABELS.get(owner, f'{owner} 자산') title = OWNER_LABELS.get(owner, f'{owner} 자산')
labels_disp = ' + '.join(d['labels']) labels_disp = ' + '.join(d['labels'])
held = [r for r in d['consolidated'] if not r.get('phantom')] held = [r for r in d['consolidated'] if not r.get('phantom')]
# behive_web KPI 순서·라벨로 통일 # behive_web KPI 순서·라벨로 통일. 라벨은 표시폭 17칸 정렬(한글 2칸 기준).
lines += [ lines += [
'==============================', '==============================',
f"{idx}) {title} ({labels_disp})", f"{idx}) {title} ({labels_disp})",
'==============================', '==============================',
f' 평가금액 : {d["total_value"]:,}', f'자산 : {d["total_net"]:,}',
f'매입금액 : {d["total_cost"]:,}', f'매입금액 : {d["total_cost"]:,}',
f'총 평가손익 : {d["total_profit"]:+,} ({d["total_profit_rate"]:+.2f}%)', f'평가금액 : {d["total_value"]:,}',
f'평가손익 : {d["total_profit"]:+,}원 ({d["total_profit_rate"]:+.2f}%)',
f'예수금 : {d["deposit"]:,}',
# '보유종목/당일매매'는 표시폭이 정확히 17칸이라 패딩 없이 콜론이 맞는다.
f'보유종목/당일매매: {len(held)}개 / {len(d["traded_today"])}',
] ]
day_pl = d.get('day_pl_total') day_pl = d.get('day_pl_total')
if day_pl is not None: if day_pl is not None:
@@ -1015,10 +1033,6 @@ def build_report(by_account: bool = False) -> tuple[str, str, str]:
lines.append(f'당일 평가손익 : {day_pl:+,}원 ({pct:+.2f}%){suffix}') lines.append(f'당일 평가손익 : {day_pl:+,}원 ({pct:+.2f}%){suffix}')
elif prev_key: elif prev_key:
lines.append(f'당일 평가손익 : 전날 스냅샷 없음 ({prev_key})') lines.append(f'당일 평가손익 : 전날 스냅샷 없음 ({prev_key})')
lines.append(f'예수금 : {d["deposit"]:,}')
lines.append(f'순자산 : {d["total_net"]:,}')
lines.append(f'보유 종목 : {len(held)}')
lines.append(f'당일 매매 : {len(d["traded_today"])}')
if d.get('traded_today') and (d.get('realized_pl_total', 0) or d.get('realized_fees_total', 0)): if d.get('traded_today') and (d.get('realized_pl_total', 0) or d.get('realized_fees_total', 0)):
fee = d.get('realized_fees_total', 0) fee = d.get('realized_fees_total', 0)
fee_part = f' (수수료·세금 {fee:,}원)' if fee else '' fee_part = f' (수수료·세금 {fee:,}원)' if fee else ''
@@ -1112,7 +1126,7 @@ def build_report(by_account: bool = False) -> tuple[str, str, str]:
tg_lines = [f'📊 주식 리포트 | {today_key} 20:00'] tg_lines = [f'📊 주식 리포트 | {today_key} 20:00']
tg_lines.append('') tg_lines.append('')
tg_lines.append(f'평가 {grand_value:,}원 · 예수금 {grand_deposit:,}') tg_lines.append(f'평가 {grand_value:,}원 · 예수금 {grand_deposit:,}')
tg_lines.append(f'자산 {grand_net:,}') tg_lines.append(f'자산 {grand_net:,}')
tg_lines.append(f'{grand_profit:+,}원 ({grand_rate:+.2f}%)') tg_lines.append(f'{grand_profit:+,}원 ({grand_rate:+.2f}%)')
if grand_day_pl_total is not None: if grand_day_pl_total is not None:
tg_lines.append(f'당일 평가손익 {grand_day_pl_total:+,}원 ({prev_key} 대비)') tg_lines.append(f'당일 평가손익 {grand_day_pl_total:+,}원 ({prev_key} 대비)')
@@ -1121,7 +1135,10 @@ def build_report(by_account: bool = False) -> tuple[str, str, str]:
elif owner_data: elif owner_data:
tg_lines.append('전날 이전 스냅샷 없음') tg_lines.append('전날 이전 스냅샷 없음')
if grand_cash_in or grand_cash_out: if grand_cash_in or grand_cash_out:
tg_lines.append(f'당일 입출금 {grand_net_cash_flow:+,}원 (입금 {grand_cash_in:,}원 · 출금 {grand_cash_out:,}원)') # 한쪽만 있으면 순액과 같은 값이라 괄호 생략
_brk = (f' (입금 {grand_cash_in:,}원 · 출금 {grand_cash_out:,}원)'
if (grand_cash_in and grand_cash_out) else '')
tg_lines.append(f'당일 입출금 {grand_net_cash_flow:+,}{_brk}')
grand_realized_pl = sum(d.get('realized_pl_total', 0) for d in owner_data.values()) grand_realized_pl = sum(d.get('realized_pl_total', 0) for d in owner_data.values())
if any(d.get('traded_today') for d in owner_data.values()) and grand_realized_pl: if any(d.get('traded_today') for d in owner_data.values()) and grand_realized_pl:
tg_lines.append(f'당일 실현 {grand_realized_pl:+,}') tg_lines.append(f'당일 실현 {grand_realized_pl:+,}')
@@ -1130,7 +1147,7 @@ def build_report(by_account: bool = False) -> tuple[str, str, str]:
for owner in ordered: for owner in ordered:
d = owner_data[owner] d = owner_data[owner]
title = OWNER_LABELS.get(owner, owner).replace(' 자산', '') title = OWNER_LABELS.get(owner, owner).replace(' 자산', '')
tg_lines.append(f'{title} 자산 {d["total_net"]:,}') tg_lines.append(f'{title} 자산 {d["total_net"]:,}')
tg_lines.append(f' 평가 {d["total_value"]:,}원 · 예수금 {d["deposit"]:,}') tg_lines.append(f' 평가 {d["total_value"]:,}원 · 예수금 {d["deposit"]:,}')
tg_lines.append(f' {d["total_profit"]:+,}원 ({d["total_profit_rate"]:+.2f}%)') tg_lines.append(f' {d["total_profit"]:+,}원 ({d["total_profit_rate"]:+.2f}%)')
if d.get('day_pl_total') is not None: if d.get('day_pl_total') is not None:
@@ -0,0 +1,591 @@
#!/usr/bin/env python3
"""토글 켜진 종목의 급등락 감시 → 레이 텔레그램 알림.
LLM을 깨우지 않음. 기준을 병행한다:
1. 거래소 ·하한가 도달 그날 있는 끝까지 . 가장 강한 신호라 무엇에도 가리지 않는다.
2. 거래소 VI 발동 "이건 급등락이다" 거래소가 공식 판정. 문턱을 우리가 정할 필요가 없다.
3. 자기 이력 분위수 장중 이탈폭(전일종가 대비) 종목 과거 이탈폭의 p90 넘으면 알림.
고정 % 쓰지 않는 이유 (실측 관심·감시 65종목 × 280거래일, 2026-08-04):
- 장중 이탈폭 중간값이 3.8% ±3% 급등락이 아니라 평범한
- 종목별 변동성이 22 (ATR14 1.0%~22.3%). ±5% 문턱이면 KODEX 미국S&P500 발생 0,
SK이터닉스는 75. 같은 5% 한쪽엔 도달 불가, 한쪽엔 노이즈다.
ATR 배수(ATR% × K) 쓰지 않는 이유 2026-08-04 관리자님 지적으로 교체:
국내 주식 하루 가격제한폭이 ±30% 인데 ATR 배수는 상한이 없어 변동성 종목의 문턱이
제한폭 밖으로 밀려난다. 실측: 1(ATR×1.5) 5/65 종목, 확대(ATR×3.0) 31/65 종목(48%)에서
30% 초과 = **영원히 발동 불가**였다(ATR% 중간값이 10% 확대는 절반이 죽는다).
분위수는 실제로 관측된 이탈폭이라 구조적으로 제한폭을 넘을 없다(p90~p99 전부 30% 초과 0종목).
덤으로 알림량이 정의상 (1-p) 비율로 확정된다 p90 = 종목당 25.
신규상장 첫날·정리매매는 제한폭 예외지만, 그런 종목은 이력이 없어 애초에 VI만 감시한다.
데이터원은 behive_web /api/realtime/quotes 현재가와 VI를 번에 주고 키움 호출이 0이다.
VI(1h) 시장 전역 broadcast라 구독이 필요 없고, 현재가(0B) 구독이 필요한데 behive_web
_rt_gather_codes() 이미 보유+관심+감시를 구독하므로 토글 종목은 부분집합이다.
구독 상한에 걸려 빠진 종목만 ka10095 배치 1콜로 폴백한다.
·하한가·VI 걸려 있는 동안 분위수 트리거는 **보류**했다가 풀린 뒤에 내보낸다
(2026-08-06 관리자님 요청). 그전엔 조용히 버려져서, VI 중에 문턱을 넘었다가 해제 시점에
되밀린 움직임은 알림이 아예 없었다. 같은 사건을 알리지 않으면서 사실은 잃지 않기 위함.
state:
behive_surge_toggles.json 감시 대상 (behive_web 🔔 토글이 )
surge_thresholds.json {date, by_code: {code: {thr, thr_big, prev_close, n}}}. 하루 1회만 계산
surge_limits.json {date, by_code: {code: {upl, lst}}}. 거래소 ·하한가, 하루 1
surge_alerts.json {date: {code: [트리거키], __pending__: {code: {: 보류정보}}}}
방향별 1 + 확대단계 1 + ·하한가 1, VI 발동 건마다 1
Usage:
python3 surge_monitor.py check # 1회 감시 (launchd 용)
python3 surge_monitor.py check --force # 장외에도 실행 (테스트용)
python3 surge_monitor.py dry-run # 판정만 출력, 텔레그램 발송 없음
python3 surge_monitor.py list # 토글 종목의 문턱(%)·발동가 출력
"""
from __future__ import annotations
import fcntl
import json
import sys
import time
import urllib.parse
import urllib.request
from contextlib import contextmanager
from datetime import datetime, timezone, timedelta
from pathlib import Path
KST = timezone(timedelta(hours=9))
WORKSPACE = Path('/Users/snowoyh/.openclaw/agents/stock/workspace')
sys.path.insert(0, str(WORKSPACE / 'scripts'))
sys.path.insert(0, str(WORKSPACE))
import kiwoom_client as kc # noqa: E402
STATE_DIR = WORKSPACE / 'state'
TOGGLES = STATE_DIR / 'behive_surge_toggles.json'
THR_CACHE = STATE_DIR / 'surge_thresholds.json'
LIMITS_CACHE = STATE_DIR / 'surge_limits.json'
ALERTS_STATE = STATE_DIR / 'surge_alerts.json'
# 보류 트리거를 담는 예약 키. 종목코드는 6자리라 이 이름과 충돌하지 않는다.
PENDING_KEY = '__pending__'
CONFIG_PATH = Path('/Users/snowoyh/.openclaw/openclaw.json')
TELEGRAM_ACCOUNT = 'stock' # 레이 봇
# 1차 문턱 = 그 종목 과거 장중 이탈폭의 이 분위수. 통수를 정하는 유일한 손잡이 —
# 분위수라 알림량이 정의상 (1-p) 비율로 확정된다. 0.90 = 종목당 연 25회(≈2주 1번).
SURGE_PCTL = 0.90
# 확대 단계 — 1차 알림 후 여기까지 더 벌어지면 한 번 더. 종목당 하루 최대 2통.
SURGE_PCTL_BIG = 0.98
# 분위수 산출에 필요한 최소 관측일. 미달(신규상장 등)이면 VI만 감시한다.
MIN_HISTORY = 60
# 이력 조회 봉 수 — sqlite 캐시에서 읽는 양만 늘린다(추가 API 콜 없음).
HISTORY_COUNT = 400
# 문턱 산출 페이싱 — ka10081 유량이 초당 5건이라 캐시가 stale 한 종목이 많으면 429가 쏟아진다.
MAX_COMPUTE_PER_CYCLE = 12
COMPUTE_PACE_SEC = 0.35
# behive_web 실시간 엔드포인트. BIND_HOST='' 라 localhost 로 도달한다.
RT_URL = 'http://127.0.0.1:18790/api/realtime/quotes'
RT_TIMEOUT = 5
MARKET_OPEN = (9, 0)
MARKET_CLOSE = (15, 35) # 15:30 마감 + 최종 체결 버퍼
def load_json(path: Path, default):
if path.exists():
try:
return json.loads(path.read_text())
except Exception:
return default
return default
def save_json(path: Path, data):
path.parent.mkdir(parents=True, exist_ok=True)
tmp = path.with_suffix(path.suffix + '.tmp')
tmp.write_text(json.dumps(data, ensure_ascii=False, indent=2))
tmp.replace(path)
@contextmanager
def alerts_lock():
"""surge_alerts.json 동시 쓰기 직렬화. watchlist_monitor 와 동일 패턴, 별도 lock 파일."""
lock_path = ALERTS_STATE.with_suffix(ALERTS_STATE.suffix + '.lock')
lock_path.parent.mkdir(parents=True, exist_ok=True)
f = open(lock_path, 'a')
try:
fcntl.flock(f.fileno(), fcntl.LOCK_EX)
yield
finally:
try:
fcntl.flock(f.fileno(), fcntl.LOCK_UN)
finally:
f.close()
def is_market_hours() -> bool:
now = datetime.now(KST)
if now.weekday() >= 5:
return False
# KRX 휴장일도 거래 없음. 데이터 파일 누락이나 import 실패 시엔 평소대로 진행.
try:
from holiday_sync import is_holiday_today
if is_holiday_today():
return False
except Exception:
pass
mins = now.hour * 60 + now.minute
return (MARKET_OPEN[0] * 60 + MARKET_OPEN[1]) <= mins <= (MARKET_CLOSE[0] * 60 + MARKET_CLOSE[1])
def send_telegram(text: str) -> bool:
cfg = json.loads(CONFIG_PATH.read_text())
acct = cfg['channels']['telegram']['accounts'][TELEGRAM_ACCOUNT]
token = acct['botToken']
chat_ids = acct.get('allowFrom') or []
if not chat_ids:
print('no telegram chat_ids', file=sys.stderr)
return False
url = f'https://api.telegram.org/bot{token}/sendMessage'
ok = True
for chat_id in chat_ids:
data = urllib.parse.urlencode({
'chat_id': chat_id,
'text': text[:4000],
'disable_web_page_preview': 'true',
}).encode()
try:
req = urllib.request.Request(url, data=data, method='POST')
with urllib.request.urlopen(req, timeout=15) as r:
if r.status != 200:
ok = False
print(f'telegram HTTP {r.status}', file=sys.stderr)
except Exception as e:
print(f'telegram error: {e}', file=sys.stderr)
ok = False
return ok
# ---------------- 감시 대상 ----------------
def load_toggles() -> dict[str, str]:
"""{code: name} — behive_web 의 🔔 토글이 켠 종목만."""
raw = load_json(TOGGLES, {})
by_code = raw.get('by_code') if isinstance(raw, dict) else None
if not isinstance(by_code, dict):
return {}
out: dict[str, str] = {}
for code, v in by_code.items():
cc = kc._clean_code(code)
if not cc or not v:
continue
# v 는 True(레거시) 또는 {'name': ...}
out[cc] = (v.get('name') or '') if isinstance(v, dict) else ''
return out
# ---------------- 데이터원 ----------------
def fetch_realtime(codes: list[str]) -> tuple[dict, dict, bool]:
"""behive_web 실시간 허브에서 (quotes, vi, ok). 키움 호출 0.
허브가 콜드하거나 behive_web 죽어 있으면 ok=False 호출측이 폴백/경고를 결정한다.
"""
if not codes:
return {}, {}, False
url = f'{RT_URL}?codes={",".join(codes)}'
try:
with urllib.request.urlopen(url, timeout=RT_TIMEOUT) as r:
d = json.loads(r.read().decode())
except Exception as e:
print(f'[warn] behive_web 실시간 조회 실패 ({e}) — VI 감시 불가, ATR만 진행', file=sys.stderr)
return {}, {}, False
return (d.get('quotes') or {}), (d.get('vi') or {}), bool(d.get('connected'))
def fetch_quotes_fallback(codes: list[str]) -> dict:
"""구독 상한에 걸려 허브에 없는 종목만 ka10095 배치 1콜로 보충."""
if not codes:
return {}
try:
return kc.get_watchlist_quotes(codes) or {}
except Exception as e:
print(f'[warn] ka10095 배치 실패: {e}', file=sys.stderr)
return {}
# ---------------- 문턱 (자기 이력 분위수) ----------------
def _quantile(sorted_vals: list[float], p: float) -> float:
"""오름차순 리스트의 p 분위수. 실측 스크립트와 같은 식(nearest-rank)을 써야 값이 일치한다."""
return sorted_vals[min(len(sorted_vals) - 1, int(len(sorted_vals) * p))]
def _compute_thresholds(code: str) -> tuple[dict | None, bool]:
"""(문턱 dict 또는 None, 재시도해야 하는가).
장중 이탈폭 = max(|고가전일종가|, |저가전일종가|) / 전일종가 × 100.
종가 대비가 아니라 **전일종가 대비 장중 최대 이탈폭** 쓰는 이유 실시간 감시가 보는 값이
`현재가 vs 전일종가`(키움 pct)라서 같은 축으로 비교해야 한다. 종가기준은 장중 움직임을
과소평가해(중간값 3.8% vs 종가기준 1.x%) 문턱이 너무 낮게 잡힌다.
번째 반환값이 필요한 이유 조회 실패(429·네트워크) 이력부족과 같이 취급해
dict 캐시하면 종목이 **하루 내내 조용히 VI만 감시**하게 된다. 실패는 재시도 대상.
"""
try:
import daily_candles_cache as dcc
candles = dcc.get_candles(code, HISTORY_COUNT)
except Exception as e:
print(f'[{code}] 일봉 조회 실패 (다음 사이클 재시도): {e}', file=sys.stderr)
return None, True
if not candles or len(candles) < MIN_HISTORY:
return None, False
exc: list[float] = []
for i in range(1, len(candles)):
pc = candles[i - 1]['close']
if not pc:
continue
exc.append(max(abs(candles[i]['high'] - pc), abs(candles[i]['low'] - pc)) / pc * 100)
if len(exc) < MIN_HISTORY:
return None, False
exc.sort()
prev_close = candles[-1]['close']
if not prev_close:
return None, False
return {
'thr': round(_quantile(exc, SURGE_PCTL), 2),
'thr_big': round(_quantile(exc, SURGE_PCTL_BIG), 2),
'prev_close': prev_close,
'n': len(exc),
}, False
def get_threshold_map(codes: list[str]) -> dict[str, dict]:
"""종목별 문턱 맵. 하루 1회만 계산하고 캐시한다.
daily_candles_cache.get_candles 캐시 최신봉이 어제보다 오래되면 ka10081 때린다.
사이클(1) × 종목수만큼 호출하면 폭주하므로 날짜가 바뀔 때와 토글이 생길 때만 계산.
분위수 파라미터를 바꿨으면 캐시가 값을 들고 있으니 `pctl` 서명이 다르면 재계산한다.
**ka10081 유량 제한이 초당 5**이라 종목을 한꺼번에 돌리면 429 쏟아진다(2026-08-04 실측:
70종목 일괄 산출 26종목 실패). 그래서 사이클당 `MAX_COMPUTE_PER_CYCLE` 개까지만,
`COMPUTE_PACE_SEC` 간격으로 계산한다. 남은 종목은 다음 사이클이 이어받는다(1 간격 × 396회라
시작 안에 전부 채워진다). 조회 실패는 캐시하지 않아 다음 사이클에 재시도된다.
"""
today = datetime.now(KST).strftime('%Y-%m-%d')
sig = f'{SURGE_PCTL}/{SURGE_PCTL_BIG}'
cache = load_json(THR_CACHE, {})
fresh = cache.get('date') == today and cache.get('pctl') == sig
by_code = cache.get('by_code') if fresh else {}
if not isinstance(by_code, dict):
by_code = {}
missing = [c for c in codes if c not in by_code][:MAX_COMPUTE_PER_CYCLE]
if missing:
for i, c in enumerate(missing):
if i:
time.sleep(COMPUTE_PACE_SEC)
r, retry = _compute_thresholds(c)
if retry:
continue # 실패는 기록하지 않는다 — 다음 사이클에 다시 시도
by_code[c] = r if r else {}
save_json(THR_CACHE, {'date': today, 'pctl': sig, 'by_code': by_code})
return {c: v for c, v in by_code.items() if v.get('thr')}
# ---------------- 상·하한가 (거래소 계산값) ----------------
def get_limit_map(codes: list[str]) -> dict[str, dict]:
"""{code: {'upl', 'lst'}} — 거래소가 계산한 가격제한폭. 하루 1콜(ka10095 배치).
기준가(전일종가) 정해져 장중 불변이라 하루 1회면 충분하다. 분위수 문턱과 달리
일봉 이력이 필요 없어서 신규상장 이력 부족 종목도 기준으론 감시된다.
배치 호출 자체가 실패하면 캐시하지 않는다 문턱 캐시와 같은 이유로, 실패를
'제한가 없음'으로 굳히면 종목이 하루 내내 조용히 빠진다. 응답에 값이 없는
종목만 dict 굳혀 사이클 재조회를 막는다.
"""
if not codes:
return {}
today = datetime.now(KST).strftime('%Y-%m-%d')
cache = load_json(LIMITS_CACHE, {})
by_code = cache.get('by_code') if cache.get('date') == today else {}
if not isinstance(by_code, dict):
by_code = {}
missing = [c for c in codes if c not in by_code]
if missing:
try:
rows = kc.get_watchlist_quotes(missing) or {}
except Exception as e:
print(f'[warn] 상하한가 조회 실패 (다음 사이클 재시도): {e}', file=sys.stderr)
return {c: v for c, v in by_code.items() if v.get('upl')}
for c in missing:
r = rows.get(c) or {}
upl, lst = r.get('upper_limit') or 0, r.get('lower_limit') or 0
by_code[c] = {'upl': upl, 'lst': lst} if (upl and lst) else {}
save_json(LIMITS_CACHE, {'date': today, 'by_code': by_code})
return {c: v for c, v in by_code.items() if v.get('upl')}
# ---------------- 판정 ----------------
def _limit_hit(price: int, limits: dict | None) -> str | None:
"""'up'(상한가) | 'down'(하한가) | None. 거래소 제한가와 현재가 비교."""
if not limits or not price:
return None
upl, lst = limits.get('upl') or 0, limits.get('lst') or 0
if upl and price >= upl:
return 'up'
if lst and price <= lst:
return 'down'
return None
def _quantile_triggers(pct: float, thr: dict | None) -> list[dict]:
"""분위수 트리거만 — [{key, reason, word}]."""
if not thr or not thr.get('thr'):
return []
direction = 'up' if pct > 0 else 'down'
word = '급등' if pct > 0 else '급락'
t1, t2 = thr['thr'], thr.get('thr_big') or 0
top1 = round((1 - SURGE_PCTL) * 100)
top2 = round((1 - SURGE_PCTL_BIG) * 100)
out: list[dict] = []
if t2 and abs(pct) >= t2:
out.append({'key': f'{direction}2', 'word': word,
'reason': f'{thr["n"]}일 중 상위 {top2}% 움직임 (문턱 {t2:.1f}%)'})
if abs(pct) >= t1:
out.append({'key': direction, 'word': word,
'reason': f'{thr["n"]}일 중 상위 {top1}% 움직임 (문턱 {t1:.1f}%)'})
return out
def evaluate(pct: float, price: int, thr: dict | None, vi: dict | None,
limits: dict | None) -> tuple[list[dict], list[dict], str]:
"""(즉시 알릴 트리거, 보류할 트리거, 가림사유).
거래소 판정(·하한가·VI) 걸려 있는 동안 분위수 트리거는 **보류**한다. 같은 사건을
알리지 않으면서도, 사이 문턱을 넘은 사실은 버리지 않고 풀린 뒤에 내보내기 위해서다.
가림사유가 문자열이면 가린 것이 없다는 호출측은 이때 보류분을 방출한다.
가림 여부는 `defer` 비었는지로 판단하면 된다. VI 중에 주가가 문턱 아래로
되밀리면 defer 비는데, 그걸 '가림 해제' 읽으면 VI 도중에 보류분이 새어나간다.
"""
now: list[dict] = []
hit = _limit_hit(price, limits)
if hit == 'up':
now.append({'key': 'limit_up', 'word': '상한가',
'reason': f'거래소 상한가 도달 ({(limits or {}).get("upl", 0):,}원)'})
elif hit == 'down':
now.append({'key': 'limit_down', 'word': '하한가',
'reason': f'거래소 하한가 도달 ({(limits or {}).get("lst", 0):,}원)'})
vi_on = bool(vi and vi.get('active'))
if vi_on:
t = (vi.get('trigger_time') or '').strip() or 'na'
kind = (vi.get('apply_kind') or '').strip() or 'VI'
now.append({'key': f'vi:{t}', 'word': None, 'reason': f'거래소 VI 발동 ({kind})'})
quantile = _quantile_triggers(pct, thr)
if hit or vi_on:
return now, quantile, ({'up': '상한가', 'down': '하한가'}.get(hit) or 'VI')
return now + quantile, [], ''
def build_message(records: list[dict]) -> str:
ts = datetime.now(KST).strftime('%m/%d %H:%M')
lines = [f'[급등락] {ts}', f'{len(records)}건 감지']
for r in records:
pct = r['pct']
# ⚠️ 아이콘은 pct 가 아니라 방향어에서 파생한다. 보류 방출 건은 돌파 시점 방향(급락)과
# 방출 시점 현재가 부호(+)가 어긋날 수 있어, pct 로 고르면 '🚀 급락'이 찍힌다.
word = r.get('word') or ('급등' if pct > 0 else '급락')
icon = {'상한가': '', '하한가': '', '급등': '🚀', '급락': '🔻'}.get(word, '🚀')
label = r['name'] or r['code']
lines.append('')
lines.append(f'{icon} #{label} {word} ({pct:+.2f}%)')
lines.append(f'• 현재가: {r["price"]:,}')
lines.append(f'• 사유: {r["reason"]}')
if r.get('vi_price'):
lines.append(f'• VI 발동가: {r["vi_price"]:,}')
return '\n'.join(lines)
# ---------------- 실행 ----------------
def _prune(state: dict, today: str) -> dict:
"""오늘·어제만 남긴다 (무한 증식 방지)."""
keep = {today, (datetime.now(KST) - timedelta(days=1)).strftime('%Y-%m-%d')}
return {k: v for k, v in state.items() if k in keep}
def run(dry: bool = False, force: bool = False) -> int:
if not force and not is_market_hours():
print(f'장외 시간 — skip ({datetime.now(KST).strftime("%Y-%m-%d %H:%M")})')
return 0
toggles = load_toggles()
if not toggles:
print('감시 대상 없음 — 자산웹에서 🔔 토글을 켜주세요')
return 0
codes = sorted(toggles)
quotes, vi_map, connected = fetch_realtime(codes)
missing = [c for c in codes if not (quotes.get(c) or {}).get('price')]
if missing:
for c, q in fetch_quotes_fallback(missing).items():
quotes[kc._clean_code(c)] = {'price': q.get('price'), 'pct': q.get('change_pct'), 'change': q.get('change')}
thr_map = get_threshold_map(codes)
limit_map = get_limit_map(codes)
today = datetime.now(KST).strftime('%Y-%m-%d')
day_state = load_json(ALERTS_STATE, {}).get(today) or {}
already = {f'{c}:{k}' for c, ks in day_state.items() if isinstance(ks, list) for k in ks}
# 보류분 — 감시에서 빠진 종목 것은 버린다(토글이 꺼졌으면 방출할 이유가 없다).
held = day_state.get(PENDING_KEY) or {}
pending = {c: v for c, v in held.items() if c in toggles and isinstance(v, dict)} if isinstance(held, dict) else {}
pending_sig = json.dumps(pending, sort_keys=True)
to_send: list[dict] = []
flushed: list[tuple[str, str]] = [] # (code, key) — 발송 성공 시에만 보류에서 지운다
def _rec(code: str, price: int, pct: float, trig: dict, vi: dict | None) -> dict:
r = {
'code': code,
'name': toggles.get(code) or '',
'price': price,
'pct': pct,
'key': trig['key'],
'word': trig.get('word'),
'reason': trig['reason'],
}
if vi and vi.get('active'):
r['vi_price'] = vi.get('trigger_price') or 0
return r
for code in codes:
q = quotes.get(code) or {}
if not q.get('price') or q.get('pct') is None:
continue
price, pct = int(q['price']), float(q['pct'])
vi = vi_map.get(code)
now_trigs, defer_trigs, blocked_by = evaluate(
pct, price, thr_map.get(code), vi, limit_map.get(code))
for trig in now_trigs:
if f'{code}:{trig["key"]}' in already:
continue
to_send.append(_rec(code, price, pct, trig, vi))
already.add(f'{code}:{trig["key"]}')
if blocked_by:
# 가림 중 — 문턱 돌파 사실만 적어둔다. 이탈폭이 가장 컸던 시점을 남긴다.
for trig in defer_trigs:
if f'{code}:{trig["key"]}' in already:
continue
cur = (pending.get(code) or {}).get(trig['key']) or {}
if abs(pct) > abs(cur.get('pct') or 0):
pending.setdefault(code, {})[trig['key']] = {
'pct': pct, 'word': trig.get('word'),
'reason': trig['reason'], 'via': blocked_by,
}
continue
# 가림 해제 — 보류분 방출. 같은 키를 위에서 이미 즉시 알렸으면 already 가 걸러낸다.
for key, d in sorted((pending.get(code) or {}).items()):
if f'{code}:{key}' in already:
flushed.append((code, key))
continue
trig = {
'key': key, 'word': d.get('word'),
'reason': f'{d.get("reason") or "문턱 돌파"}{d.get("via") or "VI"} 중 최대 {d.get("pct", 0):+.2f}% 도달',
}
to_send.append(_rec(code, price, pct, trig, vi))
already.add(f'{code}:{key}')
flushed.append((code, key))
if dry:
print(f'감시 {len(codes)}종목 / 허브연결 {connected} / 문턱 {len(thr_map)}종목 / 제한가 {len(limit_map)}종목')
for code in codes:
q = quotes.get(code) or {}
t = thr_map.get(code) or {}
lm = limit_map.get(code) or {}
thr = f'{t["thr"]:.1f}% / 확대 {t["thr_big"]:.1f}%' if t.get('thr') else '— (이력부족, VI·제한가만)'
lim = f'{lm["upl"]:,}/{lm["lst"]:,}' if lm.get('upl') else ''
print(f' {code} {toggles.get(code) or "":<12} 등락 {q.get("pct")}% / 문턱 {thr} / 상하한 {lim}'
f'{" / VI" if (vi_map.get(code) or {}).get("active") else ""}'
f'{" / 보류 " + ",".join(sorted(pending[code])) if pending.get(code) else ""}')
if to_send:
print('--- DRY ---')
print(build_message(to_send))
print(f'done. watched={len(codes)} triggered={len(to_send)} pending={sum(len(v) for v in pending.values())}')
return 0
ok = send_telegram(build_message(to_send)) if to_send else True
if ok:
for code, key in flushed:
bucket = pending.get(code) or {}
bucket.pop(key, None)
if not bucket:
pending.pop(code, None)
if not to_send and json.dumps(pending, sort_keys=True) == pending_sig:
print(f'done. watched={len(codes)} triggered=0')
return 0
with alerts_lock():
latest = _prune(load_json(ALERTS_STATE, {}), today)
day = latest.setdefault(today, {})
if ok:
for r in to_send:
bucket = day.setdefault(r['code'], [])
if r['key'] not in bucket:
bucket.append(r['key'])
print(f'alerted {r["code"]} {r["name"]}:{r["key"]} {r["pct"]:+.2f}% @ {r["price"]:,}')
if pending:
day[PENDING_KEY] = pending
else:
day.pop(PENDING_KEY, None)
save_json(ALERTS_STATE, latest)
print(f'done. watched={len(codes)} triggered={len(to_send)} pending={sum(len(v) for v in pending.values())}')
return 0
def cmd_list() -> int:
toggles = load_toggles()
if not toggles:
print('감시 대상 없음 — 자산웹에서 🔔 토글을 켜주세요')
return 0
codes = sorted(toggles)
thr_map = get_threshold_map(codes)
limit_map = get_limit_map(codes)
top1 = round((1 - SURGE_PCTL) * 100)
top2 = round((1 - SURGE_PCTL_BIG) * 100)
print(f'감시 {len(codes)}종목 — 1차=자기이력 상위 {top1}% / 확대=상위 {top2}%')
print(f'{"종목":<16}{"전일종가":>10}{"1차":>7}{"급등가":>10}{"급락가":>10}{"확대":>7}'
f'{"상한가":>10}{"하한가":>10}')
for c in codes:
t = thr_map.get(c) or {}
lm = limit_map.get(c) or {}
name = (toggles[c] or c)[:15]
lim = f'{lm["upl"]:>10,}{lm["lst"]:>10,}' if lm.get('upl') else f'{"":>10}{"":>10}'
if not t.get('thr'):
print(f'{name:<16}{"이력 부족 — VI·제한가만":>30}{lim}')
continue
pv, t1, t2 = t['prev_close'], t['thr'], t['thr_big']
print(f'{name:<16}{pv:>10,}{t1:>6.1f}%{round(pv * (1 + t1 / 100)):>10,}'
f'{round(pv * (1 - t1 / 100)):>10,}{t2:>6.1f}%{lim}')
print(f'\n※ 상·하한가 도달은 문턱과 별개로 항상 알림 (거래소 계산값, 하루 1콜 캐시)')
print(f'※ VI 발동은 이 문턱과 별개로 먼저 알림 (정적VI 전일종가 ±10% 부근)')
print(f'※ 상·하한가·VI 중 문턱을 넘으면 보류했다가 풀린 뒤 알림 (사실을 버리지 않음)')
print(f'※ 문턱은 하루 가격제한폭 ±30% 안에 있음이 보장됨 (실제 관측된 이탈폭의 분위수)')
return 0
def main():
cmd = sys.argv[1] if len(sys.argv) > 1 else 'help'
force = '--force' in sys.argv[2:]
try:
if cmd == 'check':
return run(dry=False, force=force)
if cmd == 'dry-run':
return run(dry=True, force=True)
if cmd == 'list':
return cmd_list()
print(__doc__, file=sys.stderr)
return 2
except Exception as e:
import traceback
tb = traceback.format_exc()
print(f'[fatal] {e}\n{tb}', file=sys.stderr)
try:
send_telegram(f'⚠️ [surge_monitor] 실행 실패\n{type(e).__name__}: {e}')
except Exception:
pass
return 1
if __name__ == '__main__':
sys.exit(main())
@@ -67,6 +67,95 @@ def _save_all(rows: list[dict]) -> None:
tmp.replace(JOURNAL) tmp.replace(JOURNAL)
def _advance(qty: int, avg: float, buy_qty: int, sell_qty: int, buy_avg: float) -> tuple[int, float]:
"""running 보유수량·평단 1스텝 진행.
매도는 ** 보유분 우선 소진**(평단 유지) 잔여 당일 매수분을 가중평균 블렌딩.
순서가 '전일 보유 평단' 정의의 핵심 당일 매수가 매도 원가에 섞이지 않고,
매도로 원물이 빠지면 남는 당일 매수분 평단이 된다.
"""
consumed = min(sell_qty, qty)
qty -= consumed
rem_buy = buy_qty - (sell_qty - consumed) # 당일매수분 중 매도로 안 빠진 잔량
if rem_buy > 0:
avg = (qty * avg + rem_buy * buy_avg) / (qty + rem_buy)
qty += rem_buy
qty = max(qty, 0)
if qty == 0:
avg = 0.0 # 전량 청산 → 평단 리셋 (이후 순수 데이트레이딩을 보유분으로 오인 방지)
return qty, avg
def _apply_rebase(row: dict, sell_avg: float, sell_qty: int, pre_avg: float) -> None:
"""row의 pl_amt/prft_rt를 '전일 보유 평단(pre_avg)' 기준으로 덮어쓴다 (in-place).
그로스 = (매도평단 - 전일평단) × 매도수량, pl_amt = 그로스 - 수수료·세금 (ka10170과 동일 net).
"""
gross = (sell_avg - pre_avg) * sell_qty
fee = int(row.get('cmsn_tax') or 0)
row['pl_amt'] = round(gross) - fee
cost = pre_avg * sell_qty
row['prft_rt'] = round(row['pl_amt'] / cost * 100, 2) if cost else 0.0
row['_pl_rebased'] = True
row['prev_avg'] = round(pre_avg)
def rebase_pl(rows: list[dict]) -> list[dict]:
"""매도 실현손익을 '전일 보유 평단' 기준으로 재계산해 **새 리스트** 반환 (파일 미변경, 표시 전용).
ka10170은 당일 매수+매도가 같이 있으면 당일 매수평단매도평단 round-trip으로 pl_amt를 매겨
어제까지 보유한 원물의 손익을 가린다 (2026-06-29 0193W0: 6/26 보유 62@24,550 +
당일 62@21,875 매수 62@21,885 매도 ka10170 +220, 실제 원물 손익 -165,630).
(account, code)별로 날짜순 재생(_advance)하며, **당일 매수가 동반된 매도 **
당일 매수 보유 평단을 원가로 잡아 덮어쓴다. 순수 매도(당일 매수 없음) 키움 값이
정확하므로 건드리지 않는다.
입력 rows는 (account, code) **전체 이력** 포함해야 재생이 정확하다.
"""
out = [dict(r) for r in rows]
by_key: dict[tuple, list[dict]] = {}
for r in out:
by_key.setdefault((r.get('account'), r.get('code')), []).append(r)
for grp in by_key.values():
grp.sort(key=lambda r: (r.get('date', ''), r.get('collected_at', '')))
qty, avg = 0, 0.0
for r in grp:
bq = int(r.get('buy_qty') or 0)
sq = int(r.get('sell_qty') or 0)
ba = float(r.get('buy_avg') or 0)
sa = float(r.get('sell_avg') or 0)
pre_avg = avg # 당일 매수 반영 전 = 전일 보유 평단
if sq > 0 and bq > 0 and pre_avg > 0:
_apply_rebase(r, sa, sq, pre_avg)
qty, avg = _advance(qty, avg, bq, sq, ba)
return out
def prev_avg_map(before_iso: str) -> dict:
"""파일 이력 중 before_iso **미만**(전일까지)을 (account, code)별 재생해 시작 평단 맵 반환.
라이브 journal(당일분) round-trip 오염 행을 재계산할 원가(전일 보유 평단) 소스.
{(account, code): avg}. 보유 0이면 0.
"""
rows = [r for r in _load_all() if r.get('date', '') < before_iso]
by_key: dict[tuple, list[dict]] = {}
for r in rows:
by_key.setdefault((r.get('account'), r.get('code')), []).append(r)
out: dict[tuple, float] = {}
for key, grp in by_key.items():
grp.sort(key=lambda r: (r.get('date', ''), r.get('collected_at', '')))
qty, avg = 0, 0.0
for r in grp:
qty, avg = _advance(
qty, avg,
int(r.get('buy_qty') or 0), int(r.get('sell_qty') or 0),
float(r.get('buy_avg') or 0),
)
out[key] = avg
return out
def record_trades(all_trades: dict, *, base_dt: str | None = None, quiet: bool = False, tag: str = 'collect') -> dict: def record_trades(all_trades: dict, *, base_dt: str | None = None, quiet: bool = False, tag: str = 'collect') -> dict:
"""이미 받은 ka10170 응답({label: [trades]})을 jsonl에 적재 (idempotent). """이미 받은 ka10170 응답({label: [trades]})을 jsonl에 적재 (idempotent).
`(iso_date, account in all_trades)` 단위 재적재 다른 계좌는 영향 X. `(iso_date, account in all_trades)` 단위 재적재 다른 계좌는 영향 X.
@@ -0,0 +1,399 @@
#!/usr/bin/env python3
"""트레일링 스톱 감시 — 고점이 갱신되면 키움 스톱주문의 조건단가를 상향 정정한다.
**예약 1 = 계단(레그) N개.** 고점 대비 하락률이 깊어질수록 많이 파는 계단식 청산이라
계단마다 스톱주문이 따로 걸려 있다. 고점이 오르면 살아있는 레그를 전부 상향 정정한다.
LLM을 깨우지 않는다. 하는 일은 가지:
1. 레그가 아직 미체결로 살아있는지 확인 (ka10075) 사라졌으면 정리+알림
2. 현재가가 저장된 고점을 넘었으면 kt10002 정정으로 계단별 조건단가·지정가를 함께 올림
신규 발주·수량 변경·방향 변경은 하지 않는다. 사람이 PIN으로 승인한 주문의
조건단가를 올리는 것뿐이고, 상향 전용이라 손절선이 내려가는 일은 없다.
계단이 체결돼도 남은 계단을 재배치하지 않는다 재배치엔 취소+신규 발주가 필요해
감시 루프에 자동 발주 경로가 생긴다(2026-07-31 관리자님 결정).
레그가 사라진 사유는 **주문번호 단위** kt00007 판정한다. 종목 단위 집계인
당일매매일지(ka10170) 쓰면 계단이 체결된 나머지 계단이 마감으로 소멸했을
소멸분까지 '체결' 오판한다 같은 종목 매도 기록이 이미 남아 있기 때문이다.
정정하면 주문번호가 새로 발급된다 (kt10002 응답 ord_no). trailing.commit_step_modify
상태파일의 레그별 ord_no 갱신하지 않으면 레그의 다음 정정부터 전부 실패한다.
고점은 '현재가' 로만 갱신한다. ka10095 당일 고가(high) 주지만, 등록 시점 이전에
찍힌 고가까지 반영되면 등록 직후 손절선이 현재가 위로 올라가 즉시 발동할 있다.
(: 오전 15,000 14,000 3% 등록 당일고가 기준이면 조건 14,550 > 현재가)
감시 간격이 2분이라 현재가 샘플링으로 충분하다.
현재 launchd cadence 1 1 (`check`), 08:00~20:00 거래 세션.
상시 daemon 띄우지 않는 이유는 매매 API 호출할 있는 프로세스를
24시간 살려두지 않기 위함.
NXT 시간대(프리 08:00~09:00 / 애프터 15:30~20:00) 감시는 2026-07-30 관리자님 요청으로 추가.
**정규장에 등록된 주문(SOR `_AL` 또는 KRX `''`) 정정이 NXT 단독 시간대에 받아들여지는지
실증 .** 거부되면 고점 갱신마다 실패가 반복되므로 실패 알림에 30 쿨다운을 걸었다
(로그에는 매번 남으니 진단은 logs/stock-trailing-monitor.log ).
1분보다 짧게 가려면 --repeat/--gap 쓴다. launchd StartCalendarInterval
단위가 최소라 30 발화를 만들 없고, StartInterval=30 GUI 세션 idle
발화가 보류돼(timer coalescing) 장중에 도는 문제가 있어 쓴다
(sim-scan 같은 이유로 캘린더로 전환됨). 그래서 30초는 "1분 발화 + 한 프로세스가
30 간격 2 검사" 로만 가능하다 — plist ProgramArguments 에 인자를 붙이면 된다.
(2026-07-30 30초로 운영했다가 관리자님 지시로 1 복귀. 옵션은 보존)
Usage:
python3 trailing_monitor.py check # 1회 감시 (현재 launchd 설정)
python3 trailing_monitor.py check --repeat 2 --gap 30 # 30초 간격 2회
python3 trailing_monitor.py check --force # 장외에도 실행 (테스트용)
python3 trailing_monitor.py check --dry-run # 정정 API 호출 없이 판단·body 만 출력
python3 trailing_monitor.py list # 현재 예약 목록
"""
from __future__ import annotations
import sys
import time
from datetime import datetime, timedelta, timezone
from pathlib import Path
KST = timezone(timedelta(hours=9))
WORKSPACE = Path('/Users/snowoyh/.openclaw/agents/stock/workspace')
sys.path.insert(0, str(WORKSPACE / 'scripts'))
import kiwoom_client as kc # noqa: E402
from orders import guards, kiwoom_order, trailing # noqa: E402
from orders.handler import send_telegram # noqa: E402
# 정정 실패 알림 쿨다운 — NXT 시간대에 KRX/SOR 원주문 정정이 거부되면 매 사이클 반복된다.
FAIL_NOTICE_COOLDOWN_SEC = 1800
def _log(msg: str) -> None:
print(f'[{datetime.now(KST).strftime("%Y-%m-%d %H:%M:%S")}] {msg}', flush=True)
def session_now() -> tuple[bool, str]:
"""(감시할 세션인가, 세션명). 주말·휴장일·거래시간 외는 False.
세션 판정은 orders/limits.json 단일 진실 소스로 쓰는 guards.session_at 재사용
NXT 프리(08:00~09:00) / 정규(09:00~15:20) / 종가단일가(15:20~15:30) /
NXT 애프터(15:30~20:00). 시간이 바뀌면 limits.json 고치면 된다.
"""
now = datetime.now(KST)
if now.weekday() >= 5:
return False, 'WEEKEND'
if guards.is_today_holiday(now):
return False, 'HOLIDAY'
sess = guards.session_at(now)
return sess != 'CLOSED', sess
def _pct_s(v) -> str:
"""10.0 → '10' — 계단 하락률 표기."""
return f'{float(v or 0):g}'
def _leg_fill_check(account: str, ord_no: str, cache: dict) -> tuple:
"""레그가 사라진 사유 판정 — kt00007 에서 **그 주문번호의** 체결수량을 본다.
미체결 조회에서 사라진 것만으로는 체결·취소·소멸을 구분할 없다( 목록에서 빠짐).
종목 단위인 당일매매일지(ka10170) 판정하면 계단 하나가 체결된 나머지 계단이
마감으로 소멸했을 소멸분까지 '체결' 오판한다 같은 종목의 매도 기록이
이미 남아 있기 때문이다. 주문번호 단위인 kt00007 레그마다 정확히 갈린다.
반환: (체결행 dict 또는 None, 조회 성공 여부).
조회 실패와 '체결 안 됨' 반드시 구분해야 한다 실패를 '체결 안 됨' 으로 단정하면
실제로 팔렸는데 팔렸다고 알리게 된다.
"""
if account not in cache:
try:
cache[account] = kc.get_order_executions(account)
except Exception as e:
_log(f'주문체결내역 조회 실패 ({account}): {e!r}')
cache[account] = None
rows = cache[account]
if rows is None:
return None, False
for row in rows:
if (row.get('ord_no') or '').strip() == ord_no and (row.get('cntr_qty') or 0) > 0:
return row, True
return None, True
def _notify_gone_batch(events: list) -> None:
"""한 사이클에 사라진 레그들을 예약 단위로 묶어 한 번만 알린다.
마감이면 계단이 통째로 소멸하는데 레그마다 보내면 3~5통이 몰아친다.
체결 / 미체결 소멸( 마감 취소 ) 관리자님이 취해야 행동이 완전히 다르므로
계단별로 구분해 메시지 안에 나열한다.
2026-07-30 실측: 스톱주문은 마감 체결 없이 소멸한다(15:30~18:21 사이).
자동 재등록은 하지 않는다(관리자님 지시) 다시 걸려면 자산웹에서 수동 등록.
"""
by_res: dict = {}
for ev in events:
by_res.setdefault(ev['res']['id'], []).append(ev)
for evs in by_res.values():
res = evs[0]['res']
remaining = min(e['remaining'] for e in evs)
any_filled = any(e['filled'] for e in evs)
unknown = any(not e['ok'] for e in evs)
if any_filled:
icon = ''
word = '체결'
elif unknown:
icon = '🎯'
word = '종료'
else:
icon = '⚠️'
word = '소멸'
lines = [f'{icon} 트레일링 {word}{res["symbol_name"]} ({res["symbol"]})',
f'계좌: {res["account"]} · 고점 {res["peak"]:,}']
if res.get('min_sell_price'):
lines.append(f'최저 매도가 {res["min_sell_price"]:,}')
for ev in sorted(evs, key=lambda e: e['step']['n']):
s = ev['step']
head = (f'{s["n"]}단계 {_pct_s(s["pct"])}% {s["cond_uv"]:,}원 · {s["qty"]:,}')
if ev['filled']:
f = ev['filled']
lines.append(f'{head} → 체결 {f.get("cntr_qty", 0):,}'
f'@ {f.get("cntr_uv", 0):,}')
elif ev['ok']:
lines.append(f' ⚠️ {head} → 미체결 소멸 (보유수량 그대로)')
else:
lines.append(f' 🎯 {head} → 체결 여부 판정 불가 (체결내역 조회 실패)')
if remaining > 0:
lines.append(f'남은 계단 {remaining}개 — 감시 계속합니다.')
else:
lines.append('남은 계단 없음 — 계속 쓰시려면 자산웹에서 다시 등록해주세요 '
'(자동 재등록 안 함).')
send_telegram('\n'.join(lines), parse_mode=None)
def _notify_modify_failed(res: dict, step: dict, reason: str) -> None:
send_telegram(
f'⚠️ 트레일링 손절선 상향 실패 — {res["symbol_name"]} ({res["symbol"]})\n'
f'계좌: {res["account"]} · {step["n"]}단계 {_pct_s(step["pct"])}% '
f'· 주문번호 {step["ord_no"]}\n'
f'현재 손절선 {step["cond_uv"]:,}원은 그대로 유지됩니다.\n'
f'사유: {reason}',
parse_mode=None)
def _worth_running(force: bool) -> bool:
"""예약이 있고 거래 세션인가. 루프 제어와 단발 실행이 같은 기준을 쓰게 분리."""
if not trailing.list_active():
return False
return force or session_now()[0]
def check(force: bool = False, dry_run: bool = False) -> int:
reservations = trailing.list_active()
if not reservations:
return 0
ok_sess, sess = session_now()
if not force and not ok_sess:
_log(f'{sess} — skip ({len(reservations)}건 예약 대기)')
return 0
# NXT 단독 시간대엔 KRX 호가가 15:30 종가로 고정돼 현재가와 갭이 생긴다 → NXT 시세로 조회.
quote_exchange = 'NX' if sess in ('NXT_PRE', 'NXT_AFTER') else 'AL'
# 계좌별 미체결 스냅샷 (계좌당 1콜). 스톱주문도 조건 도달 전까지 미체결로 잡힌다.
open_by_acct: dict[str, list] = {}
for acct in sorted({r['account'] for r in reservations}):
try:
open_by_acct[acct] = kc.get_open_orders(acct, side='sell')
except Exception as e:
# 한 계좌 조회 실패로 다른 계좌 감시를 멈추지 않는다. 생존 판정은 건너뛴다
# (없다고 단정하면 살아있는 예약을 지워버린다).
_log(f'미체결 조회 실패 [{acct}]: {e!r}')
open_by_acct[acct] = None
# 레그가 사라질 때만 kt00007 을 계좌당 1콜 추가로 부른다 (평시엔 호출 안 함).
exec_cache: dict = {}
gone_events = []
alive = []
for r in reservations:
rows = open_by_acct.get(r['account'])
if rows is None:
continue # 조회 실패 계좌 — 이번 사이클 판단 보류
live_steps = []
for s in list(r.get('steps') or []):
row = next((x for x in rows if x['ord_no'] == s['ord_no']), None)
if row is not None:
live_steps.append((s, row))
continue
filled, exec_ok = _leg_fill_check(r['account'], s['ord_no'], exec_cache)
gone = trailing.remove_step(r['id'], s['n'], 'not_in_open_orders')
if filled:
why = f'체결 {filled.get("cntr_qty", 0):,}주 @ {filled.get("cntr_uv", 0):,}'
elif exec_ok:
why = '미체결 소멸 (체결수량 0 — 장 마감 취소 추정)'
else:
why = '사유 판정 불가 (주문체결내역 조회 실패)'
_log(f'레그 종료 {r["id"]}/{s["n"]}단계 {r["symbol_name"]}{why}')
if gone:
gone_events.append({'res': gone['reservation'], 'step': gone['step'],
'filled': filled, 'ok': exec_ok,
'remaining': gone['remaining']})
if live_steps:
alive.append((r, live_steps))
if gone_events and not dry_run:
try:
_notify_gone_batch(gone_events)
except Exception as e:
_log(f'알림 실패: {e!r}')
if not alive:
return 0
try:
quotes = kc.get_watchlist_quotes([r['symbol'] for r, _ in alive], exchange=quote_exchange)
except Exception as e:
_log(f'시세 조회 실패 ({quote_exchange}): {e!r}')
return 1
raised = 0
for r, live_steps in alive:
cur = (quotes.get(r['symbol']) or {}).get('price') or 0
# 살아있는 레그만 담은 스냅샷으로 판단 — 이미 빠진 계단은 따라 올릴 대상이 아니다.
snap = {'peak': r['peak'], 'min_sell_price': r.get('min_sell_price'),
'steps': [s for s, _ in live_steps]}
nx = trailing.next_step_levels(snap, cur)
if not nx:
continue
if not nx['steps']:
# 고점은 올랐지만 호가단위·최저 매도가 때문에 올릴 조건단가가 없다 → 정정 API 콜 0.
if not dry_run:
trailing.commit_peak(r['id'], nx['peak'])
continue
for up in nx['steps']:
s, row = next(x for x in live_steps if x[0]['n'] == up['n'])
# 미체결 잔량으로 정정 — 부분체결됐으면 잔량만 남는다 (저장된 qty 는 최초 주문수량).
qty = row.get('unfilled_qty') or s['qty']
try:
res = kiwoom_order.modify_order(
account_label=r['account'],
orig_ord_no=s['ord_no'],
symbol=r['symbol'],
modify_qty=qty,
modify_price=up['ord_uv'],
routing_suffix=row.get('routing_suffix', ''),
dry_run=dry_run,
card_id=r.get('card_id'),
modify_cond_price=up['cond_uv'],
)
except Exception as e:
# sidecar 비활성(매매 차단) 포함. 손절선은 기존 값이 그대로 살아있다.
_log(f'정정 예외 {r["id"]}/{s["n"]}단계 {r["symbol_name"]}: {e!r}')
continue
if dry_run:
_log(f'[dry-run] {r["id"]}/{s["n"]}단계 {r["symbol_name"]} '
f'고점 {r["peak"]:,}{nx["peak"]:,} · '
f'손절 {s["cond_uv"]:,}{up["cond_uv"]:,} / 지정 {up["ord_uv"]:,} · '
f'body={res.get("body")}')
continue
if res.get('ok'):
new_ord_no = res.get('new_ord_no') or ''
updated = trailing.commit_step_modify(r['id'], s['n'], new_ord_no,
nx['peak'], up['cond_uv'], up['ord_uv'])
raised += 1
_log(f'손절선 상향 {r["id"]}/{s["n"]}단계 {r["symbol_name"]} '
f'{s["cond_uv"]:,}{up["cond_uv"]:,}원 (고점 {nx["peak"]:,}) '
f'ord_no {s["ord_no"]}{new_ord_no}')
if not updated:
# 상태 갱신 실패 = 다음 정정이 옛 ord_no 로 나가 실패한다. 반드시 알린다.
_log(f'⚠️ 상태 갱신 실패 {r["id"]}/{s["n"]}단계 — ord_no 불일치 위험')
try:
_notify_modify_failed(r, s, f'정정은 성공했지만 상태 갱신 실패 '
f'(새 주문번호 {new_ord_no})')
except Exception:
pass
else:
reason = res.get('reason', 'UNKNOWN')
detail = (res.get('response') or {}).get('return_msg') or res.get('error') or ''
_log(f'정정 실패 {r["id"]}/{s["n"]}단계 {r["symbol_name"]}: '
f'{reason} {detail} (세션 {sess})')
# NXT 시간대에 KRX/SOR 원주문 정정이 거부되면 매 사이클 반복된다 — 쿨다운으로
# 스팸 차단. 쿨다운은 예약 단위다(같은 원인으로 전 계단이 함께 실패하므로
# 계단마다 알리면 한 사이클에 3~5통이 된다). 로그에는 매번 남는다.
if trailing.should_notify_failure(r['id'], time.time(), FAIL_NOTICE_COOLDOWN_SEC):
try:
_notify_modify_failed(r, s, f'{reason} {detail}'.strip() + f' · 세션 {sess}')
except Exception as e:
_log(f'알림 실패: {e!r}')
else:
_log(f' 알림 생략 (쿨다운 {FAIL_NOTICE_COOLDOWN_SEC}초 내 이미 발송)')
if raised:
_log(f'완료 — {raised}개 계단 상향 / 예약 {len(alive)}')
return 0
def cmd_list() -> int:
reservations = trailing.list_active()
if not reservations:
print('트레일링 예약 없음')
return 0
for r in reservations:
steps = r.get('steps') or []
floor_part = f' · 최저 {r["min_sell_price"]:,}' if r.get('min_sell_price') else ''
entry_peak = r.get('entry_peak') or 0
peak_part = f'고점 {r["peak"]:,}'
if entry_peak and r['peak'] > entry_peak:
peak_part += f' (등록 시 {entry_peak:,})'
print(f'{r["id"]} · {r["symbol_name"]}({r["symbol"]}) · {r["account"]} · '
f'{r["qty"]:,}주 · {len(steps)}')
print(f' {peak_part}{floor_part} · 등록 {r["created_at"]} · 갱신 {r["updated_at"]}')
for s in steps:
cum = s.get('cum', 0)
cum_part = '전량' if cum >= 100 else f'누적 {_pct_s(cum)}%'
print(f' {s["n"]}단계 {_pct_s(s["pct"])}% · 손절 {s["cond_uv"]:,} / '
f'지정 {s["ord_uv"]:,} · {s["qty"]:,}주 ({cum_part}) · '
f'ord_no {s["ord_no"]} · 상향 {s.get("modify_count", 0)}')
return 0
def _int_opt(argv: list[str], name: str, default: int) -> int:
if name not in argv:
return default
i = argv.index(name)
if i + 1 >= len(argv):
return default
try:
return int(argv[i + 1])
except ValueError:
return default
def main(argv: list[str]) -> int:
cmd = argv[1] if len(argv) > 1 else 'check'
if cmd == 'list':
return cmd_list()
if cmd == 'check':
force = '--force' in argv
dry_run = '--dry-run' in argv
repeat = max(1, _int_opt(argv, '--repeat', 1))
gap = max(1, _int_opt(argv, '--gap', 30))
rc = 0
for i in range(repeat):
rc = check(force=force, dry_run=dry_run) or rc
if i >= repeat - 1:
break
# 예약 0건이거나 장 마감이면 남은 sweep 을 버린다 — 빈 sleep 으로 프로세스가
# 살아있을 이유가 없다. sleep '전에' 확인해야 한다.
if not _worth_running(force):
break
time.sleep(gap)
return rc
print(__doc__, file=sys.stderr)
return 2
if __name__ == '__main__':
sys.exit(main(sys.argv))
+23 -2
View File
@@ -3,7 +3,8 @@
python3 -m sim scan [--force] # 1회 스캔 (launchd/cron 진입점) python3 -m sim scan [--force] # 1회 스캔 (launchd/cron 진입점)
python3 -m sim status # 가상계좌 요약 python3 -m sim status # 가상계좌 요약
python3 -m sim report [N] # 최근 거래 N건 (기본 20) python3 -m sim report [N] # 최근 거래 N건 (기본 20)
python3 -m sim reset [--yes] # 가상계좌 초기화 (1천만 리셋) python3 -m sim reset [--yes] # 가상계좌 초기화
python3 -m sim variants sync # 비교군을 백테스트 유형별 1위로 동기화 (수동 전용)
""" """
from __future__ import annotations from __future__ import annotations
@@ -107,12 +108,22 @@ def _cmd_variants(argv):
print(f'변이 {len(vs)}개 등록:') print(f'변이 {len(vs)}개 등록:')
for v in vs: for v in vs:
print(' ', v['id'], v['name']) print(' ', v['id'], v['name'])
elif sub == 'sync':
import json as _json
from . import config as _cfg
res = _json.loads((_cfg.STATE_DIR / 'backtest_results.json').read_text())
print('동기화:', variants.sync_label_tops(res))
elif sub == 'reset': elif sub == 'reset':
variants.reset_all() variants.reset_all()
print('변이 계좌 초기화 (정의 유지)') print('변이 계좌 초기화 (정의 유지)')
elif sub == 'clear': elif sub == 'clear':
variants.clear() variants.clear()
print('변이 정의·계좌 전부 삭제') print('변이 정의·계좌 전부 삭제')
elif sub == 'philosophy':
res = variants.add_philosophy_presets()
print(f"철학별 전략 추가: 신규 {len(res['added'])}개 · 중복 {res['skipped']}개 · 총 {res['total']}")
for v in res['added']:
print(' ', v['id'], v['name'])
else: else:
vs = variants.load_variants() vs = variants.load_variants()
print(f'변이 {len(vs)}개:') print(f'변이 {len(vs)}개:')
@@ -130,13 +141,23 @@ def _cmd_reset(argv):
print(f'초기화 완료 — 가상자본 {config.INITIAL_CAPITAL:,}') print(f'초기화 완료 — 가상자본 {config.INITIAL_CAPITAL:,}')
def _cmd_universe(argv):
"""관찰목록 자동편입/제외 — 매일 장 마감 후 1회. 'import'=주도주 편입, 'prune'=무신호 auto 제외, 둘 다 기본."""
from . import universe
sub = argv[0] if argv else 'all'
if sub in ('import', 'all'):
print('자동편입:', universe.auto_import())
if sub in ('prune', 'all'):
print('자동제외:', universe.auto_prune())
def main(): def main():
argv = sys.argv[1:] argv = sys.argv[1:]
cmd = argv[0] if argv else 'status' cmd = argv[0] if argv else 'status'
rest = argv[1:] rest = argv[1:]
{'scan': _cmd_scan, 'status': _cmd_status, 'report': _cmd_report, {'scan': _cmd_scan, 'status': _cmd_status, 'report': _cmd_report,
'sweep': _cmd_sweep, 'backtest': _cmd_backtest, 'backfill': _cmd_backfill, 'sweep': _cmd_sweep, 'backtest': _cmd_backtest, 'backfill': _cmd_backfill,
'backfill-index': _cmd_backfill_index, 'backfill-index': _cmd_backfill_index, 'universe': _cmd_universe,
'variants': _cmd_variants, 'reset': _cmd_reset}.get(cmd, lambda a: print(__doc__))(rest) 'variants': _cmd_variants, 'reset': _cmd_reset}.get(cmd, lambda a: print(__doc__))(rest)
+103 -51
View File
@@ -64,6 +64,24 @@ def load_flow(code: str) -> dict | None:
return None return None
# 프로세스 메모이즈 — 같은 sweep(한 프로세스) 안에서 종목당 sqlite를 1회만 읽는다.
# backtest.run 은 sweep CLI 프로세스에서만 호출되므로(엔진/웹은 apply_params만 씀) stale 위험 없음.
_HIST_MEMO: dict = {}
_FLOW_MEMO: dict = {}
def _hist_cached(code: str) -> list[dict]:
if code not in _HIST_MEMO:
_HIST_MEMO[code] = load_history(code)
return _HIST_MEMO[code]
def _flow_cached(code: str):
if code not in _FLOW_MEMO:
_FLOW_MEMO[code] = load_flow(code)
return _FLOW_MEMO[code]
def _flow_net_upto(flow: dict | None, dates_seen: list[str]) -> dict: def _flow_net_upto(flow: dict | None, dates_seen: list[str]) -> dict:
"""최근 FLOW_DAYS 일 외국인·기관 누적. flow 없으면 중립(둘 다 +1 → 수급 통과).""" """최근 FLOW_DAYS 일 외국인·기관 누적. flow 없으면 중립(둘 다 +1 → 수급 통과)."""
if flow is None: if flow is None:
@@ -82,12 +100,12 @@ def run(overrides: dict | None, codes: list[str], date_from: str = '', date_to:
hist = {} hist = {}
for code in codes: for code in codes:
h = [c for c in load_history(code) if date_from <= c['date'] <= date_to] h = [c for c in _hist_cached(code) if date_from <= c['date'] <= date_to]
if len(h) > config.SMA_LONG + config.ATR_PERIOD + 5: if len(h) > config.SMA_LONG + config.ATR_PERIOD + 5:
hist[code] = h hist[code] = h
if not hist: if not hist:
return {'error': 'no_data', 'trades': 0} return {'error': 'no_data', 'trades': 0}
flows = {code: load_flow(code) for code in hist} flows = {code: _flow_cached(code) for code in hist}
# code별 date→index, 전체 거래일 축 # code별 date→index, 전체 거래일 축
idx_map = {code: {c['date']: i for i, c in enumerate(h)} for code, h in hist.items()} idx_map = {code: {c['date']: i for i, c in enumerate(h)} for code, h in hist.items()}
@@ -99,6 +117,7 @@ def run(overrides: dict | None, codes: list[str], date_from: str = '', date_to:
wins = closed = 0 wins = closed = 0
gross_win = gross_loss = 0.0 gross_win = gross_loss = 0.0
peak_eq = capital peak_eq = capital
exited: dict[str, str] = {} # code → 전량청산일 (당일 재진입 금지)
max_dd = 0.0 max_dd = 0.0
comm, tax = config.COMMISSION_RATE, config.SELL_TAX_RATE comm, tax = config.COMMISSION_RATE, config.SELL_TAX_RATE
@@ -108,9 +127,82 @@ def run(overrides: dict | None, codes: list[str], date_from: str = '', date_to:
def _qty_for(fill, value): def _qty_for(fill, value):
return int(value // (fill * (1 + comm))) return int(value // (fill * (1 + comm)))
slip = getattr(config, 'BT_SLIPPAGE', 0.002)
pending: list[dict] = [] # 전일 종가 신호 → 오늘 시가 체결 주문 (look-ahead 제거)
for day in all_dates: for day in all_dates:
day_prices = {} day_prices = {}
# ---- 보유 판단 (당일 종가 기준): 손절/익절(전량·분할) → 추격매수 ----
# ---- 0. 전일 큐잉 주문을 오늘 시가에 체결 (+슬리피지: 매수 비싸게/매도 싸게) ----
for od in pending:
code = od['code']
i = idx_map.get(code, {}).get(day)
if i is None:
continue # 오늘 거래 없으면 주문 소멸 — 신호 지속 시 다음 종가에 재큐잉됨
open_px = hist[code][i].get('open') or hist[code][i]['close']
kind = od['kind']
if kind in ('sell', 'scale_out'):
pos = positions.get(code)
if not pos:
continue
fill = open_px * (1 - slip)
total = pos['qty']
qty = total if od.get('frac', 1.0) >= 1.0 else max(1, int(total * od['frac']))
qty = min(qty, total)
proceeds = qty * fill * (1 - comm - tax)
cost = qty * pos['entry_price'] * (1 + comm)
pnl = proceeds - cost
cash += proceeds
realized += pnl
if qty >= total:
positions.pop(code)
exited[code] = day # 당일 재진입 금지 (엔진과 동일 규칙)
closed += 1
if pnl > 0:
wins += 1
else:
pos['qty'] = total - qty
if pnl > 0:
gross_win += pnl
else:
gross_loss += -pnl
elif kind == 'add':
pos = positions.get(code)
if not pos:
continue
fill = open_px * (1 + slip)
tranche_val = pos.get('tranche_value') or (pos['entry_price'] * pos['qty'])
qty = _qty_for(fill, tranche_val)
cost = qty * fill * (1 + comm)
if qty >= 1 and cost <= cash:
new_qty = pos['qty'] + qty
pos['entry_price'] = (pos['entry_price'] * pos['qty'] + fill * qty) / new_qty
pos['qty'] = new_qty
pos['tranches'] = pos.get('tranches', 1) + 1
pos['last_add_price'] = fill
cash -= cost
nstop, ntarget = signals.compute_stop_target(pos['entry_price'], od['atr'], od['recent_low'])
pos['stop'] = nstop if od.get('add_kind') == 'down' else max(pos['stop'], nstop)
pos['target'] = ntarget
elif kind == 'buy':
if code in positions or len(positions) >= config.MAX_POSITIONS or exited.get(code) == day:
continue
fill = open_px * (1 + slip)
stop, target = signals.compute_stop_target(fill, od['atr'], od['recent_low'])
eq = equity(day_prices)
tranche_val = signals.target_value(eq, fill, stop) / max(1, config.ENTRY_TRANCHES)
qty = _qty_for(fill, tranche_val)
cost = qty * fill * (1 + comm)
if qty < 1 or cost > cash:
continue
cash -= cost
positions[code] = {'code': code, 'name': code, 'qty': qty, 'entry_price': fill,
'stop': stop, 'target': target, 'peak': fill, 'trailing_on': False,
'scaled_out': False, 'tranches': 1, 'tranche_value': tranche_val,
'last_add_price': fill, 'entry_date': day}
pending = []
# ---- 1. 보유 판단 (당일 종가 기준) → 내일 시가 주문 큐잉 ----
for code in list(positions.keys()): for code in list(positions.keys()):
h = hist.get(code) h = hist.get(code)
i = idx_map[code].get(day) i = idx_map[code].get(day)
@@ -129,46 +221,17 @@ def run(overrides: dict | None, codes: list[str], date_from: str = '', date_to:
pos.update(dec['position_update']) pos.update(dec['position_update'])
act = dec['action'] act = dec['action']
if act in ('sell', 'scale_out'): if act in ('sell', 'scale_out'):
fill = ind['price'] pending.append({'kind': act, 'code': code, 'frac': dec.get('sell_frac', 1.0)})
total = pos['qty']
qty = total if dec.get('sell_frac', 1.0) >= 1.0 else max(1, int(total * dec['sell_frac']))
qty = min(qty, total)
proceeds = qty * fill * (1 - comm - tax)
cost = qty * pos['entry_price'] * (1 + comm)
pnl = proceeds - cost
cash += proceeds
realized += pnl
if qty >= total:
positions.pop(code)
closed += 1
if pnl > 0:
wins += 1
else:
pos['qty'] = total - qty
if pnl > 0:
gross_win += pnl
else:
gross_loss += -pnl
elif act == 'add': elif act == 'add':
fill = ind['price'] pending.append({'kind': 'add', 'code': code, 'add_kind': dec.get('add_kind'),
tranche_val = pos.get('tranche_value') or (pos['entry_price'] * pos['qty']) 'atr': ind['atr'], 'recent_low': ind['recent_low']})
qty = _qty_for(fill, tranche_val)
cost = qty * fill * (1 + comm)
if qty >= 1 and cost <= cash:
new_qty = pos['qty'] + qty
pos['entry_price'] = (pos['entry_price'] * pos['qty'] + fill * qty) / new_qty
pos['qty'] = new_qty
pos['tranches'] = pos.get('tranches', 1) + 1
pos['last_add_price'] = fill
cash -= cost
nstop, ntarget = signals.compute_stop_target(pos['entry_price'], ind['atr'], ind['recent_low'])
pos['stop'] = max(pos['stop'], nstop)
pos['target'] = ntarget
# ---- 신규 매수 판단 (1차 트랜치) ---- # ---- 2. 신규 매수 판단 (당일 종가) → 내일 시가 주문 큐잉 ----
for code, h in hist.items(): for code, h in hist.items():
if code in positions or len(positions) >= config.MAX_POSITIONS: if code in positions or len(positions) >= config.MAX_POSITIONS:
continue continue
if exited.get(code) == day: # 당일 청산 종목 재매수 금지
continue
i = idx_map[code].get(day) i = idx_map[code].get(day)
if i is None: if i is None:
continue continue
@@ -183,19 +246,8 @@ def run(overrides: dict | None, codes: list[str], date_from: str = '', date_to:
flow = _flow_net_upto(flows.get(code), dates_seen) flow = _flow_net_upto(flows.get(code), dates_seen)
dec = signals.evaluate_candidate(code, code, [], ind, flow, None, True) dec = signals.evaluate_candidate(code, code, [], ind, flow, None, True)
if dec['action'] == 'buy': if dec['action'] == 'buy':
fill = dec['buy_price'] pending.append({'kind': 'buy', 'code': code,
stop, target = signals.compute_stop_target(fill, ind['atr'], ind['recent_low']) 'atr': ind['atr'], 'recent_low': ind['recent_low']})
eq = equity(day_prices)
tranche_val = signals.target_value(eq, fill, stop) / max(1, config.ENTRY_TRANCHES)
qty = _qty_for(fill, tranche_val)
cost = qty * fill * (1 + comm)
if qty < 1 or cost > cash:
continue
cash -= cost
positions[code] = {'code': code, 'name': code, 'qty': qty, 'entry_price': fill,
'stop': stop, 'target': target, 'peak': fill, 'trailing_on': False,
'scaled_out': False, 'tranches': 1, 'tranche_value': tranche_val,
'last_add_price': fill, 'entry_date': day}
eq = equity(day_prices) eq = equity(day_prices)
if eq > peak_eq: if eq > peak_eq:
+13 -1
View File
@@ -22,9 +22,10 @@ LAST_SCAN_PATH = STATE_DIR / 'last_scan.json'
OWNER_ACCOUNT_LABELS = ['일반', 'ISA'] OWNER_ACCOUNT_LABELS = ['일반', 'ISA']
# ---- 자본·체결·비용 ---- # ---- 자본·체결·비용 ----
INITIAL_CAPITAL = 10_000_000 # 가상 자본 INITIAL_CAPITAL = 100_000_000 # 가상 자본 (기초 예수금 1억)
COMMISSION_RATE = 0.00015 # 매매 수수료 (편도, 키움 ~0.015%) COMMISSION_RATE = 0.00015 # 매매 수수료 (편도, 키움 ~0.015%)
SELL_TAX_RATE = 0.0018 # 매도 증권거래세 (~0.18%) SELL_TAX_RATE = 0.0018 # 매도 증권거래세 (~0.18%)
BT_SLIPPAGE = 0.002 # 백테스트 슬리피지 (편도 0.2% — 매수는 비싸게, 매도는 싸게. 라이브는 호가 체결이라 미적용)
# ---- 포지션 사이징 ---- # ---- 포지션 사이징 ----
MAX_POSITIONS = 8 # 동시 보유 최대 종목수 MAX_POSITIONS = 8 # 동시 보유 최대 종목수
@@ -37,6 +38,12 @@ SMA_LONG = 20
SMA_MID = 60 # 중기 추세선 — 정배열 확인(5>20>60). 데이터 부족 시 게이트 미적용 SMA_MID = 60 # 중기 추세선 — 정배열 확인(5>20>60). 데이터 부족 시 게이트 미적용
TREND_SLOPE_DAYS = 5 # 20일선 기울기 판정: 현재 20일선 vs N일 전 20일선(우상향 여부) TREND_SLOPE_DAYS = 5 # 20일선 기울기 판정: 현재 20일선 vs N일 전 20일선(우상향 여부)
REL_STRENGTH_DAYS = 20 # 상대강도: 종목 N일 수익률 − 시장지수 N일 수익률 (라이브 전용) REL_STRENGTH_DAYS = 20 # 상대강도: 종목 N일 수익률 − 시장지수 N일 수익률 (라이브 전용)
TREND_SLOPE_GATE = 1 # 추세 게이트 ① 장기선 우상향 요구 (1=요구/0=완화). 보수성 완화 변이 실험용
MID_ARRAY_GATE = 1 # 추세 게이트 ② 5일선>중기선(60) 요구 (1=요구/0=완화)
IMMEDIATE_ENTRY = 0 # 즉시매수: 조건 통과 종목이 돌파·눌림목 둘 다 아니어도 강세장이면 현재가 즉시 매수 (1=켜기). 꾸준한 상승 종목 놓침 방지 실험용
AVERAGING_ENTRY = 0 # 물타기(애버리징): 보유 중 직전매수가 대비 하락 시 손절 대신 추가매수로 평단↓ (1=켜기). 종목당 10% 한도 내, 급락·약세장 제외
AVERAGING_DROP_PCT = 0.10 # 물타기 트리거 — 직전 매수가 대비 이 비율 하락 시 추가 (0.10=-10%마다)
CRASH_DROP_PCT = 0.10 # 당일 단일 하락이 이 비율 이상이면 물타기 말고 손절 (그림 #3, 0.10=-10%↓)
ATR_PERIOD = 14 ATR_PERIOD = 14
BREAKOUT_LOOKBACK = 20 # 돌파 판정용 최근 고점 구간 BREAKOUT_LOOKBACK = 20 # 돌파 판정용 최근 고점 구간
SWING_LOW_LOOKBACK = 10 # 손절선 후보 스윙 저점 구간 SWING_LOW_LOOKBACK = 10 # 손절선 후보 스윙 저점 구간
@@ -86,6 +93,11 @@ PARAMS_PATH = STATE_DIR / 'params.json'
TUNABLE = [ TUNABLE = [
{'key': 'SMA_SHORT', 'label': '단기 이동평균(일)', 'type': 'int', 'min': 2, 'max': 60, 'step': 1, 'group': '추세'}, {'key': 'SMA_SHORT', 'label': '단기 이동평균(일)', 'type': 'int', 'min': 2, 'max': 60, 'step': 1, 'group': '추세'},
{'key': 'SMA_LONG', 'label': '장기 이동평균(일)', 'type': 'int', 'min': 5, 'max': 200, 'step': 1, 'group': '추세'}, {'key': 'SMA_LONG', 'label': '장기 이동평균(일)', 'type': 'int', 'min': 5, 'max': 200, 'step': 1, 'group': '추세'},
{'key': 'TREND_SLOPE_GATE', 'label': '장기선 우상향 요구', 'type': 'int', 'min': 0, 'max': 1, 'step': 1, 'group': '추세'},
{'key': 'MID_ARRAY_GATE', 'label': '중기 정배열(5>60) 요구', 'type': 'int', 'min': 0, 'max': 1, 'step': 1, 'group': '추세'},
{'key': 'IMMEDIATE_ENTRY', 'label': '즉시매수(눌림 안 기다림)', 'type': 'int', 'min': 0, 'max': 1, 'step': 1, 'group': '매수'},
{'key': 'AVERAGING_ENTRY', 'label': '물타기(하락 시 추가매수)', 'type': 'int', 'min': 0, 'max': 1, 'step': 1, 'group': '매도'},
{'key': 'AVERAGING_DROP_PCT', 'label': '물타기 하락 트리거', 'type': 'float', 'min': 0.03, 'max': 0.3, 'step': 0.01, 'group': '매도'},
{'key': 'ATR_PERIOD', 'label': 'ATR 기간(일)', 'type': 'int', 'min': 5, 'max': 60, 'step': 1, 'group': '변동성·기간'}, {'key': 'ATR_PERIOD', 'label': 'ATR 기간(일)', 'type': 'int', 'min': 5, 'max': 60, 'step': 1, 'group': '변동성·기간'},
{'key': 'BREAKOUT_LOOKBACK', 'label': '돌파 고점 구간(일)', 'type': 'int', 'min': 5, 'max': 120, 'step': 1, 'group': '변동성·기간'}, {'key': 'BREAKOUT_LOOKBACK', 'label': '돌파 고점 구간(일)', 'type': 'int', 'min': 5, 'max': 120, 'step': 1, 'group': '변동성·기간'},
{'key': 'SWING_LOW_LOOKBACK', 'label': '스윙 저점 구간(일)', 'type': 'int', 'min': 3, 'max': 60, 'step': 1, 'group': '변동성·기간'}, {'key': 'SWING_LOW_LOOKBACK', 'label': '스윙 저점 구간(일)', 'type': 'int', 'min': 3, 'max': 60, 'step': 1, 'group': '변동성·기간'},
+34 -7
View File
@@ -88,14 +88,19 @@ def _flow_cache_path(code: str):
def investor_flow(code: str, days: int = config.FLOW_DAYS) -> list[dict]: def investor_flow(code: str, days: int = config.FLOW_DAYS) -> list[dict]:
"""최근 days 일 외국인·기관·개인 순매수 (최신순). 60분 TTL 캐시.""" """최근 days 일 외국인·기관·개인 순매수 (최신순). 60분 TTL 캐시 + 스캔 내 메모."""
mk = (code, days)
if mk in _FLOW_MEMO_SCAN:
return _FLOW_MEMO_SCAN[mk]
path = _flow_cache_path(code) path = _flow_cache_path(code)
now = time.time() now = time.time()
if path.exists(): if path.exists():
try: try:
cached = json.loads(path.read_text()) cached = json.loads(path.read_text())
if now - cached.get('ts', 0) < FLOW_TTL_SEC: if now - cached.get('ts', 0) < FLOW_TTL_SEC:
return cached.get('rows', [])[:days] rows = cached.get('rows', [])[:days]
_FLOW_MEMO_SCAN[mk] = rows
return rows
except Exception: except Exception:
pass pass
try: try:
@@ -105,6 +110,7 @@ def investor_flow(code: str, days: int = config.FLOW_DAYS) -> list[dict]:
return [] return []
FLOW_CACHE_DIR.mkdir(parents=True, exist_ok=True) FLOW_CACHE_DIR.mkdir(parents=True, exist_ok=True)
path.write_text(json.dumps({'ts': now, 'rows': rows}, ensure_ascii=False)) path.write_text(json.dumps({'ts': now, 'rows': rows}, ensure_ascii=False))
_FLOW_MEMO_SCAN[mk] = rows[:days]
return rows[:days] return rows[:days]
@@ -116,11 +122,15 @@ def flow_net(rows: list[dict]) -> dict:
def analyst(code: str, price: int) -> dict | None: def analyst(code: str, price: int) -> dict | None:
"""애널 게이트/가점용. 캐시 미스(네트워크 발생) 시에만 페이싱 — 연속 크롤링 차단 회피.""" """애널 게이트/가점용. 캐시 미스(네트워크 발생) 시에만 페이싱 + 스캔 내 메모."""
if code in _ANL_MEMO_SCAN:
return _ANL_MEMO_SCAN[code]
fresh = (_cache_fresh(FNGUIDE_CACHE_DIR / f'{code}.json') fresh = (_cache_fresh(FNGUIDE_CACHE_DIR / f'{code}.json')
and _cache_fresh(WISEREPORT_CACHE_DIR / f'{code}.json')) and _cache_fresh(WISEREPORT_CACHE_DIR / f'{code}.json'))
try: try:
return _analyst_query(code, price) out = _analyst_query(code, price)
_ANL_MEMO_SCAN[code] = out
return out
finally: finally:
if not fresh: if not fresh:
time.sleep(ANALYST_PACING_SEC) time.sleep(ANALYST_PACING_SEC)
@@ -168,10 +178,27 @@ def _analyst_query(code: str, price: int) -> dict | None:
} }
# 스캔 1회 동안 호가 공유 — 같은 스캔에서 같은 종목은 같은 체결가 (선수 간 체결 공정성 + API 절감).
# engine._gather 가 스캔 시작마다 reset.
_BOOK_MEMO: dict = {}
_FLOW_MEMO_SCAN: dict = {} # 스캔 1회 동안 종목별 수급 공유 (파라미터 무관)
_ANL_MEMO_SCAN: dict = {} # 스캔 1회 동안 종목별 애널 공유 (파라미터 무관)
def reset_book_memo():
_BOOK_MEMO.clear()
_FLOW_MEMO_SCAN.clear()
_ANL_MEMO_SCAN.clear()
def quote_book(code: str) -> dict | None: def quote_book(code: str) -> dict | None:
"""체결가용 호가 (매도1/매수1). 실패 시 None.""" """체결가용 호가 (매도1/매수1). 스캔 내 종목당 1회 조회 후 공유. 실패 시 None."""
if code in _BOOK_MEMO:
return _BOOK_MEMO[code]
try: try:
return kc.get_quote_book(code) book = kc.get_quote_book(code)
except Exception as e: except Exception as e:
sys.stderr.write(f'[data] quote_book {code} 실패: {e}\n') sys.stderr.write(f'[data] quote_book {code} 실패: {e}\n')
return None book = None
_BOOK_MEMO[code] = book
return book
+161 -21
View File
@@ -41,6 +41,29 @@ def _index_trend_ok() -> dict:
return out return out
def _session_elapsed_frac(now) -> float:
"""장 시작 후 경과 비율 (0.15~1.0) — 장중 부분 거래량을 하루치로 환산하는 분모.
장외면 1.0(완성봉 그대로). 하한 0.15 초반 과대 환산 폭주 방지."""
if not is_market_session(now):
return 1.0
o = now.replace(hour=config.MARKET_OPEN[0], minute=config.MARKET_OPEN[1], second=0, microsecond=0)
c = now.replace(hour=config.MARKET_CLOSE[0], minute=config.MARKET_CLOSE[1], second=0, microsecond=0)
total = (c - o).total_seconds()
return min(1.0, max(0.15, (now - o).total_seconds() / total))
def _watching(snap) -> list:
"""스캔 시점 '매수로 노리는' 종목 — 즉시매수(BUY)·추격(ADD)·눌림목 대기(WAIT+지정가). 비교탭 표시용."""
out = []
for d in snap.get('decisions', []):
st = d.get('state')
if st in ('BUY', 'ADD') or (st == 'WAIT' and d.get('watch_price')):
out.append({'name': d.get('name'), 'code': d.get('code'), 'state': st,
'reason': d.get('reason', ''), 'price': d.get('price'),
'watch_price': d.get('watch_price')})
return out
def _index_return(mk: str, days: int): def _index_return(mk: str, days: int):
"""지수 N거래일 수익률(%) — 상대강도 비교용. 데이터 부족 시 None.""" """지수 N거래일 수익률(%) — 상대강도 비교용. 데이터 부족 시 None."""
s = sorted(benchmark.series(mk).items()) s = sorted(benchmark.series(mk).items())
@@ -192,11 +215,47 @@ def _fill_sell_price(code: str, fallback: int) -> int:
return int(fallback) return int(fallback)
def _gather(extra_codes=None): _SCAN_CANDLES: dict = {} # 스캔 1회 동안 종목별 일봉 공유
_IND_MEMO: dict = {} # (code, 지표 파라미터) → 지표 묶음 — 같은 지표 설정 변이끼리 공유
def _ind_key(code):
return (code, config.SMA_SHORT, config.SMA_LONG, config.SMA_MID, config.ATR_PERIOD,
config.BREAKOUT_LOOKBACK, config.SWING_LOW_LOOKBACK, config.VOLUME_AVG_PERIOD,
config.RSI_PERIOD, config.TREND_SLOPE_DAYS)
LAST_QUOTES_PATH = config.STATE_DIR / 'last_quotes.json'
def _save_last_quotes(quotes: dict) -> None:
"""직전 스캔이 모은 시세 — judge_view(관심종목 탭)가 라이브 재호출 없이 같은 값을 재사용."""
if not quotes: # 시세 수집 실패(빈 dict)면 직전 정상값 보존 — 덮어쓰지 않음
return
try:
config.STATE_DIR.mkdir(parents=True, exist_ok=True)
LAST_QUOTES_PATH.write_text(json.dumps(quotes, ensure_ascii=False))
except Exception as e:
sys.stderr.write(f'[engine] last_quotes 저장 실패: {e}\n')
def _load_last_quotes() -> dict | None:
"""직전 스캔 시세. 없으면 None → 호출부가 라이브 폴백."""
try:
return json.loads(LAST_QUOTES_PATH.read_text())
except Exception:
return None
def _gather(extra_codes=None, quotes=None):
"""파라미터 무관한 라이브 데이터 1회 수집 (메인·변이 공유). 종목·시세·시장매핑. """파라미터 무관한 라이브 데이터 1회 수집 (메인·변이 공유). 종목·시세·시장매핑.
extra_codes: universe에 없지만 청산 판단을 위해 포함해야 보유 코드(수동 삭제된 보유분). extra_codes: universe에 없지만 청산 판단을 위해 포함해야 보유 코드(수동 삭제된 보유분).
quotes: 주어지면 라이브 시세 호출을 건너뛰고 그대로 사용 (judge_view 직전 스캔 시세 재사용).
""" """
data.reset_book_memo() # 호가 공유 캐시 리셋 — 이번 스캔의 체결가를 전 선수가 공유
_SCAN_CANDLES.clear()
_IND_MEMO.clear()
uni = universe.build_universe() uni = universe.build_universe()
codes = [e['code'] for e in uni] codes = [e['code'] for e in uni]
seen = set(codes) seen = set(codes)
@@ -205,15 +264,19 @@ def _gather(extra_codes=None):
uni = uni + [{'code': c, 'name': '', 'sources': ['held']}] uni = uni + [{'code': c, 'name': '', 'sources': ['held']}]
codes.append(c) codes.append(c)
seen.add(c) seen.add(c)
if not quotes: # None(미지정) 또는 빈 dict(저장본 비었음)면 라이브 수집
quotes = data.batch_quotes(codes) quotes = data.batch_quotes(codes)
cmkt = universe.code_market_map() cmkt = universe.code_market_map()
return uni, quotes, cmkt return uni, quotes, cmkt
def _run_scan(pf, uni, quotes, cmkt, now) -> dict: def _run_scan(pf, uni, quotes, cmkt, now, execute: bool = True) -> dict:
"""주어진 포트폴리오에 대해 현재 config(파라미터) 기준 스캔·체결. 스냅샷 반환(파일 기록 X).""" """주어진 포트폴리오에 대해 현재 config(파라미터) 기준 스캔·체결. 스냅샷 반환(파일 기록 X).
execute=False 판단(decisions) 만들고 체결·계좌 저장을 모두 생략 시각 전환 read-only ."""
mkt_ok = market_ok_map() # MARKET_BREADTH_MIN 등 파라미터 의존 → 변이마다 재계산 mkt_ok = market_ok_map() # MARKET_BREADTH_MIN 등 파라미터 의존 → 변이마다 재계산
idx_ret = {mk: _index_return(mk, config.REL_STRENGTH_DAYS) for mk in ('KOSPI', 'KOSDAQ')} idx_ret = {mk: _index_return(mk, config.REL_STRENGTH_DAYS) for mk in ('KOSPI', 'KOSDAQ')}
vfrac = _session_elapsed_frac(now) # 장중 부분 거래량 → 하루치 환산 분모
decisions: list[dict] = [] decisions: list[dict] = []
buys: list[dict] = [] buys: list[dict] = []
sells: list[dict] = [] sells: list[dict] = []
@@ -223,9 +286,17 @@ def _run_scan(pf, uni, quotes, cmkt, now) -> dict:
if not name and code in pf.positions: # 보유 보강분(universe에서 빠진)은 이름 보완 if not name and code in pf.positions: # 보유 보강분(universe에서 빠진)은 이름 보완
name = pf.positions[code].get('name', code) name = pf.positions[code].get('name', code)
quote = quotes.get(code) quote = quotes.get(code)
hist = _SCAN_CANDLES.get(code)
if hist is None:
hist = data.candles(code, 80) hist = data.candles(code, 80)
_SCAN_CANDLES[code] = hist
series = data.build_series(hist, quote) series = data.build_series(hist, quote)
ind = signals.compute_indicators(series) _ik = _ind_key(code)
_cached = _IND_MEMO.get(_ik)
if _cached is None:
_cached = signals.compute_indicators(series) or False
_IND_MEMO[_ik] = _cached
ind = dict(_cached) if _cached else None # 사본 — 변이별 주입값(rel_strength 등) 오염 방지
if ind is None: if ind is None:
decisions.append({'code': code, 'name': name, 'sources': sources, decisions.append({'code': code, 'name': name, 'sources': sources,
'state': 'NODATA', 'reason': '데이터 부족', 'checks': [], 'state': 'NODATA', 'reason': '데이터 부족', 'checks': [],
@@ -239,26 +310,29 @@ def _run_scan(pf, uni, quotes, cmkt, now) -> dict:
flow = data.flow_net(data.investor_flow(code)) flow = data.flow_net(data.investor_flow(code))
anl = data.analyst(code, cur_price) anl = data.analyst(code, cur_price)
dec = signals.evaluate_holding(pf.positions[code], ind, flow, anl, dec = signals.evaluate_holding(pf.positions[code], ind, flow, anl,
held_days=_held_days(pf.positions[code], now)) held_days=_held_days(pf.positions[code], now),
market_ok=mkt_ok.get(cmkt.get(code, ''), True))
pf.apply_position_update(code, dec['position_update']) pf.apply_position_update(code, dec['position_update'])
dec.update({k: pf.positions[code].get(k) for k in dec.update({k: pf.positions[code].get(k) for k in
('entry_price', 'qty', 'stop', 'target', 'trailing_on', 'entry_at')}) ('entry_price', 'qty', 'stop', 'target', 'trailing_on', 'entry_at')})
act = dec['action'] act = dec['action']
if act in ('sell', 'scale_out'): if execute and act in ('sell', 'scale_out'):
fill = _fill_sell_price(code, cur_price) fill = _fill_sell_price(code, cur_price)
rec = pf.sell(code, fill, dec['reason'], signals=dec.get('checks'), rec = pf.sell(code, fill, dec['reason'], signals=dec.get('checks'),
frac=dec.get('sell_frac', 1.0)) frac=dec.get('sell_frac', 1.0))
if rec: if rec:
sells.append(rec) sells.append(rec)
dec['fill_price'] = fill dec['fill_price'] = fill
elif act == 'add': elif execute and act == 'add':
fill = _fill_buy_price(code, cur_price) fill = _fill_buy_price(code, cur_price)
rec = pf.add_tranche(code, fill, dec['reason'], signals=dec.get('checks')) rec = pf.add_tranche(code, fill, dec['reason'], signals=dec.get('checks'))
if rec: if rec:
# 새 평단 기준 손절·목표 재산정 (손절은 위로만 래칫) # 새 평단 기준 손절·목표 재산정 (손절은 위로만 래칫)
new_entry = pf.positions[code]['entry_price'] new_entry = pf.positions[code]['entry_price']
nstop, ntarget = signals.compute_stop_target(new_entry, ind['atr'], ind['recent_low']) nstop, ntarget = signals.compute_stop_target(new_entry, ind['atr'], ind['recent_low'])
pf.positions[code]['stop'] = max(pf.positions[code]['stop'], nstop) # 추격매수(up)=손절 위로만 래칫 / 물타기(down)=낮아진 평단 기준으로 손절 재설정
pf.positions[code]['stop'] = (nstop if dec.get('add_kind') == 'down'
else max(pf.positions[code]['stop'], nstop))
pf.positions[code]['target'] = ntarget pf.positions[code]['target'] = ntarget
buys.append(rec) buys.append(rec)
dec.update({'fill_price': fill, 'entry_price': new_entry, dec.update({'fill_price': fill, 'entry_price': new_entry,
@@ -279,12 +353,7 @@ def _run_scan(pf, uni, quotes, cmkt, now) -> dict:
decisions.append({ decisions.append({
'code': code, 'name': name, 'sources': sources, 'price': cur_price, 'code': code, 'name': name, 'sources': sources, 'price': cur_price,
'state': 'SKIP', 'reason': '추세 미충족', 'action': None, 'state': 'SKIP', 'reason': '추세 미충족', 'action': None,
'checks': [ 'checks': signals.trend_checks(ind), # 4조건+상대강도 모두 표시 (왜 제외인지 보이게)
{'label': '추세(20일선 위)', 'ok': cur_price > ind['sma_long'],
'detail': f"{cur_price:,} vs {ind['sma_long']:,.0f}"},
{'label': '정배열(5>20)', 'ok': ind['sma_short'] > ind['sma_long'],
'detail': f"{ind['sma_short']:,.0f} / {ind['sma_long']:,.0f}"},
],
}) })
continue continue
@@ -292,6 +361,7 @@ def _run_scan(pf, uni, quotes, cmkt, now) -> dict:
anl = data.analyst(code, cur_price) anl = data.analyst(code, cur_price)
market = cmkt.get(code, '') market = cmkt.get(code, '')
m_ok = mkt_ok.get(market, True) m_ok = mkt_ok.get(market, True)
ind['vol_time_frac'] = vfrac
# 상대강도(라이브 전용): 종목 N일 수익률 − 시장지수 N일 수익률 # 상대강도(라이브 전용): 종목 N일 수익률 − 시장지수 N일 수익률
n = config.REL_STRENGTH_DAYS n = config.REL_STRENGTH_DAYS
closes_c = [c['close'] for c in series] closes_c = [c['close'] for c in series]
@@ -300,7 +370,11 @@ def _run_scan(pf, uni, quotes, cmkt, now) -> dict:
ind['rel_strength'] = round(stock_ret - idx_ret[market], 2) ind['rel_strength'] = round(stock_ret - idx_ret[market], 2)
dec = signals.evaluate_candidate(code, name, sources, ind, flow, anl, m_ok) dec = signals.evaluate_candidate(code, name, sources, ind, flow, anl, m_ok)
if dec['action'] == 'buy' and pf.can_open(): if dec['action'] == 'buy' and pf.exited_today(code):
# 당일 전량청산 종목 재매수 금지 — 휩쏘 churn(손절→5분 뒤 재진입 반복) 방지
dec.update({'state': 'WAIT', 'action': None,
'reason': '당일 청산 종목 — 재진입 쿨다운(내일부터 가능)'})
if execute and dec['action'] == 'buy' and pf.can_open():
fill = _fill_buy_price(code, dec['buy_price']) fill = _fill_buy_price(code, dec['buy_price'])
stop, target = signals.compute_stop_target(fill, ind['atr'], ind['recent_low']) stop, target = signals.compute_stop_target(fill, ind['atr'], ind['recent_low'])
rec = pf.buy(code, name, fill, sources, stop, target, dec['buy_path'], dec['reason'], rec = pf.buy(code, name, fill, sources, stop, target, dec['buy_path'], dec['reason'],
@@ -313,6 +387,7 @@ def _run_scan(pf, uni, quotes, cmkt, now) -> dict:
dec['reason'] = '매수 신호 — 현금/한도 부족' dec['reason'] = '매수 신호 — 현금/한도 부족'
decisions.append(dec) decisions.append(dec)
if execute:
pf.update_equity_metrics() pf.update_equity_metrics()
pf.save() pf.save()
@@ -330,6 +405,32 @@ def _run_scan(pf, uni, quotes, cmkt, now) -> dict:
} }
def judge_view(vid: str) -> dict | None:
"""선택한 계좌('main'/'vN') 시각으로 **매매 없이 판단만** — 관심종목 탭 시각 전환용.
execute=False 체결·계좌 저장이 전혀 없다. 끝나면 config 메인 파라미터로 복원."""
from . import backtest, variants as variants_mod
now = datetime.now(config.KST)
if vid in ('main', 'M', ''):
params = config.load_params()
pf = Portfolio.load()
else:
v = next((x for x in variants_mod.load_variants() if x['id'] == vid), None)
if not v:
return None
pp, tp = variants_mod.variant_paths(vid)
params = v.get('params') or {}
pf = Portfolio.load(pp, tp)
try:
backtest.apply_params(params)
# 직전 스캔이 저장한 시세 재사용 — 라이브 재호출 없이 보유종목 가격과 같은 시점으로 통일.
# 스캔 이력이 아직 없으면(None) _gather 가 라이브 폴백.
uni, quotes, cmkt = _gather(set(pf.positions), quotes=_load_last_quotes())
return _run_scan(pf, uni, quotes, cmkt, now, execute=False)
finally:
backtest.apply_params(config.load_params()) # 전역 config 원복 (웹 데몬 잔류 방지)
def _attach_benchmark(snap: dict, pf, now, refresh: bool = True): def _attach_benchmark(snap: dict, pf, now, refresh: bool = True):
"""가상계좌 시작일 대비 기준지수(KOSPI/KOSDAQ) 수익·알파를 스냅샷에 부착.""" """가상계좌 시작일 대비 기준지수(KOSPI/KOSDAQ) 수익·알파를 스냅샷에 부착."""
from . import benchmark from . import benchmark
@@ -350,6 +451,7 @@ def scan(force: bool = False) -> dict:
return {'skipped': True, 'reason': '장외/휴장', 'at': now.isoformat()} return {'skipped': True, 'reason': '장외/휴장', 'at': now.isoformat()}
pf = Portfolio.load() pf = Portfolio.load()
uni, quotes, cmkt = _gather(set(pf.positions)) # 보유분은 universe에서 빠져도 청산 위해 포함 uni, quotes, cmkt = _gather(set(pf.positions)) # 보유분은 universe에서 빠져도 청산 위해 포함
_save_last_quotes(quotes)
snap = _run_scan(pf, uni, quotes, cmkt, now) snap = _run_scan(pf, uni, quotes, cmkt, now)
_attach_benchmark(snap, pf, now) _attach_benchmark(snap, pf, now)
config.STATE_DIR.mkdir(parents=True, exist_ok=True) config.STATE_DIR.mkdir(parents=True, exist_ok=True)
@@ -373,10 +475,12 @@ def scan_all(force: bool = False) -> dict:
for vpf in vpfs.values(): for vpf in vpfs.values():
held_union |= set(vpf.positions) held_union |= set(vpf.positions)
uni, quotes, cmkt = _gather(held_union) uni, quotes, cmkt = _gather(held_union)
_save_last_quotes(quotes)
# 메인 (현재 params.json 튜닝) # 기준 판단 (params.json) — 2026-06-10 기준전략 폐지: 매매 없이 판단만(last_scan = 화면·상태점용).
# 실제 매매는 전부 변이들이 한다 (메인 계좌 동결).
backtest.apply_params(main_params) backtest.apply_params(main_params)
snap = _run_scan(pf, uni, quotes, cmkt, now) snap = _run_scan(pf, uni, quotes, cmkt, now, execute=False)
_attach_benchmark(snap, pf, now) # 지수 캐시 갱신 1회 (변이는 캐시 재사용) _attach_benchmark(snap, pf, now) # 지수 캐시 갱신 1회 (변이는 캐시 재사용)
config.STATE_DIR.mkdir(parents=True, exist_ok=True) config.STATE_DIR.mkdir(parents=True, exist_ok=True)
config.LAST_SCAN_PATH.write_text(json.dumps(snap, ensure_ascii=False, indent=2)) config.LAST_SCAN_PATH.write_text(json.dumps(snap, ensure_ascii=False, indent=2))
@@ -388,24 +492,60 @@ def scan_all(force: bool = False) -> dict:
s = p.summary() s = p.summary()
return benchmark.compare(s.get('total_return_pct'), benchmark.norm_date(p.created_at), today) return benchmark.compare(s.get('total_return_pct'), benchmark.norm_date(p.created_at), today)
compare = [{'id': 'main', 'name': '메인 (현재 튜닝)', 'params': main_params, compare = [] # 기준전략 폐지 — 변이들만 비교 (메인 계좌는 매매 안 함)
'summary': pf.summary(), 'benchmark': _alpha(pf)}]
for v in vdefs: for v in vdefs:
backtest.apply_params(v.get('params') or {}) backtest.apply_params(v.get('params') or {})
vpf = vpfs[v['id']] vpf = vpfs[v['id']]
_run_scan(vpf, uni, quotes, cmkt, now) vsnap = _run_scan(vpf, uni, quotes, cmkt, now)
compare.append({'id': v['id'], 'name': v.get('name', v['id']), compare.append({'id': v['id'], 'name': v.get('name', v['id']),
'params': v.get('params') or {}, 'summary': vpf.summary(), 'params': v.get('params') or {}, 'summary': vpf.summary(),
'benchmark': _alpha(vpf)}) 'benchmark': _alpha(vpf), 'watching': _watching(vsnap),
'held': sorted(vpf.positions)})
compare.sort(key=lambda c: c['summary'].get('total_return_pct', 0) or 0, reverse=True) compare.sort(key=lambda c: c['summary'].get('total_return_pct', 0) or 0, reverse=True)
# 자동편입(auto) 종목 신호 추적 — 한 변이라도 노리는(매수/대기) 종목은 '살아있음' 기록 (auto_prune 판단용)
try:
from . import universe as _um
sig = {it['code'] for c in compare for it in (c.get('watching') or []) if it.get('code')}
if sig:
_um.mark_signals(sorted(sig))
except Exception:
pass
variants_mod.COMPARE_PATH.write_text(json.dumps({ variants_mod.COMPARE_PATH.write_text(json.dumps({
'scanned_at': now.isoformat(), 'session': is_market_session(now), 'scanned_at': now.isoformat(), 'session': is_market_session(now),
'variants': compare, 'variants': compare,
}, ensure_ascii=False, indent=2)) }, ensure_ascii=False, indent=2))
_record_equity_history(compare, now)
return snap return snap
EQUITY_HISTORY_PATH = config.STATE_DIR / 'equity_history.json'
def _record_equity_history(compare: list, now) -> None:
"""일별 계좌 성과 이력 — {date: [{id, ph(파라미터 해시), equity, ret}]}.
스캔 당일 항목을 덮어써 그날 마지막 스캔( 마감) 값이 남는다. 변이 재구성으로
id가 재사용돼도 ph로 어느 전략이었는지 식별 가능. 사후 국면별 분석용 누적."""
import hashlib
try:
hist = json.loads(EQUITY_HISTORY_PATH.read_text()) if EQUITY_HISTORY_PATH.exists() else {}
except Exception:
hist = {}
today = now.strftime('%Y%m%d')
hist[today] = [{
'id': c['id'],
'ph': hashlib.md5(json.dumps(c.get('params') or {}, sort_keys=True).encode()).hexdigest()[:8],
'equity': c['summary'].get('equity'),
'ret': c['summary'].get('total_return_pct'),
} for c in compare]
try:
EQUITY_HISTORY_PATH.write_text(json.dumps(hist, ensure_ascii=False))
except Exception as e:
sys.stderr.write(f'[engine] equity_history 기록 실패: {e}\n')
if __name__ == '__main__': if __name__ == '__main__':
force = '--force' in sys.argv force = '--force' in sys.argv
snap = scan_all(force=force) snap = scan_all(force=force)
+10 -3
View File
@@ -9,7 +9,8 @@ from __future__ import annotations
import json import json
from datetime import datetime from datetime import datetime
from . import config, signals from . import config
from .signals import target_value as _sizing_value # buy()의 signals 파라미터가 모듈명을 가려서 직접 import
def _now_iso() -> str: def _now_iso() -> str:
@@ -28,6 +29,7 @@ class Portfolio:
self.max_drawdown: float = data.get('max_drawdown', 0.0) self.max_drawdown: float = data.get('max_drawdown', 0.0)
self.created_at: str = data.get('created_at', _now_iso()) self.created_at: str = data.get('created_at', _now_iso())
self.updated_at: str = data.get('updated_at', self.created_at) self.updated_at: str = data.get('updated_at', self.created_at)
self.last_exit: dict[str, str] = data.get('last_exit', {}) # code → 전량청산 날짜(YYYY-MM-DD), 당일 재진입 금지용
# 영속화 경로 (변이는 별도 경로, 기본은 메인 sim) # 영속화 경로 (변이는 별도 경로, 기본은 메인 sim)
self._pf_path = config.PORTFOLIO_PATH self._pf_path = config.PORTFOLIO_PATH
self._trades_path = config.TRADES_PATH self._trades_path = config.TRADES_PATH
@@ -55,7 +57,7 @@ class Portfolio:
'cash': self.cash, 'initial': self.initial, 'positions': self.positions, 'cash': self.cash, 'initial': self.initial, 'positions': self.positions,
'realized_pnl': self.realized_pnl, 'closed_trades': self.closed_trades, 'realized_pnl': self.realized_pnl, 'closed_trades': self.closed_trades,
'wins': self.wins, 'peak_equity': self.peak_equity, 'wins': self.wins, 'peak_equity': self.peak_equity,
'max_drawdown': self.max_drawdown, 'max_drawdown': self.max_drawdown, 'last_exit': self.last_exit,
'created_at': self.created_at, 'updated_at': self.updated_at, 'created_at': self.created_at, 'updated_at': self.updated_at,
}, ensure_ascii=False, indent=2)) }, ensure_ascii=False, indent=2))
@@ -83,7 +85,7 @@ class Portfolio:
"""신규 진입(1차 트랜치). 목표비중을 ENTRY_TRANCHES 로 나눈 만큼만 매수. 체결 dict 또는 None.""" """신규 진입(1차 트랜치). 목표비중을 ENTRY_TRANCHES 로 나눈 만큼만 매수. 체결 dict 또는 None."""
if code in self.positions or not self.can_open(): if code in self.positions or not self.can_open():
return None return None
full_target = signals.target_value(self.equity_estimate(), fill_price, stop) full_target = _sizing_value(self.equity_estimate(), fill_price, stop)
tranche_val = full_target / max(1, config.ENTRY_TRANCHES) tranche_val = full_target / max(1, config.ENTRY_TRANCHES)
qty = self._qty_for(fill_price, tranche_val) qty = self._qty_for(fill_price, tranche_val)
if qty < 1: if qty < 1:
@@ -169,8 +171,13 @@ class Portfolio:
if pnl > 0: if pnl > 0:
self.wins += 1 self.wins += 1
del self.positions[code] del self.positions[code]
self.last_exit[code] = _now_iso()[:10] # 당일 재진입 금지 기준
return rec return rec
def exited_today(self, code: str) -> bool:
"""오늘 전량청산한 종목인지 — 당일 재진입(휩쏘 churn) 방지."""
return self.last_exit.get(code) == _now_iso()[:10]
def apply_position_update(self, code: str, upd: dict): def apply_position_update(self, code: str, upd: dict):
if code in self.positions: if code in self.positions:
self.positions[code].update(upd) self.positions[code].update(upd)
+75 -30
View File
@@ -74,11 +74,11 @@ def trend_ok(ind: dict) -> bool:
기본: 현재가>20일선 & 정배열(5>20). 보강: 20일선 우상향 5>중기선(60) 데이터 있을 때만.""" 기본: 현재가>20일선 & 정배열(5>20). 보강: 20일선 우상향 5>중기선(60) 데이터 있을 때만."""
if not (ind['price'] > ind['sma_long'] and ind['sma_short'] > ind['sma_long']): if not (ind['price'] > ind['sma_long'] and ind['sma_short'] > ind['sma_long']):
return False return False
if ind.get('sma_long_slope_up') is False: # ① 20일선이 꺾여 내려오면 제외 if getattr(config, 'TREND_SLOPE_GATE', 1) and ind.get('sma_long_slope_up') is False:
return False return False # ① 장기선이 꺾여 내려오면 제외 (게이트 ON일 때만)
sm = ind.get('sma_mid') sm = ind.get('sma_mid')
if sm is not None and ind['sma_short'] <= sm: # ② 단기선이 중기선 아래면(역배열) 제외 if getattr(config, 'MID_ARRAY_GATE', 1) and sm is not None and ind['sma_short'] <= sm:
return False return False # ② 단기선이 중기선 아래면(역배열) 제외 (게이트 ON일 때만)
return True return True
@@ -122,29 +122,44 @@ def _analyst_checks(analyst: dict | None, price: float) -> tuple[bool, list[dict
return gate_ok, checks, bonus return gate_ok, checks, bonus
def trend_checks(ind: dict) -> list[dict]:
"""추세 게이트 체크리스트(trend_ok와 동일 4조건 + 상대강도) — 매수 판단·제외 카드 공용.
라벨은 실제 적용된 이평 일수(config) 표기 (변이마다 SMA_LONG 10/20/40 다름)."""
price = ind['price']
_S, _L, _M = config.SMA_SHORT, config.SMA_LONG, config.SMA_MID
slope = ind.get('sma_long_slope_up')
sm = ind.get('sma_mid')
rel = ind.get('rel_strength')
slope_gate = getattr(config, 'TREND_SLOPE_GATE', 1)
mid_gate = getattr(config, 'MID_ARRAY_GATE', 1)
# 게이트 꺼진 조건은 ok=None(참고) — 통과/탈락에 영향 없음을 표시
if not slope_gate:
slope_check = {'label': f'추세 기울기({_L}일선↑)', 'ok': None,
'detail': '게이트 끔(완화)' + ('' if slope is None else f" · 실제 {'우상향' if slope else '하향'}")}
else:
slope_check = {'label': f'추세 기울기({_L}일선↑)', 'ok': None if slope is None else slope,
'detail': '데이터 없음(통과)' if slope is None else ('우상향' if slope else '하향')}
if not mid_gate:
mid_check = {'label': f'중기 정배열({_S}>{_M})', 'ok': None,
'detail': '게이트 끔(완화)' + ('' if sm is None else f" · {ind['sma_short']:,.0f} / {sm:,.0f}")}
else:
mid_check = {'label': f'중기 정배열({_S}>{_M})', 'ok': None if sm is None else ind['sma_short'] > sm,
'detail': '데이터 없음(통과)' if sm is None else f"{ind['sma_short']:,.0f} / {sm:,.0f}"}
return [
{'label': f'추세({_L}일선 위)', 'ok': price > ind['sma_long'],
'detail': f"{price:,} vs {ind['sma_long']:,.0f}"},
{'label': f'정배열({_S}>{_L})', 'ok': ind['sma_short'] > ind['sma_long'],
'detail': f"{ind['sma_short']:,.0f} / {ind['sma_long']:,.0f}"},
slope_check, mid_check,
{'label': '상대강도(시장대비)', 'ok': None if rel is None else rel > 0,
'detail': '데이터 없음(통과)' if rel is None else f'{rel:+.1f}%p'},
]
def evaluate_candidate(code, name, sources, ind, flow, analyst, market_ok) -> dict: def evaluate_candidate(code, name, sources, ind, flow, analyst, market_ok) -> dict:
"""미보유 종목 매수 판단. flow/analyst 는 engine 이 trend 통과 후 주입.""" """미보유 종목 매수 판단. flow/analyst 는 engine 이 trend 통과 후 주입."""
price = ind['price'] price = ind['price']
checks: list[dict] = [] checks: list[dict] = list(trend_checks(ind)) # 1. 추세 게이트 (제외 카드와 공유)
# 1. 추세
checks.append({'label': '추세(20일선 위)', 'ok': price > ind['sma_long'],
'detail': f"{price:,} vs {ind['sma_long']:,.0f}"})
checks.append({'label': '정배열(5>20)', 'ok': ind['sma_short'] > ind['sma_long'],
'detail': f"{ind['sma_short']:,.0f} / {ind['sma_long']:,.0f}"})
# 1-b. 추세 질 보강 — 기울기 / 중기선 / 상대강도 (데이터 없으면 통과 표시)
slope = ind.get('sma_long_slope_up')
checks.append({'label': '추세 기울기(20일선↑)',
'ok': None if slope is None else slope,
'detail': '데이터 없음(통과)' if slope is None else ('우상향' if slope else '하향')})
sm = ind.get('sma_mid')
checks.append({'label': '중기 정배열(5>60)',
'ok': None if sm is None else ind['sma_short'] > sm,
'detail': '데이터 없음(통과)' if sm is None else f"{ind['sma_short']:,.0f} / {sm:,.0f}"})
rel = ind.get('rel_strength')
checks.append({'label': '상대강도(시장대비)',
'ok': None if rel is None else rel > 0,
'detail': '데이터 없음(통과)' if rel is None else f'{rel:+.1f}%p'})
# 2. 수급 # 2. 수급
fnet = flow.get('foreign', 0) if flow else 0 fnet = flow.get('foreign', 0) if flow else 0
@@ -171,28 +186,34 @@ def evaluate_candidate(code, name, sources, ind, flow, analyst, market_ok) -> di
return {**base, 'state': 'WAIT', 'reason': '수급 미충족'} return {**base, 'state': 'WAIT', 'reason': '수급 미충족'}
# 4. 과열 보류 — 회전율이 평균 대비 과도하면 돌파·눌림목 불문 신규매수 보류 # 4. 과열 보류 — 회전율이 평균 대비 과도하면 돌파·눌림목 불문 신규매수 보류
# 장중엔 부분 누적 거래량을 경과시간 비례로 하루치 환산(vol_time_frac, engine 주입·백테스트는 1.0)
vfrac = ind.get('vol_time_frac') or 1.0
vol_today = ind['today_volume'] / vfrac
t_today, t_avg = ind.get('turnover_today'), ind.get('turnover_avg') t_today, t_avg = ind.get('turnover_today'), ind.get('turnover_avg')
if t_today is not None:
t_today = t_today / vfrac
proj = ' (환산)' if vfrac < 1.0 else ''
overheated = bool(t_today and t_avg and t_today >= t_avg * config.TURNOVER_OVERHEAT_MULT) overheated = bool(t_today and t_avg and t_today >= t_avg * config.TURNOVER_OVERHEAT_MULT)
if t_today is not None and t_avg: if t_today is not None and t_avg:
checks.append({'label': '과열 아님(회전율)', 'ok': not overheated, checks.append({'label': '과열 아님(회전율)', 'ok': not overheated,
'detail': f"{t_today:.2f}% vs 평균 {t_avg:.2f}% (보류 {config.TURNOVER_OVERHEAT_MULT:.0f}배↑)"}) 'detail': f"{t_today:.2f}%{proj} vs 평균 {t_avg:.2f}% (보류 {config.TURNOVER_OVERHEAT_MULT:.0f}배↑)"})
if overheated: if overheated:
return {**base, 'state': 'WAIT', return {**base, 'state': 'WAIT',
'reason': f'과열(회전율 {t_today:.1f}% ≥ 평균×{config.TURNOVER_OVERHEAT_MULT:.0f}) — 신규매수 보류'} 'reason': f'과열(회전율 {t_today:.1f}% ≥ 평균×{config.TURNOVER_OVERHEAT_MULT:.0f}) — 신규매수 보류'}
# 5. 매수 경로 — 돌파 우선 (전고점 + 거래량 급증 + 회전율 급증 모두 충족) # 5. 매수 경로 — 돌파 우선 (전고점 + 거래량 급증 + 회전율 급증 모두 충족)
price_break = bool(ind['recent_high'] and price > ind['recent_high']) price_break = bool(ind['recent_high'] and price > ind['recent_high'])
vol_mult_ok = bool(ind['volume_avg'] and ind['today_volume'] >= ind['volume_avg'] * config.VOLUME_BREAKOUT_MULT) vol_mult_ok = bool(ind['volume_avg'] and vol_today >= ind['volume_avg'] * config.VOLUME_BREAKOUT_MULT)
turn_ok = (t_today is None or not t_avg) or (t_today >= t_avg * config.TURNOVER_BREAKOUT_MULT) turn_ok = (t_today is None or not t_avg) or (t_today >= t_avg * config.TURNOVER_BREAKOUT_MULT)
breakout = price_break and vol_mult_ok and turn_ok breakout = price_break and vol_mult_ok and turn_ok
checks.append({'label': '돌파(전고점)', 'ok': price_break, checks.append({'label': '돌파(전고점)', 'ok': price_break,
'detail': f"고점 {ind['recent_high']:,.0f}" if ind['recent_high'] else ''}) 'detail': f"고점 {ind['recent_high']:,.0f}" if ind['recent_high'] else ''})
checks.append({'label': '거래량 급증', 'ok': vol_mult_ok, checks.append({'label': '거래량 급증', 'ok': vol_mult_ok,
'detail': f"{ind['today_volume']:,} vs 평균 {ind['volume_avg']:,.0f}" if ind['volume_avg'] else ''}) 'detail': f"{vol_today:,.0f}{proj} vs 평균 {ind['volume_avg']:,.0f}" if ind['volume_avg'] else ''})
if t_today is not None and t_avg: if t_today is not None and t_avg:
checks.append({'label': '회전율 급증', 'ok': bool(turn_ok), checks.append({'label': '회전율 급증', 'ok': bool(turn_ok),
'detail': f"{t_today:.2f}% vs 평균 {t_avg:.2f}%"}) 'detail': f"{t_today:.2f}%{proj} vs 평균 {t_avg:.2f}%"})
else: else:
checks.append({'label': '회전율', 'ok': None, 'detail': '데이터 없음(통과)'}) checks.append({'label': '회전율', 'ok': None, 'detail': '데이터 없음(통과)'})
@@ -235,15 +256,22 @@ def evaluate_candidate(code, name, sources, ind, flow, analyst, market_ok) -> di
'buy_price': price, 'watch_price': limit, 'buy_price': price, 'watch_price': limit,
'reason': f'눌림목 지정가 {limit:,} 도달'} 'reason': f'눌림목 지정가 {limit:,} 도달'}
# 6-b. 즉시매수 — 추세·정배열·수급·애널 다 통과했는데 돌파·눌림목 둘 다 아니면(=안 내려오는 상승 종목),
# 강세장·RSI 정상이면 현재가에 바로 매수. 꾸준히 오르기만 하는 좋은 종목 놓침 방지 (실험 토글).
if getattr(config, 'IMMEDIATE_ENTRY', 0) and market_ok and not rsi_overbought:
return {**base, 'state': 'BUY', 'action': 'buy', 'buy_path': 'immediate',
'buy_price': price, 'reason': '조건 충족 — 즉시매수(눌림 안 기다림)'}
return {**base, 'state': 'WAIT', 'watch_price': limit, return {**base, 'state': 'WAIT', 'watch_price': limit,
'reason': f'눌림목 대기 — 지정가 {limit:,}'} 'reason': f'눌림목 대기 — 지정가 {limit:,}'}
def evaluate_holding(position, ind, flow, analyst, held_days=None) -> dict: def evaluate_holding(position, ind, flow, analyst, held_days=None, market_ok=True) -> dict:
"""보유 종목 판단. 우선순위: 손절/추세이탈(전량) → 시간손절 → 분할익절(scale_out) → 추격매수(add) → 유지. """보유 종목 판단. 우선순위: 손절/추세이탈(전량) → 시간손절 → 분할익절(scale_out) → 추격매수(add) → 유지.
position stop/peak/trailing/scaled_out 갱신값도 position_update 함께 반환. position stop/peak/trailing/scaled_out 갱신값도 position_update 함께 반환.
held_days: 보유 경과 일수(달력). None이면 시간손절 미적용(엔진·백테스트가 산정해 전달). held_days: 보유 경과 일수(달력). None이면 시간손절 미적용(엔진·백테스트가 산정해 전달).
market_ok: 시장 강세 여부(물타기 허용 판단용, 백테스트는 중립 True).
""" """
price = ind['price'] price = ind['price']
entry = position['entry_price'] entry = position['entry_price']
@@ -273,7 +301,7 @@ def evaluate_holding(position, ind, flow, analyst, held_days=None) -> dict:
{'label': '목표/트레일링', 'ok': None, {'label': '목표/트레일링', 'ok': None,
'detail': ('트레일링 ON' if trailing_on else 'detail': ('트레일링 ON' if trailing_on else
('일부익절 완료' if scaled_out else f'목표 {target:,}'))}, ('일부익절 완료' if scaled_out else f'목표 {target:,}'))},
{'label': '추세(20일선)', 'ok': price >= ind['sma_long'], {'label': f'추세({config.SMA_LONG}일선)', 'ok': price >= ind['sma_long'],
'detail': f"{ind['sma_long']:,.0f}"}, 'detail': f"{ind['sma_long']:,.0f}"},
{'label': '수급(외/기)', 'ok': supply_ok, 'detail': f'{fnet:+,} · 기 {inet:+,}'}, {'label': '수급(외/기)', 'ok': supply_ok, 'detail': f'{fnet:+,} · 기 {inet:+,}'},
{'label': f'분할({tranches}/{config.ENTRY_TRANCHES})', 'ok': None, {'label': f'분할({tranches}/{config.ENTRY_TRANCHES})', 'ok': None,
@@ -287,6 +315,23 @@ def evaluate_holding(position, ind, flow, analyst, held_days=None) -> dict:
'price': price, 'checks': checks, 'action': None, 'state': 'HOLD', 'price': price, 'checks': checks, 'action': None, 'state': 'HOLD',
'position_update': upd, 'pnl_pct': pnl_pct} 'position_update': upd, 'pnl_pct': pnl_pct}
# 0. 물타기(애버리징) — 켜진 변이만. 하락 시 손절 대신 추가매수로 평단↓ (한도·강세장·비급락 조건).
# 당일 단일 급락(-CRASH%↓)은 물타기 금지→손절 우선(그림 #3), 약세장도 금지(그림 #4).
avg_on = getattr(config, 'AVERAGING_ENTRY', 0)
if avg_on:
prev_close = ind.get('prev_close') or price
today_chg = (price / prev_close - 1) if prev_close else 0
crash = today_chg <= -getattr(config, 'CRASH_DROP_PCT', 0.10)
avg_trigger = last_add * (1 - getattr(config, 'AVERAGING_DROP_PCT', 0.10))
budget_left = tranches < config.ENTRY_TRANCHES
# 트레일링/익절 전 + 한도 남음 + 강세장 + 비급락 + 직전매수가 -X% 도달 → 물타기
if (budget_left and market_ok and not crash and not trailing_on and not scaled_out
and price <= avg_trigger):
return {**base, 'state': 'ADD', 'action': 'add', 'add_kind': 'down',
'reason': f'물타기 — {tranches + 1}/{config.ENTRY_TRANCHES}차 (평단↓, -{config.AVERAGING_DROP_PCT*100:.0f}%)'}
# 물타기 한도 소진(또는 급락/약세장)인데 손절선 깨짐 → 최종 손절
# (한도 남았는데 급락이면 아래 일반 손절로 자연 처리)
# 1. 손절·추세이탈 — 전량 # 1. 손절·추세이탈 — 전량
if price <= stop: if price <= stop:
reason = '트레일링 익절' if (trailing_on and price > entry) else '손절' reason = '트레일링 익절' if (trailing_on and price > entry) else '손절'
File diff suppressed because it is too large Load Diff
+50 -12
View File
@@ -10,15 +10,34 @@ from __future__ import annotations
import itertools import itertools
import json import json
import os
from datetime import datetime from datetime import datetime
from multiprocessing import get_context
from . import backtest, config, universe from . import backtest, config, universe
def _eval_combo(args):
"""워커 1개가 조합 1개를 평가 — 학습/검증 + 전체기간 3분할 구간(꾸준함 측정).
파라미터는 학습(fit) 없으므로 3분할은 '한 구간 운빨' 거르는 일관성 검증."""
keys, combo, codes, trf, trt, tef, tet, windows = args
params = dict(zip(keys, combo))
tr = backtest.run(params, codes, date_from=trf, date_to=trt)
te = backtest.run(params, codes, date_from=tef, date_to=tet)
wins = []
for wf, wt in windows:
w = backtest.run(params, codes, date_from=wf, date_to=wt)
wins.append({'from': wf, 'to': wt,
'ret': w.get('total_return_pct'), 'trades': w.get('trades', 0)})
rets = [w['ret'] for w in wins if w['ret'] is not None]
return {'params': params, 'train': tr, 'test': te, 'windows': wins,
'worst_ret': min(rets) if rets else None}
# 백테스트에서 실제 영향 있는 파라미터만 스윕 (애널 게이트·시장필터는 backtest 중립이라 제외). # 백테스트에서 실제 영향 있는 파라미터만 스윕 (애널 게이트·시장필터는 backtest 중립이라 제외).
# 기존 5 + 신규 4(RSI·시간손절·리스크) 탐색. 조합폭발 억제 위해 기존 그리드는 핵심값으로 축소. # 기존 5 + 신규 4(RSI·시간손절·리스크) 탐색. 조합폭발 억제 위해 기존 그리드는 핵심값으로 축소.
# base 3×3×2×2×2 = 72 × 신규 2×2×2×2 = 16 → 1152 조합. # base 4×3×2×2×2 = 96 × 신규 2×2×2×2 = 16 → 1536 조합. (2026-06-15 SMA_LONG 60 추가)
GRID = { GRID = {
'SMA_LONG': [10, 20, 40], # 추세 속도 — 빠른/느린 (다양성 핵심) 'SMA_LONG': [10, 20, 60], # 추세선 길이 — 10/20/60 (2026-06-15 40 제거: 어중간·관리자님 지시. 60은 중기선과 겹침)
'RR_RATIO': [1.5, 2.0, 3.0], # 손익비 'RR_RATIO': [1.5, 2.0, 3.0], # 손익비
'STOP_ATR_MULT': [1.5, 2.0], # 손절 폭 'STOP_ATR_MULT': [1.5, 2.0], # 손절 폭
'PULLBACK_ATR_MULT': [1.0, 1.5], # 눌림 깊이 'PULLBACK_ATR_MULT': [1.0, 1.5], # 눌림 깊이
@@ -51,22 +70,39 @@ def run_sweep(codes: list[str] | None = None, train_frac: float = 0.7, grid: dic
train_to, test_from, test_to = dates[split - 1], dates[split], dates[-1] train_to, test_from, test_to = dates[split - 1], dates[split], dates[-1]
train_from = dates[0] train_from = dates[0]
# 전체기간 3분할 — 구간별 수익으로 '꾸준함'(최악 구간) 측정
third = len(dates) // 3
windows = [(dates[0], dates[third - 1]),
(dates[third], dates[2 * third - 1]),
(dates[2 * third], dates[-1])]
keys = list(grid.keys()) keys = list(grid.keys())
combos = list(itertools.product(*[grid[k] for k in keys])) combos = list(itertools.product(*[grid[k] for k in keys]))
results = [] args = [(keys, combo, codes, train_from, train_to, test_from, test_to, windows) for combo in combos]
for combo in combos:
params = dict(zip(keys, combo)) # 멀티프로세싱 — 조합을 코어에 분배. macOS는 fork가 데드락 위험이라 spawn 사용
tr = backtest.run(params, codes, date_from=train_from, date_to=train_to) # (워커가 메인 재import → sim/__main__.py의 `if __name__=='__main__'` 가드로 재귀 방지).
te = backtest.run(params, codes, date_from=test_from, date_to=test_to) # chunksize 크게 → 워커당 연속 조합 처리로 종목 일봉 메모이즈 재활용 극대화. pool.map은 순서 유지(결정론).
results.append({'params': params, 'train': tr, 'test': te}) nproc = max(1, (os.cpu_count() or 4) - 2)
if len(args) <= 1 or nproc == 1:
results = [_eval_combo(a) for a in args]
else:
chunk = max(1, len(args) // nproc)
with get_context('spawn').Pool(nproc) as pool:
results = pool.map(_eval_combo, args, chunksize=chunk)
def sort_key(r): def sort_key(r):
te = r['test'] te = r['test']
enough = (te.get('trades', 0) or 0) >= MIN_TRADES enough = (te.get('trades', 0) or 0) >= MIN_TRADES
return (1 if enough else 0, te.get('total_return_pct', -999) or -999) worst = r.get('worst_ret')
# 1순위 최악 구간 수익(꾸준함 — 한 구간 운빨 배제), 2순위 검증수익
return (1 if enough else 0,
worst if worst is not None else -999,
te.get('total_return_pct', -999) or -999)
results.sort(key=sort_key, reverse=True) results.sort(key=sort_key, reverse=True)
out = { out = {
'generated_at': datetime.now(config.KST).isoformat(), 'generated_at': datetime.now(config.KST).isoformat(),
'universe_size': len(codes), 'universe_size': len(codes),
@@ -81,6 +117,8 @@ def run_sweep(codes: list[str] | None = None, train_frac: float = 0.7, grid: dic
} }
config.STATE_DIR.mkdir(parents=True, exist_ok=True) config.STATE_DIR.mkdir(parents=True, exist_ok=True)
(config.STATE_DIR / 'backtest_results.json').write_text(json.dumps(out, ensure_ascii=False, indent=2)) (config.STATE_DIR / 'backtest_results.json').write_text(json.dumps(out, ensure_ascii=False, indent=2))
# ⚠️ 비교군 자동 동기화는 2026-06-10 관리자님 지시로 끔 — sweep은 결과 파일만 갱신.
# 비교군 변경은 명시 요청 시에만: `python3 -m sim variants sync` 또는 variants.sync_label_tops().
return out return out
@@ -91,13 +129,13 @@ if __name__ == '__main__':
if res.get('error'): if res.get('error'):
print('스윕 실패:', res) print('스윕 실패:', res)
else: else:
print(f"스윕 완료 — {res['count']}개 조합 · 검증기간 {res['split']['test']}") print(f"스윕 완료 — {res['count']}개 조합 · 검증기간 {res['split']['test']} · 정렬=최악구간 수익")
print(f"{'RR':>4} {'STOP':>5} {'SMA':>4} {'PULL':>5} {'RSI±':>8} {'HOLD':>5} {'RISK':>5} | " print(f"{'RR':>4} {'STOP':>5} {'SMA':>4} {'PULL':>5} {'RSI±':>8} {'HOLD':>5} {'RISK':>5} | "
f"{'검증수익%':>8} {'검증MDD%':>8} {'거래':>5} {'승률%':>6}") f"{'최악구간%':>8} {'검증수익%':>8} {'거래':>5} {'승률%':>6}")
for r in res['results'][:12]: for r in res['results'][:12]:
p, te = r['params'], r['test'] p, te = r['params'], r['test']
rsi = f"{p.get('RSI_OVERBOUGHT','-')}/{p.get('RSI_OVERSOLD','-')}" rsi = f"{p.get('RSI_OVERBOUGHT','-')}/{p.get('RSI_OVERSOLD','-')}"
print(f"{p['RR_RATIO']:>4} {p['STOP_ATR_MULT']:>5} {p['SMA_LONG']:>4} {p['PULLBACK_ATR_MULT']:>5} " print(f"{p['RR_RATIO']:>4} {p['STOP_ATR_MULT']:>5} {p['SMA_LONG']:>4} {p['PULLBACK_ATR_MULT']:>5} "
f"{rsi:>8} {p.get('MAX_HOLD_DAYS','-'):>5} {p.get('RISK_PER_TRADE_PCT','-'):>5} | " f"{rsi:>8} {p.get('MAX_HOLD_DAYS','-'):>5} {p.get('RISK_PER_TRADE_PCT','-'):>5} | "
f"{te['total_return_pct']:>8} {te['mdd_pct']:>8} " f"{str(r.get('worst_ret')):>8} {te['total_return_pct']:>8} "
f"{te['trades']:>5} {str(te['win_rate_pct']):>6}") f"{te['trades']:>5} {str(te['win_rate_pct']):>6}")
+102
View File
@@ -151,6 +151,108 @@ def remove(code: str):
_save_watchlist(wl) _save_watchlist(wl)
# ── 자동편입(auto) — 키움 순위정보로 주도주를 매일 후보에 편입 ──────────────
# 소스: ka90009 외인·기관 순매수(수급 좋은 종목, 우리 전략 수급게이트와 궁합) + ka10023 거래량급증(관심 폭발).
# 규칙: ETF/ETN·급증률 이상치·하락 제외, 각 소스 상위 N, 총 상한. 자동제외는 origin=auto·미보유·N거래일 무신호만.
AUTO_TOP_N = 15 # 각 소스 상위 N 편입
AUTO_TOTAL_CAP = 120 # 관찰목록 총 상한 (auto 편입은 이 한도 내에서만)
AUTO_SURGE_CAP = 1000.0 # 거래량 급증률 이 % 초과는 노이즈로 제외
AUTO_PRUNE_DAYS = 10 # auto 종목이 이 거래일 수 동안 무신호면 자동 제외 (보유·수동 등은 제외 안 함)
def _held_codes() -> set:
try:
held = kc.get_positions_all(labels=config.OWNER_ACCOUNT_LABELS)
return {(p.get('code') or '').strip().zfill(6)
for poss in held.values() for p in poss if p.get('qty', 0) > 0}
except Exception:
return set()
def auto_import() -> dict:
"""키움 순위정보로 주도주 자동 편입(origin='auto'). 총 상한 내에서만. 결과 요약 반환."""
cands: dict[str, str] = {} # code -> name (중복 자동 dedup)
def take(rows, key_name='name', n=AUTO_TOP_N):
c = 0
for x in rows:
if c >= n:
break
code = (x.get('code') or '').strip().zfill(6)
nm = x.get(key_name, '')
if not code or is_etf(nm) or code in cands:
continue
cands[code] = nm
c += 1
try:
nb = kc.get_foreign_inst_netbuy()
take([x for x in nb['foreign'] if x['amt'] > 0]) # 외인 순매수
take([x for x in nb['inst'] if x['amt'] > 0]) # 기관 순매수
except Exception as e:
sys.stderr.write(f'[universe] 외인기관 순매수 조회 실패: {e}\n')
try:
vs = kc.get_volume_surge()
take([x for x in vs if x['flu_rt'] > 0 and 0 < x['surge_rt'] <= AUTO_SURGE_CAP]) # 거래량 급증
except Exception as e:
sys.stderr.write(f'[universe] 거래량급증 조회 실패: {e}\n')
wl = _load_watchlist()
now = datetime.now(config.KST).isoformat()
added = 0
for code, nm in cands.items():
if code in wl:
continue
if len(wl) >= AUTO_TOTAL_CAP: # 상한 도달 시 신규 auto 편입 중단
break
wl[code] = {'name': nm, 'origin': 'auto', 'added_at': now}
added += 1
if added:
_save_watchlist(wl)
return {'candidates': len(cands), 'added': added, 'total': len(wl)}
def auto_prune(no_signal_days: int = AUTO_PRUNE_DAYS) -> dict:
"""origin='auto'·미보유 종목 중 최근 no_signal_days 거래일 동안 한 번도 매수신호(BUY/ADD/WAIT-watch) 없던 것 제거.
보유·수동·비하이브(watch/interest/held/manual) 절대 건드리지 않는다."""
wl = _load_watchlist()
auto_codes = {c for c, e in wl.items() if e.get('origin') == 'auto'}
if not auto_codes:
return {'pruned': 0, 'total': len(wl)}
held = _held_codes()
# 최근 신호 추적: state/sim/auto_seen.json {code: last_signal_iso}. 매 import 시 갱신.
seen = _load_json(config.STATE_DIR / 'auto_seen.json', {})
now = datetime.now(config.KST)
pruned = 0
for code in list(auto_codes):
if code in held:
continue
last = seen.get(code)
ent_added = wl[code].get('added_at', '')
ref = last or ent_added
try:
days = (now - datetime.fromisoformat(ref)).days
except Exception:
days = 0
if days >= no_signal_days:
del wl[code]
pruned += 1
if pruned:
_save_watchlist(wl)
return {'pruned': pruned, 'total': len(wl)}
def mark_signals(codes_with_signal: list[str]):
"""이번 스캔에서 매수신호(BUY/ADD/대기) 든 종목의 '마지막 신호 시각' 기록 — auto_prune 판단용."""
path = config.STATE_DIR / 'auto_seen.json'
seen = _load_json(path, {})
now = datetime.now(config.KST).isoformat()
for c in codes_with_signal:
seen[(c or '').strip().zfill(6)] = now
config.STATE_DIR.mkdir(parents=True, exist_ok=True)
path.write_text(json.dumps(seen, ensure_ascii=False))
def build_universe() -> list[dict]: def build_universe() -> list[dict]:
"""누적 관찰목록을 동기화 후 [{code, name, sources:[origin]}]로 반환. code 6자리 정규화.""" """누적 관찰목록을 동기화 후 [{code, name, sources:[origin]}]로 반환. code 6자리 정규화."""
wl = sync_watchlist() wl = sync_watchlist()
+163 -2
View File
@@ -40,6 +40,116 @@ def _label(params: dict) -> str:
return '·'.join(f'{short.get(k, k)}{v:g}' for k, v in params.items()) return '·'.join(f'{short.get(k, k)}{v:g}' for k, v in params.items())
def _philosophy_presets() -> list[dict]:
"""철학별 라이브 비교군 프리셋.
기존 sweep은 같은 규칙의 강약 조절이 많아 보유 종목이 겹치기 쉬웠다. 프리셋은
수급 기간, 애널 게이트, 시장 방어, 보유 종목 , 진입 방식까지 같이 바꿔 라이브 행동을
벌리는 용도다. 주문 모듈과 무관한 페이퍼 시뮬 전용 정의다.
"""
base = {
'RSI_OVERBOUGHT': 75,
'RSI_OVERSOLD': 20,
'MAX_HOLD_DAYS': 20,
'BEAR_ENTRY_MODE': 1,
'TREND_SLOPE_GATE': 1,
'MID_ARRAY_GATE': 1,
'IMMEDIATE_ENTRY': 0,
'AVERAGING_ENTRY': 0,
'ENTRY_TRANCHES': 2,
'SCALE_OUT_FRAC': 0.0,
}
def p(name: str, strength: str, **params):
merged = dict(base)
merged.update(params)
return {'name': f'{name}·{strength}', 'params': merged}
return [
p('대형주 안정형', '보수', SMA_LONG=60, RR_RATIO=1.5, STOP_ATR_MULT=2.5,
PULLBACK_ATR_MULT=1.0, VOLUME_BREAKOUT_MULT=1.3, TURNOVER_BREAKOUT_MULT=1.2,
TURNOVER_OVERHEAT_MULT=4.0, FLOW_DAYS=10, ANALYST_MIN_UPSIDE_PCT=3.0,
MAX_POSITIONS=12, RISK_PER_TRADE_PCT=0.005, BEAR_ENTRY_MODE=0),
p('대형주 안정형', '기본', SMA_LONG=60, RR_RATIO=2.0, STOP_ATR_MULT=2.2,
PULLBACK_ATR_MULT=1.0, VOLUME_BREAKOUT_MULT=1.5, TURNOVER_BREAKOUT_MULT=1.3,
TURNOVER_OVERHEAT_MULT=4.0, FLOW_DAYS=7, ANALYST_MIN_UPSIDE_PCT=5.0,
MAX_POSITIONS=10, RISK_PER_TRADE_PCT=0.0075, BEAR_ENTRY_MODE=1),
p('대형주 안정형', '공격', SMA_LONG=20, RR_RATIO=2.0, STOP_ATR_MULT=2.0,
PULLBACK_ATR_MULT=1.0, VOLUME_BREAKOUT_MULT=1.5, TURNOVER_BREAKOUT_MULT=1.5,
TURNOVER_OVERHEAT_MULT=4.5, FLOW_DAYS=5, ANALYST_MIN_UPSIDE_PCT=5.0,
MAX_POSITIONS=8, RISK_PER_TRADE_PCT=0.01, BEAR_ENTRY_MODE=1),
p('수급 추종형', '보수', SMA_LONG=60, RR_RATIO=2.0, STOP_ATR_MULT=2.0,
PULLBACK_ATR_MULT=1.5, VOLUME_BREAKOUT_MULT=1.3, TURNOVER_BREAKOUT_MULT=1.2,
FLOW_DAYS=10, ANALYST_MIN_UPSIDE_PCT=0.0, MAX_POSITIONS=8,
RISK_PER_TRADE_PCT=0.006, BEAR_ENTRY_MODE=0),
p('수급 추종형', '기본', SMA_LONG=20, RR_RATIO=2.0, STOP_ATR_MULT=1.8,
PULLBACK_ATR_MULT=1.0, VOLUME_BREAKOUT_MULT=1.3, TURNOVER_BREAKOUT_MULT=1.3,
FLOW_DAYS=5, ANALYST_MIN_UPSIDE_PCT=0.0, MAX_POSITIONS=8,
RISK_PER_TRADE_PCT=0.01, BEAR_ENTRY_MODE=1),
p('수급 추종형', '공격', SMA_LONG=10, RR_RATIO=2.5, STOP_ATR_MULT=1.5,
PULLBACK_ATR_MULT=0.8, VOLUME_BREAKOUT_MULT=1.2, TURNOVER_BREAKOUT_MULT=1.2,
FLOW_DAYS=3, ANALYST_MIN_UPSIDE_PCT=-5.0, MAX_POSITIONS=6,
RISK_PER_TRADE_PCT=0.0125, BEAR_ENTRY_MODE=1, IMMEDIATE_ENTRY=1),
p('돌파 모멘텀형', '보수', SMA_LONG=60, BREAKOUT_LOOKBACK=40, RR_RATIO=3.0,
STOP_ATR_MULT=1.7, PULLBACK_ATR_MULT=0.0, VOLUME_BREAKOUT_MULT=2.5,
TURNOVER_BREAKOUT_MULT=2.0, TURNOVER_OVERHEAT_MULT=5.0, FLOW_DAYS=5,
ANALYST_MIN_UPSIDE_PCT=5.0, MAX_POSITIONS=6, RISK_PER_TRADE_PCT=0.006,
BEAR_ENTRY_MODE=0),
p('돌파 모멘텀형', '기본', SMA_LONG=20, BREAKOUT_LOOKBACK=20, RR_RATIO=3.0,
STOP_ATR_MULT=1.5, PULLBACK_ATR_MULT=0.0, VOLUME_BREAKOUT_MULT=2.0,
TURNOVER_BREAKOUT_MULT=1.8, TURNOVER_OVERHEAT_MULT=5.0, FLOW_DAYS=5,
ANALYST_MIN_UPSIDE_PCT=5.0, MAX_POSITIONS=6, RISK_PER_TRADE_PCT=0.01,
BEAR_ENTRY_MODE=1),
p('돌파 모멘텀형', '공격', SMA_LONG=10, BREAKOUT_LOOKBACK=10, RR_RATIO=3.0,
STOP_ATR_MULT=1.3, PULLBACK_ATR_MULT=0.0, VOLUME_BREAKOUT_MULT=1.7,
TURNOVER_BREAKOUT_MULT=1.5, TURNOVER_OVERHEAT_MULT=6.0, FLOW_DAYS=3,
ANALYST_MIN_UPSIDE_PCT=0.0, MAX_POSITIONS=5, RISK_PER_TRADE_PCT=0.0125,
BEAR_ENTRY_MODE=1, IMMEDIATE_ENTRY=1),
p('눌림 반등형', '보수', SMA_LONG=60, RR_RATIO=1.8, STOP_ATR_MULT=2.5,
PULLBACK_ATR_MULT=1.5, VOLUME_BREAKOUT_MULT=1.5, TURNOVER_BREAKOUT_MULT=1.2,
FLOW_DAYS=10, RSI_OVERSOLD=25, ANALYST_MIN_UPSIDE_PCT=5.0,
MAX_POSITIONS=10, RISK_PER_TRADE_PCT=0.006, BEAR_ENTRY_MODE=0),
p('눌림 반등형', '기본', SMA_LONG=20, RR_RATIO=2.0, STOP_ATR_MULT=2.2,
PULLBACK_ATR_MULT=1.5, VOLUME_BREAKOUT_MULT=1.3, TURNOVER_BREAKOUT_MULT=1.2,
FLOW_DAYS=5, RSI_OVERSOLD=30, ANALYST_MIN_UPSIDE_PCT=5.0,
MAX_POSITIONS=8, RISK_PER_TRADE_PCT=0.01, BEAR_ENTRY_MODE=0),
p('눌림 반등형', '공격', SMA_LONG=20, RR_RATIO=2.5, STOP_ATR_MULT=2.0,
PULLBACK_ATR_MULT=2.0, VOLUME_BREAKOUT_MULT=1.2, TURNOVER_BREAKOUT_MULT=1.1,
FLOW_DAYS=3, RSI_OVERSOLD=35, ANALYST_MIN_UPSIDE_PCT=0.0,
MAX_POSITIONS=6, RISK_PER_TRADE_PCT=0.0125, BEAR_ENTRY_MODE=1),
p('소형 성장형', '보수', SMA_LONG=60, RR_RATIO=3.0, STOP_ATR_MULT=1.8,
PULLBACK_ATR_MULT=1.0, VOLUME_BREAKOUT_MULT=2.5, TURNOVER_BREAKOUT_MULT=2.0,
TURNOVER_OVERHEAT_MULT=6.0, FLOW_DAYS=5, ANALYST_MIN_UPSIDE_PCT=10.0,
MAX_POSITIONS=5, RISK_PER_TRADE_PCT=0.004, BEAR_ENTRY_MODE=0),
p('소형 성장형', '기본', SMA_LONG=20, RR_RATIO=3.0, STOP_ATR_MULT=1.5,
PULLBACK_ATR_MULT=1.0, VOLUME_BREAKOUT_MULT=2.0, TURNOVER_BREAKOUT_MULT=1.8,
TURNOVER_OVERHEAT_MULT=6.0, FLOW_DAYS=5, ANALYST_MIN_UPSIDE_PCT=10.0,
MAX_POSITIONS=5, RISK_PER_TRADE_PCT=0.006, BEAR_ENTRY_MODE=1),
p('소형 성장형', '공격', SMA_LONG=10, RR_RATIO=3.5, STOP_ATR_MULT=1.3,
PULLBACK_ATR_MULT=0.8, VOLUME_BREAKOUT_MULT=1.7, TURNOVER_BREAKOUT_MULT=1.5,
TURNOVER_OVERHEAT_MULT=7.0, FLOW_DAYS=3, ANALYST_MIN_UPSIDE_PCT=5.0,
MAX_POSITIONS=4, RISK_PER_TRADE_PCT=0.008, BEAR_ENTRY_MODE=1,
IMMEDIATE_ENTRY=1),
p('방어 현금형', '보수', SMA_LONG=60, RR_RATIO=1.5, STOP_ATR_MULT=2.5,
PULLBACK_ATR_MULT=1.0, VOLUME_BREAKOUT_MULT=2.5, TURNOVER_BREAKOUT_MULT=2.0,
TURNOVER_OVERHEAT_MULT=4.0, FLOW_DAYS=10, ANALYST_MIN_UPSIDE_PCT=12.0,
MAX_POSITIONS=4, RISK_PER_TRADE_PCT=0.003, BEAR_ENTRY_MODE=0),
p('방어 현금형', '기본', SMA_LONG=60, RR_RATIO=2.0, STOP_ATR_MULT=2.2,
PULLBACK_ATR_MULT=1.0, VOLUME_BREAKOUT_MULT=2.0, TURNOVER_BREAKOUT_MULT=1.8,
TURNOVER_OVERHEAT_MULT=4.5, FLOW_DAYS=7, ANALYST_MIN_UPSIDE_PCT=10.0,
MAX_POSITIONS=5, RISK_PER_TRADE_PCT=0.005, BEAR_ENTRY_MODE=0),
p('방어 현금형', '공격', SMA_LONG=20, RR_RATIO=2.0, STOP_ATR_MULT=2.0,
PULLBACK_ATR_MULT=1.0, VOLUME_BREAKOUT_MULT=1.8, TURNOVER_BREAKOUT_MULT=1.5,
TURNOVER_OVERHEAT_MULT=5.0, FLOW_DAYS=5, ANALYST_MIN_UPSIDE_PCT=8.0,
MAX_POSITIONS=6, RISK_PER_TRADE_PCT=0.0075, BEAR_ENTRY_MODE=1),
]
def seed_from_sweep(n: int = 3) -> list[dict]: def seed_from_sweep(n: int = 3) -> list[dict]:
"""backtest_results.json 검증 상위 n개 → 변이로 등록 (기존 계좌는 유지).""" """backtest_results.json 검증 상위 n개 → 변이로 등록 (기존 계좌는 유지)."""
try: try:
@@ -65,7 +175,45 @@ def seed_from_sweep(n: int = 3) -> list[dict]:
return variants return variants
def add_variant(params: dict) -> dict | None: def sync_label_tops(results: dict) -> dict:
"""sweep 결과에서 세부 유형(시장적합 라벨)별 1위를 비교군과 동기화 — 수동 추가/제거 불필요.
파라미터가 같은 변이는 계좌 유지, 빠진 유형 대표는 추가, 더는 대표가 아닌 변이는 삭제.
(2026-06-10 기준전략 폐지 메인 제외 규칙 삭제, 유형별 1 전부 변이로.)"""
def _k(p):
return json.dumps({k: float(v) for k, v in (p or {}).items()}, sort_keys=True)
def _sk(r):
w = r.get('worst_ret')
return (w if w is not None else -999,
r['test'].get('total_return_pct', -999) or -999)
from .sim_web import _market_fit_summary # 함수 레벨 import (순환 회피)
uniq = {}
for r in results.get('results', []):
uniq.setdefault(_k(r['params']), r)
by_label = {}
for r in uniq.values():
lbl = _market_fit_summary(r['params'])
if lbl not in by_label or _sk(r) > _sk(by_label[lbl]):
by_label[lbl] = r
desired = {_k(r['params']): r['params'] for r in by_label.values()}
current = {_k(v['params']): v for v in load_variants()}
removed = added = 0
for k, v in current.items():
if k not in desired:
remove_variant(v['id'])
removed += 1
for k, p in desired.items():
if k not in current:
if add_variant(p):
added += 1
return {'labels': len(by_label), 'added': added, 'removed': removed,
'kept': len(current) - removed}
def add_variant(params: dict, name: str | None = None) -> dict | None:
"""단일 params 조합을 변이로 추가 (백테스트 행 → 비교군). 이미 있으면 None.""" """단일 params 조합을 변이로 추가 (백테스트 행 → 비교군). 이미 있으면 None."""
variants = load_variants() variants = load_variants()
seen = {json.dumps(v['params'], sort_keys=True) for v in variants} seen = {json.dumps(v['params'], sort_keys=True) for v in variants}
@@ -73,12 +221,25 @@ def add_variant(params: dict) -> dict | None:
return None return None
nums = [int(v['id'][1:]) for v in variants if v['id'][1:].isdigit()] nums = [int(v['id'][1:]) for v in variants if v['id'][1:].isdigit()]
vid = f'v{(max(nums) + 1) if nums else 1}' vid = f'v{(max(nums) + 1) if nums else 1}'
v = {'id': vid, 'name': _label(params), 'params': params} v = {'id': vid, 'name': name or _label(params), 'params': params}
variants.append(v) variants.append(v)
save_variants(variants) save_variants(variants)
return v return v
def add_philosophy_presets() -> dict:
"""철학별 프리셋 18개를 비교군에 추가. 기존 계좌와 중복 조합은 유지."""
added = []
skipped = 0
for preset in _philosophy_presets():
v = add_variant(preset['params'], preset['name'])
if v:
added.append(v)
else:
skipped += 1
return {'added': added, 'skipped': skipped, 'total': len(load_variants())}
def remove_variant(vid: str): def remove_variant(vid: str):
"""변이 1개 삭제 (정의 + 계좌).""" """변이 1개 삭제 (정의 + 계좌)."""
import shutil import shutil
@@ -24,3 +24,89 @@
{"date": "2026-06-08", "market": "KOSPI", "market_label": "코스피", "rise": 42, "upper": 1, "fall": 876, "lower": 0, "steady": 3, "adr": 4.91, "personal": 17628, "foreign": -2644, "institutional": -17164, "captured_at": "2026-06-08T21:00:04.897696+09:00"} {"date": "2026-06-08", "market": "KOSPI", "market_label": "코스피", "rise": 42, "upper": 1, "fall": 876, "lower": 0, "steady": 3, "adr": 4.91, "personal": 17628, "foreign": -2644, "institutional": -17164, "captured_at": "2026-06-08T21:00:04.897696+09:00"}
{"date": "2026-06-09", "market": "KOSDAQ", "market_label": "코스닥", "rise": 1435, "upper": 6, "fall": 258, "lower": 1, "steady": 44, "adr": 556.37, "personal": -5112, "foreign": 3126, "institutional": 1996, "captured_at": "2026-06-09T21:00:02.663326+09:00"} {"date": "2026-06-09", "market": "KOSDAQ", "market_label": "코스닥", "rise": 1435, "upper": 6, "fall": 258, "lower": 1, "steady": 44, "adr": 556.37, "personal": -5112, "foreign": 3126, "institutional": 1996, "captured_at": "2026-06-09T21:00:02.663326+09:00"}
{"date": "2026-06-09", "market": "KOSPI", "market_label": "코스피", "rise": 774, "upper": 1, "fall": 133, "lower": 1, "steady": 15, "adr": 578.36, "personal": -6167, "foreign": -20064, "institutional": 25048, "captured_at": "2026-06-09T21:00:02.663326+09:00"} {"date": "2026-06-09", "market": "KOSPI", "market_label": "코스피", "rise": 774, "upper": 1, "fall": 133, "lower": 1, "steady": 15, "adr": 578.36, "personal": -6167, "foreign": -20064, "institutional": 25048, "captured_at": "2026-06-09T21:00:02.663326+09:00"}
{"date": "2026-06-10", "market": "KOSDAQ", "market_label": "코스닥", "rise": 499, "upper": 6, "fall": 1176, "lower": 1, "steady": 61, "adr": 42.91, "personal": 1167, "foreign": 1420, "institutional": -1125, "captured_at": "2026-06-10T21:00:04.276904+09:00"}
{"date": "2026-06-10", "market": "KOSPI", "market_label": "코스피", "rise": 343, "upper": 2, "fall": 550, "lower": 0, "steady": 28, "adr": 62.73, "personal": 48643, "foreign": -27754, "institutional": -22665, "captured_at": "2026-06-10T21:00:04.276904+09:00"}
{"date": "2026-06-11", "market": "KOSDAQ", "market_label": "코스닥", "rise": 1219, "upper": 10, "fall": 457, "lower": 0, "steady": 59, "adr": 268.93, "personal": -3634, "foreign": -3601, "institutional": 7149, "captured_at": "2026-06-11T21:00:01.845336+09:00"}
{"date": "2026-06-11", "market": "KOSPI", "market_label": "코스피", "rise": 576, "upper": 3, "fall": 320, "lower": 0, "steady": 25, "adr": 180.94, "personal": 20803, "foreign": -14640, "institutional": -7561, "captured_at": "2026-06-11T21:00:01.845336+09:00"}
{"date": "2026-06-12", "market": "KOSDAQ", "market_label": "코스닥", "rise": 1318, "upper": 9, "fall": 371, "lower": 0, "steady": 47, "adr": 357.68, "personal": -9416, "foreign": 2769, "institutional": 6315, "captured_at": "2026-06-12T21:00:03.422609+09:00"}
{"date": "2026-06-12", "market": "KOSPI", "market_label": "코스피", "rise": 756, "upper": 3, "fall": 144, "lower": 0, "steady": 18, "adr": 527.08, "personal": -43174, "foreign": 22041, "institutional": 22870, "captured_at": "2026-06-12T21:00:03.422609+09:00"}
{"date": "2026-06-15", "market": "KOSDAQ", "market_label": "코스닥", "rise": 1010, "upper": 10, "fall": 662, "lower": 0, "steady": 62, "adr": 154.08, "personal": 6162, "foreign": -8164, "institutional": 2166, "captured_at": "2026-06-15T21:00:02.416077+09:00"}
{"date": "2026-06-15", "market": "KOSPI", "market_label": "코스피", "rise": 676, "upper": 3, "fall": 207, "lower": 0, "steady": 35, "adr": 328.02, "personal": -15124, "foreign": 10774, "institutional": 4462, "captured_at": "2026-06-15T21:00:02.416077+09:00"}
{"date": "2026-06-16", "market": "KOSDAQ", "market_label": "코스닥", "rise": 764, "upper": 6, "fall": 896, "lower": 1, "steady": 76, "adr": 85.84, "personal": 7907, "foreign": -3095, "institutional": -4630, "captured_at": "2026-06-16T21:00:02.050758+09:00"}
{"date": "2026-06-16", "market": "KOSPI", "market_label": "코스피", "rise": 519, "upper": 5, "fall": 360, "lower": 0, "steady": 38, "adr": 145.56, "personal": -21841, "foreign": 15353, "institutional": 7076, "captured_at": "2026-06-16T21:00:02.050758+09:00"}
{"date": "2026-06-17", "market": "KOSDAQ", "market_label": "코스닥", "rise": 957, "upper": 7, "fall": 681, "lower": 0, "steady": 96, "adr": 141.56, "personal": -335, "foreign": 400, "institutional": -101, "captured_at": "2026-06-17T21:00:02.638185+09:00"}
{"date": "2026-06-17", "market": "KOSPI", "market_label": "코스피", "rise": 349, "upper": 4, "fall": 526, "lower": 0, "steady": 42, "adr": 67.11, "personal": 5254, "foreign": -9952, "institutional": 5957, "captured_at": "2026-06-17T21:00:02.638185+09:00"}
{"date": "2026-06-18", "market": "KOSDAQ", "market_label": "코스닥", "rise": 245, "upper": 12, "fall": 1436, "lower": 0, "steady": 52, "adr": 17.9, "personal": 3842, "foreign": -1235, "institutional": -2659, "captured_at": "2026-06-18T21:00:02.338371+09:00"}
{"date": "2026-06-18", "market": "KOSPI", "market_label": "코스피", "rise": 109, "upper": 3, "fall": 791, "lower": 0, "steady": 17, "adr": 14.16, "personal": -4156, "foreign": 12776, "institutional": -7682, "captured_at": "2026-06-18T21:00:02.338371+09:00"}
{"date": "2026-06-19", "market": "KOSDAQ", "market_label": "코스닥", "rise": 200, "upper": 7, "fall": 1490, "lower": 1, "steady": 40, "adr": 13.88, "personal": 750, "foreign": 4977, "institutional": -5838, "captured_at": "2026-06-19T21:00:01.989022+09:00"}
{"date": "2026-06-19", "market": "KOSPI", "market_label": "코스피", "rise": 115, "upper": 2, "fall": 787, "lower": 0, "steady": 16, "adr": 14.87, "personal": 16478, "foreign": -3555, "institutional": -12244, "captured_at": "2026-06-19T21:00:01.989022+09:00"}
{"date": "2026-06-22", "market": "KOSDAQ", "market_label": "코스닥", "rise": 383, "upper": 8, "fall": 1297, "lower": 0, "steady": 53, "adr": 30.15, "personal": -4634, "foreign": 3152, "institutional": 1456, "captured_at": "2026-06-22T21:00:01.907533+09:00"}
{"date": "2026-06-22", "market": "KOSPI", "market_label": "코스피", "rise": 148, "upper": 3, "fall": 742, "lower": 1, "steady": 28, "adr": 20.32, "personal": 21506, "foreign": -25466, "institutional": 3034, "captured_at": "2026-06-22T21:00:01.907533+09:00"}
{"date": "2026-06-23", "market": "KOSDAQ", "market_label": "코스닥", "rise": 134, "upper": 8, "fall": 1574, "lower": 1, "steady": 26, "adr": 9.02, "personal": -3979, "foreign": 2746, "institutional": 1329, "captured_at": "2026-06-23T21:00:02.466967+09:00"}
{"date": "2026-06-23", "market": "KOSPI", "market_label": "코스피", "rise": 46, "upper": 4, "fall": 859, "lower": 0, "steady": 13, "adr": 5.82, "personal": 85910, "foreign": -42047, "institutional": -44760, "captured_at": "2026-06-23T21:00:02.466967+09:00"}
{"date": "2026-06-24", "market": "KOSDAQ", "market_label": "코스닥", "rise": 883, "upper": 12, "fall": 786, "lower": 1, "steady": 64, "adr": 113.72, "personal": -3184, "foreign": -321, "institutional": 3363, "captured_at": "2026-06-24T21:00:02.270251+09:00"}
{"date": "2026-06-24", "market": "KOSPI", "market_label": "코스피", "rise": 516, "upper": 6, "fall": 367, "lower": 0, "steady": 35, "adr": 142.23, "personal": 26312, "foreign": -46546, "institutional": 19095, "captured_at": "2026-06-24T21:00:02.270251+09:00"}
{"date": "2026-06-25", "market": "KOSDAQ", "market_label": "코스닥", "rise": 400, "upper": 8, "fall": 1280, "lower": 4, "steady": 57, "adr": 31.78, "personal": 1452, "foreign": 212, "institutional": -1707, "captured_at": "2026-06-25T21:00:01.814263+09:00"}
{"date": "2026-06-25", "market": "KOSPI", "market_label": "코스피", "rise": 291, "upper": 3, "fall": 589, "lower": 3, "steady": 36, "adr": 49.66, "personal": -24136, "foreign": -8754, "institutional": 33244, "captured_at": "2026-06-25T21:00:01.814263+09:00"}
{"date": "2026-06-26", "market": "KOSDAQ", "market_label": "코스닥", "rise": 220, "upper": 7, "fall": 1470, "lower": 2, "steady": 50, "adr": 15.42, "personal": -6688, "foreign": 3510, "institutional": 3084, "captured_at": "2026-06-26T21:00:02.514312+09:00"}
{"date": "2026-06-26", "market": "KOSPI", "market_label": "코스피", "rise": 111, "upper": 4, "fall": 780, "lower": 2, "steady": 24, "adr": 14.71, "personal": 81919, "foreign": -42906, "institutional": -41224, "captured_at": "2026-06-26T21:00:02.514312+09:00"}
{"date": "2026-06-29", "market": "KOSDAQ", "market_label": "코스닥", "rise": 1555, "upper": 14, "fall": 157, "lower": 1, "steady": 30, "adr": 993.04, "personal": -5272, "foreign": 266, "institutional": 5043, "captured_at": "2026-06-29T21:00:03.315108+09:00"}
{"date": "2026-06-29", "market": "KOSPI", "market_label": "코스피", "rise": 820, "upper": 6, "fall": 88, "lower": 0, "steady": 9, "adr": 938.64, "personal": 45975, "foreign": -77332, "institutional": 29327, "captured_at": "2026-06-29T21:00:03.315108+09:00"}
{"date": "2026-06-30", "market": "KOSDAQ", "market_label": "코스닥", "rise": 718, "upper": 12, "fall": 974, "lower": 1, "steady": 53, "adr": 74.87, "personal": 3909, "foreign": -2464, "institutional": -1428, "captured_at": "2026-06-30T21:00:01.974835+09:00"}
{"date": "2026-06-30", "market": "KOSPI", "market_label": "코스피", "rise": 262, "upper": 4, "fall": 623, "lower": 0, "steady": 32, "adr": 42.7, "personal": 8401, "foreign": -37992, "institutional": 29332, "captured_at": "2026-06-30T21:00:01.974835+09:00"}
{"date": "2026-07-01", "market": "KOSDAQ", "market_label": "코스닥", "rise": 1193, "upper": 17, "fall": 491, "lower": 1, "steady": 55, "adr": 245.93, "personal": -1082, "foreign": 2472, "institutional": -1255, "captured_at": "2026-07-01T21:00:01.866864+09:00"}
{"date": "2026-07-01", "market": "KOSPI", "market_label": "코스피", "rise": 700, "upper": 11, "fall": 193, "lower": 1, "steady": 25, "adr": 366.49, "personal": 17370, "foreign": -17028, "institutional": -700, "captured_at": "2026-07-01T21:00:01.866864+09:00"}
{"date": "2026-07-02", "market": "KOSDAQ", "market_label": "코스닥", "rise": 318, "upper": 8, "fall": 1355, "lower": 3, "steady": 66, "adr": 24.01, "personal": 4859, "foreign": -1942, "institutional": -3091, "captured_at": "2026-07-02T21:00:05.425991+09:00"}
{"date": "2026-07-02", "market": "KOSPI", "market_label": "코스피", "rise": 280, "upper": 4, "fall": 616, "lower": 1, "steady": 20, "adr": 46.03, "personal": 62413, "foreign": -43706, "institutional": -20825, "captured_at": "2026-07-02T21:00:05.425991+09:00"}
{"date": "2026-07-03", "market": "KOSDAQ", "market_label": "코스닥", "rise": 1094, "upper": 8, "fall": 566, "lower": 0, "steady": 78, "adr": 194.7, "personal": 1075, "foreign": -202, "institutional": -1037, "captured_at": "2026-07-03T21:00:02.137974+09:00"}
{"date": "2026-07-03", "market": "KOSPI", "market_label": "코스피", "rise": 589, "upper": 2, "fall": 297, "lower": 1, "steady": 27, "adr": 198.32, "personal": -22942, "foreign": -21750, "institutional": 44079, "captured_at": "2026-07-03T21:00:02.137974+09:00"}
{"date": "2026-07-06", "market": "KOSDAQ", "market_label": "코스닥", "rise": 683, "upper": 6, "fall": 982, "lower": 0, "steady": 74, "adr": 70.16, "personal": 2591, "foreign": -447, "institutional": -2244, "captured_at": "2026-07-06T21:00:03.092182+09:00"}
{"date": "2026-07-06", "market": "KOSPI", "market_label": "코스피", "rise": 464, "upper": 8, "fall": 412, "lower": 0, "steady": 37, "adr": 114.56, "personal": 26829, "foreign": -13144, "institutional": -14618, "captured_at": "2026-07-06T21:00:03.092182+09:00"}
{"date": "2026-07-07", "market": "KOSDAQ", "market_label": "코스닥", "rise": 484, "upper": 6, "fall": 1194, "lower": 1, "steady": 61, "adr": 41.0, "personal": -3616, "foreign": 3742, "institutional": -100, "captured_at": "2026-07-07T21:00:04.611682+09:00"}
{"date": "2026-07-07", "market": "KOSPI", "market_label": "코스피", "rise": 358, "upper": 1, "fall": 512, "lower": 0, "steady": 42, "adr": 70.12, "personal": 31359, "foreign": -29172, "institutional": -3108, "captured_at": "2026-07-07T21:00:04.611682+09:00"}
{"date": "2026-07-08", "market": "KOSDAQ", "market_label": "코스닥", "rise": 246, "upper": 4, "fall": 1445, "lower": 1, "steady": 48, "adr": 17.29, "personal": -1959, "foreign": 3376, "institutional": -1453, "captured_at": "2026-07-08T21:00:03.487551+09:00"}
{"date": "2026-07-08", "market": "KOSPI", "market_label": "코스피", "rise": 125, "upper": 3, "fall": 765, "lower": 0, "steady": 22, "adr": 16.73, "personal": -358, "foreign": 3437, "institutional": -3552, "captured_at": "2026-07-08T21:00:03.487551+09:00"}
{"date": "2026-07-09", "market": "KOSDAQ", "market_label": "코스닥", "rise": 775, "upper": 8, "fall": 887, "lower": 0, "steady": 77, "adr": 88.28, "personal": -3217, "foreign": 221, "institutional": 3081, "captured_at": "2026-07-09T21:00:02.779248+09:00"}
{"date": "2026-07-09", "market": "KOSPI", "market_label": "코스피", "rise": 237, "upper": 1, "fall": 652, "lower": 0, "steady": 24, "adr": 36.5, "personal": -13278, "foreign": 1343, "institutional": 12885, "captured_at": "2026-07-09T21:00:02.779248+09:00"}
{"date": "2026-07-10", "market": "KOSDAQ", "market_label": "코스닥", "rise": 1488, "upper": 4, "fall": 204, "lower": 5, "steady": 43, "adr": 713.88, "personal": -4213, "foreign": -1563, "institutional": 5825, "captured_at": "2026-07-10T21:00:02.641644+09:00"}
{"date": "2026-07-10", "market": "KOSPI", "market_label": "코스피", "rise": 802, "upper": 6, "fall": 92, "lower": 0, "steady": 19, "adr": 878.26, "personal": -7805, "foreign": -3228, "institutional": 11314, "captured_at": "2026-07-10T21:00:02.641644+09:00"}
{"date": "2026-07-13", "market": "KOSDAQ", "market_label": "코스닥", "rise": 221, "upper": 4, "fall": 1460, "lower": 2, "steady": 57, "adr": 15.39, "personal": 1833, "foreign": -3878, "institutional": 1843, "captured_at": "2026-07-13T21:00:01.940921+09:00"}
{"date": "2026-07-13", "market": "KOSPI", "market_label": "코스피", "rise": 179, "upper": 3, "fall": 716, "lower": 0, "steady": 18, "adr": 25.42, "personal": 38869, "foreign": -16705, "institutional": -22338, "captured_at": "2026-07-13T21:00:01.940921+09:00"}
{"date": "2026-07-14", "market": "KOSDAQ", "market_label": "코스닥", "rise": 445, "upper": 6, "fall": 1212, "lower": 0, "steady": 83, "adr": 37.21, "personal": 698, "foreign": -2471, "institutional": 1587, "captured_at": "2026-07-14T21:00:05.513305+09:00"}
{"date": "2026-07-14", "market": "KOSPI", "market_label": "코스피", "rise": 219, "upper": 5, "fall": 662, "lower": 0, "steady": 31, "adr": 33.84, "personal": -41411, "foreign": 9565, "institutional": 32117, "captured_at": "2026-07-14T21:00:05.513305+09:00"}
{"date": "2026-07-15", "market": "KOSDAQ", "market_label": "코스닥", "rise": 1465, "upper": 14, "fall": 217, "lower": 1, "steady": 57, "adr": 678.44, "personal": -1542, "foreign": 231, "institutional": 1086, "captured_at": "2026-07-15T21:00:04.202161+09:00"}
{"date": "2026-07-15", "market": "KOSPI", "market_label": "코스피", "rise": 711, "upper": 7, "fall": 169, "lower": 0, "steady": 32, "adr": 424.85, "personal": -24666, "foreign": 23031, "institutional": 1992, "captured_at": "2026-07-15T21:00:04.202161+09:00"}
{"date": "2026-07-16", "market": "KOSDAQ", "market_label": "코스닥", "rise": 501, "upper": 11, "fall": 1182, "lower": 1, "steady": 56, "adr": 43.28, "personal": 4184, "foreign": -2919, "institutional": -1553, "captured_at": "2026-07-16T21:00:01.884912+09:00"}
{"date": "2026-07-16", "market": "KOSPI", "market_label": "코스피", "rise": 384, "upper": 6, "fall": 488, "lower": 0, "steady": 40, "adr": 79.92, "personal": 36647, "foreign": -13665, "institutional": -23831, "captured_at": "2026-07-16T21:00:01.884912+09:00"}
{"date": "2026-07-20", "market": "KOSDAQ", "market_label": "코스닥", "rise": 198, "upper": 10, "fall": 1487, "lower": 3, "steady": 54, "adr": 13.96, "personal": 1907, "foreign": -518, "institutional": -1330, "captured_at": "2026-07-20T21:00:02.383101+09:00"}
{"date": "2026-07-20", "market": "KOSPI", "market_label": "코스피", "rise": 97, "upper": 3, "fall": 799, "lower": 4, "steady": 18, "adr": 12.45, "personal": 3490, "foreign": 5198, "institutional": -9235, "captured_at": "2026-07-20T21:00:02.383101+09:00"}
{"date": "2026-07-21", "market": "KOSDAQ", "market_label": "코스닥", "rise": 983, "upper": 19, "fall": 657, "lower": 5, "steady": 96, "adr": 151.36, "personal": 1474, "foreign": -1360, "institutional": -129, "captured_at": "2026-07-21T21:00:02.218278+09:00"}
{"date": "2026-07-21", "market": "KOSPI", "market_label": "코스피", "rise": 485, "upper": 1, "fall": 382, "lower": 2, "steady": 47, "adr": 126.56, "personal": -16421, "foreign": 2952, "institutional": 13744, "captured_at": "2026-07-21T21:00:02.218278+09:00"}
{"date": "2026-07-22", "market": "KOSDAQ", "market_label": "코스닥", "rise": 839, "upper": 14, "fall": 793, "lower": 3, "steady": 103, "adr": 107.16, "personal": 2636, "foreign": -815, "institutional": -1914, "captured_at": "2026-07-22T21:00:02.077211+09:00"}
{"date": "2026-07-22", "market": "KOSPI", "market_label": "코스피", "rise": 469, "upper": 0, "fall": 399, "lower": 0, "steady": 47, "adr": 117.54, "personal": -12176, "foreign": 26211, "institutional": -13963, "captured_at": "2026-07-22T21:00:02.077211+09:00"}
{"date": "2026-07-23", "market": "KOSDAQ", "market_label": "코스닥", "rise": 1442, "upper": 9, "fall": 252, "lower": 1, "steady": 42, "adr": 573.52, "personal": -2373, "foreign": 1675, "institutional": 643, "captured_at": "2026-07-23T21:00:03.478785+09:00"}
{"date": "2026-07-23", "market": "KOSPI", "market_label": "코스피", "rise": 831, "upper": 4, "fall": 74, "lower": 0, "steady": 10, "adr": 1128.38, "personal": -22077, "foreign": 21359, "institutional": 976, "captured_at": "2026-07-23T21:00:03.478785+09:00"}
{"date": "2026-07-24", "market": "KOSDAQ", "market_label": "코스닥", "rise": 371, "upper": 9, "fall": 1281, "lower": 1, "steady": 80, "adr": 29.64, "personal": 4881, "foreign": -1315, "institutional": -3580, "captured_at": "2026-07-24T21:00:02.378107+09:00"}
{"date": "2026-07-24", "market": "KOSPI", "market_label": "코스피", "rise": 301, "upper": 2, "fall": 585, "lower": 0, "steady": 30, "adr": 51.79, "personal": 51782, "foreign": -32683, "institutional": -19514, "captured_at": "2026-07-24T21:00:02.378107+09:00"}
{"date": "2026-07-27", "market": "KOSDAQ", "market_label": "코스닥", "rise": 1007, "upper": 10, "fall": 628, "lower": 2, "steady": 99, "adr": 161.43, "personal": -1550, "foreign": -1422, "institutional": 2731, "captured_at": "2026-07-27T21:00:02.567797+09:00"}
{"date": "2026-07-27", "market": "KOSPI", "market_label": "코스피", "rise": 497, "upper": 0, "fall": 372, "lower": 2, "steady": 47, "adr": 132.89, "personal": 19788, "foreign": -28811, "institutional": 8595, "captured_at": "2026-07-27T21:00:02.567797+09:00"}
{"date": "2026-07-28", "market": "KOSDAQ", "market_label": "코스닥", "rise": 140, "upper": 11, "fall": 1557, "lower": 2, "steady": 38, "adr": 9.69, "personal": 480, "foreign": 860, "institutional": -1345, "captured_at": "2026-07-28T21:00:02.094342+09:00"}
{"date": "2026-07-28", "market": "KOSPI", "market_label": "코스피", "rise": 36, "upper": 3, "fall": 878, "lower": 2, "steady": 3, "adr": 4.43, "personal": 43152, "foreign": -45009, "institutional": 1830, "captured_at": "2026-07-28T21:00:02.094342+09:00"}
{"date": "2026-07-29", "market": "KOSDAQ", "market_label": "코스닥", "rise": 141, "upper": 4, "fall": 1554, "lower": 3, "steady": 35, "adr": 9.31, "personal": -4579, "foreign": 3082, "institutional": 1474, "captured_at": "2026-07-29T21:00:04.833116+09:00"}
{"date": "2026-07-29", "market": "KOSPI", "market_label": "코스피", "rise": 91, "upper": 1, "fall": 805, "lower": 1, "steady": 21, "adr": 11.41, "personal": -19701, "foreign": -12502, "institutional": 31769, "captured_at": "2026-07-29T21:00:04.833116+09:00"}
{"date": "2026-07-30", "market": "KOSDAQ", "market_label": "코스닥", "rise": 733, "upper": 5, "fall": 938, "lower": 0, "steady": 57, "adr": 78.68, "personal": -1108, "foreign": 2483, "institutional": -1435, "captured_at": "2026-07-30T21:00:02.501493+09:00"}
{"date": "2026-07-30", "market": "KOSPI", "market_label": "코스피", "rise": 609, "upper": 4, "fall": 277, "lower": 0, "steady": 30, "adr": 221.3, "personal": -14309, "foreign": 13280, "institutional": 805, "captured_at": "2026-07-30T21:00:02.501493+09:00"}
{"date": "2026-07-31", "market": "KOSDAQ", "market_label": "코스닥", "rise": 1557, "upper": 14, "fall": 141, "lower": 0, "steady": 30, "adr": 1114.18, "personal": -4715, "foreign": 1697, "institutional": 2985, "captured_at": "2026-07-31T21:00:02.143730+09:00"}
{"date": "2026-07-31", "market": "KOSPI", "market_label": "코스피", "rise": 775, "upper": 12, "fall": 127, "lower": 0, "steady": 15, "adr": 619.69, "personal": -82840, "foreign": 72410, "institutional": 11503, "captured_at": "2026-07-31T21:00:02.143730+09:00"}
{"date": "2026-08-03", "market": "KOSDAQ", "market_label": "코스닥", "rise": 1170, "upper": 11, "fall": 468, "lower": 0, "steady": 89, "adr": 252.35, "personal": 302, "foreign": -2092, "institutional": 1669, "captured_at": "2026-08-03T21:00:05.036019+09:00"}
{"date": "2026-08-03", "market": "KOSPI", "market_label": "코스피", "rise": 455, "upper": 3, "fall": 419, "lower": 0, "steady": 43, "adr": 109.31, "personal": 46523, "foreign": -28220, "institutional": -19516, "captured_at": "2026-08-03T21:00:05.036019+09:00"}
{"date": "2026-08-04", "market": "KOSDAQ", "market_label": "코스닥", "rise": 1505, "upper": 11, "fall": 175, "lower": 0, "steady": 47, "adr": 866.29, "personal": -2587, "foreign": -2775, "institutional": 5438, "captured_at": "2026-08-04T21:00:01.937958+09:00"}
{"date": "2026-08-04", "market": "KOSPI", "market_label": "코스피", "rise": 788, "upper": 1, "fall": 96, "lower": 0, "steady": 31, "adr": 821.88, "personal": 8187, "foreign": -3716, "institutional": -5385, "captured_at": "2026-08-04T21:00:01.937958+09:00"}
{"date": "2026-08-05", "market": "KOSDAQ", "market_label": "코스닥", "rise": 1346, "upper": 11, "fall": 301, "lower": 0, "steady": 78, "adr": 450.83, "personal": 3941, "foreign": -2979, "institutional": -1101, "captured_at": "2026-08-05T21:00:05.552836+09:00"}
{"date": "2026-08-05", "market": "KOSPI", "market_label": "코스피", "rise": 675, "upper": 0, "fall": 197, "lower": 0, "steady": 43, "adr": 342.64, "personal": -11844, "foreign": 14464, "institutional": -2838, "captured_at": "2026-08-05T21:00:05.552836+09:00"}
{"date": "2026-08-06", "market": "KOSDAQ", "market_label": "코스닥", "rise": 736, "upper": 7, "fall": 893, "lower": 0, "steady": 95, "adr": 83.2, "personal": 863, "foreign": -2481, "institutional": 1615, "captured_at": "2026-08-06T21:00:02.122175+09:00"}
{"date": "2026-08-06", "market": "KOSPI", "market_label": "코스피", "rise": 490, "upper": 3, "fall": 381, "lower": 0, "steady": 44, "adr": 129.4, "personal": 33367, "foreign": -32893, "institutional": -1214, "captured_at": "2026-08-06T21:00:02.122175+09:00"}
{"date": "2026-08-07", "market": "KOSDAQ", "market_label": "코스닥", "rise": 808, "upper": 6, "fall": 829, "lower": 0, "steady": 84, "adr": 98.19, "personal": 3402, "foreign": -2522, "institutional": -1044, "captured_at": "2026-08-07T21:00:06.627011+09:00"}
{"date": "2026-08-07", "market": "KOSPI", "market_label": "코스피", "rise": 554, "upper": 3, "fall": 322, "lower": 0, "steady": 36, "adr": 172.98, "personal": 2675, "foreign": -8651, "institutional": 5854, "captured_at": "2026-08-07T21:00:06.627011+09:00"}
{"date": "2026-08-10", "market": "KOSDAQ", "market_label": "코스닥", "rise": 1431, "upper": 11, "fall": 236, "lower": 0, "steady": 52, "adr": 611.02, "personal": -6729, "foreign": 1027, "institutional": 5667, "captured_at": "2026-08-10T21:00:01.810609+09:00"}
{"date": "2026-08-10", "market": "KOSPI", "market_label": "코스피", "rise": 697, "upper": 0, "fall": 183, "lower": 0, "steady": 31, "adr": 380.87, "personal": 9003, "foreign": -14909, "institutional": 5692, "captured_at": "2026-08-10T21:00:01.810609+09:00"}
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"👀": "v1", "⭐": "v4", "🔥": "v300", "💎": "v40", "🚀": "v319", "🎯": "v321"}
File diff suppressed because one or more lines are too long
@@ -0,0 +1,11 @@
{
"SMA_LONG": 10,
"PULLBACK_ATR_MULT": 1.5,
"STOP_ATR_MULT": 2.0,
"RR_RATIO": 3.0,
"VOLUME_BREAKOUT_MULT": 1.3,
"RSI_OVERBOUGHT": 88.0,
"RSI_OVERSOLD": 20.0,
"MAX_HOLD_DAYS": 0,
"RISK_PER_TRADE_PCT": 0.02
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,197 @@
{
"cash": 4372680.496499985,
"initial": 100000000,
"positions": {
"010950": {
"code": "010950",
"name": "S-Oil",
"sources": [
"auto"
],
"qty": 86,
"entry_price": 128395.3488372093,
"entry_at": "2026-07-08T09:16:01.874405+09:00",
"stop": 112596,
"target": 175793,
"peak": 156400,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 139600,
"tranches": 2,
"tranche_value": 5572914.42378125,
"last_add_price": 130800
},
"214450": {
"code": "214450",
"name": "파마리서치",
"sources": [
"auto"
],
"qty": 31,
"entry_price": 347064.51612903224,
"entry_at": "2026-07-16T09:04:02.184863+09:00",
"stop": 305213,
"target": 472619,
"peak": 411500,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 409000,
"tranches": 2,
"tranche_value": 5640114.3750312505,
"last_add_price": 353000
},
"003680": {
"code": "003680",
"name": "한성기업",
"sources": [
"auto"
],
"qty": 1140,
"entry_price": 6333.0,
"entry_at": "2026-07-30T09:04:05.277095+09:00",
"stop": 5039,
"target": 10215,
"peak": 6840,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 7,457 도달",
"cur_price": 6220,
"tranches": 2,
"tranche_value": 3612125.2394573665,
"last_add_price": 6550
},
"138040": {
"code": "138040",
"name": "메리츠금융지주",
"sources": [
"auto"
],
"qty": 79,
"entry_price": 125877.21518987342,
"entry_at": "2026-07-30T09:16:09.704305+09:00",
"stop": 114936,
"target": 158700,
"peak": 127600,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 123200,
"tranches": 2,
"tranche_value": 5035879.961218749,
"last_add_price": 127700
},
"194370": {
"code": "194370",
"name": "제이에스코퍼레이션",
"sources": [
"auto"
],
"qty": 728,
"entry_price": 13160.096153846154,
"entry_at": "2026-08-03T12:00:10.581409+09:00",
"stop": 11445,
"target": 18305,
"peak": 14120,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 13370,
"tranches": 2,
"tranche_value": 4803063.4110624995,
"last_add_price": 13420
},
"078930": {
"code": "078930",
"name": "GS",
"sources": [
"auto"
],
"qty": 66,
"entry_price": 90689.39393939394,
"entry_at": "2026-08-04T09:34:08.150378+09:00",
"stop": 79324,
"target": 124784,
"peak": 101600,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 97700,
"tranches": 2,
"tranche_value": 4797930.468406249,
"last_add_price": 93500
},
"252990": {
"code": "252990",
"name": "샘씨엔에스",
"sources": [
"auto"
],
"qty": 531,
"entry_price": 13674.444444444445,
"entry_at": "2026-08-06T09:12:11.568330+09:00",
"stop": 10691,
"target": 22624,
"peak": 15670,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 13,160 도달",
"cur_price": 15670,
"tranches": 2,
"tranche_value": 3636137.140405993,
"last_add_price": 14290
},
"068270": {
"code": "068270",
"name": "셀트리온",
"sources": [
"interest"
],
"qty": 48,
"entry_price": 196100.0,
"entry_at": "2026-08-06T09:14:08.213823+09:00",
"stop": 178744,
"target": 248168,
"peak": 201000,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 201000,
"tranches": 2,
"tranche_value": 4804824.179093749,
"last_add_price": 198600
}
},
"realized_pnl": -24411738.768500023,
"closed_trades": 23,
"wins": 0,
"peak_equity": 100102462.48,
"max_drawdown": 0.2476485322022221,
"last_exit": {
"030000": "2026-08-06",
"086790": "2026-07-29",
"005930": "2026-06-23",
"298040": "2026-06-24",
"403870": "2026-07-07",
"240810": "2026-07-24",
"093370": "2026-07-20",
"214450": "2026-07-15",
"055550": "2026-07-20",
"024060": "2026-07-27",
"003680": "2026-07-29",
"252990": "2026-07-29",
"078930": "2026-07-31",
"090850": "2026-08-06"
},
"created_at": "2026-06-11T09:00:01.943184+09:00",
"updated_at": "2026-08-10T15:28:12.599897+09:00"
}
@@ -0,0 +1,77 @@
{"ts": "2026-06-17T11:15:02.163140+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 130900, "qty": 47, "cost": 6153223, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 118039, "target": 169483, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "129,300 vs 118,950"}, {"label": "정배열(5>10)", "ok": true, "detail": "120,400 / 118,950"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "120,400 / 118,307"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-13.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +371 · 기 +158 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+22%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.12% (환산) vs 평균 0.38% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 126,500"}, {"label": "거래량 급증", "ok": true, "detail": "3,094,534 (환산) vs 평균 1,031,725"}, {"label": "회전율 급증", "ok": true, "detail": "1.12% (환산) vs 평균 0.38%"}, {"label": "RSI", "ok": true, "detail": "60"}]}
{"ts": "2026-06-19T09:02:05.756730+09:00", "side": "BUY", "code": "005930", "name": "삼성전자", "price": 373500, "qty": 16, "cost": 5976896, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 331259, "target": 500222, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "373,000 vs 330,350"}, {"label": "정배열(5>10)", "ok": true, "detail": "352,400 / 330,350"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "352,400 / 258,005"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+6.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,427 · 기 +4,448 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+19%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.04% (환산) vs 평균 0.53% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 370,000"}, {"label": "거래량 급증", "ok": true, "detail": "60,950,213 (환산) vs 평균 31,088,390"}, {"label": "회전율 급증", "ok": true, "detail": "1.04% (환산) vs 평균 0.53%"}, {"label": "RSI", "ok": true, "detail": "67"}]}
{"ts": "2026-06-19T09:02:06.178128+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19160, "qty": 325, "cost": 6227934, "path": "pullback", "reason": "눌림목 지정가 19,690 도달", "stop": 17760, "target": 23360, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "19,150 vs 18,963"}, {"label": "정배열(5>10)", "ok": true, "detail": "19,616 / 18,963"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,616 / 19,361"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-31.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,162 · 기 +2,080 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.03% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "37,673 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.03% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,690 (현재 19,150)"}]}
{"ts": "2026-06-23T09:00:07.147411+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18820, "qty": 325, "proceeds": 6104573, "entry_price": 19160, "pnl": -123361, "pnl_pct": -1.77, "hold_from": "2026-06-19T09:02:06.178112+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 18,710)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 23,360"}, {"label": "추세(10일선)", "ok": false, "detail": "18,919"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -318 · 기 -227"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,528"}]}
{"ts": "2026-06-23T09:06:02.261681+09:00", "side": "BUY", "code": "298040", "name": "효성중공업", "price": 4130000, "qty": 1, "cost": 4130620, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 3559830, "target": 5840510, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "4,125,000 vs 3,535,900"}, {"label": "정배열(5>10)", "ok": true, "detail": "3,678,200 / 3,535,900"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "3,678,200 / 3,411,683"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-6.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +16 · 기 -7 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+13%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": false, "detail": "약세 — 돌파만 허용"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.82% (환산) vs 평균 0.63% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 4,085,000"}, {"label": "거래량 급증", "ok": true, "detail": "170,653 (환산) vs 평균 58,834"}, {"label": "회전율 급증", "ok": true, "detail": "1.82% (환산) vs 평균 0.63%"}, {"label": "RSI", "ok": true, "detail": "62"}]}
{"ts": "2026-06-23T12:04:03.036279+09:00", "side": "SELL", "code": "086790", "name": "하나금융지주", "price": 117700, "qty": 47, "proceeds": 5521113, "entry_price": 130900, "pnl": -632110, "pnl_pct": -10.08, "hold_from": "2026-06-17T11:15:02.163131+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "118,039 (현재 117,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 169,483"}, {"label": "추세(10일선)", "ok": false, "detail": "119,330"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +332 · 기 -364"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 134,300"}]}
{"ts": "2026-06-23T12:32:03.300082+09:00", "side": "SELL", "code": "005930", "name": "삼성전자", "price": 330000, "qty": 16, "proceeds": 5269704, "entry_price": 373500, "pnl": -707192, "pnl_pct": -11.65, "hold_from": "2026-06-19T09:02:05.756719+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "331,259 (현재 330,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 500,222"}, {"label": "추세(10일선)", "ok": false, "detail": "335,050"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -3,792 · 기 +1,417"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 384,779"}]}
{"ts": "2026-06-24T09:02:01.876083+09:00", "side": "SELL", "code": "298040", "name": "효성중공업", "price": 3499000, "qty": 1, "proceeds": 3492177, "entry_price": 4130000, "pnl": -638443, "pnl_pct": -15.28, "hold_from": "2026-06-23T09:06:02.261677+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "3,559,830 (현재 3,489,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 5,840,510"}, {"label": "추세(10일선)", "ok": true, "detail": "3,472,300"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +19 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 4,274,721"}]}
{"ts": "2026-06-24T09:02:02.294346+09:00", "side": "BUY", "code": "403870", "name": "HPSP", "price": 53200, "qty": 97, "cost": 5161174, "path": "pullback", "reason": "눌림목 지정가 60,114 도달", "stop": 43200, "target": 83200, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "53,200 vs 52,550"}, {"label": "정배열(5>10)", "ok": true, "detail": "57,960 / 52,550"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "57,960 / 49,671"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+20.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +711 · 기 -2,060 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+29%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.34% (환산) vs 평균 5.97% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 71,500"}, {"label": "거래량 급증", "ok": false, "detail": "1,102,733 (환산) vs 평균 4,912,598"}, {"label": "회전율 급증", "ok": false, "detail": "1.34% (환산) vs 평균 5.97%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 60,114 (현재 53,200)"}]}
{"ts": "2026-06-24T09:08:00.922591+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 155400, "qty": 26, "cost": 4041006, "path": "pullback", "reason": "눌림목 지정가 155,963 도달", "stop": 118951, "target": 264748, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "155,400 vs 128,090"}, {"label": "정배열(5>10)", "ok": true, "detail": "143,100 / 128,090"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "143,100 / 121,690"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+45.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +210 · 기 +143 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+6%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "6.50% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": true, "detail": "3,192,593 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": true, "detail": "6.50% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 155,963 (현재 155,400)"}]}
{"ts": "2026-06-26T09:00:03.477186+09:00", "side": "SELL", "code": "403870", "name": "HPSP", "price": 50000, "qty": 97, "proceeds": 4840542, "entry_price": 53200, "pnl": -320632, "pnl_pct": -6.02, "hold_from": "2026-06-24T09:02:02.294329+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "43,200 (현재 51,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 83,200"}, {"label": "추세(10일선)", "ok": false, "detail": "52,330"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -311 · 기 -267"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 57,056"}]}
{"ts": "2026-06-26T09:04:03.833814+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 164900, "qty": 25, "cost": 4123118, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 118951, "target": 264748, "signals": [{"label": "손절선", "ok": true, "detail": "118,951 (현재 164,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 264,748"}, {"label": "추세(10일선)", "ok": true, "detail": "129,020"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -140 · 기 +323"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 164,359"}]}
{"ts": "2026-06-29T09:00:12.226221+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 339500, "qty": 18, "cost": 6111917, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 300291, "target": 457126, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "337,000 vs 305,050"}, {"label": "정배열(5>10)", "ok": true, "detail": "313,600 / 305,050"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "313,600 / 305,367"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+37.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -22 · 기 +97 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+43%"}, {"label": "시장 강세", "ok": false, "detail": "약세 — 돌파만 허용"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.50% (환산) vs 평균 0.93% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 334,500"}, {"label": "거래량 급증", "ok": true, "detail": "155,347 (환산) vs 평균 96,436"}, {"label": "회전율 급증", "ok": true, "detail": "1.50% (환산) vs 평균 0.93%"}, {"label": "RSI", "ok": true, "detail": "63"}]}
{"ts": "2026-06-29T09:40:01.364512+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 351000, "qty": 17, "cost": 5967895, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 300291, "target": 457126, "signals": [{"label": "손절선", "ok": true, "detail": "300,291 (현재 351,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 457,126"}, {"label": "추세(10일선)", "ok": true, "detail": "306,450"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -22 · 기 +97"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 349,802"}]}
{"ts": "2026-06-30T09:00:03.224282+09:00", "side": "BUY", "code": "403870", "name": "HPSP", "price": 55300, "qty": 80, "cost": 4424664, "path": "pullback", "reason": "눌림목 지정가 60,222 도달", "stop": 43200, "target": 91600, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "53,700 vs 52,600"}, {"label": "정배열(5>10)", "ok": true, "detail": "58,060 / 52,600"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "58,060 / 49,679"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+12.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +222 · 기 -821 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+28%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.00% (환산) vs 평균 5.97% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 71,500"}, {"label": "거래량 급증", "ok": false, "detail": "827 (환산) vs 평균 4,912,598"}, {"label": "회전율 급증", "ok": false, "detail": "0.00% (환산) vs 평균 5.97%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 60,222 (현재 53,700)"}]}
{"ts": "2026-07-02T10:18:02.949133+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 15980, "qty": 274, "cost": 4379177, "path": "pullback", "reason": "눌림목 지정가 16,358 도달", "stop": 12444, "target": 26587, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "15,980 vs 13,620"}, {"label": "정배열(5>10)", "ok": true, "detail": "16,104 / 13,620"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "16,104 / 11,478"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+25.7%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,833 · 기 +437 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+25%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "9.98% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": true, "detail": "10,701,165 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": true, "detail": "9.98% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "60"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 16,358 (현재 15,980)"}]}
{"ts": "2026-07-02T10:40:02.874484+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 18960, "qty": 319, "cost": 6049147, "path": "pullback", "reason": "눌림목 지정가 19,580 도달", "stop": 17760, "target": 22560, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "18,960 vs 18,944"}, {"label": "정배열(5>10)", "ok": true, "detail": "19,578 / 18,944"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,578 / 19,358"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+3.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -339 · 기 +110 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+34%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.86% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": true, "detail": "986,112 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.86% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "49"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,580 (현재 18,960)"}]}
{"ts": "2026-07-02T11:20:01.970932+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 22550, "qty": 268, "cost": 6044307, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 17760, "target": 22560, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 19,350)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,560"}, {"label": "추세(10일선)", "ok": true, "detail": "18,983"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -339 · 기 +110"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,350"}]}
{"ts": "2026-07-02T11:24:06.075978+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18860, "qty": 587, "proceeds": 11049232, "entry_price": 20599, "pnl": -1044222, "pnl_pct": -8.44, "hold_from": "2026-07-02T10:40:02.874471+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "19,039 (현재 18,890)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 25,279"}, {"label": "추세(10일선)", "ok": false, "detail": "18,937"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -339 · 기 +110"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-03T09:44:02.531757+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 123600, "qty": 51, "proceeds": 6291308, "entry_price": 160057, "pnl": -1872816, "pnl_pct": -22.78, "hold_from": "2026-06-24T09:08:00.922587+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "124,222 (현재 123,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 267,562"}, {"label": "추세(10일선)", "ok": false, "detail": "124,920"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +674 · 기 -2,170"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-03T10:24:02.696490+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19040, "qty": 306, "cost": 5827114, "path": "pullback", "reason": "눌림목 지정가 19,631 도달", "stop": 17760, "target": 22880, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "19,030 vs 18,951"}, {"label": "정배열(5>10)", "ok": true, "detail": "19,592 / 18,951"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,592 / 19,359"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+2.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -35 · 기 +168 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+34%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.54% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "619,193 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.54% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "49"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,631 (현재 19,030)"}]}
{"ts": "2026-07-06T09:00:05.367354+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 130600, "qty": 27, "cost": 3526729, "path": "pullback", "reason": "눌림목 지정가 154,452 도달", "stop": 96000, "target": 234400, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "133,100 vs 125,860"}, {"label": "정배열(5>10)", "ok": true, "detail": "138,640 / 125,860"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "138,640 / 121,318"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+17.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +782 · 기 -1,979 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+31%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.01% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": false, "detail": "4,080 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": false, "detail": "0.01% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "52"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 154,452 (현재 133,100)"}]}
{"ts": "2026-07-06T09:34:01.582045+09:00", "side": "BUY", "code": "055550", "name": "신한지주", "price": 110000, "qty": 52, "cost": 5720858, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 99202, "target": 142394, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "110,300 vs 99,990"}, {"label": "정배열(5>10)", "ok": true, "detail": "101,240 / 99,990"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "101,240 / 96,630"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+3.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -717 · 기 +1,343 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+17%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.55% (환산) vs 평균 0.35% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 109,800"}, {"label": "거래량 급증", "ok": true, "detail": "2,617,853 (환산) vs 평균 1,653,581"}, {"label": "회전율 급증", "ok": true, "detail": "0.55% (환산) vs 평균 0.35%"}, {"label": "RSI", "ok": true, "detail": "64"}]}
{"ts": "2026-07-07T09:48:07.302373+09:00", "side": "SELL", "code": "403870", "name": "HPSP", "price": 43000, "qty": 80, "proceeds": 3433292, "entry_price": 55300, "pnl": -991372, "pnl_pct": -22.24, "hold_from": "2026-06-30T09:00:03.224267+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "43,200 (현재 43,050)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 91,600"}, {"label": "추세(10일선)", "ok": false, "detail": "51,535"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +1,424 · 기 -5,706"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 59,449"}]}
{"ts": "2026-07-07T10:28:06.382153+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 12410, "qty": 274, "proceeds": 3393709, "entry_price": 15980, "pnl": -985467, "pnl_pct": -22.34, "hold_from": "2026-07-02T10:18:02.949119+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "12,444 (현재 12,430)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 26,587"}, {"label": "추세(10일선)", "ok": false, "detail": "13,265"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -1,543 · 기 +15"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 16,975"}]}
{"ts": "2026-07-07T14:06:20.089623+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 183300, "qty": 19, "cost": 3483222, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 96000, "target": 234400, "signals": [{"label": "손절선", "ok": true, "detail": "96,000 (현재 183,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 234,400"}, {"label": "추세(10일선)", "ok": true, "detail": "123,150"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +263 · 기 -1,543"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 139,025"}]}
{"ts": "2026-07-07T14:06:22.687123+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 20750, "qty": 281, "cost": 5831625, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 17760, "target": 22880, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 20,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,880"}, {"label": "추세(10일선)", "ok": true, "detail": "18,901"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +156 · 기 +113"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,358"}]}
{"ts": "2026-07-08T09:00:10.790205+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 108300, "qty": 46, "proceeds": 4972085, "entry_price": 152367, "pnl": -2037866, "pnl_pct": -28.92, "hold_from": "2026-07-06T09:00:05.367339+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "118,668 (현재 112,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 253,466"}, {"label": "추세(10일선)", "ok": false, "detail": "123,820"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +243 · 기 -857"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-08T09:16:01.874414+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 126100, "qty": 44, "cost": 5549232, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 110301, "target": 173498, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "126,100 vs 108,080"}, {"label": "정배열(5>10)", "ok": true, "detail": "114,400 / 108,080"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "114,400 / 113,132"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+16.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -164 · 기 +736 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+18%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": false, "detail": "약세 — 돌파만 허용"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.48% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 116,900"}, {"label": "거래량 급증", "ok": true, "detail": "544,247 (환산) vs 평균 359,705"}, {"label": "회전율 급증", "ok": true, "detail": "0.48% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "66"}]}
{"ts": "2026-07-08T09:34:04.862709+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 130800, "qty": 42, "cost": 5494424, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 110301, "target": 173498, "signals": [{"label": "손절선", "ok": true, "detail": "110,301 (현재 130,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 173,498"}, {"label": "추세(10일선)", "ok": true, "detail": "108,520"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -164 · 기 +736"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 130,050"}]}
{"ts": "2026-07-10T09:26:06.360793+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 130900, "qty": 42, "cost": 5498625, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 117686, "target": 170541, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "130,800 vs 120,640"}, {"label": "정배열(5>10)", "ok": true, "detail": "122,760 / 120,640"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "122,760 / 118,578"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+18.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -427 · 기 +555 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+23%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.60% (환산) vs 평균 0.37% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 130,700"}, {"label": "거래량 급증", "ok": true, "detail": "1,646,513 (환산) vs 평균 1,026,357"}, {"label": "회전율 급증", "ok": true, "detail": "0.60% (환산) vs 평균 0.37%"}, {"label": "RSI", "ok": true, "detail": "61"}]}
{"ts": "2026-07-10T11:06:06.387602+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 13660, "qty": 271, "cost": 3702415, "path": "pullback", "reason": "눌림목 지정가 15,971 도달", "stop": 10360, "target": 23560, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "13,630 vs 13,385"}, {"label": "정배열(5>10)", "ok": true, "detail": "15,634 / 13,385"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "15,634 / 11,439"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+6.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +210 · 기 +239 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+47%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "14.23% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": true, "detail": "15,267,605 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": true, "detail": "14.23% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "52"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 15,971 (현재 13,630)"}]}
{"ts": "2026-07-10T12:14:02.591560+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 126200, "qty": 29, "cost": 3660349, "path": "pullback", "reason": "눌림목 지정가 151,752 도달", "stop": 96000, "target": 216800, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "126,200 vs 125,170"}, {"label": "정배열(5>10)", "ok": true, "detail": "137,260 / 125,170"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "137,260 / 121,203"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+17.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +483 · 기 -241 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+38%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "7.53% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": true, "detail": "3,695,762 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": true, "detail": "7.53% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 151,752 (현재 126,200)"}]}
{"ts": "2026-07-13T09:06:06.491483+09:00", "side": "BUY", "code": "055550", "name": "신한지주", "price": 112800, "qty": 50, "cost": 5640846, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 99202, "target": 142394, "signals": [{"label": "손절선", "ok": true, "detail": "99,202 (현재 112,800)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 142,394"}, {"label": "추세(10일선)", "ok": true, "detail": "100,240"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -358 · 기 +991"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 112,792"}]}
{"ts": "2026-07-13T09:08:05.274334+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 134300, "qty": 41, "cost": 5507126, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 117686, "target": 170541, "signals": [{"label": "손절선", "ok": true, "detail": "117,686 (현재 134,200)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 170,541"}, {"label": "추세(10일선)", "ok": true, "detail": "120,980"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -277 · 기 +460"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 134,118"}]}
{"ts": "2026-07-13T09:26:03.332430+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 139100, "qty": 27, "cost": 3756263, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 96000, "target": 216800, "signals": [{"label": "손절선", "ok": true, "detail": "96,000 (현재 139,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 216,800"}, {"label": "추세(10일선)", "ok": true, "detail": "126,460"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -213 · 기 +772"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 136,162"}]}
{"ts": "2026-07-14T09:40:04.963062+09:00", "side": "BUY", "code": "090850", "name": "현대이지웰", "price": 5910, "qty": 931, "cost": 5503035, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 5447, "target": 7298, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "5,900 vs 5,543"}, {"label": "정배열(5>10)", "ok": true, "detail": "5,646 / 5,543"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "5,646 / 5,614"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+33.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +107 · 기 +5 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": false, "detail": "약세 — 돌파만 허용"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.34% (환산) vs 평균 0.22% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 5,700"}, {"label": "거래량 급증", "ok": true, "detail": "74,367 (환산) vs 평균 49,512"}, {"label": "회전율 급증", "ok": true, "detail": "0.34% (환산) vs 평균 0.22%"}, {"label": "RSI", "ok": true, "detail": "65"}]}
{"ts": "2026-07-15T10:30:01.562473+09:00", "side": "SELL", "code": "214450", "name": "파마리서치", "price": 303500, "qty": 35, "proceeds": 10601786, "entry_price": 345086, "pnl": -1478026, "pnl_pct": -12.05, "hold_from": "2026-06-29T09:00:12.226210+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "303,877 (현재 303,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 468,711"}, {"label": "추세(10일선)", "ok": true, "detail": "301,700"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -25 · 기 +35"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-15T13:56:01.759138+09:00", "side": "BUY", "code": "090850", "name": "현대이지웰", "price": 6030, "qty": 912, "cost": 5500185, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 5447, "target": 7298, "signals": [{"label": "손절선", "ok": true, "detail": "5,447 (현재 6,030)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 7,298"}, {"label": "추세(10일선)", "ok": true, "detail": "5,556"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +147 · 기 -11"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,028"}]}
{"ts": "2026-07-15T14:32:01.808579+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18570, "qty": 587, "proceeds": 10879334, "entry_price": 19859, "pnl": -779405, "pnl_pct": -6.49, "hold_from": "2026-07-03T10:24:02.696479+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "18,586 (현재 18,570)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 23,675"}, {"label": "추세(10일선)", "ok": false, "detail": "18,905"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -214 · 기 +240"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-16T09:04:02.184872+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 341500, "qty": 16, "cost": 5464820, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 301363, "target": 461911, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "340,500 vs 305,400"}, {"label": "정배열(5>10)", "ok": true, "detail": "314,300 / 305,400"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "314,300 / 305,425"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+34.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -33 · 기 +28 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+41%"}, {"label": "시장 강세", "ok": false, "detail": "약세 — 돌파만 허용"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.18% (환산) vs 평균 0.93% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 334,500"}, {"label": "거래량 급증", "ok": true, "detail": "226,533 (환산) vs 평균 96,436"}, {"label": "회전율 급증", "ok": true, "detail": "2.18% (환산) vs 평균 0.93%"}, {"label": "RSI", "ok": true, "detail": "64"}]}
{"ts": "2026-07-16T09:28:03.406225+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 353000, "qty": 15, "cost": 5295794, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 301363, "target": 461911, "signals": [{"label": "손절선", "ok": true, "detail": "301,363 (현재 352,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 461,911"}, {"label": "추세(10일선)", "ok": true, "detail": "306,600"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -33 · 기 +28"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 351,963"}]}
{"ts": "2026-07-20T12:28:02.248848+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 10310, "qty": 271, "proceeds": 2788562, "entry_price": 13660, "pnl": -913854, "pnl_pct": -24.52, "hold_from": "2026-07-10T11:06:06.387588+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "10,360 (현재 10,310)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 23,560"}, {"label": "추세(10일선)", "ok": false, "detail": "12,013"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -887 · 기 +515"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 14,626"}]}
{"ts": "2026-07-20T14:12:02.314100+09:00", "side": "SELL", "code": "055550", "name": "신한지주", "price": 100100, "qty": 102, "proceeds": 10190290, "entry_price": 111373, "pnl": -1171414, "pnl_pct": -10.12, "hold_from": "2026-07-06T09:34:01.582032+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "100,203 (현재 100,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 144,881"}, {"label": "추세(10일선)", "ok": true, "detail": "98,970"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -168 · 기 +257"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-23T09:46:06.299582+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 88400, "qty": 61, "cost": 5393209, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 77778, "target": 120266, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "88,300 vs 80,910"}, {"label": "정배열(5>10)", "ok": true, "detail": "83,020 / 80,910"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "83,020 / 75,060"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+47.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -150 · 기 +299 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+17%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.80% (환산) vs 평균 0.42% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 87,600"}, {"label": "거래량 급증", "ok": true, "detail": "743,133 (환산) vs 평균 392,182"}, {"label": "회전율 급증", "ok": true, "detail": "0.80% (환산) vs 평균 0.42%"}, {"label": "RSI", "ok": true, "detail": "67"}]}
{"ts": "2026-07-23T10:30:02.401768+09:00", "side": "BUY", "code": "024060", "name": "흥구석유", "price": 14140, "qty": 356, "cost": 5034595, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 11706, "target": 21442, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "14,180 vs 12,429"}, {"label": "정배열(5>10)", "ok": true, "detail": "13,154 / 12,429"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "13,154 / 12,687"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+55.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +109 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "84.26% (환산) vs 평균 31.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 13,990"}, {"label": "거래량 급증", "ok": true, "detail": "12,639,979 (환산) vs 평균 4,720,532"}, {"label": "회전율 급증", "ok": true, "detail": "84.26% (환산) vs 평균 31.47%"}, {"label": "RSI", "ok": true, "detail": "66"}]}
{"ts": "2026-07-23T13:06:04.378524+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 91400, "qty": 59, "cost": 5393409, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 77778, "target": 120266, "signals": [{"label": "손절선", "ok": true, "detail": "77,778 (현재 91,400)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 120,266"}, {"label": "추세(10일선)", "ok": true, "detail": "81,220"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -169 · 기 +311"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 91,159"}]}
{"ts": "2026-07-24T09:00:02.274051+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 111800, "qty": 56, "proceeds": 6248591, "entry_price": 132420, "pnl": -1168021, "pnl_pct": -15.57, "hold_from": "2026-07-10T12:14:02.591547+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "96,000 (현재 113,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 241,679"}, {"label": "추세(10일선)", "ok": false, "detail": "123,880"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -480 · 기 -206"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-24T09:02:03.981423+09:00", "side": "BUY", "code": "024060", "name": "흥구석유", "price": 15060, "qty": 334, "cost": 5030795, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 11706, "target": 21442, "signals": [{"label": "손절선", "ok": true, "detail": "11,706 (현재 15,020)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,442"}, {"label": "추세(10일선)", "ok": true, "detail": "12,513"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +208 · 기 -2"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 14,766"}]}
{"ts": "2026-07-24T10:02:04.270583+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 18950, "qty": 292, "cost": 5534230, "path": "pullback", "reason": "눌림목 지정가 19,643 도달", "stop": 17760, "target": 22520, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "18,950 vs 18,943"}, {"label": "정배열(5>10)", "ok": true, "detail": "19,576 / 18,943"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,576 / 19,358"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+19.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +2 · 기 -5 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.39% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "454,069 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.39% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "49"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,643 (현재 18,950)"}]}
{"ts": "2026-07-27T09:02:05.306008+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 7470, "qty": 731, "cost": 5461389, "path": "pullback", "reason": "눌림목 지정가 7,635 도달", "stop": 6370, "target": 10769, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "7,470 vs 5,392"}, {"label": "정배열(5>10)", "ok": true, "detail": "6,452 / 5,392"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,452 / 4,889"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+82.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +49 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.79% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "49,327 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "0.79% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "74"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,635 (현재 7,470)"}]}
{"ts": "2026-07-27T09:08:02.026931+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 7910, "qty": 690, "cost": 5458719, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 6370, "target": 10769, "signals": [{"label": "손절선", "ok": true, "detail": "6,370 (현재 7,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 10,769"}, {"label": "추세(10일선)", "ok": true, "detail": "5,434"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +49 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 7,747"}]}
{"ts": "2026-07-27T09:10:00.979478+09:00", "side": "SELL", "code": "024060", "name": "흥구석유", "price": 12030, "qty": 690, "proceeds": 8284514, "entry_price": 14585, "pnl": -1780876, "pnl_pct": -17.52, "hold_from": "2026-07-23T10:30:02.401758+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "12,081 (현재 12,030)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,097"}, {"label": "추세(10일선)", "ok": false, "detail": "12,214"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -85 · 기 +2"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-27T09:12:01.035449+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 13150, "qty": 306, "cost": 4024504, "path": "pullback", "reason": "눌림목 지정가 13,180 도달", "stop": 10340, "target": 21580, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "13,150 vs 12,888"}, {"label": "정배열(5>10)", "ok": true, "detail": "14,378 / 12,888"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "14,378 / 13,268"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+1.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +27 · 기 +15 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.46% (환산) vs 평균 1.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 15,870"}, {"label": "거래량 급증", "ok": false, "detail": "274,967 (환산) vs 평균 882,736"}, {"label": "회전율 급증", "ok": false, "detail": "0.46% (환산) vs 평균 1.47%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 13,180 (현재 13,150)"}]}
{"ts": "2026-07-28T11:22:00.688753+09:00", "side": "SELL", "code": "003680", "name": "한성기업", "price": 6630, "qty": 1421, "proceeds": 9402859, "entry_price": 7684, "pnl": -1517249, "pnl_pct": -13.71, "hold_from": "2026-07-27T09:02:05.306004+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "6,577 (현재 6,380)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 11,004"}, {"label": "추세(10일선)", "ok": true, "detail": "5,282"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +96 · 기 +0"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T09:02:01.303424+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6540, "qty": 654, "cost": 4277802, "path": "pullback", "reason": "눌림목 지정가 7,526 도달", "stop": 5295, "target": 10276, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "6,540 vs 5,298"}, {"label": "정배열(5>10)", "ok": true, "detail": "6,266 / 5,298"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,266 / 4,873"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+70.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +188 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.87% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "116,047 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "1.87% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "63"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,526 (현재 6,540)"}]}
{"ts": "2026-07-29T09:24:03.681936+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 18950, "qty": 292, "cost": 5534230, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 17760, "target": 22520, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 20,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,520"}, {"label": "추세(10일선)", "ok": true, "detail": "18,901"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +99 · 기 +138"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,268"}]}
{"ts": "2026-07-29T09:24:04.035867+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6710, "qty": 637, "cost": 4274911, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 5295, "target": 10276, "signals": [{"label": "손절선", "ok": true, "detail": "5,295 (현재 8,460)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 10,276"}, {"label": "추세(10일선)", "ok": true, "detail": "5,064"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +188 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,796"}]}
{"ts": "2026-07-29T09:24:04.447212+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 11310, "qty": 317, "cost": 3585808, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 10340, "target": 21580, "signals": [{"label": "손절선", "ok": true, "detail": "10,340 (현재 15,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,580"}, {"label": "추세(10일선)", "ok": true, "detail": "12,768"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +242 · 기 -182"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,887"}]}
{"ts": "2026-07-29T10:52:02.292514+09:00", "side": "SELL", "code": "252990", "name": "샘씨엔에스", "price": 10340, "qty": 623, "proceeds": 6429258, "entry_price": 12214, "pnl": -1181053, "pnl_pct": -15.34, "hold_from": "2026-07-27T09:12:01.035446+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "10,340 (현재 10,340)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 17,835"}, {"label": "추세(10일선)", "ok": false, "detail": "12,607"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +239 · 기 -181"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T12:04:01.628867+09:00", "side": "SELL", "code": "086790", "name": "하나금융지주", "price": 119200, "qty": 83, "proceeds": 9874307, "entry_price": 132580, "pnl": -1131443, "pnl_pct": -10.09, "hold_from": "2026-07-10T09:26:06.360780+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "119,709 (현재 119,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 171,192"}, {"label": "추세(10일선)", "ok": false, "detail": "119,490"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -11 · 기 -51"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T13:14:05.383429+09:00", "side": "SELL", "code": "003680", "name": "한성기업", "price": 5580, "qty": 1291, "proceeds": 7189733, "entry_price": 6624, "pnl": -1362980, "pnl_pct": -15.76, "hold_from": "2026-07-29T09:02:01.303420+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,600 (현재 5,590)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 9,697"}, {"label": "추세(10일선)", "ok": true, "detail": "5,204"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +185 · 기 +0"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-30T09:04:05.277102+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6130, "qty": 589, "cost": 3611112, "path": "pullback", "reason": "눌림목 지정가 7,457 도달", "stop": 4793, "target": 10140, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "6,120 vs 5,256"}, {"label": "정배열(5>10)", "ok": true, "detail": "6,182 / 5,256"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,182 / 4,866"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+65.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +234 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "4.31% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "267,687 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "4.31% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,457 (현재 6,120)"}]}
{"ts": "2026-07-30T09:16:09.704313+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 124100, "qty": 40, "cost": 4964745, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 113673, "target": 155380, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "124,000 vs 117,010"}, {"label": "정배열(5>10)", "ok": true, "detail": "118,260 / 117,010"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "118,260 / 110,085"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+54.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +9 · 기 +389 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+20%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.31% (환산) vs 평균 0.17% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 123,300"}, {"label": "거래량 급증", "ok": true, "detail": "518,220 (환산) vs 평균 289,522"}, {"label": "회전율 급증", "ok": true, "detail": "0.31% (환산) vs 평균 0.17%"}, {"label": "RSI", "ok": true, "detail": "68"}]}
{"ts": "2026-07-30T10:10:06.142998+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 127700, "qty": 39, "cost": 4981047, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 113673, "target": 155380, "signals": [{"label": "손절선", "ok": true, "detail": "113,673 (현재 127,600)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 155,380"}, {"label": "추세(10일선)", "ok": true, "detail": "117,370"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +35 · 기 +392"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 126,835"}]}
{"ts": "2026-07-31T09:06:05.825941+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6550, "qty": 551, "cost": 3609591, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 4793, "target": 10140, "signals": [{"label": "손절선", "ok": true, "detail": "4,793 (현재 6,640)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 10,140"}, {"label": "추세(10일선)", "ok": true, "detail": "5,308"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +355 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,453"}]}
{"ts": "2026-07-31T09:06:06.330737+09:00", "side": "SELL", "code": "078930", "name": "GS", "price": 77700, "qty": 120, "proceeds": 9305818, "entry_price": 89875, "pnl": -1480800, "pnl_pct": -13.55, "hold_from": "2026-07-23T09:46:06.299578+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "78,839 (현재 78,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 122,984"}, {"label": "추세(10일선)", "ok": false, "detail": "79,880"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -179 · 기 +325"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-08-03T12:00:10.581416+09:00", "side": "BUY", "code": "194370", "name": "제이에스코퍼레이션", "price": 12910, "qty": 371, "cost": 4790328, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 11314, "target": 17699, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "12,930 vs 12,003"}, {"label": "정배열(5>10)", "ok": true, "detail": "12,138 / 12,003"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "12,138 / 11,924"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+27.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +7 · 기 +10 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+74%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.72% (환산) vs 평균 0.34% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 12,870"}, {"label": "거래량 급증", "ok": true, "detail": "208,994 (환산) vs 평균 99,303"}, {"label": "회전율 급증", "ok": true, "detail": "0.72% (환산) vs 평균 0.34%"}, {"label": "RSI", "ok": true, "detail": "63"}]}
{"ts": "2026-08-03T12:02:08.464738+09:00", "side": "BUY", "code": "194370", "name": "제이에스코퍼레이션", "price": 13420, "qty": 357, "cost": 4791659, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 11314, "target": 17699, "signals": [{"label": "손절선", "ok": true, "detail": "11,314 (현재 13,450)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 17,699"}, {"label": "추세(10일선)", "ok": true, "detail": "12,055"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +7 · 기 +10"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,339"}]}
{"ts": "2026-08-04T09:34:08.150391+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 90000, "qty": 53, "cost": 4770716, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 79135, "target": 122595, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "89,800 vs 81,060"}, {"label": "정배열(5>10)", "ok": true, "detail": "83,320 / 81,060"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "83,320 / 75,085"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+55.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +68 · 기 +117 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+15%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.64% (환산) vs 평균 0.42% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 87,600"}, {"label": "거래량 급증", "ok": true, "detail": "595,733 (환산) vs 평균 392,182"}, {"label": "회전율 급증", "ok": true, "detail": "0.64% (환산) vs 평균 0.42%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-08-04T10:32:11.011486+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 93500, "qty": 13, "cost": 1215682, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 79135, "target": 122595, "signals": [{"label": "손절선", "ok": true, "detail": "79,135 (현재 93,400)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 122,595"}, {"label": "추세(10일선)", "ok": true, "detail": "81,420"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +57 · 기 +117"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 92,841"}]}
{"ts": "2026-08-06T09:00:13.271931+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18730, "qty": 584, "proceeds": 10916990, "entry_price": 18950, "pnl": -151470, "pnl_pct": -1.16, "hold_from": "2026-07-24T10:02:04.270573+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 18,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,520"}, {"label": "추세(10일선)", "ok": false, "detail": "18,923"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -203 · 기 -147"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-08-06T09:06:08.044853+09:00", "side": "SELL", "code": "090850", "name": "현대이지웰", "price": 5470, "qty": 1843, "proceeds": 10061552, "entry_price": 5969, "pnl": -941669, "pnl_pct": -8.37, "hold_from": "2026-07-14T09:40:04.963052+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,498 (현재 5,490)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 7,383"}, {"label": "추세(10일선)", "ok": false, "detail": "5,502"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -30 · 기 -23"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-08-06T09:12:11.568337+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 13110, "qty": 277, "cost": 3632015, "path": "pullback", "reason": "눌림목 지정가 13,160 도달", "stop": 10340, "target": 21420, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "13,090 vs 12,882"}, {"label": "정배열(5>10)", "ok": true, "detail": "14,366 / 12,882"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "14,366 / 13,268"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-12.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -352 · 기 +499 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.38% (환산) vs 평균 1.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 15,870"}, {"label": "거래량 급증", "ok": false, "detail": "229,113 (환산) vs 평균 882,736"}, {"label": "회전율 급증", "ok": false, "detail": "0.38% (환산) vs 평균 1.47%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 13,160 (현재 13,090)"}]}
{"ts": "2026-08-06T09:14:08.213833+09:00", "side": "BUY", "code": "068270", "name": "셀트리온", "price": 193600, "qty": 24, "cost": 4647097, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 176944, "target": 243568, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "193,500 vs 180,840"}, {"label": "정배열(5>10)", "ok": true, "detail": "186,480 / 180,840"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "186,480 / 176,699"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+20.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +255 · 기 -319 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+42%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.49% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 191,700"}, {"label": "거래량 급증", "ok": true, "detail": "1,163,480 (환산) vs 평균 738,783"}, {"label": "회전율 급증", "ok": true, "detail": "0.49% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "64"}]}
{"ts": "2026-08-07T09:02:10.128383+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 14290, "qty": 254, "cost": 3630204, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 10340, "target": 21420, "signals": [{"label": "손절선", "ok": true, "detail": "10,340 (현재 14,240)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,420"}, {"label": "추세(10일선)", "ok": true, "detail": "12,997"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -216 · 기 +313"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,856"}]}
{"ts": "2026-08-07T09:34:06.949454+09:00", "side": "BUY", "code": "068270", "name": "셀트리온", "price": 198600, "qty": 24, "cost": 4767115, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 176944, "target": 243568, "signals": [{"label": "손절선", "ok": true, "detail": "176,944 (현재 198,600)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 243,568"}, {"label": "추세(10일선)", "ok": true, "detail": "181,350"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +338 · 기 +73"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 197,939"}]}
@@ -0,0 +1,197 @@
{
"cash": 28179215.39100001,
"initial": 100000000,
"positions": {
"214450": {
"code": "214450",
"name": "파마리서치",
"sources": [
"auto"
],
"qty": 22,
"entry_price": 347250.0,
"entry_at": "2026-07-13T09:12:04.289321+09:00",
"stop": 374219,
"target": 410027,
"peak": 411500,
"trailing_on": true,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 409000,
"tranches": 2,
"tranche_value": 3936003.3225085386,
"last_add_price": 353000
},
"138040": {
"code": "138040",
"name": "메리츠금융지주",
"sources": [
"auto"
],
"qty": 83,
"entry_price": 124881.92771084337,
"entry_at": "2026-07-29T10:24:01.432671+09:00",
"stop": 114155,
"target": 140972,
"peak": 127600,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 123200,
"tranches": 2,
"tranche_value": 5296043.025056097,
"last_add_price": 126400
},
"003680": {
"code": "003680",
"name": "한성기업",
"sources": [
"auto"
],
"qty": 637,
"entry_price": 6333.076923076923,
"entry_at": "2026-07-30T09:04:06.859145+09:00",
"stop": 5039,
"target": 8274,
"peak": 6840,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 7,457 도달",
"cur_price": 6220,
"tranches": 2,
"tranche_value": 2020237.3208749255,
"last_add_price": 6550
},
"010950": {
"code": "010950",
"name": "S-Oil",
"sources": [
"auto"
],
"qty": 58,
"entry_price": 133900.0,
"entry_at": "2026-07-30T09:24:06.912150+09:00",
"stop": 118244,
"target": 157385,
"peak": 139900,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 139600,
"tranches": 2,
"tranche_value": 3949543.523644232,
"last_add_price": 136000
},
"194370": {
"code": "194370",
"name": "제이에스코퍼레이션",
"sources": [
"auto"
],
"qty": 532,
"entry_price": 13160.206766917294,
"entry_at": "2026-08-03T12:00:11.186392+09:00",
"stop": 11445,
"target": 15733,
"peak": 14120,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 13370,
"tranches": 2,
"tranche_value": 3504336.4241500003,
"last_add_price": 13420
},
"078930": {
"code": "078930",
"name": "GS",
"sources": [
"auto"
],
"qty": 77,
"entry_price": 91929.87012987013,
"entry_at": "2026-08-04T09:50:08.969520+09:00",
"stop": 80565,
"target": 108977,
"peak": 101600,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 97700,
"tranches": 2,
"tranche_value": 3560762.7001641323,
"last_add_price": 93500
},
"252990": {
"code": "252990",
"name": "샘씨엔에스",
"sources": [
"auto"
],
"qty": 311,
"entry_price": 13423.569131832797,
"entry_at": "2026-08-05T09:02:12.579429+09:00",
"stop": 10340,
"target": 18049,
"peak": 15670,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 13,170 도달",
"cur_price": 15670,
"tranches": 2,
"tranche_value": 2094069.1444097043,
"last_add_price": 13830
},
"068270": {
"code": "068270",
"name": "셀트리온",
"sources": [
"interest"
],
"qty": 51,
"entry_price": 194156.86274509804,
"entry_at": "2026-08-06T09:34:15.268990+09:00",
"stop": 177101,
"target": 219741,
"peak": 201000,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 201000,
"tranches": 2,
"tranche_value": 5025448.547031702,
"last_add_price": 196400
}
},
"realized_pnl": -13850460.364500012,
"closed_trades": 25,
"wins": 1,
"peak_equity": 100172467.23000002,
"max_drawdown": 0.14748235408916366,
"last_exit": {
"030000": "2026-08-06",
"086790": "2026-07-28",
"403870": "2026-07-07",
"240810": "2026-07-24",
"214450": "2026-07-06",
"093370": "2026-07-20",
"055550": "2026-07-20",
"024060": "2026-07-27",
"003680": "2026-07-29",
"138040": "2026-07-28",
"010950": "2026-07-29",
"252990": "2026-07-29",
"090850": "2026-08-05",
"078930": "2026-07-31"
},
"created_at": "2026-06-11T09:00:01.944232+09:00",
"updated_at": "2026-08-10T15:28:13.767762+09:00"
}
@@ -0,0 +1,77 @@
{"ts": "2026-06-17T11:15:02.299761+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 130900, "qty": 38, "cost": 4974946, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 118039, "target": 150191, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "129,300 vs 118,950"}, {"label": "정배열(5>10)", "ok": true, "detail": "120,400 / 118,950"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "120,400 / 118,307"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-13.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +371 · 기 +158 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+22%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.12% (환산) vs 평균 0.38% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 126,500"}, {"label": "거래량 급증", "ok": true, "detail": "3,094,534 (환산) vs 평균 1,031,725"}, {"label": "회전율 급증", "ok": true, "detail": "1.12% (환산) vs 평균 0.38%"}, {"label": "RSI", "ok": true, "detail": "60"}]}
{"ts": "2026-06-19T09:02:06.341563+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19160, "qty": 325, "cost": 6227934, "path": "pullback", "reason": "눌림목 지정가 19,690 도달", "stop": 17760, "target": 21260, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "19,150 vs 18,963"}, {"label": "정배열(5>10)", "ok": true, "detail": "19,616 / 18,963"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,616 / 19,361"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-31.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,162 · 기 +2,080 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.03% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "37,673 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.03% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,690 (현재 19,150)"}]}
{"ts": "2026-06-23T09:00:09.238138+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18820, "qty": 325, "proceeds": 6104573, "entry_price": 19160, "pnl": -123361, "pnl_pct": -1.77, "hold_from": "2026-06-19T09:02:06.341561+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 18,710)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,260"}, {"label": "추세(10일선)", "ok": false, "detail": "18,919"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -318 · 기 -227"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,528"}]}
{"ts": "2026-06-23T12:04:04.077319+09:00", "side": "SELL", "code": "086790", "name": "하나금융지주", "price": 117700, "qty": 38, "proceeds": 4463878, "entry_price": 130900, "pnl": -511068, "pnl_pct": -10.08, "hold_from": "2026-06-17T11:15:02.299760+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "118,039 (현재 117,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 150,191"}, {"label": "추세(10일선)", "ok": false, "detail": "119,330"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +332 · 기 -364"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 134,300"}]}
{"ts": "2026-06-24T09:02:02.369304+09:00", "side": "BUY", "code": "403870", "name": "HPSP", "price": 53200, "qty": 49, "cost": 2607191, "path": "pullback", "reason": "눌림목 지정가 60,114 도달", "stop": 43200, "target": 68200, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "53,200 vs 52,550"}, {"label": "정배열(5>10)", "ok": true, "detail": "57,960 / 52,550"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "57,960 / 49,671"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+20.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +711 · 기 -2,060 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+29%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.34% (환산) vs 평균 5.97% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 71,500"}, {"label": "거래량 급증", "ok": false, "detail": "1,102,733 (환산) vs 평균 4,912,598"}, {"label": "회전율 급증", "ok": false, "detail": "1.34% (환산) vs 평균 5.97%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 60,114 (현재 53,200)"}]}
{"ts": "2026-06-24T09:08:00.981981+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 155400, "qty": 13, "cost": 2020503, "path": "pullback", "reason": "눌림목 지정가 155,963 도달", "stop": 118951, "target": 210074, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "155,400 vs 128,090"}, {"label": "정배열(5>10)", "ok": true, "detail": "143,100 / 128,090"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "143,100 / 121,690"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+45.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +210 · 기 +143 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+6%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "6.50% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": true, "detail": "3,192,593 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": true, "detail": "6.50% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 155,963 (현재 155,400)"}]}
{"ts": "2026-06-26T09:00:05.483093+09:00", "side": "SELL", "code": "403870", "name": "HPSP", "price": 50000, "qty": 49, "proceeds": 2445222, "entry_price": 53200, "pnl": -161969, "pnl_pct": -6.02, "hold_from": "2026-06-24T09:02:02.369303+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "43,200 (현재 51,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 68,200"}, {"label": "추세(10일선)", "ok": false, "detail": "52,330"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -311 · 기 -267"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 57,056"}]}
{"ts": "2026-06-26T09:04:03.892266+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 164900, "qty": 12, "cost": 1979097, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 118951, "target": 210074, "signals": [{"label": "손절선", "ok": true, "detail": "118,951 (현재 164,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 210,074"}, {"label": "추세(10일선)", "ok": true, "detail": "129,020"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -140 · 기 +323"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 164,359"}]}
{"ts": "2026-06-30T09:00:05.439867+09:00", "side": "BUY", "code": "403870", "name": "HPSP", "price": 55300, "qty": 40, "cost": 2212332, "path": "pullback", "reason": "눌림목 지정가 60,222 도달", "stop": 43200, "target": 73450, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "53,700 vs 52,600"}, {"label": "정배열(5>10)", "ok": true, "detail": "58,060 / 52,600"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "58,060 / 49,679"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+12.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +222 · 기 -821 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+28%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.00% (환산) vs 평균 5.97% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 71,500"}, {"label": "거래량 급증", "ok": false, "detail": "827 (환산) vs 평균 4,912,598"}, {"label": "회전율 급증", "ok": false, "detail": "0.00% (환산) vs 평균 5.97%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 60,222 (현재 53,700)"}]}
{"ts": "2026-07-01T09:06:03.204343+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 357500, "qty": 11, "cost": 3933090, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 314220, "target": 422420, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "357,000 vs 307,050"}, {"label": "정배열(5>10)", "ok": true, "detail": "317,600 / 307,050"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "317,600 / 305,700"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+32.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -75 · 기 +221 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+35%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.89% (환산) vs 평균 0.93% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 334,500"}, {"label": "거래량 급증", "ok": true, "detail": "196,247 (환산) vs 평균 96,436"}, {"label": "회전율 급증", "ok": true, "detail": "1.89% (환산) vs 평균 0.93%"}, {"label": "RSI", "ok": true, "detail": "68"}]}
{"ts": "2026-07-01T09:24:02.305227+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 372000, "qty": 11, "cost": 4092614, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 314220, "target": 422420, "signals": [{"label": "손절선", "ok": true, "detail": "314,220 (현재 372,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 422,420"}, {"label": "추세(10일선)", "ok": true, "detail": "308,550"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -75 · 기 +221"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 368,499"}]}
{"ts": "2026-07-02T10:18:03.823440+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 15980, "qty": 139, "cost": 2221553, "path": "pullback", "reason": "눌림목 지정가 16,358 도달", "stop": 12444, "target": 21284, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "15,980 vs 13,620"}, {"label": "정배열(5>10)", "ok": true, "detail": "16,104 / 13,620"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "16,104 / 11,478"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+25.7%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,833 · 기 +437 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+25%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "9.98% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": true, "detail": "10,701,165 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": true, "detail": "9.98% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "60"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 16,358 (현재 15,980)"}]}
{"ts": "2026-07-02T10:40:02.946612+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 18960, "qty": 324, "cost": 6143961, "path": "pullback", "reason": "눌림목 지정가 19,580 도달", "stop": 17760, "target": 20760, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "18,960 vs 18,944"}, {"label": "정배열(5>10)", "ok": true, "detail": "19,578 / 18,944"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,578 / 19,358"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+3.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -339 · 기 +110 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+34%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.86% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "986,112 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.86% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "49"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,580 (현재 18,960)"}]}
{"ts": "2026-07-02T11:20:02.049404+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 22550, "qty": 273, "cost": 6157073, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 17760, "target": 20760, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 19,350)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 20,760"}, {"label": "추세(10일선)", "ok": true, "detail": "18,983"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -339 · 기 +110"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,350"}]}
{"ts": "2026-07-02T11:24:06.141326+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18860, "qty": 597, "proceeds": 11237464, "entry_price": 20602, "pnl": -1063571, "pnl_pct": -8.45, "hold_from": "2026-07-02T10:40:02.946610+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "19,042 (현재 18,890)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,942"}, {"label": "추세(10일선)", "ok": false, "detail": "18,937"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -339 · 기 +110"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-03T09:44:02.602967+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 123600, "qty": 25, "proceeds": 3083974, "entry_price": 159960, "pnl": -915625, "pnl_pct": -22.73, "hold_from": "2026-06-24T09:08:00.981980+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "124,125 (현재 123,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 213,713"}, {"label": "추세(10일선)", "ok": false, "detail": "124,920"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +674 · 기 -2,170"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-03T10:24:02.766124+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19040, "qty": 315, "cost": 5998500, "path": "pullback", "reason": "눌림목 지정가 19,631 도달", "stop": 17760, "target": 20960, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "19,030 vs 18,951"}, {"label": "정배열(5>10)", "ok": true, "detail": "19,592 / 18,951"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,592 / 19,359"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+2.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -35 · 기 +168 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+34%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.54% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "619,193 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.54% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "49"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,631 (현재 19,030)"}]}
{"ts": "2026-07-06T09:00:07.944661+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 130600, "qty": 13, "cost": 1698055, "path": "pullback", "reason": "눌림목 지정가 154,452 도달", "stop": 96000, "target": 182500, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "133,100 vs 125,860"}, {"label": "정배열(5>10)", "ok": true, "detail": "138,640 / 125,860"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "138,640 / 121,318"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+17.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +782 · 기 -1,979 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+31%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.01% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": false, "detail": "4,080 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": false, "detail": "0.01% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "52"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 154,452 (현재 133,100)"}]}
{"ts": "2026-07-06T09:46:01.641444+09:00", "side": "SELL", "code": "214450", "name": "파마리서치", "price": 320500, "qty": 22, "proceeds": 7037251, "entry_price": 364750, "pnl": -988453, "pnl_pct": -12.13, "hold_from": "2026-07-01T09:06:03.204341+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "320,756 (현재 320,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 430,741"}, {"label": "추세(10일선)", "ok": true, "detail": "303,400"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -111 · 기 +227"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-07T09:48:07.376376+09:00", "side": "SELL", "code": "403870", "name": "HPSP", "price": 43000, "qty": 40, "proceeds": 1716646, "entry_price": 55300, "pnl": -495686, "pnl_pct": -22.24, "hold_from": "2026-06-30T09:00:05.439858+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "43,200 (현재 43,050)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 73,450"}, {"label": "추세(10일선)", "ok": false, "detail": "51,535"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +1,424 · 기 -5,706"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 59,449"}]}
{"ts": "2026-07-07T10:28:06.455126+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 12410, "qty": 139, "proceeds": 1721626, "entry_price": 15980, "pnl": -499927, "pnl_pct": -22.34, "hold_from": "2026-07-02T10:18:03.823437+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "12,444 (현재 12,430)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,284"}, {"label": "추세(10일선)", "ok": false, "detail": "13,265"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -1,543 · 기 +15"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 16,975"}]}
{"ts": "2026-07-07T14:08:19.509937+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 20750, "qty": 289, "cost": 5997650, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 17760, "target": 20960, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 20,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 20,960"}, {"label": "추세(10일선)", "ok": true, "detail": "18,901"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +156 · 기 +113"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,358"}]}
{"ts": "2026-07-08T09:00:16.934111+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 108300, "qty": 13, "proceeds": 1405155, "entry_price": 130600, "pnl": -292900, "pnl_pct": -17.08, "hold_from": "2026-07-06T09:00:07.944654+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "166,450 (현재 112,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(10일선)", "ok": false, "detail": "123,820"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +243 · 기 -857"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-09T09:36:03.447933+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 132000, "qty": 31, "cost": 4092614, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 117015, "target": 154477, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "131,900 vs 108,660"}, {"label": "정배열(5>10)", "ok": true, "detail": "115,560 / 108,660"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "115,560 / 113,228"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+22.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -184 · 기 +964 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+13%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.91% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 116,900"}, {"label": "거래량 급증", "ok": true, "detail": "1,026,867 (환산) vs 평균 359,705"}, {"label": "회전율 급증", "ok": true, "detail": "0.91% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-07-10T11:06:06.461063+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 13660, "qty": 143, "cost": 1953673, "path": "pullback", "reason": "눌림목 지정가 15,971 도달", "stop": 10360, "target": 18610, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "13,630 vs 13,385"}, {"label": "정배열(5>10)", "ok": true, "detail": "15,634 / 13,385"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "15,634 / 11,439"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+6.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +210 · 기 +239 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+47%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "14.23% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": true, "detail": "15,267,605 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": true, "detail": "14.23% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "52"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 15,971 (현재 13,630)"}]}
{"ts": "2026-07-10T12:14:02.662405+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 126200, "qty": 15, "cost": 1893284, "path": "pullback", "reason": "눌림목 지정가 151,752 도달", "stop": 96000, "target": 171500, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "126,200 vs 125,170"}, {"label": "정배열(5>10)", "ok": true, "detail": "137,260 / 125,170"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "137,260 / 121,203"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+17.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +483 · 기 -241 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+38%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "7.53% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": true, "detail": "3,695,762 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": true, "detail": "7.53% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 151,752 (현재 126,200)"}]}
{"ts": "2026-07-13T09:00:09.684184+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 136900, "qty": 30, "cost": 4107616, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 117015, "target": 154477, "signals": [{"label": "손절선", "ok": true, "detail": "117,015 (현재 136,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 154,477"}, {"label": "추세(10일선)", "ok": true, "detail": "109,100"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -64 · 기 +919"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 135,864"}]}
{"ts": "2026-07-13T09:12:04.289323+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 341500, "qty": 11, "cost": 3757063, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 300363, "target": 403206, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "341,000 vs 305,450"}, {"label": "정배열(5>10)", "ok": true, "detail": "314,400 / 305,450"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "314,400 / 305,433"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+32.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -63 · 기 +144 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+41%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.90% (환산) vs 평균 0.93% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 334,500"}, {"label": "거래량 급증", "ok": true, "detail": "197,687 (환산) vs 평균 96,436"}, {"label": "회전율 급증", "ok": true, "detail": "1.90% (환산) vs 평균 0.93%"}, {"label": "RSI", "ok": true, "detail": "64"}]}
{"ts": "2026-07-13T09:26:03.401224+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 139100, "qty": 14, "cost": 1947692, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 96000, "target": 171500, "signals": [{"label": "손절선", "ok": true, "detail": "96,000 (현재 139,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 171,500"}, {"label": "추세(10일선)", "ok": true, "detail": "126,460"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -213 · 기 +772"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 136,162"}]}
{"ts": "2026-07-13T09:48:02.326780+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 135500, "qty": 36, "cost": 4878732, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 122472, "target": 155042, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "135,500 vs 121,110"}, {"label": "정배열(5>10)", "ok": true, "detail": "123,700 / 121,110"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "123,700 / 118,657"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+27.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -277 · 기 +460 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+18%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.77% (환산) vs 평균 0.37% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 130,700"}, {"label": "거래량 급증", "ok": true, "detail": "2,103,900 (환산) vs 평균 1,026,357"}, {"label": "회전율 급증", "ok": true, "detail": "0.77% (환산) vs 평균 0.37%"}, {"label": "RSI", "ok": true, "detail": "65"}]}
{"ts": "2026-07-13T10:04:06.402387+09:00", "side": "BUY", "code": "055550", "name": "신한지주", "price": 113100, "qty": 42, "cost": 4750913, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 101931, "target": 129854, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "113,050 vs 100,265"}, {"label": "정배열(5>10)", "ok": true, "detail": "101,790 / 100,265"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "101,790 / 96,676"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+31.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -368 · 기 +1,005 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+17%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.71% (환산) vs 평균 0.35% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 109,800"}, {"label": "거래량 급증", "ok": true, "detail": "3,366,381 (환산) vs 평균 1,653,581"}, {"label": "회전율 급증", "ok": true, "detail": "0.71% (환산) vs 평균 0.35%"}, {"label": "RSI", "ok": true, "detail": "66"}]}
{"ts": "2026-07-15T11:56:05.674537+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 138900, "qty": 35, "cost": 4862229, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 122472, "target": 155042, "signals": [{"label": "손절선", "ok": true, "detail": "122,472 (현재 138,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 155,042"}, {"label": "추세(10일선)", "ok": true, "detail": "121,450"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -40 · 기 +527"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 138,828"}]}
{"ts": "2026-07-15T14:32:01.874159+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18570, "qty": 604, "proceeds": 11194408, "entry_price": 19858, "pnl": -801741, "pnl_pct": -6.49, "hold_from": "2026-07-03T10:24:02.766122+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "18,586 (현재 18,570)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,767"}, {"label": "추세(10일선)", "ok": false, "detail": "18,905"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -214 · 기 +240"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-16T09:28:03.472538+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 353000, "qty": 11, "cost": 3883582, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 300363, "target": 403206, "signals": [{"label": "손절선", "ok": true, "detail": "300,363 (현재 352,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 403,206"}, {"label": "추세(10일선)", "ok": true, "detail": "306,600"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -33 · 기 +28"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 351,963"}]}
{"ts": "2026-07-20T11:28:01.181290+09:00", "side": "SELL", "code": "055550", "name": "신한지주", "price": 101900, "qty": 42, "proceeds": 4271454, "entry_price": 113100, "pnl": -479458, "pnl_pct": -9.9, "hold_from": "2026-07-13T10:04:06.402386+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "101,931 (현재 101,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 129,854"}, {"label": "추세(10일선)", "ok": true, "detail": "99,150"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -156 · 기 +275"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 115,714"}]}
{"ts": "2026-07-20T12:28:02.306152+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 10310, "qty": 143, "proceeds": 1471455, "entry_price": 13660, "pnl": -482218, "pnl_pct": -24.52, "hold_from": "2026-07-10T11:06:06.461061+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "10,360 (현재 10,310)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 18,610"}, {"label": "추세(10일선)", "ok": false, "detail": "12,013"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -887 · 기 +515"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 14,626"}]}
{"ts": "2026-07-23T09:50:01.505017+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 88200, "qty": 43, "cost": 3793169, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 77564, "target": 104155, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "88,200 vs 80,900"}, {"label": "정배열(5>10)", "ok": true, "detail": "83,000 / 80,900"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "83,000 / 75,058"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+47.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -150 · 기 +299 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+17%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.85% (환산) vs 평균 0.42% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 87,600"}, {"label": "거래량 급증", "ok": true, "detail": "785,587 (환산) vs 평균 392,182"}, {"label": "회전율 급증", "ok": true, "detail": "0.85% (환산) vs 평균 0.42%"}, {"label": "RSI", "ok": true, "detail": "67"}]}
{"ts": "2026-07-23T10:30:02.474411+09:00", "side": "BUY", "code": "024060", "name": "흥구석유", "price": 14140, "qty": 190, "cost": 2687003, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 11706, "target": 17791, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "14,180 vs 12,429"}, {"label": "정배열(5>10)", "ok": true, "detail": "13,154 / 12,429"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "13,154 / 12,687"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+55.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +109 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "84.26% (환산) vs 평균 31.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 13,990"}, {"label": "거래량 급증", "ok": true, "detail": "12,639,979 (환산) vs 평균 4,720,532"}, {"label": "회전율 급증", "ok": true, "detail": "84.26% (환산) vs 평균 31.47%"}, {"label": "RSI", "ok": true, "detail": "66"}]}
{"ts": "2026-07-23T12:54:04.487607+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 90900, "qty": 42, "cost": 3818373, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 77564, "target": 104155, "signals": [{"label": "손절선", "ok": true, "detail": "77,564 (현재 91,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 104,155"}, {"label": "추세(10일선)", "ok": true, "detail": "81,180"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -169 · 기 +311"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 90,945"}]}
{"ts": "2026-07-24T09:00:05.421727+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 111800, "qty": 29, "proceeds": 3235878, "entry_price": 132428, "pnl": -605098, "pnl_pct": -15.58, "hold_from": "2026-07-10T12:14:02.662404+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "96,000 (현재 113,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 187,069"}, {"label": "추세(10일선)", "ok": false, "detail": "123,880"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -480 · 기 -206"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-24T09:02:04.034477+09:00", "side": "BUY", "code": "024060", "name": "흥구석유", "price": 15060, "qty": 179, "cost": 2696144, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 11706, "target": 17791, "signals": [{"label": "손절선", "ok": true, "detail": "11,706 (현재 15,020)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 17,791"}, {"label": "추세(10일선)", "ok": true, "detail": "12,513"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +208 · 기 -2"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 14,766"}]}
{"ts": "2026-07-24T10:02:04.389259+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 18950, "qty": 310, "cost": 5875381, "path": "pullback", "reason": "눌림목 지정가 19,643 도달", "stop": 17760, "target": 20735, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "18,950 vs 18,943"}, {"label": "정배열(5>10)", "ok": true, "detail": "19,576 / 18,943"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,576 / 19,358"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+19.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +2 · 기 -5 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.39% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "454,069 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.39% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "49"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,643 (현재 18,950)"}]}
{"ts": "2026-07-27T09:02:06.217883+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 7470, "qty": 423, "cost": 3160284, "path": "pullback", "reason": "눌림목 지정가 7,635 도달", "stop": 6370, "target": 9119, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "7,470 vs 5,392"}, {"label": "정배열(5>10)", "ok": true, "detail": "6,452 / 5,392"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,452 / 4,889"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+82.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +49 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.79% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "49,327 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "0.79% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "74"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,635 (현재 7,470)"}]}
{"ts": "2026-07-27T09:08:02.078866+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 7910, "qty": 400, "cost": 3164475, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 6370, "target": 9119, "signals": [{"label": "손절선", "ok": true, "detail": "6,370 (현재 7,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 9,119"}, {"label": "추세(10일선)", "ok": true, "detail": "5,434"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +49 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 7,747"}]}
{"ts": "2026-07-27T09:10:01.033059+09:00", "side": "SELL", "code": "024060", "name": "흥구석유", "price": 12030, "qty": 369, "proceeds": 4430414, "entry_price": 14586, "pnl": -952734, "pnl_pct": -17.53, "hold_from": "2026-07-23T10:30:02.474409+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "12,082 (현재 12,030)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 18,342"}, {"label": "추세(10일선)", "ok": false, "detail": "12,214"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -85 · 기 +2"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-27T09:12:01.497852+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 13150, "qty": 164, "cost": 2156923, "path": "pullback", "reason": "눌림목 지정가 13,180 도달", "stop": 10340, "target": 17365, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "13,150 vs 12,888"}, {"label": "정배열(5>10)", "ok": true, "detail": "14,378 / 12,888"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "14,378 / 13,268"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+1.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +27 · 기 +15 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.46% (환산) vs 평균 1.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 15,870"}, {"label": "거래량 급증", "ok": false, "detail": "274,967 (환산) vs 평균 882,736"}, {"label": "회전율 급증", "ok": false, "detail": "0.46% (환산) vs 평균 1.47%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 13,180 (현재 13,150)"}]}
{"ts": "2026-07-27T09:32:01.372128+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 127900, "qty": 45, "cost": 5756363, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 117645, "target": 143283, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "127,900 vs 117,400"}, {"label": "정배열(5>10)", "ok": true, "detail": "119,040 / 117,400"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "119,040 / 110,150"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+46.7%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +106 · 기 +291 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+16%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.38% (환산) vs 평균 0.17% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 123,300"}, {"label": "거래량 급증", "ok": true, "detail": "643,340 (환산) vs 평균 289,522"}, {"label": "회전율 급증", "ok": true, "detail": "0.38% (환산) vs 평균 0.17%"}, {"label": "RSI", "ok": true, "detail": "71"}]}
{"ts": "2026-07-28T11:22:00.740360+09:00", "side": "SELL", "code": "003680", "name": "한성기업", "price": 6630, "qty": 823, "proceeds": 5445850, "entry_price": 7684, "pnl": -878909, "pnl_pct": -13.72, "hold_from": "2026-07-27T09:02:06.217881+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "6,577 (현재 6,380)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 9,344"}, {"label": "추세(10일선)", "ok": true, "detail": "5,282"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +96 · 기 +0"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-28T12:56:02.869289+09:00", "side": "SELL", "code": "138040", "name": "메리츠금융지주", "price": 117400, "qty": 45, "proceeds": 5272698, "entry_price": 127900, "pnl": -483665, "pnl_pct": -8.21, "hold_from": "2026-07-27T09:32:01.372126+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "117,645 (현재 117,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 143,283"}, {"label": "추세(10일선)", "ok": true, "detail": "116,360"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +84 · 기 +324"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 130,553"}]}
{"ts": "2026-07-28T13:20:03.820316+09:00", "side": "SELL", "code": "086790", "name": "하나금융지주", "price": 123800, "qty": 71, "proceeds": 8772660, "entry_price": 137176, "pnl": -968301, "pnl_pct": -9.75, "hold_from": "2026-07-13T09:48:02.326778+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "123,862 (현재 123,800)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 157,147"}, {"label": "추세(10일선)", "ok": true, "detail": "119,940"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +122 · 기 -106"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T09:02:02.215048+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6540, "qty": 357, "cost": 2335130, "path": "pullback", "reason": "눌림목 지정가 7,526 도달", "stop": 5295, "target": 8408, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "6,540 vs 5,298"}, {"label": "정배열(5>10)", "ok": true, "detail": "6,266 / 5,298"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,266 / 4,873"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+70.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +188 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.87% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "116,047 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "1.87% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "63"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,526 (현재 6,540)"}]}
{"ts": "2026-07-29T09:24:08.685814+09:00", "side": "SELL", "code": "010950", "name": "S-Oil", "price": 128600, "qty": 61, "proceeds": 7829303, "entry_price": 134410, "pnl": -370927, "pnl_pct": -4.32, "hold_from": "2026-07-09T09:36:03.447931+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "118,954 (현재 116,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 157,594"}, {"label": "추세(10일선)", "ok": true, "detail": "105,620"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +43 · 기 +245"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T09:24:08.686031+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 11310, "qty": 191, "cost": 2160534, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 10340, "target": 17365, "signals": [{"label": "손절선", "ok": true, "detail": "10,340 (현재 15,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 17,365"}, {"label": "추세(10일선)", "ok": true, "detail": "12,768"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +242 · 기 -182"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,887"}]}
{"ts": "2026-07-29T09:26:01.888464+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18940, "qty": 310, "proceeds": 5859951, "entry_price": 18950, "pnl": -15430, "pnl_pct": -0.05, "hold_from": "2026-07-24T10:02:04.389258+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "19,645 (현재 18,950)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(10일선)", "ok": true, "detail": "18,943"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +99 · 기 +138"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T09:26:01.888676+09:00", "side": "SELL", "code": "003680", "name": "한성기업", "price": 6610, "qty": 357, "proceeds": 2355168, "entry_price": 6540, "pnl": 20038, "pnl_pct": 1.07, "hold_from": "2026-07-29T09:02:02.215046+09:00", "reason": "트레일링 익절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "7,526 (현재 6,610)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(10일선)", "ok": true, "detail": "5,306"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +188 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T09:28:01.375105+09:00", "side": "BUY", "code": "090850", "name": "현대이지웰", "price": 6390, "qty": 848, "cost": 5419533, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 5867, "target": 7174, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "6,380 vs 5,591"}, {"label": "정배열(5>10)", "ok": true, "detail": "5,742 / 5,591"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "5,742 / 5,622"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+43.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +73 · 기 -3 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.62% (환산) vs 평균 0.22% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 5,700"}, {"label": "거래량 급증", "ok": true, "detail": "134,413 (환산) vs 평균 49,512"}, {"label": "회전율 급증", "ok": true, "detail": "0.62% (환산) vs 평균 0.22%"}, {"label": "RSI", "ok": true, "detail": "73"}]}
{"ts": "2026-07-29T10:24:01.432673+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 123400, "qty": 42, "cost": 5183577, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 113016, "target": 138976, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "123,400 vs 116,950"}, {"label": "정배열(5>10)", "ok": true, "detail": "118,140 / 116,950"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "118,140 / 110,075"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+51.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +47 · 기 +310 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+20%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.38% (환산) vs 평균 0.17% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 123,300"}, {"label": "거래량 급증", "ok": true, "detail": "644,676 (환산) vs 평균 289,522"}, {"label": "회전율 급증", "ok": true, "detail": "0.38% (환산) vs 평균 0.17%"}, {"label": "RSI", "ok": true, "detail": "67"}]}
{"ts": "2026-07-29T10:52:02.342370+09:00", "side": "SELL", "code": "252990", "name": "샘씨엔에스", "price": 10340, "qty": 355, "proceeds": 3663542, "entry_price": 12160, "pnl": -653915, "pnl_pct": -14.97, "hold_from": "2026-07-27T09:12:01.497849+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "10,340 (현재 10,340)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 14,890"}, {"label": "추세(10일선)", "ok": false, "detail": "12,607"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +239 · 기 -181"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T13:34:03.579933+09:00", "side": "SELL", "code": "090850", "name": "현대이지웰", "price": 5860, "qty": 848, "proceeds": 4959590, "entry_price": 6390, "pnl": -459943, "pnl_pct": -8.29, "hold_from": "2026-07-29T09:28:01.375104+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,867 (현재 5,860)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 7,174"}, {"label": "추세(10일선)", "ok": true, "detail": "5,539"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +73 · 기 -3"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,525"}]}
{"ts": "2026-07-30T09:04:06.858551+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19090, "qty": 288, "cost": 5498745, "path": "pullback", "reason": "눌림목 지정가 19,653 도달", "stop": 17760, "target": 21085, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "19,100 vs 18,958"}, {"label": "정배열(5>10)", "ok": true, "detail": "19,606 / 18,958"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,606 / 19,360"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+29.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +2 · 기 +327 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+32%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.14% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "160,727 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.14% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,653 (현재 19,100)"}]}
{"ts": "2026-07-30T09:04:06.859148+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6130, "qty": 329, "cost": 2017073, "path": "pullback", "reason": "눌림목 지정가 7,457 도달", "stop": 4793, "target": 8135, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "6,120 vs 5,256"}, {"label": "정배열(5>10)", "ok": true, "detail": "6,182 / 5,256"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,182 / 4,866"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+65.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +234 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "4.31% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "267,687 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "4.31% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,457 (현재 6,120)"}]}
{"ts": "2026-07-30T09:24:06.912152+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 131800, "qty": 29, "cost": 3822773, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 116987, "target": 154020, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "132,000 vs 108,670"}, {"label": "정배열(5>10)", "ok": true, "detail": "115,580 / 108,670"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "115,580 / 113,230"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+51.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -6 · 기 +178 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+20%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.66% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 116,900"}, {"label": "거래량 급증", "ok": true, "detail": "738,813 (환산) vs 평균 359,705"}, {"label": "회전율 급증", "ok": true, "detail": "0.66% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-07-30T09:26:06.863454+09:00", "side": "BUY", "code": "090850", "name": "현대이지웰", "price": 6300, "qty": 867, "cost": 5462919, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 5789, "target": 7067, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "6,280 vs 5,581"}, {"label": "정배열(5>10)", "ok": true, "detail": "5,722 / 5,581"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "5,722 / 5,620"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+46.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +87 · 기 +6 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.51% (환산) vs 평균 0.22% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 5,700"}, {"label": "거래량 급증", "ok": true, "detail": "109,080 (환산) vs 평균 49,512"}, {"label": "회전율 급증", "ok": true, "detail": "0.51% (환산) vs 평균 0.22%"}, {"label": "RSI", "ok": true, "detail": "71"}]}
{"ts": "2026-07-30T09:50:06.667546+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 126400, "qty": 41, "cost": 5183177, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 113016, "target": 138976, "signals": [{"label": "손절선", "ok": true, "detail": "113,016 (현재 126,200)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 138,976"}, {"label": "추세(10일선)", "ok": true, "detail": "117,230"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +9 · 기 +389"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 126,082"}]}
{"ts": "2026-07-31T09:06:06.408818+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6550, "qty": 308, "cost": 2017703, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 4793, "target": 8135, "signals": [{"label": "손절선", "ok": true, "detail": "4,793 (현재 6,640)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 8,135"}, {"label": "추세(10일선)", "ok": true, "detail": "5,308"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +355 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,453"}]}
{"ts": "2026-07-31T09:06:06.408934+09:00", "side": "SELL", "code": "078930", "name": "GS", "price": 77700, "qty": 85, "proceeds": 6591621, "entry_price": 89534, "pnl": -1019920, "pnl_pct": -13.22, "hold_from": "2026-07-23T09:50:01.505016+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "78,555 (현재 78,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 106,003"}, {"label": "추세(10일선)", "ok": false, "detail": "79,880"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -179 · 기 +325"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-08-03T12:00:11.186394+09:00", "side": "BUY", "code": "194370", "name": "제이에스코퍼레이션", "price": 12910, "qty": 271, "cost": 3499135, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 11314, "target": 15304, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "12,930 vs 12,003"}, {"label": "정배열(5>10)", "ok": true, "detail": "12,138 / 12,003"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "12,138 / 11,924"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+27.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +7 · 기 +10 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+74%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.72% (환산) vs 평균 0.34% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 12,870"}, {"label": "거래량 급증", "ok": true, "detail": "208,994 (환산) vs 평균 99,303"}, {"label": "회전율 급증", "ok": true, "detail": "0.72% (환산) vs 평균 0.34%"}, {"label": "RSI", "ok": true, "detail": "63"}]}
{"ts": "2026-08-03T12:02:09.141957+09:00", "side": "BUY", "code": "194370", "name": "제이에스코퍼레이션", "price": 13420, "qty": 261, "cost": 3503145, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 11314, "target": 15304, "signals": [{"label": "손절선", "ok": true, "detail": "11,314 (현재 13,450)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 15,304"}, {"label": "추세(10일선)", "ok": true, "detail": "12,055"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +7 · 기 +10"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,339"}]}
{"ts": "2026-08-04T09:50:08.969522+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 90400, "qty": 39, "cost": 3526129, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 79421, "target": 106869, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "90,300 vs 81,110"}, {"label": "정배열(5>10)", "ok": true, "detail": "83,420 / 81,110"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "83,420 / 75,093"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+56.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +68 · 기 +117 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+14%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.87% (환산) vs 평균 0.42% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 87,600"}, {"label": "거래량 급증", "ok": true, "detail": "805,693 (환산) vs 평균 392,182"}, {"label": "회전율 급증", "ok": true, "detail": "0.87% (환산) vs 평균 0.42%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-08-04T10:32:12.149555+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 93500, "qty": 38, "cost": 3553533, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 79421, "target": 106869, "signals": [{"label": "손절선", "ok": true, "detail": "79,421 (현재 93,400)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 106,869"}, {"label": "추세(10일선)", "ok": true, "detail": "81,420"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +57 · 기 +117"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 93,241"}]}
{"ts": "2026-08-05T09:02:12.579251+09:00", "side": "SELL", "code": "090850", "name": "현대이지웰", "price": 5700, "qty": 867, "proceeds": 4932263, "entry_price": 6300, "pnl": -530656, "pnl_pct": -9.52, "hold_from": "2026-07-30T09:26:06.863452+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,789 (현재 5,730)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 7,067"}, {"label": "추세(10일선)", "ok": true, "detail": "5,526"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +14 · 기 -2"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,413"}]}
{"ts": "2026-08-05T09:02:12.579432+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 13040, "qty": 160, "cost": 2086713, "path": "pullback", "reason": "눌림목 지정가 13,170 도달", "stop": 10340, "target": 17090, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "13,040 vs 12,877"}, {"label": "정배열(5>10)", "ok": true, "detail": "14,356 / 12,877"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "14,356 / 13,267"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-6.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -72 · 기 +134 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.13% (환산) vs 평균 1.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 15,870"}, {"label": "거래량 급증", "ok": false, "detail": "78,333 (환산) vs 평균 882,736"}, {"label": "회전율 급증", "ok": false, "detail": "0.13% (환산) vs 평균 1.47%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 13,170 (현재 13,040)"}]}
{"ts": "2026-08-05T09:38:10.847019+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 13830, "qty": 151, "cost": 2088643, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 10340, "target": 17090, "signals": [{"label": "손절선", "ok": true, "detail": "10,340 (현재 13,860)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 17,090"}, {"label": "추세(10일선)", "ok": true, "detail": "12,959"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -72 · 기 +134"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,817"}]}
{"ts": "2026-08-06T09:00:17.713628+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18730, "qty": 288, "proceeds": 5383721, "entry_price": 19090, "pnl": -115023, "pnl_pct": -1.89, "hold_from": "2026-07-30T09:04:06.858549+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 18,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,085"}, {"label": "추세(10일선)", "ok": false, "detail": "18,923"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -203 · 기 -147"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,459"}]}
{"ts": "2026-08-06T09:34:15.268992+09:00", "side": "BUY", "code": "068270", "name": "셀트리온", "price": 192000, "qty": 26, "cost": 4992749, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 175344, "target": 216984, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "191,800 vs 180,670"}, {"label": "정배열(5>10)", "ok": true, "detail": "186,140 / 180,670"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "186,140 / 176,671"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+20.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +255 · 기 -319 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+44%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.67% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 191,700"}, {"label": "거래량 급증", "ok": true, "detail": "1,582,767 (환산) vs 평균 738,783"}, {"label": "회전율 급증", "ok": true, "detail": "0.67% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "63"}]}
{"ts": "2026-08-07T09:12:15.071471+09:00", "side": "BUY", "code": "068270", "name": "셀트리온", "price": 196400, "qty": 25, "cost": 4910736, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 175344, "target": 216984, "signals": [{"label": "손절선", "ok": true, "detail": "175,344 (현재 196,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 216,984"}, {"label": "추세(10일선)", "ok": true, "detail": "181,120"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +338 · 기 +73"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 196,264"}]}
{"ts": "2026-08-10T09:00:14.782704+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 136000, "qty": 29, "cost": 3944592, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 116987, "target": 154020, "signals": [{"label": "손절선", "ok": true, "detail": "116,987 (현재 137,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 154,020"}, {"label": "추세(10일선)", "ok": true, "detail": "109,170"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -253 · 기 +225"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 135,714"}]}
@@ -0,0 +1,198 @@
{
"cash": 23589410.428500064,
"initial": 100000000,
"positions": {
"214450": {
"code": "214450",
"name": "파마리서치",
"sources": [
"auto"
],
"qty": 22,
"entry_price": 347250.0,
"entry_at": "2026-07-13T09:12:04.291895+09:00",
"stop": 374219,
"target": 410027,
"peak": 411500,
"trailing_on": true,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 409000,
"tranches": 2,
"tranche_value": 3962363.617644489,
"last_add_price": 353000
},
"138040": {
"code": "138040",
"name": "메리츠금융지주",
"sources": [
"auto"
],
"qty": 93,
"entry_price": 119186.02150537634,
"entry_at": "2026-07-29T09:02:02.218181+09:00",
"stop": 111200,
"target": 131165,
"peak": 127600,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 118,115 도달",
"cur_price": 123200,
"tranches": 2,
"tranche_value": 5549046.703468754,
"last_add_price": 120500
},
"086790": {
"code": "086790",
"name": "하나금융지주",
"sources": [
"auto"
],
"qty": 83,
"entry_price": 123226.50602409638,
"entry_at": "2026-07-30T09:04:06.862578+09:00",
"stop": 111000,
"target": 141566,
"peak": 134600,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 122,665 도달",
"cur_price": 130600,
"tranches": 2,
"tranche_value": 5150762.675171776,
"last_add_price": 125200
},
"003680": {
"code": "003680",
"name": "한성기업",
"sources": [
"auto"
],
"qty": 631,
"entry_price": 6333.011093502377,
"entry_at": "2026-07-30T09:04:06.863063+09:00",
"stop": 5039,
"target": 8274,
"peak": 6840,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 7,792 도달",
"cur_price": 6220,
"tranches": 2,
"tranche_value": 2002983.4606684945,
"last_add_price": 6550
},
"010950": {
"code": "010950",
"name": "S-Oil",
"sources": [
"auto"
],
"qty": 57,
"entry_price": 133863.15789473685,
"entry_at": "2026-07-30T09:24:06.914859+09:00",
"stop": 118207,
"target": 157348,
"peak": 139900,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 139600,
"tranches": 2,
"tranche_value": 3940896.531574532,
"last_add_price": 136000
},
"194370": {
"code": "194370",
"name": "제이에스코퍼레이션",
"sources": [
"auto"
],
"qty": 530,
"entry_price": 13160.188679245282,
"entry_at": "2026-08-03T12:00:11.189297+09:00",
"stop": 11445,
"target": 15732,
"peak": 14120,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 13370,
"tranches": 2,
"tranche_value": 3497500.5799993444,
"last_add_price": 13420
},
"252990": {
"code": "252990",
"name": "샘씨엔에스",
"sources": [
"auto"
],
"qty": 311,
"entry_price": 13423.569131832797,
"entry_at": "2026-08-05T09:02:12.583320+09:00",
"stop": 10340,
"target": 18049,
"peak": 15670,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 13,947 도달",
"cur_price": 15670,
"tranches": 2,
"tranche_value": 2091765.9324469643,
"last_add_price": 13830
},
"068270": {
"code": "068270",
"name": "셀트리온",
"sources": [
"interest"
],
"qty": 51,
"entry_price": 194156.86274509804,
"entry_at": "2026-08-06T09:34:15.272347+09:00",
"stop": 177101,
"target": 219741,
"peak": 201000,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 201000,
"tranches": 2,
"tranche_value": 5012093.7710951045,
"last_add_price": 196400
}
},
"realized_pnl": -14771785.13750002,
"closed_trades": 30,
"wins": 2,
"peak_equity": 101529111.72700004,
"max_drawdown": 0.1639948569900874,
"last_exit": {
"030000": "2026-08-06",
"086790": "2026-07-29",
"403870": "2026-07-07",
"095610": "2026-07-29",
"093370": "2026-07-20",
"240810": "2026-07-24",
"214450": "2026-07-06",
"034730": "2026-07-07",
"055550": "2026-07-20",
"024060": "2026-07-27",
"003680": "2026-07-29",
"252990": "2026-07-28",
"010950": "2026-07-29",
"090850": "2026-08-05",
"078930": "2026-07-31"
},
"created_at": "2026-06-11T09:00:01.944251+09:00",
"updated_at": "2026-08-10T15:28:13.770025+09:00"
}
@@ -0,0 +1,93 @@
{"ts": "2026-06-17T11:15:02.304318+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 130900, "qty": 38, "cost": 4974946, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 118039, "target": 150191, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "129,300 vs 118,950"}, {"label": "정배열(5>10)", "ok": true, "detail": "120,400 / 118,950"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "120,400 / 118,307"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-13.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +371 · 기 +158 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+22%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.12% (환산) vs 평균 0.38% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 126,500"}, {"label": "거래량 급증", "ok": true, "detail": "3,094,534 (환산) vs 평균 1,031,725"}, {"label": "회전율 급증", "ok": true, "detail": "1.12% (환산) vs 평균 0.38%"}, {"label": "RSI", "ok": true, "detail": "60"}]}
{"ts": "2026-06-17T16:47:28.483754+09:00", "side": "BUY", "code": "403870", "name": "HPSP", "price": 62900, "qty": 35, "cost": 2201830, "path": "pullback", "reason": "눌림목 지정가 64,531 도달", "stop": 48962, "target": 83807, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "62,800 vs 53,510"}, {"label": "정배열(5>10)", "ok": true, "detail": "59,880 / 53,510"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "59,880 / 49,831"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+21.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -4,434 · 기 +5,040 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+9%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "11.31% vs 평균 5.97% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 71,500"}, {"label": "거래량 급증", "ok": false, "detail": "9,309,211 vs 평균 4,912,598"}, {"label": "회전율 급증", "ok": true, "detail": "11.31% vs 평균 5.97%"}, {"label": "RSI", "ok": true, "detail": "58"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 64,531 (현재 62,800)"}]}
{"ts": "2026-06-19T09:02:06.344845+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19160, "qty": 325, "cost": 6227934, "path": "pullback", "reason": "눌림목 지정가 20,044 도달", "stop": 17760, "target": 21260, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "19,150 vs 18,963"}, {"label": "정배열(5>10)", "ok": true, "detail": "19,616 / 18,963"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,616 / 19,361"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-31.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,162 · 기 +2,080 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.03% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "37,673 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.03% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 20,044 (현재 19,150)"}]}
{"ts": "2026-06-23T09:00:09.342852+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18820, "qty": 325, "proceeds": 6104573, "entry_price": 19160, "pnl": -123361, "pnl_pct": -1.77, "hold_from": "2026-06-19T09:02:06.344843+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 18,710)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,260"}, {"label": "추세(10일선)", "ok": false, "detail": "18,919"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -318 · 기 -227"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,528"}]}
{"ts": "2026-06-23T12:04:04.079542+09:00", "side": "SELL", "code": "086790", "name": "하나금융지주", "price": 117700, "qty": 38, "proceeds": 4463878, "entry_price": 130900, "pnl": -511068, "pnl_pct": -10.08, "hold_from": "2026-06-17T11:15:02.304317+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "118,039 (현재 117,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 150,191"}, {"label": "추세(10일선)", "ok": false, "detail": "119,330"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +332 · 기 -364"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 134,300"}]}
{"ts": "2026-06-24T09:04:06.111950+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 156700, "qty": 13, "cost": 2037406, "path": "pullback", "reason": "눌림목 지정가 165,075 도달", "stop": 120251, "target": 211374, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "156,200 vs 128,170"}, {"label": "정배열(5>10)", "ok": true, "detail": "143,260 / 128,170"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "143,260 / 121,703"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+46.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +210 · 기 +143 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+6%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "5.83% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": true, "detail": "2,860,073 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": true, "detail": "5.83% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 165,075 (현재 156,200)"}]}
{"ts": "2026-06-24T09:12:05.347423+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 17270, "qty": 150, "cost": 2590889, "path": "pullback", "reason": "눌림목 지정가 17,366 도달", "stop": 13981, "target": 22203, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "17,280 vs 13,750"}, {"label": "정배열(5>10)", "ok": true, "detail": "16,364 / 13,750"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "16,364 / 11,500"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+21.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +1,740 · 기 -508 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+16%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.34% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": false, "detail": "2,509,340 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": false, "detail": "2.34% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "65"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 17,366 (현재 17,280)"}]}
{"ts": "2026-06-24T09:46:04.779355+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 158200, "qty": 13, "cost": 2056908, "path": "pullback", "reason": "눌림목 지정가 158,264 도달", "stop": 120729, "target": 214407, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "158,000 vs 153,380"}, {"label": "정배열(5>10)", "ok": true, "detail": "172,240 / 153,380"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "172,240 / 99,750"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+56.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +41 · 기 +65 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+5%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "4.25% (환산) vs 평균 3.06% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 202,500"}, {"label": "거래량 급증", "ok": false, "detail": "822,940 (환산) vs 평균 591,925"}, {"label": "회전율 급증", "ok": false, "detail": "4.25% (환산) vs 평균 3.06%"}, {"label": "RSI", "ok": true, "detail": "61"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 158,264 (현재 158,000)"}]}
{"ts": "2026-06-24T11:12:05.896210+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 18260, "qty": 142, "cost": 2593309, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 13981, "target": 22203, "signals": [{"label": "손절선", "ok": true, "detail": "13,981 (현재 18,250)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,203"}, {"label": "추세(10일선)", "ok": true, "detail": "13,847"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +1,742 · 기 -508"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 18,094"}]}
{"ts": "2026-06-25T09:00:23.474580+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 179100, "qty": 11, "cost": 1970396, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 120729, "target": 214407, "signals": [{"label": "손절선", "ok": true, "detail": "120,729 (현재 178,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 214,407"}, {"label": "추세(10일선)", "ok": true, "detail": "155,410"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -56 · 기 +134"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 167,275"}]}
{"ts": "2026-06-26T09:00:05.584610+09:00", "side": "SELL", "code": "403870", "name": "HPSP", "price": 50000, "qty": 35, "proceeds": 1746588, "entry_price": 62900, "pnl": -455243, "pnl_pct": -20.51, "hold_from": "2026-06-17T16:47:28.483745+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "48,962 (현재 51,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 83,807"}, {"label": "추세(10일선)", "ok": false, "detail": "52,330"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -311 · 기 -267"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 66,756"}]}
{"ts": "2026-06-26T10:14:04.057812+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 166900, "qty": 12, "cost": 2003100, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 120251, "target": 211374, "signals": [{"label": "손절선", "ok": true, "detail": "120,251 (현재 166,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 211,374"}, {"label": "추세(10일선)", "ok": true, "detail": "129,220"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -126 · 기 +320"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 165,659"}]}
{"ts": "2026-06-29T11:36:01.262629+09:00", "side": "BUY", "code": "034730", "name": "SK", "price": 745000, "qty": 3, "cost": 2235335, "path": "pullback", "reason": "눌림목 지정가 748,914 도달", "stop": 612829, "target": 943257, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "744,000 vs 735,600"}, {"label": "정배열(5>10)", "ok": true, "detail": "766,800 / 735,600"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "766,800 / 530,600"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+12.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -194 · 기 +152 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+8%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.35% (환산) vs 평균 0.45% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 883,000"}, {"label": "거래량 급증", "ok": true, "detail": "977,966 (환산) vs 평균 329,863"}, {"label": "회전율 급증", "ok": true, "detail": "1.35% (환산) vs 평균 0.45%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 748,914 (현재 744,000)"}]}
{"ts": "2026-06-29T14:18:01.482930+09:00", "side": "BUY", "code": "034730", "name": "SK", "price": 778000, "qty": 3, "cost": 2334350, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 612829, "target": 943257, "signals": [{"label": "손절선", "ok": true, "detail": "612,829 (현재 779,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 943,257"}, {"label": "추세(10일선)", "ok": true, "detail": "739,100"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -200 · 기 +143"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 778,043"}]}
{"ts": "2026-06-30T09:00:05.540133+09:00", "side": "BUY", "code": "403870", "name": "HPSP", "price": 55300, "qty": 41, "cost": 2267640, "path": "pullback", "reason": "눌림목 지정가 63,981 도달", "stop": 43200, "target": 73450, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "53,700 vs 52,600"}, {"label": "정배열(5>10)", "ok": true, "detail": "58,060 / 52,600"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "58,060 / 49,679"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+12.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +222 · 기 -821 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+28%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.00% (환산) vs 평균 5.97% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 71,500"}, {"label": "거래량 급증", "ok": false, "detail": "827 (환산) vs 평균 4,912,598"}, {"label": "회전율 급증", "ok": false, "detail": "0.00% (환산) vs 평균 5.97%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 63,981 (현재 53,700)"}]}
{"ts": "2026-07-01T09:06:03.206698+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 357500, "qty": 11, "cost": 3933090, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 314220, "target": 422420, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "357,000 vs 307,050"}, {"label": "정배열(5>10)", "ok": true, "detail": "317,600 / 307,050"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "317,600 / 305,700"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+32.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -75 · 기 +221 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+35%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.89% (환산) vs 평균 0.93% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 334,500"}, {"label": "거래량 급증", "ok": true, "detail": "196,247 (환산) vs 평균 96,436"}, {"label": "회전율 급증", "ok": true, "detail": "1.89% (환산) vs 평균 0.93%"}, {"label": "RSI", "ok": true, "detail": "68"}]}
{"ts": "2026-07-01T09:24:02.307379+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 372000, "qty": 11, "cost": 4092614, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 314220, "target": 422420, "signals": [{"label": "손절선", "ok": true, "detail": "314,220 (현재 372,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 422,420"}, {"label": "추세(10일선)", "ok": true, "detail": "308,550"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -75 · 기 +221"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 368,499"}]}
{"ts": "2026-07-01T11:06:02.349355+09:00", "side": "SELL", "code": "095610", "name": "테스", "price": 212000, "qty": 24, "proceeds": 5078078, "entry_price": 167779, "pnl": 1050774, "pnl_pct": 26.36, "hold_from": "2026-06-24T09:46:04.779353+09:00", "reason": "트레일링 익절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "213,193 (현재 213,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(10일선)", "ok": true, "detail": "158,880"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -229 · 기 +300"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-02T10:18:03.827422+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 122200, "qty": 43, "cost": 5255388, "path": "pullback", "reason": "눌림목 지정가 122,215 도달", "stop": 111000, "target": 139000, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "122,000 vs 119,760"}, {"label": "정배열(5>10)", "ok": true, "detail": "121,000 / 119,760"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "121,000 / 118,432"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+10.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +22 · 기 -44 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+29%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.80% (환산) vs 평균 0.37% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 130,700"}, {"label": "거래량 급증", "ok": true, "detail": "2,199,199 (환산) vs 평균 1,026,357"}, {"label": "회전율 급증", "ok": true, "detail": "0.80% (환산) vs 평균 0.37%"}, {"label": "RSI", "ok": true, "detail": "52"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 122,215 (현재 122,000)"}]}
{"ts": "2026-07-02T10:40:02.948677+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 18960, "qty": 324, "cost": 6143961, "path": "pullback", "reason": "눌림목 지정가 19,970 도달", "stop": 17760, "target": 20760, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "18,960 vs 18,944"}, {"label": "정배열(5>10)", "ok": true, "detail": "19,578 / 18,944"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,578 / 19,358"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+3.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -339 · 기 +110 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+34%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.86% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "986,112 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.86% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "49"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,970 (현재 18,960)"}]}
{"ts": "2026-07-02T11:20:02.051721+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 22550, "qty": 273, "cost": 6157073, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 17760, "target": 20760, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 19,350)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 20,760"}, {"label": "추세(10일선)", "ok": true, "detail": "18,983"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -339 · 기 +110"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,350"}]}
{"ts": "2026-07-02T11:24:06.143347+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18860, "qty": 597, "proceeds": 11237464, "entry_price": 20602, "pnl": -1063571, "pnl_pct": -8.45, "hold_from": "2026-07-02T10:40:02.948676+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "19,042 (현재 18,890)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,942"}, {"label": "추세(10일선)", "ok": false, "detail": "18,937"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -339 · 기 +110"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-03T09:04:01.665799+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 14370, "qty": 292, "proceeds": 4187858, "entry_price": 17751, "pnl": -996340, "pnl_pct": -19.05, "hold_from": "2026-06-24T09:12:05.347421+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "14,457 (현재 14,390)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,693"}, {"label": "추세(10일선)", "ok": true, "detail": "13,461"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -1,591 · 기 +253"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-03T09:28:01.636551+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 125700, "qty": 25, "proceeds": 3136372, "entry_price": 161596, "pnl": -904134, "pnl_pct": -22.21, "hold_from": "2026-06-24T09:04:06.111949+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "125,761 (현재 125,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 215,349"}, {"label": "추세(10일선)", "ok": true, "detail": "125,120"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +674 · 기 -2,170"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-03T10:16:02.526460+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 126200, "qty": 42, "cost": 5301195, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 111000, "target": 139000, "signals": [{"label": "손절선", "ok": true, "detail": "111,000 (현재 126,200)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 139,000"}, {"label": "추세(10일선)", "ok": true, "detail": "120,180"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -140 · 기 +278"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 125,493"}]}
{"ts": "2026-07-03T10:24:02.768194+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19040, "qty": 314, "cost": 5979457, "path": "pullback", "reason": "눌림목 지정가 20,004 도달", "stop": 17760, "target": 20960, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "19,030 vs 18,951"}, {"label": "정배열(5>10)", "ok": true, "detail": "19,592 / 18,951"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,592 / 19,359"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+2.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -35 · 기 +168 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+34%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.54% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "619,193 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.54% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "49"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 20,004 (현재 19,030)"}]}
{"ts": "2026-07-06T09:00:08.046896+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 130600, "qty": 13, "cost": 1698055, "path": "pullback", "reason": "눌림목 지정가 164,068 도달", "stop": 96000, "target": 182500, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "133,100 vs 125,860"}, {"label": "정배열(5>10)", "ok": true, "detail": "138,640 / 125,860"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "138,640 / 121,318"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+17.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +782 · 기 -1,979 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+31%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.01% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": false, "detail": "4,080 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": false, "detail": "0.01% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "52"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 164,068 (현재 133,100)"}]}
{"ts": "2026-07-06T09:00:08.048351+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 14510, "qty": 130, "cost": 1886583, "path": "pullback", "reason": "눌림목 지정가 17,169 도달", "stop": 10827, "target": 20034, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "14,490 vs 13,471"}, {"label": "정배열(5>10)", "ok": true, "detail": "15,806 / 13,471"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "15,806 / 11,453"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+7.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,226 · 기 +134 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+38%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.02% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": false, "detail": "20,667 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": false, "detail": "0.02% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "54"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 17,169 (현재 14,490)"}]}
{"ts": "2026-07-06T09:46:01.643722+09:00", "side": "SELL", "code": "214450", "name": "파마리서치", "price": 320500, "qty": 22, "proceeds": 7037251, "entry_price": 364750, "pnl": -988453, "pnl_pct": -12.13, "hold_from": "2026-07-01T09:06:03.206697+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "320,756 (현재 320,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 430,741"}, {"label": "추세(10일선)", "ok": true, "detail": "303,400"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -111 · 기 +227"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-07T09:12:07.261676+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 155900, "qty": 12, "cost": 1871081, "path": "pullback", "reason": "눌림목 지정가 158,314 도달", "stop": 118529, "target": 211957, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "155,800 vs 153,160"}, {"label": "정배열(5>10)", "ok": true, "detail": "171,800 / 153,160"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "171,800 / 99,713"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+43.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +80 · 기 -197 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+14%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "3.33% (환산) vs 평균 3.06% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 202,500"}, {"label": "거래량 급증", "ok": false, "detail": "645,567 (환산) vs 평균 591,925"}, {"label": "회전율 급증", "ok": false, "detail": "3.33% (환산) vs 평균 3.06%"}, {"label": "RSI", "ok": true, "detail": "60"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 158,314 (현재 155,800)"}]}
{"ts": "2026-07-07T09:48:07.378539+09:00", "side": "SELL", "code": "403870", "name": "HPSP", "price": 43000, "qty": 41, "proceeds": 1759562, "entry_price": 55300, "pnl": -508078, "pnl_pct": -22.24, "hold_from": "2026-06-30T09:00:05.540126+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "43,200 (현재 43,050)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 73,450"}, {"label": "추세(10일선)", "ok": false, "detail": "51,535"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +1,424 · 기 -5,706"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 59,449"}]}
{"ts": "2026-07-07T10:30:07.357407+09:00", "side": "SELL", "code": "034730", "name": "SK", "price": 628000, "qty": 6, "proceeds": 3760652, "entry_price": 761500, "pnl": -809033, "pnl_pct": -17.53, "hold_from": "2026-06-29T11:36:01.262627+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "629,329 (현재 628,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 959,757"}, {"label": "추세(10일선)", "ok": false, "detail": "724,000"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -58 · 기 +6"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-07T12:02:08.175480+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 12230, "qty": 130, "proceeds": 1586800, "entry_price": 14510, "pnl": -299783, "pnl_pct": -15.71, "hold_from": "2026-07-06T09:00:08.048341+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "10,827 (현재 12,230)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 20,034"}, {"label": "추세(10일선)", "ok": false, "detail": "13,245"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -1,558 · 기 -4"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 15,512"}]}
{"ts": "2026-07-07T14:08:22.267417+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 177000, "qty": 11, "cost": 1947292, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 118529, "target": 211957, "signals": [{"label": "손절선", "ok": true, "detail": "118,529 (현재 177,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 211,957"}, {"label": "추세(10일선)", "ok": true, "detail": "148,710"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +152 · 기 -281"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 165,142"}]}
{"ts": "2026-07-07T14:08:22.269186+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 20750, "qty": 288, "cost": 5976896, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 17760, "target": 20960, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 20,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 20,960"}, {"label": "추세(10일선)", "ok": true, "detail": "18,901"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +156 · 기 +113"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,358"}]}
{"ts": "2026-07-08T09:00:17.041286+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 108300, "qty": 13, "proceeds": 1405155, "entry_price": 130600, "pnl": -292900, "pnl_pct": -17.08, "hold_from": "2026-07-06T09:00:08.046892+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "166,450 (현재 112,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(10일선)", "ok": false, "detail": "123,820"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +243 · 기 -857"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-09T09:36:03.450093+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 132000, "qty": 30, "cost": 3960594, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 117015, "target": 154477, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "131,900 vs 108,660"}, {"label": "정배열(5>10)", "ok": true, "detail": "115,560 / 108,660"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "115,560 / 113,228"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+22.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -184 · 기 +964 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+13%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.91% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 116,900"}, {"label": "거래량 급증", "ok": true, "detail": "1,026,867 (환산) vs 평균 359,705"}, {"label": "회전율 급증", "ok": true, "detail": "0.91% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-07-10T11:06:06.463233+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 13660, "qty": 143, "cost": 1953673, "path": "pullback", "reason": "눌림목 지정가 16,984 도달", "stop": 10360, "target": 18610, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "13,630 vs 13,385"}, {"label": "정배열(5>10)", "ok": true, "detail": "15,634 / 13,385"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "15,634 / 11,439"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+6.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +210 · 기 +239 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+47%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "14.23% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": true, "detail": "15,267,605 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": true, "detail": "14.23% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "52"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 16,984 (현재 13,630)"}]}
{"ts": "2026-07-10T12:14:02.664485+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 126200, "qty": 15, "cost": 1893284, "path": "pullback", "reason": "눌림목 지정가 162,268 도달", "stop": 96000, "target": 171500, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "126,200 vs 125,170"}, {"label": "정배열(5>10)", "ok": true, "detail": "137,260 / 125,170"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "137,260 / 121,203"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+17.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +483 · 기 -241 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+38%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "7.53% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": true, "detail": "3,695,762 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": true, "detail": "7.53% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 162,268 (현재 126,200)"}]}
{"ts": "2026-07-13T09:00:09.784350+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 136900, "qty": 29, "cost": 3970696, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 117015, "target": 154477, "signals": [{"label": "손절선", "ok": true, "detail": "117,015 (현재 136,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 154,477"}, {"label": "추세(10일선)", "ok": true, "detail": "109,100"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -64 · 기 +919"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 135,864"}]}
{"ts": "2026-07-13T09:12:04.291897+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 341500, "qty": 11, "cost": 3757063, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 300363, "target": 403206, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "341,000 vs 305,450"}, {"label": "정배열(5>10)", "ok": true, "detail": "314,400 / 305,450"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "314,400 / 305,433"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+32.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -63 · 기 +144 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+41%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.90% (환산) vs 평균 0.93% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 334,500"}, {"label": "거래량 급증", "ok": true, "detail": "197,687 (환산) vs 평균 96,436"}, {"label": "회전율 급증", "ok": true, "detail": "1.90% (환산) vs 평균 0.93%"}, {"label": "RSI", "ok": true, "detail": "64"}]}
{"ts": "2026-07-13T09:26:03.403270+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 139100, "qty": 14, "cost": 1947692, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 96000, "target": 171500, "signals": [{"label": "손절선", "ok": true, "detail": "96,000 (현재 139,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 171,500"}, {"label": "추세(10일선)", "ok": true, "detail": "126,460"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -213 · 기 +772"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 136,162"}]}
{"ts": "2026-07-13T10:04:06.404637+09:00", "side": "BUY", "code": "055550", "name": "신한지주", "price": 113100, "qty": 42, "cost": 4750913, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 101931, "target": 129854, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "113,050 vs 100,265"}, {"label": "정배열(5>10)", "ok": true, "detail": "101,790 / 100,265"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "101,790 / 96,676"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+31.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -368 · 기 +1,005 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+17%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.71% (환산) vs 평균 0.35% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 109,800"}, {"label": "거래량 급증", "ok": true, "detail": "3,366,381 (환산) vs 평균 1,653,581"}, {"label": "회전율 급증", "ok": true, "detail": "0.71% (환산) vs 평균 0.35%"}, {"label": "RSI", "ok": true, "detail": "66"}]}
{"ts": "2026-07-15T14:32:01.876272+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18570, "qty": 602, "proceeds": 11157341, "entry_price": 19858, "pnl": -799013, "pnl_pct": -6.49, "hold_from": "2026-07-03T10:24:02.768192+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "18,586 (현재 18,570)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,766"}, {"label": "추세(10일선)", "ok": false, "detail": "18,905"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -214 · 기 +240"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-16T09:00:08.142600+09:00", "side": "SELL", "code": "095610", "name": "테스", "price": 209000, "qty": 23, "proceeds": 4797626, "entry_price": 165991, "pnl": 979254, "pnl_pct": 25.91, "hold_from": "2026-07-07T09:12:07.261674+09:00", "reason": "트레일링 익절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "210,764 (현재 207,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(10일선)", "ok": true, "detail": "158,280"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -799 · 기 +891"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-16T09:28:03.474549+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 353000, "qty": 11, "cost": 3883582, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 300363, "target": 403206, "signals": [{"label": "손절선", "ok": true, "detail": "300,363 (현재 352,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 403,206"}, {"label": "추세(10일선)", "ok": true, "detail": "306,600"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -33 · 기 +28"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 351,963"}]}
{"ts": "2026-07-20T11:28:01.183314+09:00", "side": "SELL", "code": "055550", "name": "신한지주", "price": 101900, "qty": 42, "proceeds": 4271454, "entry_price": 113100, "pnl": -479458, "pnl_pct": -9.9, "hold_from": "2026-07-13T10:04:06.404635+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "101,931 (현재 101,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 129,854"}, {"label": "추세(10일선)", "ok": true, "detail": "99,150"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -156 · 기 +275"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 115,714"}]}
{"ts": "2026-07-20T12:28:02.308175+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 10310, "qty": 143, "proceeds": 1471455, "entry_price": 13660, "pnl": -482218, "pnl_pct": -24.52, "hold_from": "2026-07-10T11:06:06.463231+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "10,360 (현재 10,310)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 18,610"}, {"label": "추세(10일선)", "ok": false, "detail": "12,013"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -887 · 기 +515"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 14,626"}]}
{"ts": "2026-07-22T14:18:05.417998+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 14030, "qty": 158, "cost": 2217073, "path": "pullback", "reason": "눌림목 지정가 14,023 도달", "stop": 11077, "target": 18460, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "14,020 vs 12,975"}, {"label": "정배열(5>10)", "ok": true, "detail": "14,552 / 12,975"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "14,552 / 13,283"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+10.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,005 · 기 +1,723 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.97% (환산) vs 평균 1.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 15,870"}, {"label": "거래량 급증", "ok": false, "detail": "585,754 (환산) vs 평균 882,736"}, {"label": "회전율 급증", "ok": false, "detail": "0.97% (환산) vs 평균 1.47%"}, {"label": "RSI", "ok": true, "detail": "53"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 14,023 (현재 14,020)"}]}
{"ts": "2026-07-22T15:04:00.988784+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 158100, "qty": 12, "cost": 1897485, "path": "pullback", "reason": "눌림목 지정가 158,107 도달", "stop": 120314, "target": 214778, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "158,000 vs 153,380"}, {"label": "정배열(5>10)", "ok": true, "detail": "172,240 / 153,380"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "172,240 / 99,750"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+49.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -311 · 기 +22 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+24%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "5.02% (환산) vs 평균 3.06% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 202,500"}, {"label": "거래량 급증", "ok": false, "detail": "971,360 (환산) vs 평균 591,925"}, {"label": "회전율 급증", "ok": true, "detail": "5.02% (환산) vs 평균 3.06%"}, {"label": "RSI", "ok": true, "detail": "61"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 158,107 (현재 158,000)"}]}
{"ts": "2026-07-23T09:50:01.507037+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 88200, "qty": 44, "cost": 3881382, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 77564, "target": 104155, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "88,200 vs 80,900"}, {"label": "정배열(5>10)", "ok": true, "detail": "83,000 / 80,900"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "83,000 / 75,058"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+47.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -150 · 기 +299 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+17%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.85% (환산) vs 평균 0.42% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 87,600"}, {"label": "거래량 급증", "ok": true, "detail": "785,587 (환산) vs 평균 392,182"}, {"label": "회전율 급증", "ok": true, "detail": "0.85% (환산) vs 평균 0.42%"}, {"label": "RSI", "ok": true, "detail": "67"}]}
{"ts": "2026-07-23T10:24:01.496618+09:00", "side": "SELL", "code": "095610", "name": "테스", "price": 152100, "qty": 12, "proceeds": 1821641, "entry_price": 158100, "pnl": -75844, "pnl_pct": -3.8, "hold_from": "2026-07-22T15:04:00.988783+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "120,314 (현재 152,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 214,778"}, {"label": "추세(10일선)", "ok": false, "detail": "152,780"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -101 · 기 -107"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 167,575"}]}
{"ts": "2026-07-23T10:30:02.476529+09:00", "side": "BUY", "code": "024060", "name": "흥구석유", "price": 14140, "qty": 192, "cost": 2715287, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 11706, "target": 17791, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "14,180 vs 12,429"}, {"label": "정배열(5>10)", "ok": true, "detail": "13,154 / 12,429"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "13,154 / 12,687"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+55.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +109 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "84.26% (환산) vs 평균 31.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 13,990"}, {"label": "거래량 급증", "ok": true, "detail": "12,639,979 (환산) vs 평균 4,720,532"}, {"label": "회전율 급증", "ok": true, "detail": "84.26% (환산) vs 평균 31.47%"}, {"label": "RSI", "ok": true, "detail": "66"}]}
{"ts": "2026-07-23T12:54:04.489474+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 90900, "qty": 42, "cost": 3818373, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 77564, "target": 104155, "signals": [{"label": "손절선", "ok": true, "detail": "77,564 (현재 91,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 104,155"}, {"label": "추세(10일선)", "ok": true, "detail": "81,180"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -169 · 기 +311"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 90,945"}]}
{"ts": "2026-07-24T09:00:05.529199+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 111800, "qty": 29, "proceeds": 3235878, "entry_price": 132428, "pnl": -605098, "pnl_pct": -15.58, "hold_from": "2026-07-10T12:14:02.664484+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "96,000 (현재 113,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 187,069"}, {"label": "추세(10일선)", "ok": false, "detail": "123,880"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -480 · 기 -206"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-24T09:00:05.530375+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 155500, "qty": 12, "cost": 1866280, "path": "pullback", "reason": "눌림목 지정가 158,093 도달", "stop": 117686, "target": 212221, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "155,000 vs 153,080"}, {"label": "정배열(5>10)", "ok": true, "detail": "171,640 / 153,080"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "171,640 / 99,700"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+44.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +200 · 기 -454 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+27%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "3.77% (환산) vs 평균 3.06% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 202,500"}, {"label": "거래량 급증", "ok": false, "detail": "730,327 (환산) vs 평균 591,925"}, {"label": "회전율 급증", "ok": false, "detail": "3.77% (환산) vs 평균 3.06%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 158,093 (현재 155,000)"}]}
{"ts": "2026-07-24T09:02:04.036333+09:00", "side": "BUY", "code": "024060", "name": "흥구석유", "price": 15060, "qty": 181, "cost": 2726269, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 11706, "target": 17791, "signals": [{"label": "손절선", "ok": true, "detail": "11,706 (현재 15,020)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 17,791"}, {"label": "추세(10일선)", "ok": true, "detail": "12,513"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +208 · 기 -2"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 14,766"}]}
{"ts": "2026-07-24T09:28:04.942689+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 14510, "qty": 153, "cost": 2220363, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 11077, "target": 18460, "signals": [{"label": "손절선", "ok": true, "detail": "11,077 (현재 15,400)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 18,460"}, {"label": "추세(10일선)", "ok": true, "detail": "13,113"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -857 · 기 +1,172"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 14,791"}]}
{"ts": "2026-07-24T10:02:04.391526+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 18950, "qty": 312, "cost": 5913287, "path": "pullback", "reason": "눌림목 지정가 20,012 도달", "stop": 17760, "target": 20735, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "18,950 vs 18,943"}, {"label": "정배열(5>10)", "ok": true, "detail": "19,576 / 18,943"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,576 / 19,358"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+19.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +2 · 기 -5 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.39% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "454,069 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.39% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "49"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 20,012 (현재 18,950)"}]}
{"ts": "2026-07-27T09:10:01.034991+09:00", "side": "SELL", "code": "024060", "name": "흥구석유", "price": 12030, "qty": 373, "proceeds": 4478440, "entry_price": 14586, "pnl": -963116, "pnl_pct": -17.53, "hold_from": "2026-07-23T10:30:02.476527+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "12,083 (현재 12,030)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 18,342"}, {"label": "추세(10일선)", "ok": false, "detail": "12,214"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -85 · 기 +2"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-27T09:12:01.501479+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 7850, "qty": 420, "cost": 3297495, "path": "pullback", "reason": "눌림목 지정가 7,907 도달", "stop": 6743, "target": 9510, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "7,840 vs 5,428"}, {"label": "정배열(5>10)", "ok": true, "detail": "6,526 / 5,428"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,526 / 4,895"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+91.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +49 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "11.17% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "693,433 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": true, "detail": "11.17% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": false, "detail": "80"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,907 (현재 7,840)"}]}
{"ts": "2026-07-27T12:56:04.228682+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 8300, "qty": 397, "cost": 3295594, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 6743, "target": 9510, "signals": [{"label": "손절선", "ok": true, "detail": "6,743 (현재 8,310)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 9,510"}, {"label": "추세(10일선)", "ok": true, "detail": "5,476"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +50 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 8,127"}]}
{"ts": "2026-07-27T13:38:04.225254+09:00", "side": "SELL", "code": "003680", "name": "한성기업", "price": 6880, "qty": 817, "proceeds": 5609999, "entry_price": 8069, "pnl": -983090, "pnl_pct": -14.73, "hold_from": "2026-07-27T09:12:01.501476+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "6,962 (현재 6,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 9,729"}, {"label": "추세(10일선)", "ok": true, "detail": "5,334"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +50 · 기 +0"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-28T09:00:15.725820+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6780, "qty": 394, "cost": 2671721, "path": "pullback", "reason": "눌림목 지정가 7,884 도달", "stop": 5628, "target": 8509, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "7,050 vs 5,350"}, {"label": "정배열(5>10)", "ok": true, "detail": "6,368 / 5,350"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,368 / 4,882"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+73.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +86 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.01% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "813 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "0.01% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "69"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,884 (현재 7,050)"}]}
{"ts": "2026-07-28T09:10:01.736195+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 7100, "qty": 376, "cost": 2670000, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 5628, "target": 8509, "signals": [{"label": "손절선", "ok": true, "detail": "5,628 (현재 7,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 8,509"}, {"label": "추세(10일선)", "ok": true, "detail": "5,354"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +86 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 7,079"}]}
{"ts": "2026-07-28T10:08:02.763925+09:00", "side": "SELL", "code": "252990", "name": "샘씨엔에스", "price": 11170, "qty": 311, "proceeds": 3467096, "entry_price": 14266, "pnl": -970340, "pnl_pct": -21.7, "hold_from": "2026-07-22T14:18:05.417997+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "11,223 (현재 11,220)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 18,831"}, {"label": "추세(10일선)", "ok": false, "detail": "12,695"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +106 · 기 -64"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T09:02:02.218183+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 117900, "qty": 47, "cost": 5542131, "path": "pullback", "reason": "눌림목 지정가 118,115 도달", "stop": 111200, "target": 127950, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "117,800 vs 116,390"}, {"label": "정배열(5>10)", "ok": true, "detail": "117,020 / 116,390"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "117,020 / 109,982"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+45.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +39 · 기 +307 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+26%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.03% (환산) vs 평균 0.17% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 123,300"}, {"label": "거래량 급증", "ok": false, "detail": "44,660 (환산) vs 평균 289,522"}, {"label": "회전율 급증", "ok": false, "detail": "0.03% (환산) vs 평균 0.17%"}, {"label": "RSI", "ok": true, "detail": "57"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 118,115 (현재 117,800)"}]}
{"ts": "2026-07-29T09:16:04.458945+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 120500, "qty": 46, "cost": 5543831, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 111200, "target": 127950, "signals": [{"label": "손절선", "ok": true, "detail": "111,200 (현재 120,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 127,950"}, {"label": "추세(10일선)", "ok": true, "detail": "116,660"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +39 · 기 +307"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 120,492"}]}
{"ts": "2026-07-29T09:24:08.688483+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 122600, "qty": 15, "cost": 1839276, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 117686, "target": 212221, "signals": [{"label": "손절선", "ok": true, "detail": "117,686 (현재 177,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 212,221"}, {"label": "추세(10일선)", "ok": true, "detail": "148,710"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +453 · 기 -688"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 164,742"}]}
{"ts": "2026-07-29T09:24:08.688690+09:00", "side": "SELL", "code": "010950", "name": "S-Oil", "price": 128600, "qty": 59, "proceeds": 7572605, "entry_price": 134408, "pnl": -358685, "pnl_pct": -4.32, "hold_from": "2026-07-09T09:36:03.450092+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "118,952 (현재 116,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 157,593"}, {"label": "추세(10일선)", "ok": true, "detail": "105,620"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +43 · 기 +245"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T09:26:01.891082+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18940, "qty": 312, "proceeds": 5897757, "entry_price": 18950, "pnl": -15530, "pnl_pct": -0.05, "hold_from": "2026-07-24T10:02:04.391524+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "19,645 (현재 18,950)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(10일선)", "ok": true, "detail": "18,943"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +99 · 기 +138"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T09:28:01.377044+09:00", "side": "BUY", "code": "090850", "name": "현대이지웰", "price": 6390, "qty": 850, "cost": 5432315, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 5867, "target": 7174, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "6,380 vs 5,591"}, {"label": "정배열(5>10)", "ok": true, "detail": "5,742 / 5,591"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "5,742 / 5,622"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+43.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +73 · 기 -3 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.62% (환산) vs 평균 0.22% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 5,700"}, {"label": "거래량 급증", "ok": true, "detail": "134,413 (환산) vs 평균 49,512"}, {"label": "회전율 급증", "ok": true, "detail": "0.62% (환산) vs 평균 0.22%"}, {"label": "RSI", "ok": true, "detail": "73"}]}
{"ts": "2026-07-29T10:18:05.366579+09:00", "side": "SELL", "code": "095610", "name": "테스", "price": 116400, "qty": 27, "proceeds": 3136672, "entry_price": 137222, "pnl": -568884, "pnl_pct": -15.17, "hold_from": "2026-07-24T09:00:05.530369+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "117,686 (현재 115,800)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 192,006"}, {"label": "추세(10일선)", "ok": false, "detail": "149,160"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +445 · 기 -685"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T12:04:01.681905+09:00", "side": "SELL", "code": "086790", "name": "하나금융지주", "price": 119200, "qty": 85, "proceeds": 10112243, "entry_price": 124176, "pnl": -444341, "pnl_pct": -4.01, "hold_from": "2026-07-02T10:18:03.827419+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "111,006 (현재 119,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 143,933"}, {"label": "추세(10일선)", "ok": false, "detail": "119,490"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -11 · 기 -51"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T13:06:06.472442+09:00", "side": "SELL", "code": "003680", "name": "한성기업", "price": 5690, "qty": 770, "proceeds": 4372756, "entry_price": 6936, "pnl": -968965, "pnl_pct": -17.97, "hold_from": "2026-07-28T09:00:15.725812+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,741 (현재 5,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 8,729"}, {"label": "추세(10일선)", "ok": true, "detail": "5,214"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +185 · 기 +0"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T13:34:03.581955+09:00", "side": "SELL", "code": "090850", "name": "현대이지웰", "price": 5860, "qty": 850, "proceeds": 4971287, "entry_price": 6390, "pnl": -461028, "pnl_pct": -8.29, "hold_from": "2026-07-29T09:28:01.377043+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,867 (현재 5,860)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 7,174"}, {"label": "추세(10일선)", "ok": true, "detail": "5,539"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +73 · 기 -3"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,525"}]}
{"ts": "2026-07-30T09:04:06.862580+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 121300, "qty": 42, "cost": 5095364, "path": "pullback", "reason": "눌림목 지정가 122,665 도달", "stop": 111000, "target": 136750, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "121,200 vs 119,680"}, {"label": "정배열(5>10)", "ok": true, "detail": "120,840 / 119,680"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "120,840 / 118,418"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+34.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -214 · 기 +182 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+36%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.18% (환산) vs 평균 0.37% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 130,700"}, {"label": "거래량 급증", "ok": false, "detail": "494,880 (환산) vs 평균 1,026,357"}, {"label": "회전율 급증", "ok": false, "detail": "0.18% (환산) vs 평균 0.37%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 122,665 (현재 121,200)"}]}
{"ts": "2026-07-30T09:04:06.862756+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19090, "qty": 286, "cost": 5460559, "path": "pullback", "reason": "눌림목 지정가 20,019 도달", "stop": 17760, "target": 21085, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "19,100 vs 18,958"}, {"label": "정배열(5>10)", "ok": true, "detail": "19,606 / 18,958"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,606 / 19,360"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+29.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +2 · 기 +327 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+32%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.14% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "160,727 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.14% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 20,019 (현재 19,100)"}]}
{"ts": "2026-07-30T09:04:06.863066+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6130, "qty": 326, "cost": 1998680, "path": "pullback", "reason": "눌림목 지정가 7,792 도달", "stop": 4793, "target": 8135, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "6,120 vs 5,256"}, {"label": "정배열(5>10)", "ok": true, "detail": "6,182 / 5,256"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,182 / 4,866"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+65.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +234 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "4.31% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "267,687 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "4.31% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,792 (현재 6,120)"}]}
{"ts": "2026-07-30T09:16:11.313716+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 125200, "qty": 41, "cost": 5133970, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 111000, "target": 136750, "signals": [{"label": "손절선", "ok": true, "detail": "111,000 (현재 125,400)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 136,750"}, {"label": "추세(10일선)", "ok": true, "detail": "120,100"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -214 · 기 +182"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 124,618"}]}
{"ts": "2026-07-30T09:24:06.914861+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 131800, "qty": 29, "cost": 3822773, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 116987, "target": 154020, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "132,000 vs 108,670"}, {"label": "정배열(5>10)", "ok": true, "detail": "115,580 / 108,670"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "115,580 / 113,230"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+51.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -6 · 기 +178 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+20%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.66% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 116,900"}, {"label": "거래량 급증", "ok": true, "detail": "738,813 (환산) vs 평균 359,705"}, {"label": "회전율 급증", "ok": true, "detail": "0.66% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-07-30T09:26:06.866302+09:00", "side": "BUY", "code": "090850", "name": "현대이지웰", "price": 6300, "qty": 865, "cost": 5450317, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 5789, "target": 7067, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "6,280 vs 5,581"}, {"label": "정배열(5>10)", "ok": true, "detail": "5,722 / 5,581"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "5,722 / 5,620"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+46.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +87 · 기 +6 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.51% (환산) vs 평균 0.22% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 5,700"}, {"label": "거래량 급증", "ok": true, "detail": "109,080 (환산) vs 평균 49,512"}, {"label": "회전율 급증", "ok": true, "detail": "0.51% (환산) vs 평균 0.22%"}, {"label": "RSI", "ok": true, "detail": "71"}]}
{"ts": "2026-07-31T09:06:06.410935+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6550, "qty": 305, "cost": 1998050, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 4793, "target": 8135, "signals": [{"label": "손절선", "ok": true, "detail": "4,793 (현재 6,640)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 8,135"}, {"label": "추세(10일선)", "ok": true, "detail": "5,308"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +355 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,453"}]}
{"ts": "2026-07-31T09:06:06.411045+09:00", "side": "SELL", "code": "078930", "name": "GS", "price": 77700, "qty": 86, "proceeds": 6669170, "entry_price": 89519, "pnl": -1030585, "pnl_pct": -13.2, "hold_from": "2026-07-23T09:50:01.507036+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "78,539 (현재 78,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 105,988"}, {"label": "추세(10일선)", "ok": false, "detail": "79,880"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -179 · 기 +325"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-08-03T12:00:11.189299+09:00", "side": "BUY", "code": "194370", "name": "제이에스코퍼레이션", "price": 12910, "qty": 270, "cost": 3486223, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 11314, "target": 15304, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "12,930 vs 12,003"}, {"label": "정배열(5>10)", "ok": true, "detail": "12,138 / 12,003"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "12,138 / 11,924"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+27.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +7 · 기 +10 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+74%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.72% (환산) vs 평균 0.34% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 12,870"}, {"label": "거래량 급증", "ok": true, "detail": "208,994 (환산) vs 평균 99,303"}, {"label": "회전율 급증", "ok": true, "detail": "0.72% (환산) vs 평균 0.34%"}, {"label": "RSI", "ok": true, "detail": "63"}]}
{"ts": "2026-08-03T12:02:09.144443+09:00", "side": "BUY", "code": "194370", "name": "제이에스코퍼레이션", "price": 13420, "qty": 260, "cost": 3489723, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 11314, "target": 15304, "signals": [{"label": "손절선", "ok": true, "detail": "11,314 (현재 13,450)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 15,304"}, {"label": "추세(10일선)", "ok": true, "detail": "12,055"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +7 · 기 +10"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,339"}]}
{"ts": "2026-08-05T09:02:12.583140+09:00", "side": "SELL", "code": "090850", "name": "현대이지웰", "price": 5700, "qty": 865, "proceeds": 4920886, "entry_price": 6300, "pnl": -529432, "pnl_pct": -9.52, "hold_from": "2026-07-30T09:26:06.866300+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,789 (현재 5,730)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 7,067"}, {"label": "추세(10일선)", "ok": true, "detail": "5,526"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +14 · 기 -2"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,413"}]}
{"ts": "2026-08-05T09:02:12.583322+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 13040, "qty": 160, "cost": 2086713, "path": "pullback", "reason": "눌림목 지정가 13,947 도달", "stop": 10340, "target": 17090, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "13,040 vs 12,877"}, {"label": "정배열(5>10)", "ok": true, "detail": "14,356 / 12,877"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "14,356 / 13,267"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-6.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -72 · 기 +134 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.13% (환산) vs 평균 1.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 15,870"}, {"label": "거래량 급증", "ok": false, "detail": "78,333 (환산) vs 평균 882,736"}, {"label": "회전율 급증", "ok": false, "detail": "0.13% (환산) vs 평균 1.47%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 13,947 (현재 13,040)"}]}
{"ts": "2026-08-05T09:38:10.849723+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 13830, "qty": 151, "cost": 2088643, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 10340, "target": 17090, "signals": [{"label": "손절선", "ok": true, "detail": "10,340 (현재 13,860)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 17,090"}, {"label": "추세(10일선)", "ok": true, "detail": "12,959"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -72 · 기 +134"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,817"}]}
{"ts": "2026-08-06T09:00:17.815534+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18730, "qty": 286, "proceeds": 5346334, "entry_price": 19090, "pnl": -114225, "pnl_pct": -1.89, "hold_from": "2026-07-30T09:04:06.862754+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 18,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,085"}, {"label": "추세(10일선)", "ok": false, "detail": "18,923"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -203 · 기 -147"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,459"}]}
{"ts": "2026-08-06T09:34:15.272349+09:00", "side": "BUY", "code": "068270", "name": "셀트리온", "price": 192000, "qty": 26, "cost": 4992749, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 175344, "target": 216984, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "191,800 vs 180,670"}, {"label": "정배열(5>10)", "ok": true, "detail": "186,140 / 180,670"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "186,140 / 176,671"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+20.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +255 · 기 -319 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+44%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.67% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 191,700"}, {"label": "거래량 급증", "ok": true, "detail": "1,582,767 (환산) vs 평균 738,783"}, {"label": "회전율 급증", "ok": true, "detail": "0.67% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "63"}]}
{"ts": "2026-08-07T09:12:15.074213+09:00", "side": "BUY", "code": "068270", "name": "셀트리온", "price": 196400, "qty": 25, "cost": 4910736, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 175344, "target": 216984, "signals": [{"label": "손절선", "ok": true, "detail": "175,344 (현재 196,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 216,984"}, {"label": "추세(10일선)", "ok": true, "detail": "181,120"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +338 · 기 +73"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 196,264"}]}
{"ts": "2026-08-10T09:00:14.888891+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 136000, "qty": 28, "cost": 3808571, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 116987, "target": 154020, "signals": [{"label": "손절선", "ok": true, "detail": "116,987 (현재 137,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 154,020"}, {"label": "추세(10일선)", "ok": true, "detail": "109,170"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -253 · 기 +225"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 135,714"}]}
@@ -0,0 +1,202 @@
{
"cash": 22309155.60850004,
"initial": 100000000,
"positions": {
"214450": {
"code": "214450",
"name": "파마리서치",
"sources": [
"auto"
],
"qty": 27,
"entry_price": 350037.037037037,
"entry_at": "2026-07-21T12:06:01.164331+09:00",
"stop": 318434,
"target": 413243,
"peak": 411500,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 409000,
"tranches": 2,
"tranche_value": 4980582.661409654,
"last_add_price": 356000
},
"218150": {
"code": "218150",
"name": "미래생명자원",
"sources": [
"interest"
],
"qty": 2548,
"entry_price": 2036.565934065934,
"entry_at": "2026-07-27T14:20:01.056080+09:00",
"stop": 1775,
"target": 2720,
"peak": 2450,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 2,135 도달",
"cur_price": 2080,
"tranches": 2,
"tranche_value": 2595536.5029300014,
"last_add_price": 1951
},
"138040": {
"code": "138040",
"name": "메리츠금융지주",
"sources": [
"auto"
],
"qty": 87,
"entry_price": 119185.05747126437,
"entry_at": "2026-07-29T09:02:02.221426+09:00",
"stop": 111408,
"target": 134739,
"peak": 127600,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 118,115 도달",
"cur_price": 123200,
"tranches": 2,
"tranche_value": 5213821.568625003,
"last_add_price": 120500
},
"003680": {
"code": "003680",
"name": "한성기업",
"sources": [
"auto"
],
"qty": 795,
"entry_price": 6332.867924528302,
"entry_at": "2026-07-30T09:04:06.866644+09:00",
"stop": 5362,
"target": 8274,
"peak": 6840,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 7,792 도달",
"cur_price": 6220,
"tranches": 2,
"tranche_value": 2521548.49371356,
"last_add_price": 6550
},
"194370": {
"code": "194370",
"name": "제이에스코퍼레이션",
"sources": [
"auto"
],
"qty": 653,
"entry_price": 13159.923430321593,
"entry_at": "2026-08-03T12:00:11.776417+09:00",
"stop": 11874,
"target": 15732,
"peak": 14120,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 13370,
"tranches": 2,
"tranche_value": 4300842.818074627,
"last_add_price": 13420
},
"095610": {
"code": "095610",
"name": "테스",
"sources": [
"auto"
],
"qty": 23,
"entry_price": 141495.65217391305,
"entry_at": "2026-08-04T09:04:08.850905+09:00",
"stop": 111689,
"target": 201110,
"peak": 148000,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 156,279 도달",
"cur_price": 143700,
"tranches": 2,
"tranche_value": 1735775.3707943999,
"last_add_price": 147600
},
"252990": {
"code": "252990",
"name": "샘씨엔에스",
"sources": [
"auto"
],
"qty": 333,
"entry_price": 13905.405405405405,
"entry_at": "2026-08-05T09:18:09.783202+09:00",
"stop": 11576,
"target": 18564,
"peak": 15670,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 13,947 도달",
"cur_price": 15670,
"tranches": 2,
"tranche_value": 2325831.4188620616,
"last_add_price": 14270
},
"068270": {
"code": "068270",
"name": "셀트리온",
"sources": [
"interest"
],
"qty": 50,
"entry_price": 194200.0,
"entry_at": "2026-08-06T09:34:15.275495+09:00",
"stop": 181408,
"target": 219784,
"peak": 201000,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 201000,
"tranches": 2,
"tranche_value": 4973576.381781252,
"last_add_price": 196400
}
},
"realized_pnl": -21450179.557000034,
"closed_trades": 43,
"wins": 3,
"peak_equity": 101695667.93550003,
"max_drawdown": 0.23379971074166161,
"last_exit": {
"030000": "2026-08-06",
"035420": "2026-06-23",
"403870": "2026-07-02",
"095610": "2026-07-28",
"093370": "2026-07-20",
"240810": "2026-07-24",
"009150": "2026-07-06",
"034730": "2026-07-08",
"214450": "2026-07-14",
"003490": "2026-07-07",
"319660": "2026-07-23",
"105560": "2026-07-20",
"086790": "2026-07-21",
"003680": "2026-07-29",
"252990": "2026-07-28",
"010950": "2026-08-03",
"090850": "2026-08-05",
"161890": "2026-07-30",
"078930": "2026-07-31"
},
"created_at": "2026-06-11T09:00:01.944270+09:00",
"updated_at": "2026-08-10T15:28:14.350984+09:00"
}
@@ -0,0 +1,126 @@
{"ts": "2026-06-12T09:00:34.009437+09:00", "side": "BUY", "code": "035420", "name": "NAVER", "price": 232500, "qty": 14, "cost": 3255488, "path": "pullback", "reason": "눌림목 지정가 233,744 도달", "stop": 197616, "target": 302268, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "233,500 vs 224,820"}, {"label": "정배열(5>20)", "ok": true, "detail": "258,500 / 224,820"}, {"label": "추세 기울기(20일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "258,500 / 215,623"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+8.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -159 · 기 +1,154 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+41%"}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.99% (환산) vs 평균 2.17% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 304,000"}, {"label": "거래량 급증", "ok": false, "detail": "4,694,733 (환산) vs 평균 3,404,288"}, {"label": "회전율 급증", "ok": false, "detail": "2.99% (환산) vs 평균 2.17%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 233,744 (현재 233,500)"}]}
{"ts": "2026-06-12T10:25:04.174047+09:00", "side": "BUY", "code": "035420", "name": "NAVER", "price": 244500, "qty": 13, "cost": 3178977, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 197616, "target": 302268, "signals": [{"label": "손절선", "ok": true, "detail": "197,616 (현재 244,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 302,268"}, {"label": "추세(20일선)", "ok": true, "detail": "225,370"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -116 · 기 +1,185"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 244,128"}]}
{"ts": "2026-06-17T16:47:28.507097+09:00", "side": "BUY", "code": "403870", "name": "HPSP", "price": 62900, "qty": 47, "cost": 2956743, "path": "pullback", "reason": "눌림목 지정가 64,531 도달", "stop": 52447, "target": 83807, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "62,800 vs 52,858"}, {"label": "정배열(5>20)", "ok": true, "detail": "59,880 / 52,858"}, {"label": "추세 기울기(20일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "59,880 / 49,831"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+21.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -4,434 · 기 +5,040 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+9%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "11.31% vs 평균 5.97% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 71,500"}, {"label": "거래량 급증", "ok": false, "detail": "9,309,211 vs 평균 4,912,598"}, {"label": "회전율 급증", "ok": true, "detail": "11.31% vs 평균 5.97%"}, {"label": "RSI", "ok": true, "detail": "58"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 64,531 (현재 62,800)"}]}
{"ts": "2026-06-19T09:02:06.348139+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19160, "qty": 326, "cost": 6247097, "path": "pullback", "reason": "눌림목 지정가 20,044 도달", "stop": 18100, "target": 21279, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "19,150 vs 18,862"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,616 / 18,862"}, {"label": "추세 기울기(20일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,616 / 19,361"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-31.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,162 · 기 +2,080 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.03% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "37,673 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.03% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 20,044 (현재 19,150)"}]}
{"ts": "2026-06-23T09:00:09.447545+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18820, "qty": 326, "proceeds": 6123356, "entry_price": 19160, "pnl": -123741, "pnl_pct": -1.77, "hold_from": "2026-06-19T09:02:06.348137+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "18,100 (현재 18,710)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,279"}, {"label": "추세(20일선)", "ok": false, "detail": "18,840"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -318 · 기 -227"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,528"}]}
{"ts": "2026-06-23T15:10:02.424604+09:00", "side": "SELL", "code": "035420", "name": "NAVER", "price": 203000, "qty": 27, "proceeds": 5470312, "entry_price": 238278, "pnl": -964153, "pnl_pct": -14.81, "hold_from": "2026-06-12T09:00:34.009427+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "203,394 (현재 203,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 308,046"}, {"label": "추세(20일선)", "ok": false, "detail": "231,595"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +408 · 기 -163"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-06-24T09:04:06.114453+09:00", "side": "SELL", "code": "403870", "name": "HPSP", "price": 52300, "qty": 47, "proceeds": 2453307, "entry_price": 62900, "pnl": -503437, "pnl_pct": -16.85, "hold_from": "2026-06-17T16:47:28.507089+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "52,447 (현재 52,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 83,807"}, {"label": "추세(20일선)", "ok": false, "detail": "52,332"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +711 · 기 -2,060"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 66,717"}]}
{"ts": "2026-06-24T09:04:06.114580+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 156700, "qty": 17, "cost": 2664300, "path": "pullback", "reason": "눌림목 지정가 165,075 도달", "stop": 129363, "target": 211374, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "156,200 vs 121,650"}, {"label": "정배열(5>20)", "ok": true, "detail": "143,260 / 121,650"}, {"label": "추세 기울기(20일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "143,260 / 121,703"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+46.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +210 · 기 +143 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+6%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "5.83% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": true, "detail": "2,860,073 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": true, "detail": "5.83% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 165,075 (현재 156,200)"}]}
{"ts": "2026-06-24T09:12:05.349711+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 17270, "qty": 199, "cost": 3437246, "path": "pullback", "reason": "눌림목 지정가 17,366 도달", "stop": 14804, "target": 22203, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "17,280 vs 12,914"}, {"label": "정배열(5>20)", "ok": true, "detail": "16,364 / 12,914"}, {"label": "추세 기울기(20일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "16,364 / 11,500"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+21.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +1,740 · 기 -508 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+16%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.34% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": false, "detail": "2,509,340 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": false, "detail": "2.34% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "65"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 17,366 (현재 17,280)"}]}
{"ts": "2026-06-24T09:46:04.781319+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 158200, "qty": 17, "cost": 2689803, "path": "pullback", "reason": "눌림목 지정가 158,264 도달", "stop": 130097, "target": 214407, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "158,000 vs 136,315"}, {"label": "정배열(5>20)", "ok": true, "detail": "172,240 / 136,315"}, {"label": "추세 기울기(20일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "172,240 / 99,750"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+56.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +41 · 기 +65 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+5%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "4.25% (환산) vs 평균 3.06% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 202,500"}, {"label": "거래량 급증", "ok": false, "detail": "822,940 (환산) vs 평균 591,925"}, {"label": "회전율 급증", "ok": false, "detail": "4.25% (환산) vs 평균 3.06%"}, {"label": "RSI", "ok": true, "detail": "61"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 158,264 (현재 158,000)"}]}
{"ts": "2026-06-24T11:12:05.898443+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 18260, "qty": 188, "cost": 3433395, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 14804, "target": 22203, "signals": [{"label": "손절선", "ok": true, "detail": "14,804 (현재 18,250)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,203"}, {"label": "추세(20일선)", "ok": true, "detail": "12,962"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +1,742 · 기 -508"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 18,094"}]}
{"ts": "2026-06-25T09:00:23.578154+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 179100, "qty": 15, "cost": 2686903, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 130097, "target": 214407, "signals": [{"label": "손절선", "ok": true, "detail": "130,097 (현재 178,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 214,407"}, {"label": "추세(20일선)", "ok": true, "detail": "137,330"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -56 · 기 +134"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 167,275"}]}
{"ts": "2026-06-25T09:02:04.071867+09:00", "side": "BUY", "code": "403870", "name": "HPSP", "price": 53200, "qty": 49, "cost": 2607191, "path": "pullback", "reason": "눌림목 지정가 63,881 도달", "stop": 43200, "target": 73200, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "53,300 vs 52,382"}, {"label": "정배열(5>20)", "ok": true, "detail": "57,980 / 52,382"}, {"label": "추세 기울기(20일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "57,980 / 49,672"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+15.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +406 · 기 -1,461 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+29%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.21% (환산) vs 평균 5.97% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 71,500"}, {"label": "거래량 급증", "ok": false, "detail": "1,819,047 (환산) vs 평균 4,912,598"}, {"label": "회전율 급증", "ok": false, "detail": "2.21% (환산) vs 평균 5.97%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 63,881 (현재 53,300)"}]}
{"ts": "2026-06-26T09:00:05.688310+09:00", "side": "SELL", "code": "403870", "name": "HPSP", "price": 50000, "qty": 49, "proceeds": 2445222, "entry_price": 53200, "pnl": -161969, "pnl_pct": -6.02, "hold_from": "2026-06-25T09:02:04.071865+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "43,200 (현재 51,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 73,200"}, {"label": "추세(20일선)", "ok": false, "detail": "52,268"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -311 · 기 -267"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 57,056"}]}
{"ts": "2026-06-26T10:14:04.059906+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 166900, "qty": 16, "cost": 2670801, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 129363, "target": 211374, "signals": [{"label": "손절선", "ok": true, "detail": "129,363 (현재 166,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 211,374"}, {"label": "추세(20일선)", "ok": true, "detail": "122,175"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -126 · 기 +320"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 165,659"}]}
{"ts": "2026-06-29T11:36:01.264617+09:00", "side": "BUY", "code": "034730", "name": "SK", "price": 745000, "qty": 4, "cost": 2980447, "path": "pullback", "reason": "눌림목 지정가 748,914 도달", "stop": 645871, "target": 943257, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "744,000 vs 676,650"}, {"label": "정배열(5>20)", "ok": true, "detail": "766,800 / 676,650"}, {"label": "추세 기울기(20일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "766,800 / 530,600"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+12.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -194 · 기 +152 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+8%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.35% (환산) vs 평균 0.45% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 883,000"}, {"label": "거래량 급증", "ok": true, "detail": "977,966 (환산) vs 평균 329,863"}, {"label": "회전율 급증", "ok": true, "detail": "1.35% (환산) vs 평균 0.45%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 748,914 (현재 744,000)"}]}
{"ts": "2026-06-29T14:18:01.484808+09:00", "side": "BUY", "code": "034730", "name": "SK", "price": 778000, "qty": 4, "cost": 3112467, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 645871, "target": 943257, "signals": [{"label": "손절선", "ok": true, "detail": "645,871 (현재 779,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 943,257"}, {"label": "추세(20일선)", "ok": true, "detail": "678,400"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -200 · 기 +143"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 778,043"}]}
{"ts": "2026-06-30T09:00:05.639912+09:00", "side": "BUY", "code": "403870", "name": "HPSP", "price": 55300, "qty": 43, "cost": 2378257, "path": "pullback", "reason": "눌림목 지정가 63,981 도달", "stop": 44022, "target": 77857, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "53,700 vs 52,402"}, {"label": "정배열(5>20)", "ok": true, "detail": "58,060 / 52,402"}, {"label": "추세 기울기(20일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "58,060 / 49,679"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+12.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +222 · 기 -821 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+28%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.00% (환산) vs 평균 5.97% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 71,500"}, {"label": "거래량 급증", "ok": false, "detail": "827 (환산) vs 평균 4,912,598"}, {"label": "회전율 급증", "ok": false, "detail": "0.00% (환산) vs 평균 5.97%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 63,981 (현재 53,700)"}]}
{"ts": "2026-07-01T09:06:03.209135+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 357500, "qty": 15, "cost": 5363304, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 325040, "target": 422420, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "357,000 vs 296,975"}, {"label": "정배열(5>20)", "ok": true, "detail": "317,600 / 296,975"}, {"label": "추세 기울기(20일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "317,600 / 305,700"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+32.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -75 · 기 +221 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+35%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.89% (환산) vs 평균 0.93% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 334,500"}, {"label": "거래량 급증", "ok": true, "detail": "196,247 (환산) vs 평균 96,436"}, {"label": "회전율 급증", "ok": true, "detail": "1.89% (환산) vs 평균 0.93%"}, {"label": "RSI", "ok": true, "detail": "68"}]}
{"ts": "2026-07-01T09:24:02.309730+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 372000, "qty": 14, "cost": 5208781, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 325040, "target": 422420, "signals": [{"label": "손절선", "ok": true, "detail": "325,040 (현재 372,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 422,420"}, {"label": "추세(20일선)", "ok": true, "detail": "297,725"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -75 · 기 +221"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 368,499"}]}
{"ts": "2026-07-01T11:06:02.351611+09:00", "side": "SELL", "code": "095610", "name": "테스", "price": 212000, "qty": 32, "proceeds": 6770771, "entry_price": 167997, "pnl": 1394065, "pnl_pct": 26.19, "hold_from": "2026-06-24T09:46:04.781317+09:00", "reason": "트레일링 익절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "213,193 (현재 213,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "139,065"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -229 · 기 +300"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-02T10:18:03.830979+09:00", "side": "BUY", "code": "009150", "name": "삼성전기", "price": 1985000, "qty": 3, "cost": 5955893, "path": "pullback", "reason": "눌림목 지정가 1,994,011 도달", "stop": 1901000, "target": 2153000, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "1,982,000 vs 1,967,800"}, {"label": "정배열(5>20)", "ok": true, "detail": "2,038,800 / 1,967,800"}, {"label": "추세 기울기(20일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "2,038,800 / 1,295,483"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+17.7%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +337 · 기 +193 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+6%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "4.19% (환산) vs 평균 1.76% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 2,417,000"}, {"label": "거래량 급증", "ok": true, "detail": "3,133,469 (환산) vs 평균 1,312,239"}, {"label": "회전율 급증", "ok": true, "detail": "4.19% (환산) vs 평균 1.76%"}, {"label": "RSI", "ok": true, "detail": "56"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 1,994,011 (현재 1,982,000)"}]}
{"ts": "2026-07-02T10:34:04.117399+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 18860, "qty": 324, "cost": 6111557, "path": "pullback", "reason": "눌림목 지정가 19,970 도달", "stop": 17760, "target": 21060, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "18,860 vs 18,848"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,558 / 18,848"}, {"label": "추세 기울기(20일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,558 / 19,356"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+3.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -339 · 기 +110 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+35%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.80% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "924,985 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.80% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "48"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,970 (현재 18,860)"}]}
{"ts": "2026-07-02T11:20:02.053948+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 22550, "qty": 271, "cost": 6111967, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 17760, "target": 21060, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 19,350)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,060"}, {"label": "추세(20일선)", "ok": true, "detail": "18,872"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -339 · 기 +110"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,250"}]}
{"ts": "2026-07-02T11:22:01.962941+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 19000, "qty": 595, "proceeds": 11282955, "entry_price": 20541, "pnl": -940568, "pnl_pct": -7.5, "hold_from": "2026-07-02T10:34:04.117397+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "19,371 (현재 19,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,881"}, {"label": "추세(20일선)", "ok": true, "detail": "18,860"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -339 · 기 +110"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-02T12:42:02.217684+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 15250, "qty": 387, "proceeds": 5890242, "entry_price": 17751, "pnl": -980399, "pnl_pct": -14.09, "hold_from": "2026-06-24T09:12:05.349710+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "15,280 (현재 15,280)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,692"}, {"label": "추세(20일선)", "ok": true, "detail": "12,814"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -1,920 · 기 +434"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-02T14:28:02.056486+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 134800, "qty": 33, "proceeds": 4439726, "entry_price": 161645, "pnl": -895375, "pnl_pct": -16.61, "hold_from": "2026-06-24T09:04:06.114579+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "134,769 (현재 134,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 215,398"}, {"label": "추세(20일선)", "ok": true, "detail": "120,575"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +395 · 기 -1,516"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-02T15:04:06.183065+09:00", "side": "SELL", "code": "403870", "name": "HPSP", "price": 43900, "qty": 43, "proceeds": 1884019, "entry_price": 55300, "pnl": -494238, "pnl_pct": -20.61, "hold_from": "2026-06-30T09:00:05.639905+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "44,022 (현재 43,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 77,857"}, {"label": "추세(20일선)", "ok": false, "detail": "51,912"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +2,379 · 기 -6,625"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 59,411"}]}
{"ts": "2026-07-03T09:00:08.430585+09:00", "side": "SELL", "code": "009150", "name": "삼성전기", "price": 1895000, "qty": 3, "proceeds": 5673914, "entry_price": 1985000, "pnl": -281979, "pnl_pct": -4.53, "hold_from": "2026-07-02T10:18:03.830976+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "1,901,000 (현재 1,894,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 2,153,000"}, {"label": "추세(20일선)", "ok": false, "detail": "1,963,400"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +132 · 기 +129"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 2,084,495"}]}
{"ts": "2026-07-03T09:02:04.917379+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 133400, "qty": 16, "cost": 2134720, "path": "pullback", "reason": "눌림목 지정가 163,875 도달", "stop": 104263, "target": 191674, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "133,300 vs 120,505"}, {"label": "정배열(5>20)", "ok": true, "detail": "138,680 / 120,505"}, {"label": "추세 기울기(20일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "138,680 / 121,322"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+18.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +674 · 기 -2,170 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+31%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.16% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": false, "detail": "571,607 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": false, "detail": "1.16% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "52"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 163,875 (현재 133,300)"}]}
{"ts": "2026-07-03T09:02:04.917552+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 14660, "qty": 173, "cost": 2536560, "path": "pullback", "reason": "눌림목 지정가 17,179 도달", "stop": 11914, "target": 20152, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "14,680 vs 12,784"}, {"label": "정배열(5>20)", "ok": true, "detail": "15,844 / 12,784"}, {"label": "추세 기울기(20일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "15,844 / 11,456"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+12.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,591 · 기 +253 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+36%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.92% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": false, "detail": "991,593 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": false, "detail": "0.92% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "55"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 17,179 (현재 14,680)"}]}
{"ts": "2026-07-03T09:10:03.668540+09:00", "side": "SELL", "code": "034730", "name": "SK", "price": 656000, "qty": 8, "proceeds": 5237766, "entry_price": 761500, "pnl": -855147, "pnl_pct": -13.85, "hold_from": "2026-06-29T11:36:01.264615+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "662,371 (현재 657,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 959,757"}, {"label": "추세(20일선)", "ok": false, "detail": "672,300"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -51 · 기 +3"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-03T09:50:01.665084+09:00", "side": "SELL", "code": "214450", "name": "파마리서치", "price": 328500, "qty": 29, "proceeds": 9507923, "entry_price": 364500, "pnl": -1064162, "pnl_pct": -9.88, "hold_from": "2026-07-01T09:06:03.209133+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "331,504 (현재 331,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 430,491"}, {"label": "추세(20일선)", "ok": true, "detail": "295,675"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -127 · 기 +294"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-03T10:24:02.770189+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19040, "qty": 308, "cost": 5865200, "path": "pullback", "reason": "눌림목 지정가 20,004 도달", "stop": 17921, "target": 21277, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "19,030 vs 18,856"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,592 / 18,856"}, {"label": "추세 기울기(20일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,592 / 19,359"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+2.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -35 · 기 +168 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+34%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.54% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "619,193 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.54% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "49"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 20,004 (현재 19,030)"}]}
{"ts": "2026-07-06T09:00:08.148622+09:00", "side": "BUY", "code": "009150", "name": "삼성전기", "price": 1993000, "qty": 2, "cost": 3986598, "path": "pullback", "reason": "눌림목 지정가 1,995,439 도달", "stop": 1901000, "target": 2177000, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "1,975,000 vs 1,967,450"}, {"label": "정배열(5>20)", "ok": true, "detail": "2,037,400 / 1,967,450"}, {"label": "추세 기울기(20일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "2,037,400 / 1,295,367"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+9.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +151 · 기 +57 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+9%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.82% (환산) vs 평균 1.76% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 2,417,000"}, {"label": "거래량 급증", "ok": false, "detail": "615,080 (환산) vs 평균 1,312,239"}, {"label": "회전율 급증", "ok": false, "detail": "0.82% (환산) vs 평균 1.76%"}, {"label": "RSI", "ok": true, "detail": "55"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 1,995,439 (현재 1,975,000)"}]}
{"ts": "2026-07-06T09:00:08.151514+09:00", "side": "BUY", "code": "034730", "name": "SK", "price": 690000, "qty": 5, "cost": 3450518, "path": "pullback", "reason": "눌림목 지정가 747,129 도달", "stop": 604000, "target": 862000, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "695,000 vs 674,200"}, {"label": "정배열(5>20)", "ok": true, "detail": "757,000 / 674,200"}, {"label": "추세 기울기(20일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "757,000 / 529,783"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+3.7%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -81 · 기 +57 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+21%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.17% (환산) vs 평균 0.45% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 883,000"}, {"label": "거래량 급증", "ok": false, "detail": "124,240 (환산) vs 평균 329,863"}, {"label": "회전율 급증", "ok": false, "detail": "0.17% (환산) vs 평균 0.45%"}, {"label": "RSI", "ok": true, "detail": "54"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 747,129 (현재 695,000)"}]}
{"ts": "2026-07-06T09:34:02.056068+09:00", "side": "BUY", "code": "003490", "name": "대한항공", "price": 29100, "qty": 200, "cost": 5820873, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 27052, "target": 33195, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "29,100 vs 25,960"}, {"label": "정배열(5>20)", "ok": true, "detail": "26,160 / 25,960"}, {"label": "추세 기울기(20일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "26,160 / 25,220"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-3.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -142 · 기 +2,052 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.9/5"}, {"label": "상승여력", "ok": true, "detail": "+19%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.31% (환산) vs 평균 0.58% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 28,400"}, {"label": "거래량 급증", "ok": true, "detail": "4,788,480 (환산) vs 평균 2,146,231"}, {"label": "회전율 급증", "ok": true, "detail": "1.31% (환산) vs 평균 0.58%"}, {"label": "RSI", "ok": true, "detail": "65"}]}
{"ts": "2026-07-06T10:06:01.980443+09:00", "side": "SELL", "code": "009150", "name": "삼성전기", "price": 1900000, "qty": 2, "proceeds": 3792590, "entry_price": 1993000, "pnl": -194008, "pnl_pct": -4.67, "hold_from": "2026-07-06T09:00:08.148616+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "1,901,000 (현재 1,901,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 2,177,000"}, {"label": "추세(20일선)", "ok": false, "detail": "1,963,750"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +135 · 기 +46"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 2,089,780"}]}
{"ts": "2026-07-07T09:12:07.264150+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 155900, "qty": 16, "cost": 2494774, "path": "pullback", "reason": "눌림목 지정가 158,314 도달", "stop": 127872, "target": 211957, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "155,800 vs 136,205"}, {"label": "정배열(5>20)", "ok": true, "detail": "171,800 / 136,205"}, {"label": "추세 기울기(20일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "171,800 / 99,713"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+43.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +80 · 기 -197 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+14%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "3.33% (환산) vs 평균 3.06% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 202,500"}, {"label": "거래량 급증", "ok": false, "detail": "645,567 (환산) vs 평균 591,925"}, {"label": "회전율 급증", "ok": false, "detail": "3.33% (환산) vs 평균 3.06%"}, {"label": "RSI", "ok": true, "detail": "60"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 158,314 (현재 155,800)"}]}
{"ts": "2026-07-07T12:02:08.178098+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 12230, "qty": 173, "proceeds": 2111664, "entry_price": 14660, "pnl": -424896, "pnl_pct": -16.58, "hold_from": "2026-07-03T09:02:04.917551+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "11,914 (현재 12,230)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 20,152"}, {"label": "추세(20일선)", "ok": false, "detail": "12,661"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -1,558 · 기 -4"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 15,662"}]}
{"ts": "2026-07-07T14:08:24.985266+09:00", "side": "SELL", "code": "003490", "name": "대한항공", "price": 26600, "qty": 200, "proceeds": 5309626, "entry_price": 29100, "pnl": -511247, "pnl_pct": -8.59, "hold_from": "2026-07-06T09:34:02.056065+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "27,052 (현재 26,600)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 33,195"}, {"label": "추세(20일선)", "ok": true, "detail": "25,870"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -532 · 기 +3,040"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 29,724"}]}
{"ts": "2026-07-07T14:08:27.625222+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 183300, "qty": 11, "cost": 2016602, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 104263, "target": 191674, "signals": [{"label": "손절선", "ok": true, "detail": "104,263 (현재 183,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 191,674"}, {"label": "추세(20일선)", "ok": true, "detail": "120,210"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +263 · 기 -1,543"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 141,825"}]}
{"ts": "2026-07-07T14:08:27.626449+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 177000, "qty": 14, "cost": 2478372, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 127872, "target": 211957, "signals": [{"label": "손절선", "ok": true, "detail": "127,872 (현재 177,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 211,957"}, {"label": "추세(20일선)", "ok": true, "detail": "134,320"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +152 · 기 -281"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 165,142"}]}
{"ts": "2026-07-07T14:08:30.307609+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 20750, "qty": 282, "cost": 5852378, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 17921, "target": 21277, "signals": [{"label": "손절선", "ok": true, "detail": "17,921 (현재 20,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,277"}, {"label": "추세(20일선)", "ok": true, "detail": "18,884"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +156 · 기 +113"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,358"}]}
{"ts": "2026-07-07T14:08:30.308497+09:00", "side": "BUY", "code": "034730", "name": "SK", "price": 815000, "qty": 4, "cost": 3260489, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 604000, "target": 862000, "signals": [{"label": "손절선", "ok": true, "detail": "604,000 (현재 815,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 862,000"}, {"label": "추세(20일선)", "ok": true, "detail": "673,250"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -44 · 기 +3"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 721,777"}]}
{"ts": "2026-07-08T09:00:17.141650+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 108300, "qty": 27, "proceeds": 2918398, "entry_price": 153730, "pnl": -1232925, "pnl_pct": -29.55, "hold_from": "2026-07-03T09:02:04.917377+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "128,455 (현재 112,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 204,279"}, {"label": "추세(20일선)", "ok": false, "detail": "119,475"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +243 · 기 -857"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-08T09:00:17.142747+09:00", "side": "SELL", "code": "095610", "name": "테스", "price": 137900, "qty": 30, "proceeds": 4128933, "entry_price": 165747, "pnl": -844213, "pnl_pct": -16.8, "hold_from": "2026-07-07T09:12:07.264149+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "138,020 (현재 137,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 221,200"}, {"label": "추세(20일선)", "ok": true, "detail": "135,310"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +458 · 기 -572"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-08T09:00:17.143299+09:00", "side": "SELL", "code": "034730", "name": "SK", "price": 602000, "qty": 9, "proceeds": 5407435, "entry_price": 745556, "pnl": -1303572, "pnl_pct": -19.25, "hold_from": "2026-07-06T09:00:08.151507+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "650,225 (현재 602,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 936,217"}, {"label": "추세(20일선)", "ok": false, "detail": "669,550"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +49 · 기 -19"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-08T09:12:05.961489+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18900, "qty": 590, "proceeds": 11129256, "entry_price": 19857, "pnl": -588322, "pnl_pct": -4.82, "hold_from": "2026-07-03T10:24:02.770188+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "18,903 (현재 18,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,766"}, {"label": "추세(20일선)", "ok": true, "detail": "18,850"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +193 · 기 +193"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-08T09:48:01.868099+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 161100, "qty": 34, "cost": 5478222, "path": "pullback", "reason": "눌림목 지정가 168,676 도달", "stop": 158000, "target": 167300, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "161,600 vs 149,870"}, {"label": "정배열(5>20)", "ok": true, "detail": "169,960 / 149,870"}, {"label": "추세 기울기(20일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "169,960 / 113,252"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+77.7%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +198 · 기 -309 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+11%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "3.83% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": false, "detail": "1,110,233 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": false, "detail": "3.83% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "56"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 168,676 (현재 161,600)"}]}
{"ts": "2026-07-08T10:26:01.962983+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 157600, "qty": 34, "proceeds": 5347951, "entry_price": 161100, "pnl": -130270, "pnl_pct": -2.17, "hold_from": "2026-07-08T09:48:01.868097+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "158,000 (현재 158,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 167,300"}, {"label": "추세(20일선)", "ok": true, "detail": "149,690"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +198 · 기 -312"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 170,862"}]}
{"ts": "2026-07-09T09:02:04.457277+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 144400, "qty": 14, "cost": 2021903, "path": "pullback", "reason": "눌림목 지정가 156,479 도달", "stop": 113618, "target": 205964, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "144,400 vs 135,635"}, {"label": "정배열(5>20)", "ok": true, "detail": "169,520 / 135,635"}, {"label": "추세 기울기(20일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "169,520 / 99,523"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+42.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +503 · 기 -501 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+23%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.94% (환산) vs 평균 3.06% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 202,500"}, {"label": "거래량 급증", "ok": false, "detail": "569,187 (환산) vs 평균 591,925"}, {"label": "회전율 급증", "ok": false, "detail": "2.94% (환산) vs 평균 3.06%"}, {"label": "RSI", "ok": true, "detail": "55"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 156,479 (현재 144,400)"}]}
{"ts": "2026-07-09T09:02:04.457421+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19110, "qty": 290, "cost": 5542731, "path": "pullback", "reason": "눌림목 지정가 20,021 도달", "stop": 18017, "target": 21296, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "19,070 vs 18,858"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,600 / 18,858"}, {"label": "추세 기울기(20일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,600 / 19,360"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+0.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -10 · 기 +164 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.08% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "93,540 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.08% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 20,021 (현재 19,070)"}]}
{"ts": "2026-07-09T09:02:04.457549+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 158300, "qty": 35, "cost": 5541331, "path": "pullback", "reason": "눌림목 지정가 168,455 도달", "stop": 158000, "target": 158900, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "158,200 vs 149,700"}, {"label": "정배열(5>20)", "ok": true, "detail": "169,280 / 149,700"}, {"label": "추세 기울기(20일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "169,280 / 113,195"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+81.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +296 · 기 -306 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+13%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.72% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": false, "detail": "499,233 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": false, "detail": "1.72% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "55"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 168,455 (현재 158,200)"}]}
{"ts": "2026-07-09T09:12:02.503058+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 156900, "qty": 35, "proceeds": 5480792, "entry_price": 158300, "pnl": -60540, "pnl_pct": -0.88, "hold_from": "2026-07-09T09:02:04.457547+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "158,000 (현재 156,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "149,635"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +296 · 기 -306"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-09T09:36:03.452342+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 132000, "qty": 39, "cost": 5148772, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 120761, "target": 154477, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "131,900 vs 108,920"}, {"label": "정배열(5>20)", "ok": true, "detail": "115,560 / 108,920"}, {"label": "추세 기울기(20일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "115,560 / 113,228"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+22.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -184 · 기 +964 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+13%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.91% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 116,900"}, {"label": "거래량 급증", "ok": true, "detail": "1,026,867 (환산) vs 평균 359,705"}, {"label": "회전율 급증", "ok": true, "detail": "0.91% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-07-10T09:00:10.854533+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 158000, "qty": 13, "cost": 2054308, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 113618, "target": 205964, "signals": [{"label": "손절선", "ok": true, "detail": "113,618 (현재 157,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 205,964"}, {"label": "추세(20일선)", "ok": true, "detail": "136,265"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +452 · 기 -360"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 154,000"}]}
{"ts": "2026-07-10T09:00:10.855604+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 164000, "qty": 33, "cost": 5412812, "path": "pullback", "reason": "눌림목 지정가 169,105 도달", "stop": 158000, "target": 176000, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "162,200 vs 149,900"}, {"label": "정배열(5>20)", "ok": true, "detail": "170,080 / 149,900"}, {"label": "추세 기울기(20일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "170,080 / 113,262"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+85.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +225 · 기 -178 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+10%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.58% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": false, "detail": "746,107 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": false, "detail": "2.58% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "56"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 169,105 (현재 162,200)"}]}
{"ts": "2026-07-10T09:28:02.614093+09:00", "side": "BUY", "code": "105560", "name": "KB금융", "price": 185900, "qty": 29, "cost": 5391909, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 171311, "target": 215077, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "185,600 vs 159,890"}, {"label": "정배열(5>20)", "ok": true, "detail": "159,900 / 159,890"}, {"label": "추세 기울기(20일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "159,900 / 157,368"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+26.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,310 · 기 +1,527 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+16%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.06% (환산) vs 평균 0.46% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 182,700"}, {"label": "거래량 급증", "ok": true, "detail": "3,715,113 (환산) vs 평균 1,640,325"}, {"label": "회전율 급증", "ok": true, "detail": "1.06% (환산) vs 평균 0.46%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-07-10T09:46:11.469025+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 12830, "qty": 179, "cost": 2296914, "path": "pullback", "reason": "눌림목 지정가 16,984 도달", "stop": 10360, "target": 17770, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "12,820 vs 12,690"}, {"label": "정배열(5>20)", "ok": true, "detail": "15,472 / 12,690"}, {"label": "추세 기울기(20일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "15,472 / 11,425"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+1.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +228 · 기 +229 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+56%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "9.75% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": true, "detail": "10,460,473 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": true, "detail": "9.75% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 16,984 (현재 12,820)"}]}
{"ts": "2026-07-10T10:14:04.432989+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 173600, "qty": 32, "cost": 5556033, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 158000, "target": 176000, "signals": [{"label": "손절선", "ok": true, "detail": "158,000 (현재 173,600)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 176,000"}, {"label": "추세(20일선)", "ok": true, "detail": "150,470"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +205 · 기 -155"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 173,548"}]}
{"ts": "2026-07-10T11:16:02.469865+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 13850, "qty": 166, "cost": 2299445, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 10360, "target": 17770, "signals": [{"label": "손절선", "ok": true, "detail": "10,360 (현재 13,850)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 17,770"}, {"label": "추세(20일선)", "ok": true, "detail": "12,742"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +210 · 기 +239"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,843"}]}
{"ts": "2026-07-10T12:14:02.666464+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 126200, "qty": 15, "cost": 1893284, "path": "pullback", "reason": "눌림목 지정가 162,268 도달", "stop": 96000, "target": 186600, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "126,200 vs 120,150"}, {"label": "정배열(5>20)", "ok": true, "detail": "137,260 / 120,150"}, {"label": "추세 기울기(20일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "137,260 / 121,203"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+17.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +483 · 기 -241 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+38%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "7.53% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": true, "detail": "3,695,762 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": true, "detail": "7.53% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 162,268 (현재 126,200)"}]}
{"ts": "2026-07-13T09:00:09.888217+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 136900, "qty": 38, "cost": 5202980, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 120761, "target": 154477, "signals": [{"label": "손절선", "ok": true, "detail": "120,761 (현재 136,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 154,477"}, {"label": "추세(20일선)", "ok": true, "detail": "109,140"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -64 · 기 +919"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 135,864"}]}
{"ts": "2026-07-13T09:12:04.294393+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 341500, "qty": 15, "cost": 5123268, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 310647, "target": 403206, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "341,000 vs 296,175"}, {"label": "정배열(5>20)", "ok": true, "detail": "314,400 / 296,175"}, {"label": "추세 기울기(20일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "314,400 / 305,433"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+32.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -63 · 기 +144 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+41%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.90% (환산) vs 평균 0.93% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 334,500"}, {"label": "거래량 급증", "ok": true, "detail": "197,687 (환산) vs 평균 96,436"}, {"label": "회전율 급증", "ok": true, "detail": "1.90% (환산) vs 평균 0.93%"}, {"label": "RSI", "ok": true, "detail": "64"}]}
{"ts": "2026-07-13T09:26:03.405300+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 139100, "qty": 13, "cost": 1808571, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 96000, "target": 186600, "signals": [{"label": "손절선", "ok": true, "detail": "96,000 (현재 139,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 186,600"}, {"label": "추세(20일선)", "ok": true, "detail": "120,795"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -213 · 기 +772"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 136,162"}]}
{"ts": "2026-07-13T09:36:02.268298+09:00", "side": "BUY", "code": "105560", "name": "KB금융", "price": 191000, "qty": 29, "cost": 5539831, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 171311, "target": 215077, "signals": [{"label": "손절선", "ok": true, "detail": "171,311 (현재 191,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 215,077"}, {"label": "추세(20일선)", "ok": true, "detail": "160,160"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -867 · 기 +1,393"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 190,952"}]}
{"ts": "2026-07-13T12:44:04.349246+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 187900, "qty": 65, "proceeds": 12189684, "entry_price": 168726, "pnl": 1220839, "pnl_pct": 11.36, "hold_from": "2026-07-10T09:00:10.855598+09:00", "reason": "트레일링 익절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "189,133 (현재 187,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "151,185"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -254 · 기 +457"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-14T10:20:06.141551+09:00", "side": "SELL", "code": "214450", "name": "파마리서치", "price": 310500, "qty": 15, "proceeds": 4648418, "entry_price": 341500, "pnl": -474851, "pnl_pct": -9.08, "hold_from": "2026-07-13T09:12:04.294392+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "310,647 (현재 310,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 403,206"}, {"label": "추세(20일선)", "ok": true, "detail": "294,650"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -50 · 기 +82"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 351,713"}]}
{"ts": "2026-07-16T09:00:08.249132+09:00", "side": "SELL", "code": "095610", "name": "테스", "price": 209000, "qty": 27, "proceeds": 5631996, "entry_price": 150948, "pnl": 1555785, "pnl_pct": 38.46, "hold_from": "2026-07-09T09:02:04.457275+09:00", "reason": "트레일링 익절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "210,764 (현재 207,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "138,765"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -799 · 기 +891"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-16T09:00:08.249940+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18580, "qty": 290, "proceeds": 5377693, "entry_price": 19110, "pnl": -165038, "pnl_pct": -2.77, "hold_from": "2026-07-09T09:02:04.457419+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "18,017 (현재 18,560)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,296"}, {"label": "추세(20일선)", "ok": false, "detail": "18,832"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -120 · 기 -150"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,486"}]}
{"ts": "2026-07-16T09:38:02.508846+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 138900, "qty": 40, "cost": 5556833, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 128529, "target": 159642, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "138,800 vs 119,185"}, {"label": "정배열(5>20)", "ok": true, "detail": "124,360 / 119,185"}, {"label": "추세 기울기(20일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "124,360 / 118,712"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+40.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +71 · 기 +417 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+17%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.76% (환산) vs 평균 0.37% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 130,700"}, {"label": "거래량 급증", "ok": true, "detail": "2,097,713 (환산) vs 평균 1,026,357"}, {"label": "회전율 급증", "ok": true, "detail": "0.76% (환산) vs 평균 0.37%"}, {"label": "RSI", "ok": true, "detail": "67"}]}
{"ts": "2026-07-20T09:04:02.871730+09:00", "side": "SELL", "code": "105560", "name": "KB금융", "price": 173000, "qty": 58, "proceeds": 10014434, "entry_price": 188450, "pnl": -917306, "pnl_pct": -8.2, "hold_from": "2026-07-10T09:28:02.614091+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "173,293 (현재 173,200)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 218,763"}, {"label": "추세(20일선)", "ok": true, "detail": "159,270"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -332 · 기 +291"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-20T12:28:02.310171+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 10310, "qty": 345, "proceeds": 3550014, "entry_price": 13321, "pnl": -1046345, "pnl_pct": -22.6, "hold_from": "2026-07-10T09:46:11.469023+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "10,360 (현재 10,310)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 19,242"}, {"label": "추세(20일선)", "ok": false, "detail": "14,755"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -887 · 기 +515"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-21T09:06:03.147127+09:00", "side": "SELL", "code": "086790", "name": "하나금융지주", "price": 127800, "qty": 40, "proceeds": 5102032, "entry_price": 138900, "pnl": -454802, "pnl_pct": -7.99, "hold_from": "2026-07-16T09:38:02.508844+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "128,529 (현재 127,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 159,642"}, {"label": "추세(20일선)", "ok": true, "detail": "118,640"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +121 · 기 +190"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 142,068"}]}
{"ts": "2026-07-21T10:12:01.040324+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 167000, "qty": 33, "cost": 5511827, "path": "pullback", "reason": "눌림목 지정가 169,640 도달", "stop": 158000, "target": 185000, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "167,000 vs 150,140"}, {"label": "정배열(5>20)", "ok": true, "detail": "171,040 / 150,140"}, {"label": "추세 기울기(20일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "171,040 / 113,342"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+92.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -534 · 기 +316 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+7%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "3.29% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": false, "detail": "951,819 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": false, "detail": "3.29% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "58"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 169,640 (현재 167,000)"}]}
{"ts": "2026-07-21T12:06:01.164333+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 344500, "qty": 14, "cost": 4823723, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 313808, "target": 405884, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "344,500 vs 296,350"}, {"label": "정배열(5>20)", "ok": true, "detail": "315,100 / 296,350"}, {"label": "추세 기울기(20일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "315,100 / 305,492"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+39.7%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -7 · 기 +1 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+43%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.38% (환산) vs 평균 0.93% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 334,500"}, {"label": "거래량 급증", "ok": true, "detail": "247,158 (환산) vs 평균 96,436"}, {"label": "회전율 급증", "ok": true, "detail": "2.38% (환산) vs 평균 0.93%"}, {"label": "RSI", "ok": true, "detail": "65"}]}
{"ts": "2026-07-22T09:00:06.709714+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 177600, "qty": 31, "cost": 5506426, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 158000, "target": 185000, "signals": [{"label": "손절선", "ok": true, "detail": "158,000 (현재 178,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 185,000"}, {"label": "추세(20일선)", "ok": true, "detail": "150,715"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -377 · 기 +151"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 175,894"}]}
{"ts": "2026-07-22T09:04:01.813458+09:00", "side": "BUY", "code": "161890", "name": "한국콜마", "price": 99200, "qty": 56, "cost": 5556033, "path": "pullback", "reason": "눌림목 지정가 98,848 도달", "stop": 92100, "target": 113400, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "98,800 vs 98,505"}, {"label": "정배열(5>20)", "ok": true, "detail": "107,060 / 98,505"}, {"label": "추세 기울기(20일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "107,060 / 91,913"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+27.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +29 · 기 -34 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.16% (환산) vs 평균 1.76% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 124,600"}, {"label": "거래량 급증", "ok": false, "detail": "272,433 (환산) vs 평균 415,172"}, {"label": "회전율 급증", "ok": false, "detail": "1.16% (환산) vs 평균 1.76%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 98,848 (현재 98,800)"}]}
{"ts": "2026-07-22T12:12:00.734253+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 157300, "qty": 64, "proceeds": 10047569, "entry_price": 172134, "pnl": -970684, "pnl_pct": -8.62, "hold_from": "2026-07-21T10:12:01.040322+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "158,000 (현재 157,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 200,403"}, {"label": "추세(20일선)", "ok": true, "detail": "149,655"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -407 · 기 +141"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-22T14:18:05.419864+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 14030, "qty": 197, "cost": 2764325, "path": "pullback", "reason": "눌림목 지정가 14,023 도달", "stop": 11815, "target": 18460, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "14,020 vs 12,776"}, {"label": "정배열(5>20)", "ok": true, "detail": "14,552 / 12,776"}, {"label": "추세 기울기(20일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "14,552 / 13,283"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+10.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,005 · 기 +1,723 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.97% (환산) vs 평균 1.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 15,870"}, {"label": "거래량 급증", "ok": false, "detail": "585,754 (환산) vs 평균 882,736"}, {"label": "회전율 급증", "ok": false, "detail": "0.97% (환산) vs 평균 1.47%"}, {"label": "RSI", "ok": true, "detail": "53"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 14,023 (현재 14,020)"}]}
{"ts": "2026-07-22T15:04:00.990876+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 158100, "qty": 15, "cost": 2371856, "path": "pullback", "reason": "눌림목 지정가 158,107 도달", "stop": 129761, "target": 214778, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "158,000 vs 136,315"}, {"label": "정배열(5>20)", "ok": true, "detail": "172,240 / 136,315"}, {"label": "추세 기울기(20일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "172,240 / 99,750"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+49.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -311 · 기 +22 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+24%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "5.02% (환산) vs 평균 3.06% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 202,500"}, {"label": "거래량 급증", "ok": false, "detail": "971,360 (환산) vs 평균 591,925"}, {"label": "회전율 급증", "ok": true, "detail": "5.02% (환산) vs 평균 3.06%"}, {"label": "RSI", "ok": true, "detail": "61"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 158,107 (현재 158,000)"}]}
{"ts": "2026-07-23T09:00:22.456369+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 160100, "qty": 34, "cost": 5444217, "path": "pullback", "reason": "눌림목 지정가 169,062 도달", "stop": 158000, "target": 164300, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "158,100 vs 149,695"}, {"label": "정배열(5>20)", "ok": true, "detail": "169,260 / 149,695"}, {"label": "추세 기울기(20일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "169,260 / 113,193"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+76.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -162 · 기 +37 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+13%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.05% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": false, "detail": "303,687 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": false, "detail": "1.05% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "55"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 169,062 (현재 158,100)"}]}
{"ts": "2026-07-23T09:32:04.406594+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 157800, "qty": 34, "proceeds": 5354738, "entry_price": 160100, "pnl": -89479, "pnl_pct": -1.44, "hold_from": "2026-07-23T09:00:22.456363+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "158,000 (현재 157,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "149,685"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -162 · 기 +37"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-23T09:44:04.277794+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 18850, "qty": 290, "cost": 5467320, "path": "pullback", "reason": "눌림목 지정가 20,001 도달", "stop": 17760, "target": 21030, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "18,850 vs 18,847"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,556 / 18,847"}, {"label": "추세 기울기(20일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,556 / 19,356"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+13.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -25 · 기 +6 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+34%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.34% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "388,767 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.34% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "48"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 20,001 (현재 18,850)"}]}
{"ts": "2026-07-23T09:50:01.509013+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 88200, "qty": 54, "cost": 4763514, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 80223, "target": 104155, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "88,200 vs 75,070"}, {"label": "정배열(5>20)", "ok": true, "detail": "83,000 / 75,070"}, {"label": "추세 기울기(20일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "83,000 / 75,058"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+47.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -150 · 기 +299 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+17%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.85% (환산) vs 평균 0.42% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 87,600"}, {"label": "거래량 급증", "ok": true, "detail": "785,587 (환산) vs 평균 392,182"}, {"label": "회전율 급증", "ok": true, "detail": "0.85% (환산) vs 평균 0.42%"}, {"label": "RSI", "ok": true, "detail": "67"}]}
{"ts": "2026-07-23T12:18:01.539249+09:00", "side": "BUY", "code": "161890", "name": "한국콜마", "price": 103100, "qty": 54, "cost": 5568235, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 92100, "target": 113400, "signals": [{"label": "손절선", "ok": true, "detail": "92,100 (현재 103,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 113,400"}, {"label": "추세(20일선)", "ok": true, "detail": "98,720"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +222 · 기 -227"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 103,029"}]}
{"ts": "2026-07-23T12:22:02.589476+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 356000, "qty": 13, "cost": 4628694, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 313808, "target": 405884, "signals": [{"label": "손절선", "ok": true, "detail": "313,808 (현재 356,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 405,884"}, {"label": "추세(20일선)", "ok": true, "detail": "296,925"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +6 · 기 +26"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 355,034"}]}
{"ts": "2026-07-23T12:54:04.491410+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 90900, "qty": 53, "cost": 4818423, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 80223, "target": 104155, "signals": [{"label": "손절선", "ok": true, "detail": "80,223 (현재 91,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 104,155"}, {"label": "추세(20일선)", "ok": true, "detail": "75,210"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -169 · 기 +311"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 90,945"}]}
{"ts": "2026-07-24T09:00:05.632693+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 111800, "qty": 28, "proceeds": 3124296, "entry_price": 132189, "pnl": -577559, "pnl_pct": -15.42, "hold_from": "2026-07-10T12:14:02.666463+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "102,302 (현재 113,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 191,963"}, {"label": "추세(20일선)", "ok": false, "detail": "119,505"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -480 · 기 -206"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-24T09:00:05.633650+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18730, "qty": 290, "proceeds": 5421108, "entry_price": 18850, "pnl": -46212, "pnl_pct": -0.64, "hold_from": "2026-07-23T09:44:04.277793+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 18,730)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,030"}, {"label": "추세(20일선)", "ok": false, "detail": "18,841"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -5 · 기 -5"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,219"}]}
{"ts": "2026-07-24T09:28:04.944506+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 14510, "qty": 191, "cost": 2771826, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 11815, "target": 18460, "signals": [{"label": "손절선", "ok": true, "detail": "11,815 (현재 15,400)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 18,460"}, {"label": "추세(20일선)", "ok": true, "detail": "12,845"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -857 · 기 +1,172"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 14,791"}]}
{"ts": "2026-07-27T09:02:06.223077+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19100, "qty": 289, "cost": 5520728, "path": "pullback", "reason": "눌림목 지정가 20,032 도달", "stop": 18023, "target": 21254, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "19,070 vs 18,858"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,600 / 18,858"}, {"label": "추세 기울기(20일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,600 / 19,360"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+16.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +101 · 기 -3 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.13% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "146,760 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.13% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 20,032 (현재 19,070)"}]}
{"ts": "2026-07-27T09:02:06.223286+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 7470, "qty": 533, "cost": 3982107, "path": "pullback", "reason": "눌림목 지정가 7,910 도달", "stop": 6645, "target": 9119, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "7,470 vs 4,876"}, {"label": "정배열(5>20)", "ok": true, "detail": "6,452 / 4,876"}, {"label": "추세 기울기(20일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,452 / 4,889"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+82.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +49 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.79% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "49,327 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "0.79% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "74"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,910 (현재 7,470)"}]}
{"ts": "2026-07-27T09:08:02.082537+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 7910, "qty": 503, "cost": 3979327, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 6645, "target": 9119, "signals": [{"label": "손절선", "ok": true, "detail": "6,645 (현재 7,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 9,119"}, {"label": "추세(20일선)", "ok": true, "detail": "4,897"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +49 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 7,747"}]}
{"ts": "2026-07-27T13:40:01.090664+09:00", "side": "SELL", "code": "003680", "name": "한성기업", "price": 6780, "qty": 1036, "proceeds": 7010383, "entry_price": 7684, "pnl": -951051, "pnl_pct": -11.76, "hold_from": "2026-07-27T09:02:06.223284+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "6,854 (현재 6,770)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 9,344"}, {"label": "추세(20일선)", "ok": true, "detail": "4,841"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +50 · 기 +0"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-27T14:20:01.056082+09:00", "side": "BUY", "code": "218150", "name": "미래생명자원", "price": 2130, "qty": 1218, "cost": 2594729, "path": "pullback", "reason": "눌림목 지정가 2,135 도달", "stop": 1775, "target": 2840, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "2,130 vs 2,030"}, {"label": "정배열(5>20)", "ok": true, "detail": "2,415 / 2,030"}, {"label": "추세 기울기(20일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "2,415 / 2,265"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+41.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -118 · 기 +4 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "6.22% (환산) vs 평균 15.95% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 3,180"}, {"label": "거래량 급증", "ok": false, "detail": "1,270,804 (환산) vs 평균 3,257,264"}, {"label": "회전율 급증", "ok": false, "detail": "6.22% (환산) vs 평균 15.95%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 2,135 (현재 2,130)"}]}
{"ts": "2026-07-28T09:00:15.827850+09:00", "side": "SELL", "code": "095610", "name": "테스", "price": 126200, "qty": 15, "proceeds": 1889309, "entry_price": 158100, "pnl": -482547, "pnl_pct": -20.18, "hold_from": "2026-07-22T15:04:00.990875+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "129,761 (현재 128,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 214,778"}, {"label": "추세(20일선)", "ok": false, "detail": "134,815"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +269 · 기 -554"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 168,554"}]}
{"ts": "2026-07-28T09:00:15.829236+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6780, "qty": 495, "cost": 3356603, "path": "pullback", "reason": "눌림목 지정가 7,884 도달", "stop": 5916, "target": 8509, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "7,050 vs 4,855"}, {"label": "정배열(5>20)", "ok": true, "detail": "6,368 / 4,855"}, {"label": "추세 기울기(20일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,368 / 4,882"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+73.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +86 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.01% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "813 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "0.01% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "69"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,884 (현재 7,050)"}]}
{"ts": "2026-07-28T09:02:04.745721+09:00", "side": "SELL", "code": "252990", "name": "샘씨엔에스", "price": 11920, "qty": 388, "proceeds": 4615941, "entry_price": 14266, "pnl": -920209, "pnl_pct": -16.45, "hold_from": "2026-07-22T14:18:05.419863+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "11,984 (현재 11,960)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 18,831"}, {"label": "추세(20일선)", "ok": false, "detail": "12,673"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +84 · 기 -61"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-28T09:10:01.738088+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 7100, "qty": 473, "cost": 3358804, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 5916, "target": 8509, "signals": [{"label": "손절선", "ok": true, "detail": "5,916 (현재 7,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 8,509"}, {"label": "추세(20일선)", "ok": true, "detail": "4,857"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +86 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 7,079"}]}
{"ts": "2026-07-29T09:02:02.221428+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 117900, "qty": 44, "cost": 5188378, "path": "pullback", "reason": "눌림목 지정가 118,115 도달", "stop": 111200, "target": 131300, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "117,800 vs 113,445"}, {"label": "정배열(5>20)", "ok": true, "detail": "117,020 / 113,445"}, {"label": "추세 기울기(20일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "117,020 / 109,982"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+45.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +39 · 기 +307 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+26%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.03% (환산) vs 평균 0.17% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 123,300"}, {"label": "거래량 급증", "ok": false, "detail": "44,660 (환산) vs 평균 289,522"}, {"label": "회전율 급증", "ok": false, "detail": "0.03% (환산) vs 평균 0.17%"}, {"label": "RSI", "ok": true, "detail": "57"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 118,115 (현재 117,800)"}]}
{"ts": "2026-07-29T09:16:04.460893+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 120500, "qty": 43, "cost": 5182277, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 111200, "target": 131300, "signals": [{"label": "손절선", "ok": true, "detail": "111,200 (현재 120,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 131,300"}, {"label": "추세(20일선)", "ok": true, "detail": "113,580"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +39 · 기 +307"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 120,492"}]}
{"ts": "2026-07-29T09:24:08.691208+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 18950, "qty": 292, "cost": 5534230, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 18023, "target": 21254, "signals": [{"label": "손절선", "ok": true, "detail": "18,023 (현재 20,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,254"}, {"label": "추세(20일선)", "ok": true, "detail": "18,884"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +99 · 기 +138"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,418"}]}
{"ts": "2026-07-29T09:24:08.691404+09:00", "side": "SELL", "code": "010950", "name": "S-Oil", "price": 128600, "qty": 77, "proceeds": 9882891, "entry_price": 134418, "pnl": -468862, "pnl_pct": -4.33, "hold_from": "2026-07-09T09:36:03.452341+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "122,826 (현재 116,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 157,603"}, {"label": "추세(20일선)", "ok": true, "detail": "107,870"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +43 · 기 +245"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T09:24:09.102125+09:00", "side": "BUY", "code": "218150", "name": "미래생명자원", "price": 1951, "qty": 1330, "cost": 2595219, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 1775, "target": 2840, "signals": [{"label": "손절선", "ok": true, "detail": "1,775 (현재 2,450)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 2,840"}, {"label": "추세(20일선)", "ok": true, "detail": "2,005"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +40 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 2,287"}]}
{"ts": "2026-07-29T09:28:01.378937+09:00", "side": "BUY", "code": "090850", "name": "현대이지웰", "price": 6390, "qty": 819, "cost": 5234195, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 5998, "target": 7174, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "6,380 vs 5,358"}, {"label": "정배열(5>20)", "ok": true, "detail": "5,742 / 5,358"}, {"label": "추세 기울기(20일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "5,742 / 5,622"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+43.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +73 · 기 -3 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.62% (환산) vs 평균 0.22% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 5,700"}, {"label": "거래량 급증", "ok": true, "detail": "134,413 (환산) vs 평균 49,512"}, {"label": "회전율 급증", "ok": true, "detail": "0.62% (환산) vs 평균 0.22%"}, {"label": "RSI", "ok": true, "detail": "73"}]}
{"ts": "2026-07-29T10:42:05.407176+09:00", "side": "SELL", "code": "090850", "name": "현대이지웰", "price": 5980, "qty": 819, "proceeds": 4888070, "entry_price": 6390, "pnl": -346125, "pnl_pct": -6.42, "hold_from": "2026-07-29T09:28:01.378936+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,998 (현재 5,980)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 7,174"}, {"label": "추세(20일선)", "ok": true, "detail": "5,338"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +77 · 기 -3"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,521"}]}
{"ts": "2026-07-29T11:18:04.419939+09:00", "side": "SELL", "code": "003680", "name": "한성기업", "price": 6000, "qty": 968, "proceeds": 5796674, "entry_price": 6936, "pnl": -918733, "pnl_pct": -13.5, "hold_from": "2026-07-28T09:00:15.829228+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "6,040 (현재 6,020)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 8,729"}, {"label": "추세(20일선)", "ok": true, "detail": "4,803"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +185 · 기 +0"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-30T09:04:06.866646+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6130, "qty": 411, "cost": 2519808, "path": "pullback", "reason": "눌림목 지정가 7,792 도달", "stop": 5127, "target": 8135, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "6,120 vs 4,808"}, {"label": "정배열(5>20)", "ok": true, "detail": "6,182 / 4,808"}, {"label": "추세 기울기(20일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,182 / 4,866"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+65.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +234 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "4.31% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "267,687 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "4.31% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,792 (현재 6,120)"}]}
{"ts": "2026-07-30T09:24:06.917510+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 131800, "qty": 37, "cost": 4877331, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 120690, "target": 154020, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "132,000 vs 108,925"}, {"label": "정배열(5>20)", "ok": true, "detail": "115,580 / 108,925"}, {"label": "추세 기울기(20일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "115,580 / 113,230"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+51.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -6 · 기 +178 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+20%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.66% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 116,900"}, {"label": "거래량 급증", "ok": true, "detail": "738,813 (환산) vs 평균 359,705"}, {"label": "회전율 급증", "ok": true, "detail": "0.66% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-07-30T11:58:07.822065+09:00", "side": "SELL", "code": "161890", "name": "한국콜마", "price": 91700, "qty": 110, "proceeds": 10067330, "entry_price": 101115, "pnl": -1056938, "pnl_pct": -9.31, "hold_from": "2026-07-22T09:04:01.813457+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "92,100 (현재 91,800)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 119,144"}, {"label": "추세(20일선)", "ok": false, "detail": "98,155"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -7 · 기 +40"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-31T09:04:07.266662+09:00", "side": "SELL", "code": "078930", "name": "GS", "price": 69100, "qty": 107, "proceeds": 7379282, "entry_price": 89537, "pnl": -2202655, "pnl_pct": -22.83, "hold_from": "2026-07-23T09:50:01.509012+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "81,303 (현재 79,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 106,006"}, {"label": "추세(20일선)", "ok": true, "detail": "74,655"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -179 · 기 +325"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-31T09:06:06.413012+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6550, "qty": 384, "cost": 2515577, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 5127, "target": 8135, "signals": [{"label": "손절선", "ok": true, "detail": "5,127 (현재 6,640)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 8,135"}, {"label": "추세(20일선)", "ok": true, "detail": "4,834"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +355 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,453"}]}
{"ts": "2026-08-03T09:34:07.943956+09:00", "side": "SELL", "code": "010950", "name": "S-Oil", "price": 120300, "qty": 37, "proceeds": 4442420, "entry_price": 131800, "pnl": -434911, "pnl_pct": -8.73, "hold_from": "2026-07-30T09:24:06.917508+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "120,690 (현재 120,400)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 154,020"}, {"label": "추세(20일선)", "ok": true, "detail": "108,345"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -35 · 기 +48"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 135,311"}]}
{"ts": "2026-08-03T09:44:09.371424+09:00", "side": "BUY", "code": "090850", "name": "현대이지웰", "price": 6120, "qty": 804, "cost": 4921218, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 5752, "target": 6857, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "6,120 vs 5,345"}, {"label": "정배열(5>20)", "ok": true, "detail": "5,690 / 5,345"}, {"label": "추세 기울기(20일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "5,690 / 5,618"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+31.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +80 · 기 +5 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.61% (환산) vs 평균 0.22% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 5,700"}, {"label": "거래량 급증", "ok": true, "detail": "132,260 (환산) vs 평균 49,512"}, {"label": "회전율 급증", "ok": true, "detail": "0.61% (환산) vs 평균 0.22%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-08-03T12:00:11.776427+09:00", "side": "BUY", "code": "194370", "name": "제이에스코퍼레이션", "price": 12910, "qty": 333, "cost": 4299675, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 11713, "target": 15304, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "12,930 vs 11,922"}, {"label": "정배열(5>20)", "ok": true, "detail": "12,138 / 11,922"}, {"label": "추세 기울기(20일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "12,138 / 11,924"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+27.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +7 · 기 +10 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+74%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.72% (환산) vs 평균 0.34% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 12,870"}, {"label": "거래량 급증", "ok": true, "detail": "208,994 (환산) vs 평균 99,303"}, {"label": "회전율 급증", "ok": true, "detail": "0.72% (환산) vs 평균 0.34%"}, {"label": "RSI", "ok": true, "detail": "63"}]}
{"ts": "2026-08-03T12:02:09.723448+09:00", "side": "BUY", "code": "194370", "name": "제이에스코퍼레이션", "price": 13420, "qty": 320, "cost": 4295044, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 11713, "target": 15304, "signals": [{"label": "손절선", "ok": true, "detail": "11,713 (현재 13,450)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 15,304"}, {"label": "추세(20일선)", "ok": true, "detail": "11,948"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +7 · 기 +10"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,339"}]}
{"ts": "2026-08-04T09:04:08.850906+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 135900, "qty": 12, "cost": 1631045, "path": "pullback", "reason": "눌림목 지정가 156,279 도달", "stop": 104818, "target": 198064, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "135,700 vs 135,200"}, {"label": "정배열(5>20)", "ok": true, "detail": "167,780 / 135,200"}, {"label": "추세 기울기(20일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "167,780 / 99,378"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+24.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +23 · 기 +54 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+45%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "6.62% (환산) vs 평균 3.06% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 202,500"}, {"label": "거래량 급증", "ok": true, "detail": "1,281,140 (환산) vs 평균 591,925"}, {"label": "회전율 급증", "ok": true, "detail": "6.62% (환산) vs 평균 3.06%"}, {"label": "RSI", "ok": true, "detail": "52"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 156,279 (현재 135,700)"}]}
{"ts": "2026-08-05T09:00:13.753117+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 147600, "qty": 11, "cost": 1623844, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 104818, "target": 198064, "signals": [{"label": "손절선", "ok": true, "detail": "104,818 (현재 147,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 198,064"}, {"label": "추세(20일선)", "ok": true, "detail": "135,790"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -256 · 기 +200"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 145,836"}]}
{"ts": "2026-08-05T09:02:12.586918+09:00", "side": "SELL", "code": "090850", "name": "현대이지웰", "price": 5700, "qty": 804, "proceeds": 4573864, "entry_price": 6120, "pnl": -347355, "pnl_pct": -6.86, "hold_from": "2026-08-03T09:44:09.371421+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,752 (현재 5,730)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 6,857"}, {"label": "추세(20일선)", "ok": true, "detail": "5,326"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +14 · 기 -2"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,233"}]}
{"ts": "2026-08-05T09:18:09.783204+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 13560, "qty": 171, "cost": 2319108, "path": "pullback", "reason": "눌림목 지정가 13,947 도달", "stop": 11230, "target": 18219, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "13,540 vs 12,752"}, {"label": "정배열(5>20)", "ok": true, "detail": "14,456 / 12,752"}, {"label": "추세 기울기(20일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "14,456 / 13,275"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-2.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -72 · 기 +134 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.18% (환산) vs 평균 1.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 15,870"}, {"label": "거래량 급증", "ok": false, "detail": "708,253 (환산) vs 평균 882,736"}, {"label": "회전율 급증", "ok": false, "detail": "1.18% (환산) vs 평균 1.47%"}, {"label": "RSI", "ok": true, "detail": "52"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 13,947 (현재 13,540)"}]}
{"ts": "2026-08-05T10:00:11.361876+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 14270, "qty": 162, "cost": 2312087, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 11230, "target": 18219, "signals": [{"label": "손절선", "ok": true, "detail": "11,230 (현재 14,340)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 18,219"}, {"label": "추세(20일선)", "ok": true, "detail": "12,792"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -72 · 기 +134"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 14,337"}]}
{"ts": "2026-08-06T09:00:17.919075+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18730, "qty": 581, "proceeds": 10860910, "entry_price": 19025, "pnl": -194048, "pnl_pct": -1.55, "hold_from": "2026-07-27T09:02:06.223075+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "18,070 (현재 18,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 20,933"}, {"label": "추세(20일선)", "ok": false, "detail": "18,842"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -203 · 기 -147"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-08-06T09:34:15.275497+09:00", "side": "BUY", "code": "068270", "name": "셀트리온", "price": 192000, "qty": 25, "cost": 4800720, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 179508, "target": 216984, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "191,800 vs 177,680"}, {"label": "정배열(5>20)", "ok": true, "detail": "186,140 / 177,680"}, {"label": "추세 기울기(20일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "186,140 / 176,671"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+20.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +255 · 기 -319 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+44%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.67% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 191,700"}, {"label": "거래량 급증", "ok": true, "detail": "1,582,767 (환산) vs 평균 738,783"}, {"label": "회전율 급증", "ok": true, "detail": "0.67% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "63"}]}
{"ts": "2026-08-07T09:12:15.076918+09:00", "side": "BUY", "code": "068270", "name": "셀트리온", "price": 196400, "qty": 25, "cost": 4910736, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 179508, "target": 216984, "signals": [{"label": "손절선", "ok": true, "detail": "179,508 (현재 196,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 216,984"}, {"label": "추세(20일선)", "ok": true, "detail": "177,905"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +338 · 기 +73"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 196,264"}]}
@@ -0,0 +1,198 @@
{
"cash": 12090206.1725,
"initial": 100000000,
"positions": {
"214450": {
"code": "214450",
"name": "파마리서치",
"sources": [
"auto"
],
"qty": 28,
"entry_price": 350250.0,
"entry_at": "2026-07-21T12:06:01.166187+09:00",
"stop": 318647,
"target": 413456,
"peak": 411500,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 409000,
"tranches": 2,
"tranche_value": 5156172.079657566,
"last_add_price": 356000
},
"138040": {
"code": "138040",
"name": "메리츠금융지주",
"sources": [
"auto"
],
"qty": 89,
"entry_price": 119185.39325842696,
"entry_at": "2026-07-29T09:02:02.224637+09:00",
"stop": 111408,
"target": 134740,
"peak": 127600,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 118,115 도달",
"cur_price": 123200,
"tranches": 2,
"tranche_value": 5368293.320125001,
"last_add_price": 120500
},
"086790": {
"code": "086790",
"name": "하나금융지주",
"sources": [
"auto"
],
"qty": 83,
"entry_price": 123226.50602409638,
"entry_at": "2026-07-30T09:04:07.455785+09:00",
"stop": 113273,
"target": 143133,
"peak": 134600,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 122,665 도달",
"cur_price": 130600,
"tranches": 2,
"tranche_value": 5180051.180047499,
"last_add_price": 125200
},
"003680": {
"code": "003680",
"name": "한성기업",
"sources": [
"auto"
],
"qty": 819,
"entry_price": 6333.076923076923,
"entry_at": "2026-07-30T09:04:07.457322+09:00",
"stop": 5363,
"target": 8274,
"peak": 6840,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 7,792 도달",
"cur_price": 6220,
"tranches": 2,
"tranche_value": 2599049.62031184,
"last_add_price": 6550
},
"194370": {
"code": "194370",
"name": "제이에스코퍼레이션",
"sources": [
"auto"
],
"qty": 677,
"entry_price": 13160.10339734121,
"entry_at": "2026-08-03T12:00:11.789224+09:00",
"stop": 11874,
"target": 15732,
"peak": 14120,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 13370,
"tranches": 2,
"tranche_value": 4464385.527789056,
"last_add_price": 13420
},
"078930": {
"code": "078930",
"name": "GS",
"sources": [
"auto"
],
"qty": 98,
"entry_price": 91918.36734693877,
"entry_at": "2026-08-04T09:50:09.564914+09:00",
"stop": 83395,
"target": 108966,
"peak": 101600,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 97700,
"tranches": 2,
"tranche_value": 4532723.825333739,
"last_add_price": 93500
},
"252990": {
"code": "252990",
"name": "샘씨엔에스",
"sources": [
"auto"
],
"qty": 350,
"entry_price": 13778.028571428571,
"entry_at": "2026-08-06T09:00:18.926753+09:00",
"stop": 11541,
"target": 18253,
"peak": 15670,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 13,975 도달",
"cur_price": 15670,
"tranches": 2,
"tranche_value": 2418915.1277636583,
"last_add_price": 14290
},
"068270": {
"code": "068270",
"name": "셀트리온",
"sources": [
"interest"
],
"qty": 53,
"entry_price": 194158.49056603774,
"entry_at": "2026-08-06T09:34:15.869489+09:00",
"stop": 181367,
"target": 219742,
"peak": 201000,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 201000,
"tranches": 2,
"tranche_value": 5253404.499,
"last_add_price": 196400
}
},
"realized_pnl": -19040274.94900003,
"closed_trades": 36,
"wins": 2,
"peak_equity": 101690998.13850003,
"max_drawdown": 0.2049465569225206,
"last_exit": {
"086790": "2026-07-29",
"030000": "2026-08-06",
"403870": "2026-07-02",
"095610": "2026-07-28",
"093370": "2026-07-20",
"240810": "2026-07-24",
"034730": "2026-07-03",
"214450": "2026-07-14",
"055550": "2026-07-20",
"024060": "2026-07-27",
"003680": "2026-07-29",
"252990": "2026-07-28",
"010950": "2026-08-03",
"090850": "2026-08-06",
"078930": "2026-07-31"
},
"created_at": "2026-06-11T09:00:01.944290+09:00",
"updated_at": "2026-08-10T15:28:14.361188+09:00"
}
@@ -0,0 +1,107 @@
{"ts": "2026-06-17T11:15:02.310687+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 130900, "qty": 47, "cost": 6153223, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 121254, "target": 150191, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "129,300 vs 118,950"}, {"label": "정배열(5>10)", "ok": true, "detail": "120,400 / 118,950"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "120,400 / 118,307"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-13.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +371 · 기 +158 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+22%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.12% (환산) vs 평균 0.38% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 126,500"}, {"label": "거래량 급증", "ok": true, "detail": "3,094,534 (환산) vs 평균 1,031,725"}, {"label": "회전율 급증", "ok": true, "detail": "1.12% (환산) vs 평균 0.38%"}, {"label": "RSI", "ok": true, "detail": "60"}]}
{"ts": "2026-06-17T16:47:28.529957+09:00", "side": "BUY", "code": "403870", "name": "HPSP", "price": 62900, "qty": 47, "cost": 2956743, "path": "pullback", "reason": "눌림목 지정가 64,531 도달", "stop": 52447, "target": 83807, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "62,800 vs 53,510"}, {"label": "정배열(5>10)", "ok": true, "detail": "59,880 / 53,510"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "59,880 / 49,831"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+21.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -4,434 · 기 +5,040 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+9%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "11.31% vs 평균 5.97% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 71,500"}, {"label": "거래량 급증", "ok": false, "detail": "9,309,211 vs 평균 4,912,598"}, {"label": "회전율 급증", "ok": true, "detail": "11.31% vs 평균 5.97%"}, {"label": "RSI", "ok": true, "detail": "58"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 64,531 (현재 62,800)"}]}
{"ts": "2026-06-19T09:02:06.351442+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19160, "qty": 325, "cost": 6227934, "path": "pullback", "reason": "눌림목 지정가 20,044 도달", "stop": 18100, "target": 21279, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "19,150 vs 18,963"}, {"label": "정배열(5>10)", "ok": true, "detail": "19,616 / 18,963"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,616 / 19,361"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-31.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,162 · 기 +2,080 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.03% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "37,673 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.03% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 20,044 (현재 19,150)"}]}
{"ts": "2026-06-19T13:32:02.797519+09:00", "side": "SELL", "code": "086790", "name": "하나금융지주", "price": 121100, "qty": 47, "proceeds": 5680601, "entry_price": 130900, "pnl": -472622, "pnl_pct": -7.49, "hold_from": "2026-06-17T11:15:02.310686+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "121,254 (현재 121,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 150,191"}, {"label": "추세(10일선)", "ok": true, "detail": "119,670"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +531 · 기 -129"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 134,178"}]}
{"ts": "2026-06-23T09:00:09.548616+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18820, "qty": 325, "proceeds": 6104573, "entry_price": 19160, "pnl": -123361, "pnl_pct": -1.77, "hold_from": "2026-06-19T09:02:06.351441+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "18,100 (현재 18,710)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,279"}, {"label": "추세(10일선)", "ok": false, "detail": "18,919"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -318 · 기 -227"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,528"}]}
{"ts": "2026-06-23T09:04:35.878315+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 121000, "qty": 49, "cost": 5929889, "path": "pullback", "reason": "눌림목 지정가 122,636 도달", "stop": 111004, "target": 140992, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "121,200 vs 119,680"}, {"label": "정배열(5>10)", "ok": true, "detail": "120,840 / 119,680"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "120,840 / 118,418"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-14.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +310 · 기 -361 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+30%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.12% (환산) vs 평균 0.37% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 130,700"}, {"label": "거래량 급증", "ok": false, "detail": "324,680 (환산) vs 평균 1,026,357"}, {"label": "회전율 급증", "ok": false, "detail": "0.12% (환산) vs 평균 0.37%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 122,636 (현재 121,200)"}]}
{"ts": "2026-06-24T09:04:06.117082+09:00", "side": "SELL", "code": "403870", "name": "HPSP", "price": 52300, "qty": 47, "proceeds": 2453307, "entry_price": 62900, "pnl": -503437, "pnl_pct": -16.85, "hold_from": "2026-06-17T16:47:28.529950+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "52,447 (현재 52,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 83,807"}, {"label": "추세(10일선)", "ok": false, "detail": "52,460"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +711 · 기 -2,060"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 66,717"}]}
{"ts": "2026-06-24T09:04:06.117214+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 156700, "qty": 18, "cost": 2821023, "path": "pullback", "reason": "눌림목 지정가 165,075 도달", "stop": 129363, "target": 211374, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "156,200 vs 128,170"}, {"label": "정배열(5>10)", "ok": true, "detail": "143,260 / 128,170"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "143,260 / 121,703"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+46.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +210 · 기 +143 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+6%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "5.83% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": true, "detail": "2,860,073 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": true, "detail": "5.83% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 165,075 (현재 156,200)"}]}
{"ts": "2026-06-24T09:12:05.351845+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 17270, "qty": 199, "cost": 3437246, "path": "pullback", "reason": "눌림목 지정가 17,366 도달", "stop": 14804, "target": 22203, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "17,280 vs 13,750"}, {"label": "정배열(5>10)", "ok": true, "detail": "16,364 / 13,750"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "16,364 / 11,500"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+21.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +1,740 · 기 -508 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+16%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.34% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": false, "detail": "2,509,340 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": false, "detail": "2.34% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "65"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 17,366 (현재 17,280)"}]}
{"ts": "2026-06-24T09:46:04.783231+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 158200, "qty": 17, "cost": 2689803, "path": "pullback", "reason": "눌림목 지정가 158,264 도달", "stop": 130097, "target": 214407, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "158,000 vs 153,380"}, {"label": "정배열(5>10)", "ok": true, "detail": "172,240 / 153,380"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "172,240 / 99,750"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+56.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +41 · 기 +65 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+5%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "4.25% (환산) vs 평균 3.06% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 202,500"}, {"label": "거래량 급증", "ok": false, "detail": "822,940 (환산) vs 평균 591,925"}, {"label": "회전율 급증", "ok": false, "detail": "4.25% (환산) vs 평균 3.06%"}, {"label": "RSI", "ok": true, "detail": "61"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 158,264 (현재 158,000)"}]}
{"ts": "2026-06-24T11:12:05.900560+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 18260, "qty": 188, "cost": 3433395, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 14804, "target": 22203, "signals": [{"label": "손절선", "ok": true, "detail": "14,804 (현재 18,250)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,203"}, {"label": "추세(10일선)", "ok": true, "detail": "13,847"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +1,742 · 기 -508"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 18,094"}]}
{"ts": "2026-06-25T09:00:23.676126+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 179100, "qty": 15, "cost": 2686903, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 130097, "target": 214407, "signals": [{"label": "손절선", "ok": true, "detail": "130,097 (현재 178,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 214,407"}, {"label": "추세(10일선)", "ok": true, "detail": "155,410"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -56 · 기 +134"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 167,275"}]}
{"ts": "2026-06-25T09:02:04.073952+09:00", "side": "BUY", "code": "403870", "name": "HPSP", "price": 53200, "qty": 49, "cost": 2607191, "path": "pullback", "reason": "눌림목 지정가 63,881 도달", "stop": 43200, "target": 73200, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "53,300 vs 52,560"}, {"label": "정배열(5>10)", "ok": true, "detail": "57,980 / 52,560"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "57,980 / 49,672"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+15.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +406 · 기 -1,461 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+29%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.21% (환산) vs 평균 5.97% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 71,500"}, {"label": "거래량 급증", "ok": false, "detail": "1,819,047 (환산) vs 평균 4,912,598"}, {"label": "회전율 급증", "ok": false, "detail": "2.21% (환산) vs 평균 5.97%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 63,881 (현재 53,300)"}]}
{"ts": "2026-06-26T09:00:05.786723+09:00", "side": "SELL", "code": "403870", "name": "HPSP", "price": 50000, "qty": 49, "proceeds": 2445222, "entry_price": 53200, "pnl": -161969, "pnl_pct": -6.02, "hold_from": "2026-06-25T09:02:04.073951+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "43,200 (현재 51,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 73,200"}, {"label": "추세(10일선)", "ok": false, "detail": "52,330"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -311 · 기 -267"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 57,056"}]}
{"ts": "2026-06-26T10:06:05.265619+09:00", "side": "SELL", "code": "086790", "name": "하나금융지주", "price": 110600, "qty": 49, "proceeds": 5408832, "entry_price": 121000, "pnl": -521057, "pnl_pct": -8.6, "hold_from": "2026-06-23T09:04:35.878312+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "111,004 (현재 110,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 140,992"}, {"label": "추세(10일선)", "ok": false, "detail": "118,630"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +34 · 기 -271"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 124,653"}]}
{"ts": "2026-06-26T10:14:04.062152+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 166900, "qty": 16, "cost": 2670801, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 129363, "target": 211374, "signals": [{"label": "손절선", "ok": true, "detail": "129,363 (현재 166,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 211,374"}, {"label": "추세(10일선)", "ok": true, "detail": "129,220"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -126 · 기 +320"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 165,659"}]}
{"ts": "2026-06-29T11:36:01.266385+09:00", "side": "BUY", "code": "034730", "name": "SK", "price": 745000, "qty": 4, "cost": 2980447, "path": "pullback", "reason": "눌림목 지정가 748,914 도달", "stop": 645871, "target": 943257, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "744,000 vs 735,600"}, {"label": "정배열(5>10)", "ok": true, "detail": "766,800 / 735,600"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "766,800 / 530,600"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+12.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -194 · 기 +152 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+8%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.35% (환산) vs 평균 0.45% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 883,000"}, {"label": "거래량 급증", "ok": true, "detail": "977,966 (환산) vs 평균 329,863"}, {"label": "회전율 급증", "ok": true, "detail": "1.35% (환산) vs 평균 0.45%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 748,914 (현재 744,000)"}]}
{"ts": "2026-06-29T14:18:01.486781+09:00", "side": "BUY", "code": "034730", "name": "SK", "price": 778000, "qty": 4, "cost": 3112467, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 645871, "target": 943257, "signals": [{"label": "손절선", "ok": true, "detail": "645,871 (현재 779,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 943,257"}, {"label": "추세(10일선)", "ok": true, "detail": "739,100"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -200 · 기 +143"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 778,043"}]}
{"ts": "2026-06-30T09:00:05.752645+09:00", "side": "BUY", "code": "403870", "name": "HPSP", "price": 55300, "qty": 43, "cost": 2378257, "path": "pullback", "reason": "눌림목 지정가 63,981 도달", "stop": 44022, "target": 77857, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "53,700 vs 52,600"}, {"label": "정배열(5>10)", "ok": true, "detail": "58,060 / 52,600"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "58,060 / 49,679"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+12.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +222 · 기 -821 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+28%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.00% (환산) vs 평균 5.97% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 71,500"}, {"label": "거래량 급증", "ok": false, "detail": "827 (환산) vs 평균 4,912,598"}, {"label": "회전율 급증", "ok": false, "detail": "0.00% (환산) vs 평균 5.97%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 63,981 (현재 53,700)"}]}
{"ts": "2026-07-01T09:06:03.211367+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 357500, "qty": 15, "cost": 5363304, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 325040, "target": 422420, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "357,000 vs 307,050"}, {"label": "정배열(5>10)", "ok": true, "detail": "317,600 / 307,050"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "317,600 / 305,700"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+32.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -75 · 기 +221 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+35%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.89% (환산) vs 평균 0.93% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 334,500"}, {"label": "거래량 급증", "ok": true, "detail": "196,247 (환산) vs 평균 96,436"}, {"label": "회전율 급증", "ok": true, "detail": "1.89% (환산) vs 평균 0.93%"}, {"label": "RSI", "ok": true, "detail": "68"}]}
{"ts": "2026-07-01T09:24:02.311832+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 372000, "qty": 14, "cost": 5208781, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 325040, "target": 422420, "signals": [{"label": "손절선", "ok": true, "detail": "325,040 (현재 372,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 422,420"}, {"label": "추세(10일선)", "ok": true, "detail": "308,550"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -75 · 기 +221"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 368,499"}]}
{"ts": "2026-07-01T11:06:02.353871+09:00", "side": "SELL", "code": "095610", "name": "테스", "price": 212000, "qty": 32, "proceeds": 6770771, "entry_price": 167997, "pnl": 1394065, "pnl_pct": 26.19, "hold_from": "2026-06-24T09:46:04.783230+09:00", "reason": "트레일링 익절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "213,193 (현재 213,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(10일선)", "ok": true, "detail": "158,880"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -229 · 기 +300"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-02T10:18:03.834928+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 122200, "qty": 45, "cost": 5499825, "path": "pullback", "reason": "눌림목 지정가 122,215 도달", "stop": 111572, "target": 143456, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "122,000 vs 119,760"}, {"label": "정배열(5>10)", "ok": true, "detail": "121,000 / 119,760"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "121,000 / 118,432"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+10.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +22 · 기 -44 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+29%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.80% (환산) vs 평균 0.37% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 130,700"}, {"label": "거래량 급증", "ok": true, "detail": "2,199,199 (환산) vs 평균 1,026,357"}, {"label": "회전율 급증", "ok": true, "detail": "0.80% (환산) vs 평균 0.37%"}, {"label": "RSI", "ok": true, "detail": "52"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 122,215 (현재 122,000)"}]}
{"ts": "2026-07-02T10:40:02.952671+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 18960, "qty": 322, "cost": 6106036, "path": "pullback", "reason": "눌림목 지정가 19,970 도달", "stop": 17790, "target": 21300, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "18,960 vs 18,944"}, {"label": "정배열(5>10)", "ok": true, "detail": "19,578 / 18,944"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,578 / 19,358"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+3.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -339 · 기 +110 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+34%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.86% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "986,112 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.86% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "49"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,970 (현재 18,960)"}]}
{"ts": "2026-07-02T11:20:02.056072+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 22550, "qty": 271, "cost": 6111967, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 17790, "target": 21300, "signals": [{"label": "손절선", "ok": true, "detail": "17,790 (현재 19,350)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,300"}, {"label": "추세(10일선)", "ok": true, "detail": "18,983"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -339 · 기 +110"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,350"}]}
{"ts": "2026-07-02T11:22:01.965010+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 19000, "qty": 593, "proceeds": 11245029, "entry_price": 20601, "pnl": -972973, "pnl_pct": -7.77, "hold_from": "2026-07-02T10:40:02.952669+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "19,431 (현재 19,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,941"}, {"label": "추세(10일선)", "ok": true, "detail": "18,958"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -339 · 기 +110"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-02T12:42:02.220043+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 15250, "qty": 387, "proceeds": 5890242, "entry_price": 17751, "pnl": -980399, "pnl_pct": -14.09, "hold_from": "2026-06-24T09:12:05.351843+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "15,280 (현재 15,280)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,692"}, {"label": "추세(10일선)", "ok": true, "detail": "13,550"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -1,920 · 기 +434"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-02T14:30:02.062791+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 134100, "qty": 34, "proceeds": 4550509, "entry_price": 161500, "pnl": -941314, "pnl_pct": -16.97, "hold_from": "2026-06-24T09:04:06.117213+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "134,624 (현재 134,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 215,253"}, {"label": "추세(10일선)", "ok": true, "detail": "125,960"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +395 · 기 -1,516"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-02T15:04:06.185101+09:00", "side": "SELL", "code": "403870", "name": "HPSP", "price": 43900, "qty": 43, "proceeds": 1884019, "entry_price": 55300, "pnl": -494238, "pnl_pct": -20.61, "hold_from": "2026-06-30T09:00:05.752638+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "44,022 (현재 43,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 77,857"}, {"label": "추세(10일선)", "ok": false, "detail": "51,620"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +2,379 · 기 -6,625"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 59,411"}]}
{"ts": "2026-07-03T09:02:04.920019+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 133400, "qty": 16, "cost": 2134720, "path": "pullback", "reason": "눌림목 지정가 163,875 도달", "stop": 104263, "target": 191674, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "133,300 vs 125,880"}, {"label": "정배열(5>10)", "ok": true, "detail": "138,680 / 125,880"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "138,680 / 121,322"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+18.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +674 · 기 -2,170 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+31%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.16% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": false, "detail": "571,607 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": false, "detail": "1.16% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "52"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 163,875 (현재 133,300)"}]}
{"ts": "2026-07-03T09:02:04.920417+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 14660, "qty": 173, "cost": 2536560, "path": "pullback", "reason": "눌림목 지정가 17,179 도달", "stop": 11914, "target": 20152, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "14,680 vs 13,490"}, {"label": "정배열(5>10)", "ok": true, "detail": "15,844 / 13,490"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "15,844 / 11,456"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+12.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,591 · 기 +253 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+36%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.92% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": false, "detail": "991,593 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": false, "detail": "0.92% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "55"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 17,179 (현재 14,680)"}]}
{"ts": "2026-07-03T09:10:03.670622+09:00", "side": "SELL", "code": "034730", "name": "SK", "price": 656000, "qty": 8, "proceeds": 5237766, "entry_price": 761500, "pnl": -855147, "pnl_pct": -13.85, "hold_from": "2026-06-29T11:36:01.266384+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "662,371 (현재 657,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 959,757"}, {"label": "추세(10일선)", "ok": false, "detail": "726,900"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -51 · 기 +3"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-03T09:50:01.667559+09:00", "side": "SELL", "code": "214450", "name": "파마리서치", "price": 328500, "qty": 29, "proceeds": 9507923, "entry_price": 364500, "pnl": -1064162, "pnl_pct": -9.88, "hold_from": "2026-07-01T09:06:03.211365+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "331,504 (현재 331,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 430,491"}, {"label": "추세(10일선)", "ok": true, "detail": "304,450"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -127 · 기 +294"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-03T10:16:02.530929+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 126200, "qty": 44, "cost": 5553633, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 111572, "target": 143456, "signals": [{"label": "손절선", "ok": true, "detail": "111,572 (현재 126,200)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 143,456"}, {"label": "추세(10일선)", "ok": true, "detail": "120,180"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -140 · 기 +278"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 125,493"}]}
{"ts": "2026-07-03T10:24:02.772093+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19040, "qty": 309, "cost": 5884243, "path": "pullback", "reason": "눌림목 지정가 20,004 도달", "stop": 17921, "target": 21277, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "19,030 vs 18,951"}, {"label": "정배열(5>10)", "ok": true, "detail": "19,592 / 18,951"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,592 / 19,359"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+2.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -35 · 기 +168 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+34%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.54% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "619,193 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.54% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "49"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 20,004 (현재 19,030)"}]}
{"ts": "2026-07-07T09:12:07.266482+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 155900, "qty": 16, "cost": 2494774, "path": "pullback", "reason": "눌림목 지정가 158,314 도달", "stop": 127872, "target": 211957, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "155,800 vs 153,160"}, {"label": "정배열(5>10)", "ok": true, "detail": "171,800 / 153,160"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "171,800 / 99,713"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+43.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +80 · 기 -197 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+14%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "3.33% (환산) vs 평균 3.06% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 202,500"}, {"label": "거래량 급증", "ok": false, "detail": "645,567 (환산) vs 평균 591,925"}, {"label": "회전율 급증", "ok": false, "detail": "3.33% (환산) vs 평균 3.06%"}, {"label": "RSI", "ok": true, "detail": "60"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 158,314 (현재 155,800)"}]}
{"ts": "2026-07-07T12:02:08.180568+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 12230, "qty": 173, "proceeds": 2111664, "entry_price": 14660, "pnl": -424896, "pnl_pct": -16.58, "hold_from": "2026-07-03T09:02:04.920416+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "11,914 (현재 12,230)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 20,152"}, {"label": "추세(10일선)", "ok": false, "detail": "13,245"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -1,558 · 기 -4"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 15,662"}]}
{"ts": "2026-07-07T14:08:32.989792+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 183300, "qty": 11, "cost": 2016602, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 104263, "target": 191674, "signals": [{"label": "손절선", "ok": true, "detail": "104,263 (현재 183,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 191,674"}, {"label": "추세(10일선)", "ok": true, "detail": "123,150"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +263 · 기 -1,543"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 141,825"}]}
{"ts": "2026-07-07T14:08:32.992041+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 177000, "qty": 14, "cost": 2478372, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 127872, "target": 211957, "signals": [{"label": "손절선", "ok": true, "detail": "127,872 (현재 177,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 211,957"}, {"label": "추세(10일선)", "ok": true, "detail": "148,710"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +152 · 기 -281"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 165,142"}]}
{"ts": "2026-07-07T14:08:32.992753+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 20750, "qty": 283, "cost": 5873131, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 17921, "target": 21277, "signals": [{"label": "손절선", "ok": true, "detail": "17,921 (현재 20,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,277"}, {"label": "추세(10일선)", "ok": true, "detail": "18,901"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +156 · 기 +113"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,358"}]}
{"ts": "2026-07-08T09:00:17.244123+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 108300, "qty": 27, "proceeds": 2918398, "entry_price": 153730, "pnl": -1232925, "pnl_pct": -29.55, "hold_from": "2026-07-03T09:02:04.920018+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "128,455 (현재 112,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 204,279"}, {"label": "추세(10일선)", "ok": false, "detail": "123,820"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +243 · 기 -857"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-08T09:00:17.245316+09:00", "side": "SELL", "code": "095610", "name": "테스", "price": 137900, "qty": 30, "proceeds": 4128933, "entry_price": 165747, "pnl": -844213, "pnl_pct": -16.8, "hold_from": "2026-07-07T09:12:07.266481+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "138,020 (현재 137,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 221,200"}, {"label": "추세(10일선)", "ok": false, "detail": "151,370"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +458 · 기 -572"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-08T09:12:05.963550+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18900, "qty": 592, "proceeds": 11166982, "entry_price": 19857, "pnl": -590392, "pnl_pct": -4.82, "hold_from": "2026-07-03T10:24:02.772092+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "18,903 (현재 18,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,766"}, {"label": "추세(10일선)", "ok": false, "detail": "18,938"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +193 · 기 +193"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-09T09:02:04.459886+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19110, "qty": 297, "cost": 5676521, "path": "pullback", "reason": "눌림목 지정가 20,021 도달", "stop": 18017, "target": 21296, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "19,070 vs 18,955"}, {"label": "정배열(5>10)", "ok": true, "detail": "19,600 / 18,955"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,600 / 19,360"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+0.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -10 · 기 +164 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.08% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "93,540 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.08% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 20,021 (현재 19,070)"}]}
{"ts": "2026-07-09T09:36:03.454534+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 132000, "qty": 40, "cost": 5280792, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 120761, "target": 154477, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "131,900 vs 108,660"}, {"label": "정배열(5>10)", "ok": true, "detail": "115,560 / 108,660"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "115,560 / 113,228"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+22.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -184 · 기 +964 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+13%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.91% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 116,900"}, {"label": "거래량 급증", "ok": true, "detail": "1,026,867 (환산) vs 평균 359,705"}, {"label": "회전율 급증", "ok": true, "detail": "0.91% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-07-10T09:00:10.959018+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 158000, "qty": 15, "cost": 2370356, "path": "pullback", "reason": "눌림목 지정가 157,800 도달", "stop": 129200, "target": 215600, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "157,000 vs 153,280"}, {"label": "정배열(5>10)", "ok": true, "detail": "172,040 / 153,280"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "172,040 / 99,733"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+53.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +452 · 기 -360 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+13%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "3.95% (환산) vs 평균 3.06% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 202,500"}, {"label": "거래량 급증", "ok": false, "detail": "763,807 (환산) vs 평균 591,925"}, {"label": "회전율 급증", "ok": false, "detail": "3.95% (환산) vs 평균 3.06%"}, {"label": "RSI", "ok": true, "detail": "60"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 157,800 (현재 157,000)"}]}
{"ts": "2026-07-10T09:58:09.974240+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 168200, "qty": 14, "cost": 2355153, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 129200, "target": 215600, "signals": [{"label": "손절선", "ok": true, "detail": "129,200 (현재 168,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 215,600"}, {"label": "추세(10일선)", "ok": true, "detail": "154,390"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +452 · 기 -360"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 167,600"}]}
{"ts": "2026-07-10T11:06:06.467292+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 13660, "qty": 151, "cost": 2062969, "path": "pullback", "reason": "눌림목 지정가 16,984 도달", "stop": 10621, "target": 19737, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "13,630 vs 13,385"}, {"label": "정배열(5>10)", "ok": true, "detail": "15,634 / 13,385"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "15,634 / 11,439"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+6.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +210 · 기 +239 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+47%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "14.23% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": true, "detail": "15,267,605 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": true, "detail": "14.23% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "52"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 16,984 (현재 13,630)"}]}
{"ts": "2026-07-10T12:14:02.668438+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 126200, "qty": 15, "cost": 1893284, "path": "pullback", "reason": "눌림목 지정가 162,268 도달", "stop": 96000, "target": 186600, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "126,200 vs 125,170"}, {"label": "정배열(5>10)", "ok": true, "detail": "137,260 / 125,170"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "137,260 / 121,203"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+17.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +483 · 기 -241 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+38%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "7.53% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": true, "detail": "3,695,762 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": true, "detail": "7.53% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 162,268 (현재 126,200)"}]}
{"ts": "2026-07-13T09:00:09.988994+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 136900, "qty": 39, "cost": 5339901, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 120761, "target": 154477, "signals": [{"label": "손절선", "ok": true, "detail": "120,761 (현재 136,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 154,477"}, {"label": "추세(10일선)", "ok": true, "detail": "109,100"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -64 · 기 +919"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 135,864"}]}
{"ts": "2026-07-13T09:12:04.296873+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 341500, "qty": 15, "cost": 5123268, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 310647, "target": 403206, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "341,000 vs 305,450"}, {"label": "정배열(5>10)", "ok": true, "detail": "314,400 / 305,450"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "314,400 / 305,433"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+32.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -63 · 기 +144 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+41%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.90% (환산) vs 평균 0.93% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 334,500"}, {"label": "거래량 급증", "ok": true, "detail": "197,687 (환산) vs 평균 96,436"}, {"label": "회전율 급증", "ok": true, "detail": "1.90% (환산) vs 평균 0.93%"}, {"label": "RSI", "ok": true, "detail": "64"}]}
{"ts": "2026-07-13T09:26:03.407256+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 139100, "qty": 13, "cost": 1808571, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 96000, "target": 186600, "signals": [{"label": "손절선", "ok": true, "detail": "96,000 (현재 139,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 186,600"}, {"label": "추세(10일선)", "ok": true, "detail": "126,460"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -213 · 기 +772"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 136,162"}]}
{"ts": "2026-07-13T10:04:06.408909+09:00", "side": "BUY", "code": "055550", "name": "신한지주", "price": 113100, "qty": 51, "cost": 5768965, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 104723, "target": 129854, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "113,050 vs 100,265"}, {"label": "정배열(5>10)", "ok": true, "detail": "101,790 / 100,265"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "101,790 / 96,676"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+31.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -368 · 기 +1,005 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+17%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.71% (환산) vs 평균 0.35% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 109,800"}, {"label": "거래량 급증", "ok": true, "detail": "3,366,381 (환산) vs 평균 1,653,581"}, {"label": "회전율 급증", "ok": true, "detail": "0.71% (환산) vs 평균 0.35%"}, {"label": "RSI", "ok": true, "detail": "66"}]}
{"ts": "2026-07-14T10:20:06.143905+09:00", "side": "SELL", "code": "214450", "name": "파마리서치", "price": 310500, "qty": 15, "proceeds": 4648418, "entry_price": 341500, "pnl": -474851, "pnl_pct": -9.08, "hold_from": "2026-07-13T09:12:04.296871+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "310,647 (현재 310,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 403,206"}, {"label": "추세(10일선)", "ok": true, "detail": "302,400"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -50 · 기 +82"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 351,713"}]}
{"ts": "2026-07-16T09:00:08.347687+09:00", "side": "SELL", "code": "095610", "name": "테스", "price": 209000, "qty": 29, "proceeds": 6049181, "entry_price": 162924, "pnl": 1323672, "pnl_pct": 28.28, "hold_from": "2026-07-10T09:00:10.959008+09:00", "reason": "트레일링 익절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "210,764 (현재 207,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(10일선)", "ok": true, "detail": "158,280"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -799 · 기 +891"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-16T09:00:08.349387+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18580, "qty": 297, "proceeds": 5507499, "entry_price": 19110, "pnl": -169022, "pnl_pct": -2.77, "hold_from": "2026-07-09T09:02:04.459884+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "18,017 (현재 18,560)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,296"}, {"label": "추세(10일선)", "ok": false, "detail": "18,904"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -120 · 기 -150"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,486"}]}
{"ts": "2026-07-20T09:02:02.272710+09:00", "side": "SELL", "code": "055550", "name": "신한지주", "price": 104000, "qty": 51, "proceeds": 5293657, "entry_price": 113100, "pnl": -475308, "pnl_pct": -8.05, "hold_from": "2026-07-13T10:04:06.408908+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "104,723 (현재 104,200)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 129,854"}, {"label": "추세(10일선)", "ok": true, "detail": "99,380"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -111 · 기 +265"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 115,714"}]}
{"ts": "2026-07-20T10:50:03.214952+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 10600, "qty": 151, "proceeds": 1597479, "entry_price": 13660, "pnl": -465491, "pnl_pct": -22.4, "hold_from": "2026-07-10T11:06:06.467291+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "10,621 (현재 10,610)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 19,737"}, {"label": "추세(10일선)", "ok": false, "detail": "12,043"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -893 · 기 +516"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 14,615"}]}
{"ts": "2026-07-21T12:06:01.166188+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 344500, "qty": 14, "cost": 4823723, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 313808, "target": 405884, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "344,500 vs 305,800"}, {"label": "정배열(5>10)", "ok": true, "detail": "315,100 / 305,800"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "315,100 / 305,492"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+39.7%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -7 · 기 +1 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+43%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.38% (환산) vs 평균 0.93% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 334,500"}, {"label": "거래량 급증", "ok": true, "detail": "247,158 (환산) vs 평균 96,436"}, {"label": "회전율 급증", "ok": true, "detail": "2.38% (환산) vs 평균 0.93%"}, {"label": "RSI", "ok": true, "detail": "65"}]}
{"ts": "2026-07-22T14:18:05.421715+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 14030, "qty": 206, "cost": 2890614, "path": "pullback", "reason": "눌림목 지정가 14,023 도달", "stop": 11815, "target": 18460, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "14,020 vs 12,975"}, {"label": "정배열(5>10)", "ok": true, "detail": "14,552 / 12,975"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "14,552 / 13,283"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+10.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,005 · 기 +1,723 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.97% (환산) vs 평균 1.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 15,870"}, {"label": "거래량 급증", "ok": false, "detail": "585,754 (환산) vs 평균 882,736"}, {"label": "회전율 급증", "ok": false, "detail": "0.97% (환산) vs 평균 1.47%"}, {"label": "RSI", "ok": true, "detail": "53"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 14,023 (현재 14,020)"}]}
{"ts": "2026-07-22T15:04:00.992935+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 158100, "qty": 16, "cost": 2529979, "path": "pullback", "reason": "눌림목 지정가 158,107 도달", "stop": 129761, "target": 214778, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "158,000 vs 153,380"}, {"label": "정배열(5>10)", "ok": true, "detail": "172,240 / 153,380"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "172,240 / 99,750"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+49.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -311 · 기 +22 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+24%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "5.02% (환산) vs 평균 3.06% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 202,500"}, {"label": "거래량 급증", "ok": false, "detail": "971,360 (환산) vs 평균 591,925"}, {"label": "회전율 급증", "ok": true, "detail": "5.02% (환산) vs 평균 3.06%"}, {"label": "RSI", "ok": true, "detail": "61"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 158,107 (현재 158,000)"}]}
{"ts": "2026-07-23T09:50:01.510936+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 88200, "qty": 57, "cost": 5028154, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 80223, "target": 104155, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "88,200 vs 80,900"}, {"label": "정배열(5>10)", "ok": true, "detail": "83,000 / 80,900"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "83,000 / 75,058"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+47.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -150 · 기 +299 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+17%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.85% (환산) vs 평균 0.42% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 87,600"}, {"label": "거래량 급증", "ok": true, "detail": "785,587 (환산) vs 평균 392,182"}, {"label": "회전율 급증", "ok": true, "detail": "0.85% (환산) vs 평균 0.42%"}, {"label": "RSI", "ok": true, "detail": "67"}]}
{"ts": "2026-07-23T10:24:01.500387+09:00", "side": "SELL", "code": "095610", "name": "테스", "price": 152100, "qty": 16, "proceeds": 2428854, "entry_price": 158100, "pnl": -101125, "pnl_pct": -3.8, "hold_from": "2026-07-22T15:04:00.992934+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "129,761 (현재 152,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 214,778"}, {"label": "추세(10일선)", "ok": false, "detail": "152,780"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -101 · 기 -107"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 167,575"}]}
{"ts": "2026-07-23T10:30:02.480604+09:00", "side": "BUY", "code": "024060", "name": "흥구석유", "price": 14140, "qty": 251, "cost": 3549672, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 12315, "target": 17791, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "14,180 vs 12,429"}, {"label": "정배열(5>10)", "ok": true, "detail": "13,154 / 12,429"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "13,154 / 12,687"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+55.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +109 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "84.26% (환산) vs 평균 31.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 13,990"}, {"label": "거래량 급증", "ok": true, "detail": "12,639,979 (환산) vs 평균 4,720,532"}, {"label": "회전율 급증", "ok": true, "detail": "84.26% (환산) vs 평균 31.47%"}, {"label": "RSI", "ok": true, "detail": "66"}]}
{"ts": "2026-07-23T12:22:02.591407+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 356000, "qty": 14, "cost": 4984748, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 313808, "target": 405884, "signals": [{"label": "손절선", "ok": true, "detail": "313,808 (현재 356,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 405,884"}, {"label": "추세(10일선)", "ok": true, "detail": "306,950"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +6 · 기 +26"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 355,034"}]}
{"ts": "2026-07-23T12:54:04.493271+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 90900, "qty": 55, "cost": 5000250, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 80223, "target": 104155, "signals": [{"label": "손절선", "ok": true, "detail": "80,223 (현재 91,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 104,155"}, {"label": "추세(10일선)", "ok": true, "detail": "81,180"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -169 · 기 +311"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 90,945"}]}
{"ts": "2026-07-24T09:00:05.732126+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 111800, "qty": 28, "proceeds": 3124296, "entry_price": 132189, "pnl": -577559, "pnl_pct": -15.42, "hold_from": "2026-07-10T12:14:02.668437+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "102,302 (현재 113,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 191,963"}, {"label": "추세(10일선)", "ok": false, "detail": "123,880"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -480 · 기 -206"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-24T09:00:05.734614+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 155500, "qty": 16, "cost": 2488373, "path": "pullback", "reason": "눌림목 지정가 158,093 도달", "stop": 127139, "target": 212221, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "155,000 vs 153,080"}, {"label": "정배열(5>10)", "ok": true, "detail": "171,640 / 153,080"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "171,640 / 99,700"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+44.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +200 · 기 -454 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+27%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "3.77% (환산) vs 평균 3.06% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 202,500"}, {"label": "거래량 급증", "ok": false, "detail": "730,327 (환산) vs 평균 591,925"}, {"label": "회전율 급증", "ok": false, "detail": "3.77% (환산) vs 평균 3.06%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 158,093 (현재 155,000)"}]}
{"ts": "2026-07-24T09:02:04.039961+09:00", "side": "BUY", "code": "024060", "name": "흥구석유", "price": 15060, "qty": 236, "cost": 3554693, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 12315, "target": 17791, "signals": [{"label": "손절선", "ok": true, "detail": "12,315 (현재 15,020)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 17,791"}, {"label": "추세(10일선)", "ok": true, "detail": "12,513"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +208 · 기 -2"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 14,766"}]}
{"ts": "2026-07-24T09:28:04.946271+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 14510, "qty": 200, "cost": 2902435, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 11815, "target": 18460, "signals": [{"label": "손절선", "ok": true, "detail": "11,815 (현재 15,400)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 18,460"}, {"label": "추세(10일선)", "ok": true, "detail": "13,113"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -857 · 기 +1,172"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 14,791"}]}
{"ts": "2026-07-24T10:02:04.395802+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 18950, "qty": 306, "cost": 5799570, "path": "pullback", "reason": "눌림목 지정가 20,012 도달", "stop": 17843, "target": 21164, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "18,950 vs 18,943"}, {"label": "정배열(5>10)", "ok": true, "detail": "19,576 / 18,943"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,576 / 19,358"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+19.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +2 · 기 -5 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.39% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "454,069 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.39% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "49"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 20,012 (현재 18,950)"}]}
{"ts": "2026-07-27T09:04:05.309208+09:00", "side": "SELL", "code": "024060", "name": "흥구석유", "price": 12200, "qty": 487, "proceeds": 5929814, "entry_price": 14586, "pnl": -1174551, "pnl_pct": -16.36, "hold_from": "2026-07-23T10:30:02.480603+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "12,708 (현재 12,250)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 18,342"}, {"label": "추세(10일선)", "ok": true, "detail": "12,236"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -85 · 기 +2"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-27T09:06:01.452072+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 7720, "qty": 547, "cost": 4223473, "path": "pullback", "reason": "눌림목 지정가 7,907 도달", "stop": 6890, "target": 9380, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "7,720 vs 5,416"}, {"label": "정배열(5>10)", "ok": true, "detail": "6,502 / 5,416"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,502 / 4,893"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+88.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +49 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "4.17% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "258,673 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "4.17% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": false, "detail": "78"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,907 (현재 7,720)"}]}
{"ts": "2026-07-27T12:50:05.820784+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 8080, "qty": 523, "cost": 4226474, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 6890, "target": 9380, "signals": [{"label": "손절선", "ok": true, "detail": "6,890 (현재 8,070)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 9,380"}, {"label": "추세(10일선)", "ok": true, "detail": "5,452"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +50 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 7,997"}]}
{"ts": "2026-07-27T13:34:01.435246+09:00", "side": "SELL", "code": "003680", "name": "한성기업", "price": 7050, "qty": 1070, "proceeds": 7528790, "entry_price": 7896, "pnl": -921157, "pnl_pct": -10.71, "hold_from": "2026-07-27T09:06:01.452056+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "7,066 (현재 7,050)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 9,556"}, {"label": "추세(10일선)", "ok": true, "detail": "5,350"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +50 · 기 +0"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-28T09:00:15.935347+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6780, "qty": 510, "cost": 3458319, "path": "pullback", "reason": "눌림목 지정가 7,884 도달", "stop": 5916, "target": 8509, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "7,050 vs 5,350"}, {"label": "정배열(5>10)", "ok": true, "detail": "6,368 / 5,350"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,368 / 4,882"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+73.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +86 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.01% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "813 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "0.01% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "69"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,884 (현재 7,050)"}]}
{"ts": "2026-07-28T09:02:04.747643+09:00", "side": "SELL", "code": "252990", "name": "샘씨엔에스", "price": 11920, "qty": 406, "proceeds": 4830083, "entry_price": 14266, "pnl": -962966, "pnl_pct": -16.45, "hold_from": "2026-07-22T14:18:05.421714+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "11,984 (현재 11,960)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 18,831"}, {"label": "추세(10일선)", "ok": false, "detail": "12,769"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +84 · 기 -61"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-28T09:04:02.736929+09:00", "side": "SELL", "code": "095610", "name": "테스", "price": 123200, "qty": 16, "proceeds": 1967356, "entry_price": 155500, "pnl": -521017, "pnl_pct": -20.77, "hold_from": "2026-07-24T09:00:05.734608+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "127,139 (현재 123,600)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 212,221"}, {"label": "추세(10일선)", "ok": false, "detail": "149,940"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +269 · 기 -554"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 166,050"}]}
{"ts": "2026-07-28T09:10:01.739939+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 7100, "qty": 487, "cost": 3458219, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 5916, "target": 8509, "signals": [{"label": "손절선", "ok": true, "detail": "5,916 (현재 7,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 8,509"}, {"label": "추세(10일선)", "ok": true, "detail": "5,354"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +86 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 7,079"}]}
{"ts": "2026-07-29T09:02:02.224639+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 117900, "qty": 45, "cost": 5306296, "path": "pullback", "reason": "눌림목 지정가 118,115 도달", "stop": 111200, "target": 131300, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "117,800 vs 116,390"}, {"label": "정배열(5>10)", "ok": true, "detail": "117,020 / 116,390"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "117,020 / 109,982"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+45.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +39 · 기 +307 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+26%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.03% (환산) vs 평균 0.17% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 123,300"}, {"label": "거래량 급증", "ok": false, "detail": "44,660 (환산) vs 평균 289,522"}, {"label": "회전율 급증", "ok": false, "detail": "0.03% (환산) vs 평균 0.17%"}, {"label": "RSI", "ok": true, "detail": "57"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 118,115 (현재 117,800)"}]}
{"ts": "2026-07-29T09:16:04.462967+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 120500, "qty": 44, "cost": 5302795, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 111200, "target": 131300, "signals": [{"label": "손절선", "ok": true, "detail": "111,200 (현재 120,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 131,300"}, {"label": "추세(10일선)", "ok": true, "detail": "116,660"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +39 · 기 +307"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 120,492"}]}
{"ts": "2026-07-29T09:24:09.111290+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 18950, "qty": 306, "cost": 5799570, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 17843, "target": 21164, "signals": [{"label": "손절선", "ok": true, "detail": "17,843 (현재 20,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,164"}, {"label": "추세(10일선)", "ok": true, "detail": "18,901"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +99 · 기 +138"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,268"}]}
{"ts": "2026-07-29T09:24:09.112024+09:00", "side": "SELL", "code": "010950", "name": "S-Oil", "price": 128600, "qty": 79, "proceeds": 10139589, "entry_price": 134419, "pnl": -481104, "pnl_pct": -4.33, "hold_from": "2026-07-09T09:36:03.454533+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "122,827 (현재 116,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 157,603"}, {"label": "추세(10일선)", "ok": true, "detail": "105,620"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +43 · 기 +245"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T09:28:01.380944+09:00", "side": "BUY", "code": "090850", "name": "현대이지웰", "price": 6390, "qty": 843, "cost": 5387578, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 5998, "target": 7174, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "6,380 vs 5,591"}, {"label": "정배열(5>10)", "ok": true, "detail": "5,742 / 5,591"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "5,742 / 5,622"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+43.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +73 · 기 -3 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.62% (환산) vs 평균 0.22% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 5,700"}, {"label": "거래량 급증", "ok": true, "detail": "134,413 (환산) vs 평균 49,512"}, {"label": "회전율 급증", "ok": true, "detail": "0.62% (환산) vs 평균 0.22%"}, {"label": "RSI", "ok": true, "detail": "73"}]}
{"ts": "2026-07-29T10:42:05.409278+09:00", "side": "SELL", "code": "090850", "name": "현대이지웰", "price": 5980, "qty": 843, "proceeds": 5031310, "entry_price": 6390, "pnl": -356268, "pnl_pct": -6.42, "hold_from": "2026-07-29T09:28:01.380943+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,998 (현재 5,980)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 7,174"}, {"label": "추세(10일선)", "ok": true, "detail": "5,551"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +77 · 기 -3"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,521"}]}
{"ts": "2026-07-29T11:18:04.421952+09:00", "side": "SELL", "code": "003680", "name": "한성기업", "price": 6000, "qty": 997, "proceeds": 5970335, "entry_price": 6936, "pnl": -946202, "pnl_pct": -13.5, "hold_from": "2026-07-28T09:00:15.935337+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "6,040 (현재 6,020)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 8,729"}, {"label": "추세(10일선)", "ok": true, "detail": "5,246"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +185 · 기 +0"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T12:04:01.685681+09:00", "side": "SELL", "code": "086790", "name": "하나금융지주", "price": 119200, "qty": 89, "proceeds": 10588113, "entry_price": 124178, "pnl": -465345, "pnl_pct": -4.01, "hold_from": "2026-07-02T10:18:03.834926+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "114,299 (현재 119,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 143,934"}, {"label": "추세(10일선)", "ok": false, "detail": "119,490"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -11 · 기 -51"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-30T09:04:07.455793+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 121300, "qty": 42, "cost": 5095364, "path": "pullback", "reason": "눌림목 지정가 122,665 도달", "stop": 111347, "target": 141206, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "121,200 vs 119,680"}, {"label": "정배열(5>10)", "ok": true, "detail": "120,840 / 119,680"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "120,840 / 118,418"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+34.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -214 · 기 +182 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+36%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.18% (환산) vs 평균 0.37% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 130,700"}, {"label": "거래량 급증", "ok": false, "detail": "494,880 (환산) vs 평균 1,026,357"}, {"label": "회전율 급증", "ok": false, "detail": "0.18% (환산) vs 평균 0.37%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 122,665 (현재 121,200)"}]}
{"ts": "2026-07-30T09:04:07.457329+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6130, "qty": 423, "cost": 2593379, "path": "pullback", "reason": "눌림목 지정가 7,792 도달", "stop": 5127, "target": 8135, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "6,120 vs 5,256"}, {"label": "정배열(5>10)", "ok": true, "detail": "6,182 / 5,256"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,182 / 4,866"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+65.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +234 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "4.31% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "267,687 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "4.31% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,792 (현재 6,120)"}]}
{"ts": "2026-07-30T09:16:11.909415+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 125200, "qty": 41, "cost": 5133970, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 111347, "target": 141206, "signals": [{"label": "손절선", "ok": true, "detail": "111,347 (현재 125,400)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 141,206"}, {"label": "추세(10일선)", "ok": true, "detail": "120,100"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -214 · 기 +182"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 124,618"}]}
{"ts": "2026-07-30T09:24:07.511684+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 131800, "qty": 38, "cost": 5009151, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 120690, "target": 154020, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "132,000 vs 108,670"}, {"label": "정배열(5>10)", "ok": true, "detail": "115,580 / 108,670"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "115,580 / 113,230"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+51.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -6 · 기 +178 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+20%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.66% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 116,900"}, {"label": "거래량 급증", "ok": true, "detail": "738,813 (환산) vs 평균 359,705"}, {"label": "회전율 급증", "ok": true, "detail": "0.66% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-07-30T09:26:07.458683+09:00", "side": "BUY", "code": "090850", "name": "현대이지웰", "price": 6300, "qty": 855, "cost": 5387308, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 5917, "target": 7067, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "6,280 vs 5,581"}, {"label": "정배열(5>10)", "ok": true, "detail": "5,722 / 5,581"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "5,722 / 5,620"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+46.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +87 · 기 +6 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.51% (환산) vs 평균 0.22% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 5,700"}, {"label": "거래량 급증", "ok": true, "detail": "109,080 (환산) vs 평균 49,512"}, {"label": "회전율 급증", "ok": true, "detail": "0.51% (환산) vs 평균 0.22%"}, {"label": "RSI", "ok": true, "detail": "71"}]}
{"ts": "2026-07-31T09:04:07.865082+09:00", "side": "SELL", "code": "078930", "name": "GS", "price": 69100, "qty": 112, "proceeds": 7724109, "entry_price": 89526, "pnl": -2304295, "pnl_pct": -22.82, "hold_from": "2026-07-23T09:50:01.510934+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "81,291 (현재 79,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 105,995"}, {"label": "추세(10일선)", "ok": false, "detail": "80,070"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -179 · 기 +325"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-31T09:06:06.999372+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6550, "qty": 396, "cost": 2594189, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 5127, "target": 8135, "signals": [{"label": "손절선", "ok": true, "detail": "5,127 (현재 6,640)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 8,135"}, {"label": "추세(10일선)", "ok": true, "detail": "5,308"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +355 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,453"}]}
{"ts": "2026-08-03T09:34:08.538141+09:00", "side": "SELL", "code": "010950", "name": "S-Oil", "price": 120300, "qty": 38, "proceeds": 4562486, "entry_price": 131800, "pnl": -446665, "pnl_pct": -8.73, "hold_from": "2026-07-30T09:24:07.511679+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "120,690 (현재 120,400)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 154,020"}, {"label": "추세(10일선)", "ok": true, "detail": "107,510"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -35 · 기 +48"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 135,311"}]}
{"ts": "2026-08-03T12:00:11.789230+09:00", "side": "BUY", "code": "194370", "name": "제이에스코퍼레이션", "price": 12910, "qty": 345, "cost": 4454618, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 11713, "target": 15304, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "12,930 vs 12,003"}, {"label": "정배열(5>10)", "ok": true, "detail": "12,138 / 12,003"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "12,138 / 11,924"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+27.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +7 · 기 +10 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+74%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.72% (환산) vs 평균 0.34% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 12,870"}, {"label": "거래량 급증", "ok": true, "detail": "208,994 (환산) vs 평균 99,303"}, {"label": "회전율 급증", "ok": true, "detail": "0.72% (환산) vs 평균 0.34%"}, {"label": "RSI", "ok": true, "detail": "63"}]}
{"ts": "2026-08-03T12:02:09.735696+09:00", "side": "BUY", "code": "194370", "name": "제이에스코퍼레이션", "price": 13420, "qty": 332, "cost": 4456108, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 11713, "target": 15304, "signals": [{"label": "손절선", "ok": true, "detail": "11,713 (현재 13,450)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 15,304"}, {"label": "추세(10일선)", "ok": true, "detail": "12,055"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +7 · 기 +10"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,339"}]}
{"ts": "2026-08-04T09:50:09.564920+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 90400, "qty": 50, "cost": 4520678, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 82166, "target": 106869, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "90,300 vs 81,110"}, {"label": "정배열(5>10)", "ok": true, "detail": "83,420 / 81,110"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "83,420 / 75,093"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+56.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +68 · 기 +117 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+14%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.87% (환산) vs 평균 0.42% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 87,600"}, {"label": "거래량 급증", "ok": true, "detail": "805,693 (환산) vs 평균 392,182"}, {"label": "회전율 급증", "ok": true, "detail": "0.87% (환산) vs 평균 0.42%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-08-04T10:32:12.762882+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 93500, "qty": 48, "cost": 4488673, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 82166, "target": 106869, "signals": [{"label": "손절선", "ok": true, "detail": "82,166 (현재 93,400)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 106,869"}, {"label": "추세(10일선)", "ok": true, "detail": "81,420"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +57 · 기 +117"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 93,241"}]}
{"ts": "2026-08-04T13:26:12.235766+09:00", "side": "SELL", "code": "090850", "name": "현대이지웰", "price": 5910, "qty": 855, "proceeds": 5043197, "entry_price": 6300, "pnl": -344111, "pnl_pct": -6.19, "hold_from": "2026-07-30T09:26:07.458674+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,917 (현재 5,910)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 7,067"}, {"label": "추세(10일선)", "ok": true, "detail": "5,544"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +36 · 기 +9"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,419"}]}
{"ts": "2026-08-05T09:02:13.217011+09:00", "side": "BUY", "code": "090850", "name": "현대이지웰", "price": 5710, "qty": 911, "cost": 5202590, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 5372, "target": 6387, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "5,730 vs 5,526"}, {"label": "정배열(5>10)", "ok": true, "detail": "5,612 / 5,526"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "5,612 / 5,611"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+11.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +14 · 기 -2 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.46% (환산) vs 평균 0.22% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 5,700"}, {"label": "거래량 급증", "ok": true, "detail": "99,627 (환산) vs 평균 49,512"}, {"label": "회전율 급증", "ok": true, "detail": "0.46% (환산) vs 평균 0.22%"}, {"label": "RSI", "ok": true, "detail": "61"}]}
{"ts": "2026-08-06T09:00:18.887672+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18730, "qty": 612, "proceeds": 11440408, "entry_price": 18950, "pnl": -158732, "pnl_pct": -1.16, "hold_from": "2026-07-24T10:02:04.395801+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "17,996 (현재 18,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 20,858"}, {"label": "추세(10일선)", "ok": false, "detail": "18,923"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -203 · 기 -147"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-08-06T09:00:18.926770+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 13300, "qty": 181, "cost": 2407661, "path": "pullback", "reason": "눌림목 지정가 13,975 도달", "stop": 11012, "target": 17875, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "13,300 vs 12,903"}, {"label": "정배열(5>10)", "ok": true, "detail": "14,408 / 12,903"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "14,408 / 13,271"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-5.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -352 · 기 +499 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.00% (환산) vs 평균 1.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 15,870"}, {"label": "거래량 급증", "ok": false, "detail": "7 (환산) vs 평균 882,736"}, {"label": "회전율 급증", "ok": false, "detail": "0.00% (환산) vs 평균 1.47%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 13,975 (현재 13,300)"}]}
{"ts": "2026-08-06T09:06:09.886971+09:00", "side": "SELL", "code": "090850", "name": "현대이지웰", "price": 5470, "qty": 911, "proceeds": 4973453, "entry_price": 5710, "pnl": -229137, "pnl_pct": -4.2, "hold_from": "2026-08-05T09:02:13.217002+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "5,372 (현재 5,490)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 6,387"}, {"label": "추세(10일선)", "ok": false, "detail": "5,502"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -30 · 기 -23"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 5,823"}]}
{"ts": "2026-08-06T09:34:15.869494+09:00", "side": "BUY", "code": "068270", "name": "셀트리온", "price": 192000, "qty": 27, "cost": 5184778, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 179508, "target": 216984, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "191,800 vs 180,670"}, {"label": "정배열(5>10)", "ok": true, "detail": "186,140 / 180,670"}, {"label": "추세 기울기(10일선↑)", "ok": true, "detail": "우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "186,140 / 176,671"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+20.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +255 · 기 -319 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+44%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.67% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 191,700"}, {"label": "거래량 급증", "ok": true, "detail": "1,582,767 (환산) vs 평균 738,783"}, {"label": "회전율 급증", "ok": true, "detail": "0.67% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "63"}]}
{"ts": "2026-08-07T09:02:12.155244+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 14290, "qty": 169, "cost": 2415372, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 11012, "target": 17875, "signals": [{"label": "손절선", "ok": true, "detail": "11,012 (현재 14,240)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 17,875"}, {"label": "추세(10일선)", "ok": true, "detail": "12,997"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -216 · 기 +313"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 14,046"}]}
{"ts": "2026-08-07T09:12:15.674263+09:00", "side": "BUY", "code": "068270", "name": "셀트리온", "price": 196400, "qty": 26, "cost": 5107166, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 179508, "target": 216984, "signals": [{"label": "손절선", "ok": true, "detail": "179,508 (현재 196,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 216,984"}, {"label": "추세(10일선)", "ok": true, "detail": "181,120"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +338 · 기 +73"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 196,264"}]}
@@ -0,0 +1,203 @@
{
"cash": 5893724.850999957,
"initial": 100000000,
"positions": {
"214450": {
"code": "214450",
"name": "파마리서치",
"sources": [
"auto"
],
"qty": 29,
"entry_price": 350051.724137931,
"entry_at": "2026-07-21T12:06:01.168413+09:00",
"stop": 307915,
"target": 476463,
"peak": 411500,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 409000,
"tranches": 2,
"tranche_value": 5184250.1290937485,
"last_add_price": 356000
},
"138040": {
"code": "138040",
"name": "메리츠금융지주",
"sources": [
"auto"
],
"qty": 68,
"entry_price": 119008.82352941176,
"entry_at": "2026-07-29T09:02:02.227528+09:00",
"stop": 111200,
"target": 142435,
"peak": 127600,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 118,115 도달",
"cur_price": 123200,
"tranches": 2,
"tranche_value": 4675255.455593748,
"last_add_price": 120500
},
"086790": {
"code": "086790",
"name": "하나금융지주",
"sources": [
"auto"
],
"qty": 73,
"entry_price": 123223.28767123287,
"entry_at": "2026-07-30T09:04:07.465577+09:00",
"stop": 111000,
"target": 159893,
"peak": 134600,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 122,665 도달",
"cur_price": 130600,
"tranches": 2,
"tranche_value": 4550435.925312498,
"last_add_price": 125200
},
"003680": {
"code": "003680",
"name": "한성기업",
"sources": [
"auto"
],
"qty": 1055,
"entry_price": 6333.03317535545,
"entry_at": "2026-07-30T09:04:07.466771+09:00",
"stop": 5039,
"target": 10215,
"peak": 6840,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 7,792 도달",
"cur_price": 6220,
"tranches": 2,
"tranche_value": 3342107.250162302,
"last_add_price": 6550
},
"010950": {
"code": "010950",
"name": "S-Oil",
"sources": [
"auto"
],
"qty": 68,
"entry_price": 133375.0,
"entry_at": "2026-07-30T09:16:11.918383+09:00",
"stop": 117719,
"target": 180344,
"peak": 139900,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 139600,
"tranches": 2,
"tranche_value": 4604300.898906248,
"last_add_price": 136000
},
"194370": {
"code": "194370",
"name": "제이에스코퍼레이션",
"sources": [
"auto"
],
"qty": 675,
"entry_price": 13160.08888888889,
"entry_at": "2026-08-03T12:00:11.797603+09:00",
"stop": 11445,
"target": 18305,
"peak": 14120,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 13370,
"tranches": 2,
"tranche_value": 4446388.7381874975,
"last_add_price": 13420
},
"252990": {
"code": "252990",
"name": "샘씨엔에스",
"sources": [
"auto"
],
"qty": 513,
"entry_price": 13423.450292397662,
"entry_at": "2026-08-05T09:02:13.227814+09:00",
"stop": 10340,
"target": 22674,
"peak": 15670,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 13,947 도달",
"cur_price": 15670,
"tranches": 2,
"tranche_value": 3449195.5386017757,
"last_add_price": 13830
},
"095610": {
"code": "095610",
"name": "테스",
"sources": [
"auto"
],
"qty": 37,
"entry_price": 141708.1081081081,
"entry_at": "2026-08-06T09:08:09.846488+09:00",
"stop": 100700,
"target": 264732,
"peak": 147300,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 156,500 도달",
"cur_price": 143700,
"tranches": 2,
"tranche_value": 2724987.151235263,
"last_add_price": 147100
}
},
"realized_pnl": -30093934.73800002,
"closed_trades": 35,
"wins": 1,
"peak_equity": 103066363.367,
"max_drawdown": 0.32842114973504477,
"last_exit": {
"030000": "2026-08-06",
"086790": "2026-07-29",
"005930": "2026-06-23",
"403870": "2026-07-07",
"093370": "2026-07-20",
"240810": "2026-07-24",
"009150": "2026-07-06",
"214450": "2026-07-06",
"034730": "2026-07-07",
"319660": "2026-07-23",
"003490": "2026-07-09",
"105560": "2026-07-20",
"055550": "2026-07-21",
"095610": "2026-07-28",
"252990": "2026-07-28",
"010950": "2026-07-29",
"078930": "2026-07-31",
"003680": "2026-07-29",
"090850": "2026-08-05",
"161890": "2026-07-30"
},
"created_at": "2026-06-15T14:55:00.582771+09:00",
"updated_at": "2026-08-10T15:28:14.928204+09:00"
}
@@ -0,0 +1,106 @@
{"ts": "2026-06-17T11:15:02.356809+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 130900, "qty": 47, "cost": 6153223, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 118039, "target": 169483, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "129,300 vs 118,195"}, {"label": "정배열(5>20)", "ok": true, "detail": "120,400 / 118,195"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "120,400 / 118,307"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-13.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +371 · 기 +158 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+22%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.12% (환산) vs 평균 0.38% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 126,500"}, {"label": "거래량 급증", "ok": true, "detail": "3,094,534 (환산) vs 평균 1,031,725"}, {"label": "회전율 급증", "ok": true, "detail": "1.12% (환산) vs 평균 0.38%"}, {"label": "RSI", "ok": true, "detail": "60"}]}
{"ts": "2026-06-17T16:47:30.995278+09:00", "side": "BUY", "code": "403870", "name": "HPSP", "price": 62900, "qty": 71, "cost": 4466570, "path": "pullback", "reason": "눌림목 지정가 64,531 도달", "stop": 48962, "target": 104714, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "62,800 vs 52,858"}, {"label": "정배열(5>20)", "ok": true, "detail": "59,880 / 52,858"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "59,880 / 49,831"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+21.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -4,434 · 기 +5,040 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+9%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "11.31% vs 평균 5.97% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 71,500"}, {"label": "거래량 급증", "ok": true, "detail": "9,309,211 vs 평균 4,912,598"}, {"label": "회전율 급증", "ok": true, "detail": "11.31% vs 평균 5.97%"}, {"label": "RSI", "ok": true, "detail": "58"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 64,531 (현재 62,800)"}]}
{"ts": "2026-06-19T09:02:06.401619+09:00", "side": "BUY", "code": "005930", "name": "삼성전자", "price": 373500, "qty": 16, "cost": 5976896, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 331259, "target": 500222, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "373,000 vs 325,400"}, {"label": "정배열(5>20)", "ok": true, "detail": "352,400 / 325,400"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "352,400 / 258,005"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+6.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,427 · 기 +4,448 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+19%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.04% (환산) vs 평균 0.53% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 370,000"}, {"label": "거래량 급증", "ok": true, "detail": "60,950,213 (환산) vs 평균 31,088,390"}, {"label": "회전율 급증", "ok": true, "detail": "1.04% (환산) vs 평균 0.53%"}, {"label": "RSI", "ok": true, "detail": "67"}]}
{"ts": "2026-06-19T09:02:06.402025+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19160, "qty": 325, "cost": 6227934, "path": "pullback", "reason": "눌림목 지정가 20,044 도달", "stop": 17760, "target": 23360, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "19,150 vs 18,862"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,616 / 18,862"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,616 / 19,361"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-31.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,162 · 기 +2,080 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.03% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "37,673 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.03% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 20,044 (현재 19,150)"}]}
{"ts": "2026-06-23T09:00:10.982982+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18820, "qty": 325, "proceeds": 6104573, "entry_price": 19160, "pnl": -123361, "pnl_pct": -1.77, "hold_from": "2026-06-19T09:02:06.402024+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 18,710)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 23,360"}, {"label": "추세(20일선)", "ok": false, "detail": "18,840"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -318 · 기 -227"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,528"}]}
{"ts": "2026-06-23T12:04:04.143156+09:00", "side": "SELL", "code": "086790", "name": "하나금융지주", "price": 117700, "qty": 47, "proceeds": 5521113, "entry_price": 130900, "pnl": -632110, "pnl_pct": -10.08, "hold_from": "2026-06-17T11:15:02.356807+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "118,039 (현재 117,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 169,483"}, {"label": "추세(20일선)", "ok": false, "detail": "118,130"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +332 · 기 -364"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 134,300"}]}
{"ts": "2026-06-23T12:32:04.185307+09:00", "side": "SELL", "code": "005930", "name": "삼성전자", "price": 330000, "qty": 16, "proceeds": 5269704, "entry_price": 373500, "pnl": -707192, "pnl_pct": -11.65, "hold_from": "2026-06-19T09:02:06.401618+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "331,259 (현재 330,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 500,222"}, {"label": "추세(20일선)", "ok": true, "detail": "329,025"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -3,792 · 기 +1,417"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 384,779"}]}
{"ts": "2026-06-24T09:04:06.120043+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 156700, "qty": 26, "cost": 4074811, "path": "pullback", "reason": "눌림목 지정가 165,075 도달", "stop": 120251, "target": 266048, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "156,200 vs 121,650"}, {"label": "정배열(5>20)", "ok": true, "detail": "143,260 / 121,650"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "143,260 / 121,703"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+46.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +210 · 기 +143 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+6%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "5.83% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": true, "detail": "2,860,073 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": true, "detail": "5.83% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 165,075 (현재 156,200)"}]}
{"ts": "2026-06-24T09:12:05.354156+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 17270, "qty": 296, "cost": 5112687, "path": "pullback", "reason": "눌림목 지정가 17,366 도달", "stop": 13981, "target": 27136, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "17,280 vs 12,914"}, {"label": "정배열(5>20)", "ok": true, "detail": "16,364 / 12,914"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "16,364 / 11,500"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+21.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +1,740 · 기 -508 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+16%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.34% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": false, "detail": "2,509,340 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": false, "detail": "2.34% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "65"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 17,366 (현재 17,280)"}]}
{"ts": "2026-06-24T09:46:04.785266+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 158200, "qty": 26, "cost": 4113817, "path": "pullback", "reason": "눌림목 지정가 158,264 도달", "stop": 120729, "target": 270614, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "158,000 vs 136,315"}, {"label": "정배열(5>20)", "ok": true, "detail": "172,240 / 136,315"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "172,240 / 99,750"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+56.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +41 · 기 +65 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+5%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "4.25% (환산) vs 평균 3.06% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 202,500"}, {"label": "거래량 급증", "ok": true, "detail": "822,940 (환산) vs 평균 591,925"}, {"label": "회전율 급증", "ok": false, "detail": "4.25% (환산) vs 평균 3.06%"}, {"label": "RSI", "ok": true, "detail": "61"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 158,264 (현재 158,000)"}]}
{"ts": "2026-06-24T11:12:05.903120+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 18260, "qty": 280, "cost": 5113567, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 13981, "target": 27136, "signals": [{"label": "손절선", "ok": true, "detail": "13,981 (현재 18,250)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 27,136"}, {"label": "추세(20일선)", "ok": true, "detail": "12,962"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +1,742 · 기 -508"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 18,094"}]}
{"ts": "2026-06-25T09:00:25.655538+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 179100, "qty": 23, "cost": 4119918, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 120729, "target": 270614, "signals": [{"label": "손절선", "ok": true, "detail": "120,729 (현재 178,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 270,614"}, {"label": "추세(20일선)", "ok": true, "detail": "137,330"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -56 · 기 +134"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 167,275"}]}
{"ts": "2026-06-25T09:04:05.747338+09:00", "side": "BUY", "code": "003490", "name": "대한항공", "price": 28900, "qty": 214, "cost": 6185528, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 26248, "target": 36855, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "28,850 vs 25,948"}, {"label": "정배열(5>20)", "ok": true, "detail": "26,110 / 25,948"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "26,110 / 25,216"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-2.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +1,577 · 기 -7 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.9/5"}, {"label": "상승여력", "ok": true, "detail": "+15%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.54% (환산) vs 평균 0.58% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 28,400"}, {"label": "거래량 급증", "ok": true, "detail": "5,629,873 (환산) vs 평균 2,146,231"}, {"label": "회전율 급증", "ok": true, "detail": "1.54% (환산) vs 평균 0.58%"}, {"label": "RSI", "ok": true, "detail": "64"}]}
{"ts": "2026-06-26T09:00:07.629324+09:00", "side": "SELL", "code": "403870", "name": "HPSP", "price": 50000, "qty": 71, "proceeds": 3543078, "entry_price": 62900, "pnl": -923492, "pnl_pct": -20.51, "hold_from": "2026-06-17T16:47:30.995271+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "48,962 (현재 51,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 104,714"}, {"label": "추세(20일선)", "ok": false, "detail": "52,268"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -311 · 기 -267"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 66,756"}]}
{"ts": "2026-06-26T10:14:04.064359+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 166900, "qty": 25, "cost": 4173126, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 120251, "target": 266048, "signals": [{"label": "손절선", "ok": true, "detail": "120,251 (현재 166,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 266,048"}, {"label": "추세(20일선)", "ok": true, "detail": "122,175"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -126 · 기 +320"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 165,659"}]}
{"ts": "2026-06-29T11:36:01.268695+09:00", "side": "BUY", "code": "034730", "name": "SK", "price": 745000, "qty": 7, "cost": 5215782, "path": "pullback", "reason": "눌림목 지정가 748,914 도달", "stop": 612829, "target": 1141514, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "744,000 vs 676,650"}, {"label": "정배열(5>20)", "ok": true, "detail": "766,800 / 676,650"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "766,800 / 530,600"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+12.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -194 · 기 +152 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+8%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.35% (환산) vs 평균 0.45% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 883,000"}, {"label": "거래량 급증", "ok": true, "detail": "977,966 (환산) vs 평균 329,863"}, {"label": "회전율 급증", "ok": true, "detail": "1.35% (환산) vs 평균 0.45%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 748,914 (현재 744,000)"}]}
{"ts": "2026-06-29T14:18:01.488939+09:00", "side": "BUY", "code": "034730", "name": "SK", "price": 778000, "qty": 7, "cost": 5446817, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 612829, "target": 1141514, "signals": [{"label": "손절선", "ok": true, "detail": "612,829 (현재 779,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 1,141,514"}, {"label": "추세(20일선)", "ok": true, "detail": "678,400"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -200 · 기 +143"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 778,043"}]}
{"ts": "2026-06-30T09:00:07.738420+09:00", "side": "BUY", "code": "403870", "name": "HPSP", "price": 55300, "qty": 81, "cost": 4479972, "path": "pullback", "reason": "눌림목 지정가 63,981 도달", "stop": 43200, "target": 91600, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "53,700 vs 52,402"}, {"label": "정배열(5>20)", "ok": true, "detail": "58,060 / 52,402"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "58,060 / 49,679"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+12.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +222 · 기 -821 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+28%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.00% (환산) vs 평균 5.97% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 71,500"}, {"label": "거래량 급증", "ok": false, "detail": "827 (환산) vs 평균 4,912,598"}, {"label": "회전율 급증", "ok": false, "detail": "0.00% (환산) vs 평균 5.97%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 63,981 (현재 53,700)"}]}
{"ts": "2026-06-30T09:02:03.189531+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 347500, "qty": 18, "cost": 6255938, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 305863, "target": 472411, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "347,000 vs 296,475"}, {"label": "정배열(5>20)", "ok": true, "detail": "315,600 / 296,475"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "315,600 / 305,533"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+29.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -19 · 기 +146 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+39%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.55% (환산) vs 평균 0.93% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 334,500"}, {"label": "거래량 급증", "ok": true, "detail": "160,800 (환산) vs 평균 96,436"}, {"label": "회전율 급증", "ok": true, "detail": "1.55% (환산) vs 평균 0.93%"}, {"label": "RSI", "ok": true, "detail": "66"}]}
{"ts": "2026-06-30T09:06:03.683224+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 360000, "qty": 17, "cost": 6120918, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 305863, "target": 472411, "signals": [{"label": "손절선", "ok": true, "detail": "305,863 (현재 360,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 472,411"}, {"label": "추세(20일선)", "ok": true, "detail": "297,125"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -19 · 기 +146"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 358,070"}]}
{"ts": "2026-07-01T09:46:03.059044+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 118200, "qty": 54, "cost": 6383757, "path": "pullback", "reason": "눌림목 지정가 122,286 도달", "stop": 111000, "target": 139800, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "118,200 vs 118,155"}, {"label": "정배열(5>20)", "ok": true, "detail": "120,240 / 118,155"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "120,240 / 118,368"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+3.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +55 · 기 -166 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.35% (환산) vs 평균 0.37% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 130,700"}, {"label": "거래량 급증", "ok": false, "detail": "969,420 (환산) vs 평균 1,026,357"}, {"label": "회전율 급증", "ok": false, "detail": "0.35% (환산) vs 평균 0.37%"}, {"label": "RSI", "ok": true, "detail": "49"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 122,286 (현재 118,200)"}]}
{"ts": "2026-07-02T10:18:03.838896+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 122200, "qty": 52, "cost": 6355353, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 111000, "target": 139800, "signals": [{"label": "손절선", "ok": true, "detail": "111,000 (현재 122,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 139,800"}, {"label": "추세(20일선)", "ok": true, "detail": "118,345"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +22 · 기 -44"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 121,743"}]}
{"ts": "2026-07-02T11:04:07.587427+09:00", "side": "BUY", "code": "003490", "name": "대한항공", "price": 29600, "qty": 209, "cost": 6187328, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 26248, "target": 36855, "signals": [{"label": "손절선", "ok": true, "detail": "26,248 (현재 29,600)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 36,855"}, {"label": "추세(20일선)", "ok": true, "detail": "25,985"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -206 · 기 +1,008"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 29,586"}]}
{"ts": "2026-07-03T09:04:01.672278+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 14370, "qty": 576, "proceeds": 8260980, "entry_price": 17751, "pnl": -1965274, "pnl_pct": -19.05, "hold_from": "2026-06-24T09:12:05.354155+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "14,457 (현재 14,390)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 27,634"}, {"label": "추세(20일선)", "ok": true, "detail": "12,769"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -1,591 · 기 +253"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-03T09:28:01.642880+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 125700, "qty": 51, "proceeds": 6398199, "entry_price": 161700, "pnl": -1849738, "pnl_pct": -22.26, "hold_from": "2026-06-24T09:04:06.120041+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "125,865 (현재 125,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 269,206"}, {"label": "추세(20일선)", "ok": true, "detail": "120,125"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +674 · 기 -2,170"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-03T10:24:02.774353+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19040, "qty": 301, "cost": 5731900, "path": "pullback", "reason": "눌림목 지정가 20,004 도달", "stop": 17760, "target": 22880, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "19,030 vs 18,856"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,592 / 18,856"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,592 / 19,359"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+2.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -35 · 기 +168 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+34%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.54% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "619,193 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.54% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "49"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 20,004 (현재 19,030)"}]}
{"ts": "2026-07-03T15:10:02.641097+09:00", "side": "BUY", "code": "009150", "name": "삼성전기", "price": 1971000, "qty": 2, "cost": 3942591, "path": "pullback", "reason": "눌림목 지정가 1,978,439 도달", "stop": 1901000, "target": 2181000, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "1,971,000 vs 1,967,250"}, {"label": "정배열(5>20)", "ok": true, "detail": "2,036,600 / 1,967,250"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "2,036,600 / 1,295,300"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+9.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +146 · 기 +126 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+10%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.46% (환산) vs 평균 1.76% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 2,417,000"}, {"label": "거래량 급증", "ok": true, "detail": "1,835,275 (환산) vs 평균 1,312,239"}, {"label": "회전율 급증", "ok": false, "detail": "2.46% (환산) vs 평균 1.76%"}, {"label": "RSI", "ok": true, "detail": "55"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 1,978,439 (현재 1,971,000)"}]}
{"ts": "2026-07-06T10:06:01.984453+09:00", "side": "SELL", "code": "009150", "name": "삼성전기", "price": 1900000, "qty": 2, "proceeds": 3792590, "entry_price": 1971000, "pnl": -150001, "pnl_pct": -3.6, "hold_from": "2026-07-03T15:10:02.641095+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "1,901,000 (현재 1,901,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 2,181,000"}, {"label": "추세(20일선)", "ok": false, "detail": "1,963,750"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +135 · 기 +46"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 2,067,780"}]}
{"ts": "2026-07-06T10:06:02.326033+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 123800, "qty": 32, "cost": 3962194, "path": "pullback", "reason": "눌림목 지정가 163,325 도달", "stop": 96000, "target": 207200, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "123,800 vs 120,030"}, {"label": "정배열(5>20)", "ok": true, "detail": "136,780 / 120,030"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "136,780 / 121,163"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+3.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +735 · 기 -1,982 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+41%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "6.92% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": true, "detail": "3,397,673 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": true, "detail": "6.92% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 163,325 (현재 123,800)"}]}
{"ts": "2026-07-06T10:20:01.601299+09:00", "side": "SELL", "code": "214450", "name": "파마리서치", "price": 311000, "qty": 35, "proceeds": 10863774, "entry_price": 353571, "pnl": -1513082, "pnl_pct": -12.04, "hold_from": "2026-06-30T09:02:03.189529+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "311,291 (현재 311,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 480,411"}, {"label": "추세(20일선)", "ok": true, "detail": "294,675"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -108 · 기 +225"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-06T10:22:04.507430+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 13300, "qty": 308, "cost": 4097014, "path": "pullback", "reason": "눌림목 지정가 17,049 도달", "stop": 10360, "target": 22120, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "13,290 vs 12,714"}, {"label": "정배열(5>20)", "ok": true, "detail": "15,566 / 12,714"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "15,566 / 11,433"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-12.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,199 · 기 +137 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+50%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "10.30% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": true, "detail": "11,050,727 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": true, "detail": "10.30% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 17,049 (현재 13,290)"}]}
{"ts": "2026-07-07T09:48:07.384355+09:00", "side": "SELL", "code": "403870", "name": "HPSP", "price": 43000, "qty": 81, "proceeds": 3476208, "entry_price": 55300, "pnl": -1003764, "pnl_pct": -22.24, "hold_from": "2026-06-30T09:00:07.738410+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "43,200 (현재 43,050)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 91,600"}, {"label": "추세(20일선)", "ok": false, "detail": "51,870"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +1,424 · 기 -5,706"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 59,449"}]}
{"ts": "2026-07-07T10:30:07.363185+09:00", "side": "SELL", "code": "034730", "name": "SK", "price": 628000, "qty": 14, "proceeds": 8774856, "entry_price": 761500, "pnl": -1887744, "pnl_pct": -17.53, "hold_from": "2026-06-29T11:36:01.268694+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "629,329 (현재 628,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 1,158,014"}, {"label": "추세(20일선)", "ok": false, "detail": "670,850"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -58 · 기 +6"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-07T12:02:08.230606+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 12230, "qty": 308, "proceeds": 3759495, "entry_price": 13300, "pnl": -337520, "pnl_pct": -8.05, "hold_from": "2026-07-06T10:22:04.507428+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "10,360 (현재 12,230)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,120"}, {"label": "추세(20일선)", "ok": false, "detail": "12,661"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -1,558 · 기 -4"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 14,302"}]}
{"ts": "2026-07-07T14:08:38.356420+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 183300, "qty": 22, "cost": 4033205, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 96000, "target": 207200, "signals": [{"label": "손절선", "ok": true, "detail": "96,000 (현재 183,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 207,200"}, {"label": "추세(20일선)", "ok": true, "detail": "120,210"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +263 · 기 -1,543"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 132,225"}]}
{"ts": "2026-07-07T14:08:41.015067+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 20750, "qty": 277, "cost": 5748612, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 17760, "target": 22880, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 20,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,880"}, {"label": "추세(20일선)", "ok": true, "detail": "18,884"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +156 · 기 +113"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,358"}]}
{"ts": "2026-07-08T09:00:18.228156+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 108300, "qty": 54, "proceeds": 5836796, "entry_price": 148041, "pnl": -2158603, "pnl_pct": -26.84, "hold_from": "2026-07-06T10:06:02.326019+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "114,341 (현재 112,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 249,139"}, {"label": "추세(20일선)", "ok": false, "detail": "119,475"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +243 · 기 -857"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-08T09:48:01.871994+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 161100, "qty": 33, "cost": 5317097, "path": "pullback", "reason": "눌림목 지정가 168,676 도달", "stop": 158000, "target": 170400, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "161,600 vs 149,870"}, {"label": "정배열(5>20)", "ok": true, "detail": "169,960 / 149,870"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "169,960 / 113,252"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+77.7%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +198 · 기 -309 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+11%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "3.83% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": true, "detail": "1,110,233 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": false, "detail": "3.83% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "56"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 168,676 (현재 161,600)"}]}
{"ts": "2026-07-08T10:26:01.966870+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 157600, "qty": 33, "proceeds": 5190658, "entry_price": 161100, "pnl": -126439, "pnl_pct": -2.17, "hold_from": "2026-07-08T09:48:01.871993+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "158,000 (현재 158,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 170,400"}, {"label": "추세(20일선)", "ok": true, "detail": "149,690"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +198 · 기 -312"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 170,862"}]}
{"ts": "2026-07-09T09:02:04.462263+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 158300, "qty": 33, "cost": 5224684, "path": "pullback", "reason": "눌림목 지정가 168,455 도달", "stop": 158000, "target": 159200, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "158,200 vs 149,700"}, {"label": "정배열(5>20)", "ok": true, "detail": "169,280 / 149,700"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "169,280 / 113,195"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+81.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +296 · 기 -306 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+13%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.72% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": false, "detail": "499,233 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": false, "detail": "1.72% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "55"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 168,455 (현재 158,200)"}]}
{"ts": "2026-07-09T09:10:01.824473+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 132300, "qty": 39, "cost": 5160474, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 117515, "target": 176655, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "132,100 vs 108,930"}, {"label": "정배열(5>20)", "ok": true, "detail": "115,600 / 108,930"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "115,600 / 113,232"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+22.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -184 · 기 +964 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+12%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.51% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 116,900"}, {"label": "거래량 급증", "ok": true, "detail": "572,860 (환산) vs 평균 359,705"}, {"label": "회전율 급증", "ok": true, "detail": "0.51% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-07-09T09:12:02.506925+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 156900, "qty": 33, "proceeds": 5167603, "entry_price": 158300, "pnl": -57080, "pnl_pct": -0.88, "hold_from": "2026-07-09T09:02:04.462262+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "158,000 (현재 156,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "149,635"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +296 · 기 -306"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-09T12:12:04.855087+09:00", "side": "SELL", "code": "003490", "name": "대한항공", "price": 26500, "qty": 423, "proceeds": 11187641, "entry_price": 29246, "pnl": -1185214, "pnl_pct": -9.39, "hold_from": "2026-06-25T09:04:05.747336+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "26,501 (현재 26,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 37,480"}, {"label": "추세(20일선)", "ok": true, "detail": "25,830"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -1,444 · 기 +2,767"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-10T09:00:11.070807+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 164000, "qty": 32, "cost": 5248787, "path": "pullback", "reason": "눌림목 지정가 169,105 도달", "stop": 158000, "target": 182000, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "162,200 vs 149,900"}, {"label": "정배열(5>20)", "ok": true, "detail": "170,080 / 149,900"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "170,080 / 113,262"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+85.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +225 · 기 -178 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+10%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.58% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": false, "detail": "746,107 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": false, "detail": "2.58% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "56"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 169,105 (현재 162,200)"}]}
{"ts": "2026-07-10T09:28:02.618671+09:00", "side": "BUY", "code": "055550", "name": "신한지주", "price": 110900, "qty": 48, "cost": 5323998, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 99988, "target": 143637, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "110,700 vs 97,340"}, {"label": "정배열(5>20)", "ok": true, "detail": "101,320 / 97,340"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "101,320 / 96,637"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+22.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -756 · 기 +893 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+17%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.54% (환산) vs 평균 0.35% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 109,800"}, {"label": "거래량 급증", "ok": true, "detail": "2,541,113 (환산) vs 평균 1,653,581"}, {"label": "회전율 급증", "ok": true, "detail": "0.54% (환산) vs 평균 0.35%"}, {"label": "RSI", "ok": true, "detail": "65"}]}
{"ts": "2026-07-10T09:28:02.618951+09:00", "side": "BUY", "code": "105560", "name": "KB금융", "price": 185900, "qty": 28, "cost": 5205981, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 166448, "target": 244255, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "185,600 vs 159,890"}, {"label": "정배열(5>20)", "ok": true, "detail": "159,900 / 159,890"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "159,900 / 157,368"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+26.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,310 · 기 +1,527 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+16%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.06% (환산) vs 평균 0.46% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 182,700"}, {"label": "거래량 급증", "ok": true, "detail": "3,715,113 (환산) vs 평균 1,640,325"}, {"label": "회전율 급증", "ok": true, "detail": "1.06% (환산) vs 평균 0.46%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-07-10T09:46:11.473039+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 12830, "qty": 344, "cost": 4414182, "path": "pullback", "reason": "눌림목 지정가 16,984 도달", "stop": 10360, "target": 20240, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "12,820 vs 12,690"}, {"label": "정배열(5>20)", "ok": true, "detail": "15,472 / 12,690"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "15,472 / 11,425"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+1.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +228 · 기 +229 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+56%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "9.75% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": true, "detail": "10,460,473 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": true, "detail": "9.75% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 16,984 (현재 12,820)"}]}
{"ts": "2026-07-10T10:14:04.436912+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 173600, "qty": 30, "cost": 5208781, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 158000, "target": 182000, "signals": [{"label": "손절선", "ok": true, "detail": "158,000 (현재 173,600)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 182,000"}, {"label": "추세(20일선)", "ok": true, "detail": "150,470"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +205 · 기 -155"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 173,548"}]}
{"ts": "2026-07-10T11:16:02.473816+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 13850, "qty": 319, "cost": 4418813, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 10360, "target": 20240, "signals": [{"label": "손절선", "ok": true, "detail": "10,360 (현재 13,850)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 20,240"}, {"label": "추세(20일선)", "ok": true, "detail": "12,742"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +210 · 기 +239"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,843"}]}
{"ts": "2026-07-13T09:00:11.029806+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 136900, "qty": 38, "cost": 5202980, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 117515, "target": 176655, "signals": [{"label": "손절선", "ok": true, "detail": "117,515 (현재 136,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 176,655"}, {"label": "추세(20일선)", "ok": true, "detail": "109,140"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -64 · 기 +919"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 136,164"}]}
{"ts": "2026-07-13T09:36:02.272467+09:00", "side": "BUY", "code": "105560", "name": "KB금융", "price": 191000, "qty": 27, "cost": 5157774, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 166448, "target": 244255, "signals": [{"label": "손절선", "ok": true, "detail": "166,448 (현재 191,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 244,255"}, {"label": "추세(20일선)", "ok": true, "detail": "160,160"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -867 · 기 +1,393"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 190,952"}]}
{"ts": "2026-07-13T12:44:04.353229+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 187900, "qty": 62, "proceeds": 11627083, "entry_price": 168645, "pnl": 1169514, "pnl_pct": 11.42, "hold_from": "2026-07-10T09:00:11.070801+09:00", "reason": "트레일링 익절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "189,133 (현재 187,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "151,185"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -254 · 기 +457"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-15T09:02:02.644676+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 135500, "qty": 23, "cost": 3116967, "path": "pullback", "reason": "눌림목 지정가 164,061 도달", "stop": 97022, "target": 250934, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "134,900 vs 120,585"}, {"label": "정배열(5>20)", "ok": true, "detail": "139,000 / 120,585"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "139,000 / 121,348"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+27.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,752 · 기 +1,989 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+31%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.30% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": false, "detail": "636,187 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": false, "detail": "1.30% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "53"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 164,061 (현재 134,900)"}]}
{"ts": "2026-07-15T14:32:01.882454+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18570, "qty": 578, "proceeds": 10712530, "entry_price": 19859, "pnl": -767982, "pnl_pct": -6.49, "hold_from": "2026-07-03T10:24:02.774352+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "18,587 (현재 18,570)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 23,676"}, {"label": "추세(20일선)", "ok": false, "detail": "18,833"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -214 · 기 +240"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-16T14:16:02.478397+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 145700, "qty": 21, "cost": 3060159, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 97022, "target": 250934, "signals": [{"label": "손절선", "ok": true, "detail": "97,022 (현재 145,800)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 250,934"}, {"label": "추세(20일선)", "ok": true, "detail": "121,130"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -1,717 · 기 +2,299"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 145,295"}]}
{"ts": "2026-07-20T12:28:02.313716+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 10310, "qty": 663, "proceeds": 6822201, "entry_price": 13321, "pnl": -2010794, "pnl_pct": -22.6, "hold_from": "2026-07-10T09:46:11.473038+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "10,360 (현재 10,310)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,203"}, {"label": "추세(20일선)", "ok": false, "detail": "14,755"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -887 · 기 +515"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-20T12:50:02.287453+09:00", "side": "SELL", "code": "105560", "name": "KB금융", "price": 167800, "qty": 55, "proceeds": 9211003, "entry_price": 188404, "pnl": -1152751, "pnl_pct": -10.94, "hold_from": "2026-07-10T09:28:02.618950+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "168,195 (현재 167,800)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 249,030"}, {"label": "추세(20일선)", "ok": true, "detail": "159,000"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -385 · 기 +288"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-21T09:02:05.656405+09:00", "side": "SELL", "code": "055550", "name": "신한지주", "price": 99300, "qty": 48, "proceeds": 4757106, "entry_price": 110900, "pnl": -566893, "pnl_pct": -10.46, "hold_from": "2026-07-10T09:28:02.618669+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "99,988 (현재 99,400)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 143,637"}, {"label": "추세(20일선)", "ok": true, "detail": "96,775"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -141 · 기 +150"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 113,471"}]}
{"ts": "2026-07-21T10:12:01.043990+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 167000, "qty": 30, "cost": 5010752, "path": "pullback", "reason": "눌림목 지정가 169,640 도달", "stop": 158000, "target": 194000, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "167,000 vs 150,140"}, {"label": "정배열(5>20)", "ok": true, "detail": "171,040 / 150,140"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "171,040 / 113,342"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+92.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -534 · 기 +316 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+7%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "3.29% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": false, "detail": "951,819 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": false, "detail": "3.29% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "58"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 169,640 (현재 167,000)"}]}
{"ts": "2026-07-21T12:06:01.168414+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 344500, "qty": 15, "cost": 5168275, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 303577, "target": 467269, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "344,500 vs 296,350"}, {"label": "정배열(5>20)", "ok": true, "detail": "315,100 / 296,350"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "315,100 / 305,492"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+39.7%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -7 · 기 +1 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+43%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.38% (환산) vs 평균 0.93% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 334,500"}, {"label": "거래량 급증", "ok": true, "detail": "247,158 (환산) vs 평균 96,436"}, {"label": "회전율 급증", "ok": true, "detail": "2.38% (환산) vs 평균 0.93%"}, {"label": "RSI", "ok": true, "detail": "65"}]}
{"ts": "2026-07-22T09:00:06.915560+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 177600, "qty": 29, "cost": 5151173, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 158000, "target": 194000, "signals": [{"label": "손절선", "ok": true, "detail": "158,000 (현재 178,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 194,000"}, {"label": "추세(20일선)", "ok": true, "detail": "150,715"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -377 · 기 +151"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 175,894"}]}
{"ts": "2026-07-22T09:04:01.817054+09:00", "side": "BUY", "code": "161890", "name": "한국콜마", "price": 99200, "qty": 52, "cost": 5159174, "path": "pullback", "reason": "눌림목 지정가 98,848 도달", "stop": 92100, "target": 120500, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "98,800 vs 98,505"}, {"label": "정배열(5>20)", "ok": true, "detail": "107,060 / 98,505"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "107,060 / 91,913"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+27.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +29 · 기 -34 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.16% (환산) vs 평균 1.76% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 124,600"}, {"label": "거래량 급증", "ok": false, "detail": "272,433 (환산) vs 평균 415,172"}, {"label": "회전율 급증", "ok": false, "detail": "1.16% (환산) vs 평균 1.76%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 98,848 (현재 98,800)"}]}
{"ts": "2026-07-22T12:12:00.737790+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 157300, "qty": 59, "proceeds": 9262603, "entry_price": 172210, "pnl": -899321, "pnl_pct": -8.66, "hold_from": "2026-07-21T10:12:01.043989+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "158,000 (현재 157,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 214,841"}, {"label": "추세(20일선)", "ok": true, "detail": "149,655"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -407 · 기 +141"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-22T14:18:05.423677+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 14030, "qty": 275, "cost": 3858829, "path": "pullback", "reason": "눌림목 지정가 14,023 도달", "stop": 11077, "target": 22889, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "14,020 vs 12,776"}, {"label": "정배열(5>20)", "ok": true, "detail": "14,552 / 12,776"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "14,552 / 13,283"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+10.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,005 · 기 +1,723 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.97% (환산) vs 평균 1.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 15,870"}, {"label": "거래량 급증", "ok": false, "detail": "585,754 (환산) vs 평균 882,736"}, {"label": "회전율 급증", "ok": false, "detail": "0.97% (환산) vs 평균 1.47%"}, {"label": "RSI", "ok": true, "detail": "53"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 14,023 (현재 14,020)"}]}
{"ts": "2026-07-23T09:00:22.660826+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 160100, "qty": 31, "cost": 4963844, "path": "pullback", "reason": "눌림목 지정가 169,062 도달", "stop": 158000, "target": 166400, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "158,100 vs 149,695"}, {"label": "정배열(5>20)", "ok": true, "detail": "169,260 / 149,695"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "169,260 / 113,193"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+76.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -162 · 기 +37 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+13%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.05% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": false, "detail": "303,687 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": false, "detail": "1.05% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "55"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 169,062 (현재 158,100)"}]}
{"ts": "2026-07-23T09:32:04.410357+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 157800, "qty": 31, "proceeds": 4882261, "entry_price": 160100, "pnl": -81583, "pnl_pct": -1.44, "hold_from": "2026-07-23T09:00:22.660819+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "158,000 (현재 157,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 166,400"}, {"label": "추세(20일선)", "ok": true, "detail": "149,685"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -162 · 기 +37"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 169,669"}]}
{"ts": "2026-07-23T09:44:04.282865+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 18850, "qty": 269, "cost": 5071411, "path": "pullback", "reason": "눌림목 지정가 20,001 도달", "stop": 17760, "target": 22120, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "18,850 vs 18,847"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,556 / 18,847"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,556 / 19,356"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+13.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -25 · 기 +6 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+34%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.34% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "388,767 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.34% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "48"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 20,001 (현재 18,850)"}]}
{"ts": "2026-07-23T12:18:01.542920+09:00", "side": "BUY", "code": "161890", "name": "한국콜마", "price": 103100, "qty": 50, "cost": 5155773, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 92100, "target": 120500, "signals": [{"label": "손절선", "ok": true, "detail": "92,100 (현재 103,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 120,500"}, {"label": "추세(20일선)", "ok": true, "detail": "98,720"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +222 · 기 -227"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 103,029"}]}
{"ts": "2026-07-23T12:22:02.593538+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 356000, "qty": 14, "cost": 4984748, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 303577, "target": 467269, "signals": [{"label": "손절선", "ok": true, "detail": "303,577 (현재 356,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 467,269"}, {"label": "추세(20일선)", "ok": true, "detail": "296,925"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +6 · 기 +26"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 355,034"}]}
{"ts": "2026-07-24T09:00:05.830105+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 111800, "qty": 44, "proceeds": 4909608, "entry_price": 140368, "pnl": -1267519, "pnl_pct": -20.35, "hold_from": "2026-07-15T09:02:02.644674+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "101,190 (현재 113,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 257,902"}, {"label": "추세(20일선)", "ok": false, "detail": "119,505"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -480 · 기 -206"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-24T09:00:05.831824+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18730, "qty": 269, "proceeds": 5028545, "entry_price": 18850, "pnl": -42865, "pnl_pct": -0.64, "hold_from": "2026-07-23T09:44:04.282863+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 18,730)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,120"}, {"label": "추세(20일선)", "ok": false, "detail": "18,841"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -5 · 기 -5"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,219"}]}
{"ts": "2026-07-24T09:26:01.006441+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 94000, "qty": 53, "cost": 4982747, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 82349, "target": 128952, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "93,900 vs 75,355"}, {"label": "정배열(5>20)", "ok": true, "detail": "84,140 / 75,355"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "84,140 / 75,153"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+61.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -113 · 기 +274 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+10%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.90% (환산) vs 평균 0.42% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 87,600"}, {"label": "거래량 급증", "ok": true, "detail": "829,560 (환산) vs 평균 392,182"}, {"label": "회전율 급증", "ok": true, "detail": "0.90% (환산) vs 평균 0.42%"}, {"label": "RSI", "ok": true, "detail": "72"}]}
{"ts": "2026-07-24T09:28:04.948071+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 14510, "qty": 266, "cost": 3860239, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 11077, "target": 22889, "signals": [{"label": "손절선", "ok": true, "detail": "11,077 (현재 15,400)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,889"}, {"label": "추세(20일선)", "ok": true, "detail": "12,845"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -857 · 기 +1,172"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 14,791"}]}
{"ts": "2026-07-24T09:48:01.195831+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 97000, "qty": 52, "cost": 5044757, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 82349, "target": 128952, "signals": [{"label": "손절선", "ok": true, "detail": "82,349 (현재 97,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 128,952"}, {"label": "추세(20일선)", "ok": true, "detail": "75,510"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -113 · 기 +274"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 96,977"}]}
{"ts": "2026-07-27T09:02:06.227946+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19100, "qty": 263, "cost": 5024053, "path": "pullback", "reason": "눌림목 지정가 20,032 도달", "stop": 17760, "target": 23120, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "19,070 vs 18,858"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,600 / 18,858"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,600 / 19,360"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+16.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +101 · 기 -3 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.13% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "146,760 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.13% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 20,032 (현재 19,070)"}]}
{"ts": "2026-07-28T09:00:16.048472+09:00", "side": "SELL", "code": "095610", "name": "테스", "price": 126200, "qty": 49, "proceeds": 6171742, "entry_price": 168010, "pnl": -2061993, "pnl_pct": -24.89, "hold_from": "2026-06-24T09:46:04.785264+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "131,710 (현재 128,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 276,910"}, {"label": "추세(20일선)", "ok": false, "detail": "134,815"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +269 · 기 -554"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-28T09:00:16.050874+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6780, "qty": 677, "cost": 4590749, "path": "pullback", "reason": "눌림목 지정가 7,884 도달", "stop": 5628, "target": 10237, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "7,050 vs 4,855"}, {"label": "정배열(5>20)", "ok": true, "detail": "6,368 / 4,855"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,368 / 4,882"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+73.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +86 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.01% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "813 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "0.01% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "69"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,884 (현재 7,050)"}]}
{"ts": "2026-07-28T09:10:01.741799+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 7100, "qty": 646, "cost": 4587288, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 5628, "target": 10237, "signals": [{"label": "손절선", "ok": true, "detail": "5,628 (현재 7,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 10,237"}, {"label": "추세(20일선)", "ok": true, "detail": "4,857"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +86 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 7,079"}]}
{"ts": "2026-07-28T10:08:02.769455+09:00", "side": "SELL", "code": "252990", "name": "샘씨엔에스", "price": 11170, "qty": 541, "proceeds": 6031186, "entry_price": 14266, "pnl": -1687881, "pnl_pct": -21.7, "hold_from": "2026-07-22T14:18:05.423676+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "11,223 (현재 11,220)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 23,395"}, {"label": "추세(20일선)", "ok": false, "detail": "12,636"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +106 · 기 -64"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T09:02:02.227530+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 117900, "qty": 39, "cost": 4598790, "path": "pullback", "reason": "눌림목 지정가 118,115 도달", "stop": 111200, "target": 138000, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "117,800 vs 113,445"}, {"label": "정배열(5>20)", "ok": true, "detail": "117,020 / 113,445"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "117,020 / 109,982"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+45.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +39 · 기 +307 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+26%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.03% (환산) vs 평균 0.17% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 123,300"}, {"label": "거래량 급증", "ok": false, "detail": "44,660 (환산) vs 평균 289,522"}, {"label": "회전율 급증", "ok": false, "detail": "0.03% (환산) vs 평균 0.17%"}, {"label": "RSI", "ok": true, "detail": "57"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 118,115 (현재 117,800)"}]}
{"ts": "2026-07-29T09:16:04.464886+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 120500, "qty": 29, "cost": 3495024, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 111200, "target": 138000, "signals": [{"label": "손절선", "ok": true, "detail": "111,200 (현재 120,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 138,000"}, {"label": "추세(20일선)", "ok": true, "detail": "113,580"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +39 · 기 +307"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 120,492"}]}
{"ts": "2026-07-29T09:24:09.118714+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 18950, "qty": 6, "cost": 113717, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 17760, "target": 23120, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 20,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 23,120"}, {"label": "추세(20일선)", "ok": true, "detail": "18,884"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +99 · 기 +138"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,418"}]}
{"ts": "2026-07-29T09:24:09.964903+09:00", "side": "SELL", "code": "010950", "name": "S-Oil", "price": 128600, "qty": 77, "proceeds": 9882891, "entry_price": 134570, "pnl": -480564, "pnl_pct": -4.44, "hold_from": "2026-07-09T09:10:01.824472+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "119,114 (현재 116,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 180,939"}, {"label": "추세(20일선)", "ok": true, "detail": "107,870"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +43 · 기 +245"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T09:24:09.966514+09:00", "side": "SELL", "code": "078930", "name": "GS", "price": 87700, "qty": 105, "proceeds": 9190543, "entry_price": 95486, "pnl": -836960, "pnl_pct": -8.15, "hold_from": "2026-07-24T09:26:01.006439+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "83,578 (현재 83,200)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 131,209"}, {"label": "추세(20일선)", "ok": true, "detail": "74,040"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -59 · 기 +284"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T09:28:01.382783+09:00", "side": "BUY", "code": "090850", "name": "현대이지웰", "price": 6390, "qty": 736, "cost": 4703745, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 5867, "target": 7958, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "6,380 vs 5,358"}, {"label": "정배열(5>20)", "ok": true, "detail": "5,742 / 5,358"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "5,742 / 5,622"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+43.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +73 · 기 -3 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.62% (환산) vs 평균 0.22% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 5,700"}, {"label": "거래량 급증", "ok": true, "detail": "134,413 (환산) vs 평균 49,512"}, {"label": "회전율 급증", "ok": true, "detail": "0.62% (환산) vs 평균 0.22%"}, {"label": "RSI", "ok": true, "detail": "73"}]}
{"ts": "2026-07-29T13:06:06.514247+09:00", "side": "SELL", "code": "003680", "name": "한성기업", "price": 5690, "qty": 1323, "proceeds": 7513191, "entry_price": 6936, "pnl": -1664846, "pnl_pct": -17.97, "hold_from": "2026-07-28T09:00:16.050865+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,741 (현재 5,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 10,522"}, {"label": "추세(20일선)", "ok": true, "detail": "4,787"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +185 · 기 +0"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T13:30:01.445481+09:00", "side": "SELL", "code": "086790", "name": "하나금융지주", "price": 118000, "qty": 106, "proceeds": 12483609, "entry_price": 120162, "pnl": -255501, "pnl_pct": -1.8, "hold_from": "2026-07-01T09:46:03.059028+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "111,000 (현재 118,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 147,649"}, {"label": "추세(20일선)", "ok": false, "detail": "118,145"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -11 · 기 -51"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T13:34:03.587859+09:00", "side": "SELL", "code": "090850", "name": "현대이지웰", "price": 5860, "qty": 736, "proceeds": 4304550, "entry_price": 6390, "pnl": -399196, "pnl_pct": -8.29, "hold_from": "2026-07-29T09:28:01.382782+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,867 (현재 5,860)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 7,958"}, {"label": "추세(20일선)", "ok": true, "detail": "5,332"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +73 · 기 -3"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,525"}]}
{"ts": "2026-07-30T09:04:07.465582+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 121300, "qty": 37, "cost": 4488773, "path": "pullback", "reason": "눌림목 지정가 122,665 도달", "stop": 111000, "target": 152200, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "121,200 vs 118,305"}, {"label": "정배열(5>20)", "ok": true, "detail": "120,840 / 118,305"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "120,840 / 118,418"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+34.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -214 · 기 +182 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+36%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.18% (환산) vs 평균 0.37% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 130,700"}, {"label": "거래량 급증", "ok": false, "detail": "494,880 (환산) vs 평균 1,026,357"}, {"label": "회전율 급증", "ok": false, "detail": "0.18% (환산) vs 평균 0.37%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 122,665 (현재 121,200)"}]}
{"ts": "2026-07-30T09:04:07.466775+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6130, "qty": 545, "cost": 3341351, "path": "pullback", "reason": "눌림목 지정가 7,792 도달", "stop": 4793, "target": 10140, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "6,120 vs 4,808"}, {"label": "정배열(5>20)", "ok": true, "detail": "6,182 / 4,808"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,182 / 4,866"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+65.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +234 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "4.31% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "267,687 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "4.31% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,792 (현재 6,120)"}]}
{"ts": "2026-07-30T09:16:11.917652+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 125200, "qty": 36, "cost": 4507876, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 111000, "target": 152200, "signals": [{"label": "손절선", "ok": true, "detail": "111,000 (현재 125,400)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 152,200"}, {"label": "추세(20일선)", "ok": true, "detail": "118,515"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -214 · 기 +182"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 124,618"}]}
{"ts": "2026-07-30T09:16:11.918388+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 130900, "qty": 35, "cost": 4582187, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 116144, "target": 175169, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "130,900 vs 108,870"}, {"label": "정배열(5>20)", "ok": true, "detail": "115,360 / 108,870"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "115,360 / 113,212"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+49.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -6 · 기 +178 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+21%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.51% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 116,900"}, {"label": "거래량 급증", "ok": true, "detail": "571,193 (환산) vs 평균 359,705"}, {"label": "회전율 급증", "ok": true, "detail": "0.51% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "68"}]}
{"ts": "2026-07-30T09:18:10.149807+09:00", "side": "BUY", "code": "090850", "name": "현대이지웰", "price": 6310, "qty": 731, "cost": 4613302, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 5799, "target": 7843, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "6,300 vs 5,354"}, {"label": "정배열(5>20)", "ok": true, "detail": "5,726 / 5,354"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "5,726 / 5,621"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+46.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +87 · 기 +6 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.41% (환산) vs 평균 0.22% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 5,700"}, {"label": "거래량 급증", "ok": true, "detail": "87,813 (환산) vs 평균 49,512"}, {"label": "회전율 급증", "ok": true, "detail": "0.41% (환산) vs 평균 0.22%"}, {"label": "RSI", "ok": true, "detail": "72"}]}
{"ts": "2026-07-30T11:58:08.423544+09:00", "side": "SELL", "code": "161890", "name": "한국콜마", "price": 91700, "qty": 102, "proceeds": 9335161, "entry_price": 101112, "pnl": -979786, "pnl_pct": -9.31, "hold_from": "2026-07-22T09:04:01.817053+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "92,100 (현재 91,800)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 128,147"}, {"label": "추세(20일선)", "ok": false, "detail": "98,155"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -7 · 기 +40"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-30T12:04:07.816772+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 87900, "qty": 50, "cost": 4395659, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 76706, "target": 121481, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "87,900 vs 75,055"}, {"label": "정배열(5>20)", "ok": true, "detail": "82,940 / 75,055"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "82,940 / 75,053"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+61.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -49 · 기 +280 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+17%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.79% (환산) vs 평균 0.42% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 87,600"}, {"label": "거래량 급증", "ok": true, "detail": "728,608 (환산) vs 평균 392,182"}, {"label": "회전율 급증", "ok": true, "detail": "0.79% (환산) vs 평균 0.42%"}, {"label": "RSI", "ok": true, "detail": "67"}]}
{"ts": "2026-07-31T09:06:07.006134+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6550, "qty": 510, "cost": 3341001, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 4793, "target": 10140, "signals": [{"label": "손절선", "ok": true, "detail": "4,793 (현재 6,640)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 10,140"}, {"label": "추세(20일선)", "ok": true, "detail": "4,834"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +355 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,453"}]}
{"ts": "2026-07-31T09:08:08.203881+09:00", "side": "SELL", "code": "078930", "name": "GS", "price": 69600, "qty": 50, "proceeds": 3473214, "entry_price": 87900, "pnl": -922445, "pnl_pct": -20.82, "hold_from": "2026-07-30T12:04:07.816765+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "76,706 (현재 69,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 121,481"}, {"label": "추세(20일선)", "ok": false, "detail": "74,135"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -179 · 기 +325"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 91,095"}]}
{"ts": "2026-08-03T12:00:11.797607+09:00", "side": "BUY", "code": "194370", "name": "제이에스코퍼레이션", "price": 12910, "qty": 344, "cost": 4441706, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 11314, "target": 17699, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "12,930 vs 11,922"}, {"label": "정배열(5>20)", "ok": true, "detail": "12,138 / 11,922"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "12,138 / 11,924"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+27.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +7 · 기 +10 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+74%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.72% (환산) vs 평균 0.34% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 12,870"}, {"label": "거래량 급증", "ok": true, "detail": "208,994 (환산) vs 평균 99,303"}, {"label": "회전율 급증", "ok": true, "detail": "0.72% (환산) vs 평균 0.34%"}, {"label": "RSI", "ok": true, "detail": "63"}]}
{"ts": "2026-08-03T12:02:09.743142+09:00", "side": "BUY", "code": "194370", "name": "제이에스코퍼레이션", "price": 13420, "qty": 331, "cost": 4442686, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 11314, "target": 17699, "signals": [{"label": "손절선", "ok": true, "detail": "11,314 (현재 13,450)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 17,699"}, {"label": "추세(20일선)", "ok": true, "detail": "11,948"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +7 · 기 +10"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,339"}]}
{"ts": "2026-08-05T09:02:13.227080+09:00", "side": "SELL", "code": "090850", "name": "현대이지웰", "price": 5700, "qty": 731, "proceeds": 4158575, "entry_price": 6310, "pnl": -454727, "pnl_pct": -9.67, "hold_from": "2026-07-30T09:18:10.149796+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,799 (현재 5,730)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 7,843"}, {"label": "추세(20일선)", "ok": true, "detail": "5,326"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +14 · 기 -2"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,423"}]}
{"ts": "2026-08-05T09:02:13.227819+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 13040, "qty": 264, "cost": 3443076, "path": "pullback", "reason": "눌림목 지정가 13,947 도달", "stop": 10340, "target": 21140, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "13,040 vs 12,727"}, {"label": "정배열(5>20)", "ok": true, "detail": "14,356 / 12,727"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "14,356 / 13,267"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-6.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -72 · 기 +134 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.13% (환산) vs 평균 1.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 15,870"}, {"label": "거래량 급증", "ok": false, "detail": "78,333 (환산) vs 평균 882,736"}, {"label": "회전율 급증", "ok": false, "detail": "0.13% (환산) vs 평균 1.47%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 13,947 (현재 13,040)"}]}
{"ts": "2026-08-05T09:38:11.448776+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 13830, "qty": 249, "cost": 3444187, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 10340, "target": 21140, "signals": [{"label": "손절선", "ok": true, "detail": "10,340 (현재 13,860)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,140"}, {"label": "추세(20일선)", "ok": true, "detail": "12,768"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -72 · 기 +134"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,817"}]}
{"ts": "2026-08-06T09:00:19.032347+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18730, "qty": 269, "proceeds": 5028545, "entry_price": 19097, "pnl": -109225, "pnl_pct": -1.92, "hold_from": "2026-07-27T09:02:06.227944+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "17,824 (현재 18,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,913"}, {"label": "추세(20일선)", "ok": false, "detail": "18,842"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -203 · 기 -147"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-08-06T09:08:09.846499+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 136600, "qty": 19, "cost": 2595789, "path": "pullback", "reason": "눌림목 지정가 156,500 도달", "stop": 100700, "target": 244300, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "136,400 vs 135,235"}, {"label": "정배열(5>20)", "ok": true, "detail": "167,920 / 135,235"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "167,920 / 99,390"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+13.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -609 · 기 +419 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+44%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.58% (환산) vs 평균 3.06% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 202,500"}, {"label": "거래량 급증", "ok": false, "detail": "499,673 (환산) vs 평균 591,925"}, {"label": "회전율 급증", "ok": false, "detail": "2.58% (환산) vs 평균 3.06%"}, {"label": "RSI", "ok": true, "detail": "52"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 156,500 (현재 136,400)"}]}
{"ts": "2026-08-10T09:00:16.132562+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 136000, "qty": 33, "cost": 4488673, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 116144, "target": 175169, "signals": [{"label": "손절선", "ok": true, "detail": "116,144 (현재 137,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 175,169"}, {"label": "추세(20일선)", "ok": true, "detail": "109,175"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -253 · 기 +225"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 134,814"}]}
{"ts": "2026-08-10T13:04:16.284400+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 147100, "qty": 18, "cost": 2648197, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 100700, "target": 244300, "signals": [{"label": "손절선", "ok": true, "detail": "100,700 (현재 147,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 244,300"}, {"label": "추세(20일선)", "ok": true, "detail": "135,765"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -349 · 기 +177"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 146,939"}]}
@@ -0,0 +1,203 @@
{
"cash": 6169690.483999949,
"initial": 100000000,
"positions": {
"214450": {
"code": "214450",
"name": "파마리서치",
"sources": [
"auto"
],
"qty": 30,
"entry_price": 350250.0,
"entry_at": "2026-07-21T12:06:01.170285+09:00",
"stop": 308113,
"target": 413456,
"peak": 411500,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 409000,
"tranches": 2,
"tranche_value": 5435113.820843748,
"last_add_price": 356000
},
"138040": {
"code": "138040",
"name": "메리츠금융지주",
"sources": [
"auto"
],
"qty": 83,
"entry_price": 119184.3373493976,
"entry_at": "2026-07-29T09:02:02.230500+09:00",
"stop": 111200,
"target": 131161,
"peak": 127600,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 118,115 도달",
"cur_price": 123200,
"tranches": 2,
"tranche_value": 5057738.410843747,
"last_add_price": 120500
},
"086790": {
"code": "086790",
"name": "하나금융지주",
"sources": [
"auto"
],
"qty": 81,
"entry_price": 123225.92592592593,
"entry_at": "2026-07-30T09:04:07.472633+09:00",
"stop": 111000,
"target": 141565,
"peak": 134600,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 122,665 도달",
"cur_price": 130600,
"tranches": 2,
"tranche_value": 5030428.7588749975,
"last_add_price": 125200
},
"003680": {
"code": "003680",
"name": "한성기업",
"sources": [
"auto"
],
"qty": 1167,
"entry_price": 6332.982005141388,
"entry_at": "2026-07-30T09:04:07.473311+09:00",
"stop": 5039,
"target": 8274,
"peak": 6840,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 7,792 도달",
"cur_price": 6220,
"tranches": 2,
"tranche_value": 3698158.582805608,
"last_add_price": 6550
},
"010950": {
"code": "010950",
"name": "S-Oil",
"sources": [
"auto"
],
"qty": 75,
"entry_price": 133416.0,
"entry_at": "2026-07-30T09:16:11.924631+09:00",
"stop": 117760,
"target": 156901,
"peak": 139900,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 139600,
"tranches": 2,
"tranche_value": 5098537.405531247,
"last_add_price": 136000
},
"194370": {
"code": "194370",
"name": "제이에스코퍼레이션",
"sources": [
"auto"
],
"qty": 747,
"entry_price": 13159.87951807229,
"entry_at": "2026-08-03T12:00:11.803724+09:00",
"stop": 11445,
"target": 15732,
"peak": 14120,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 13370,
"tranches": 2,
"tranche_value": 4920739.488124997,
"last_add_price": 13420
},
"252990": {
"code": "252990",
"name": "샘씨엔에스",
"sources": [
"auto"
],
"qty": 567,
"entry_price": 13423.1569664903,
"entry_at": "2026-08-05T09:02:13.234698+09:00",
"stop": 10340,
"target": 18048,
"peak": 15670,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 13,947 도달",
"cur_price": 15670,
"tranches": 2,
"tranche_value": 3814821.8249811833,
"last_add_price": 13830
},
"095610": {
"code": "095610",
"name": "테스",
"sources": [
"auto"
],
"qty": 42,
"entry_price": 141600.0,
"entry_at": "2026-08-06T09:08:09.854200+09:00",
"stop": 100700,
"target": 202950,
"peak": 147300,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 156,500 도달",
"cur_price": 143700,
"tranches": 2,
"tranche_value": 3012742.5788084655,
"last_add_price": 147100
}
},
"realized_pnl": -22653184.548500024,
"closed_trades": 39,
"wins": 5,
"peak_equity": 103066363.367,
"max_drawdown": 0.25604475305907143,
"last_exit": {
"030000": "2026-08-06",
"086790": "2026-07-29",
"005930": "2026-06-23",
"403870": "2026-07-07",
"095610": "2026-07-28",
"009150": "2026-07-06",
"093370": "2026-07-20",
"240810": "2026-07-24",
"214450": "2026-07-06",
"034730": "2026-07-07",
"319660": "2026-07-23",
"003490": "2026-07-09",
"105560": "2026-07-20",
"055550": "2026-07-20",
"252990": "2026-07-28",
"010950": "2026-07-29",
"078930": "2026-07-31",
"003680": "2026-07-29",
"090850": "2026-08-05",
"161890": "2026-07-30"
},
"created_at": "2026-06-15T14:55:00.582787+09:00",
"updated_at": "2026-08-10T15:28:14.940047+09:00"
}
@@ -0,0 +1,113 @@
{"ts": "2026-06-17T11:15:02.360191+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 130900, "qty": 47, "cost": 6153223, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 118039, "target": 150191, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "129,300 vs 118,195"}, {"label": "정배열(5>20)", "ok": true, "detail": "120,400 / 118,195"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "120,400 / 118,307"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-13.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +371 · 기 +158 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+22%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.12% (환산) vs 평균 0.38% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 126,500"}, {"label": "거래량 급증", "ok": true, "detail": "3,094,534 (환산) vs 평균 1,031,725"}, {"label": "회전율 급증", "ok": true, "detail": "1.12% (환산) vs 평균 0.38%"}, {"label": "RSI", "ok": true, "detail": "60"}]}
{"ts": "2026-06-17T16:47:31.019770+09:00", "side": "BUY", "code": "403870", "name": "HPSP", "price": 62900, "qty": 71, "cost": 4466570, "path": "pullback", "reason": "눌림목 지정가 64,531 도달", "stop": 48962, "target": 83807, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "62,800 vs 52,858"}, {"label": "정배열(5>20)", "ok": true, "detail": "59,880 / 52,858"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "59,880 / 49,831"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+21.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -4,434 · 기 +5,040 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+9%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "11.31% vs 평균 5.97% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 71,500"}, {"label": "거래량 급증", "ok": true, "detail": "9,309,211 vs 평균 4,912,598"}, {"label": "회전율 급증", "ok": true, "detail": "11.31% vs 평균 5.97%"}, {"label": "RSI", "ok": true, "detail": "58"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 64,531 (현재 62,800)"}]}
{"ts": "2026-06-19T09:02:06.405499+09:00", "side": "BUY", "code": "005930", "name": "삼성전자", "price": 373500, "qty": 16, "cost": 5976896, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 331259, "target": 436861, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "373,000 vs 325,400"}, {"label": "정배열(5>20)", "ok": true, "detail": "352,400 / 325,400"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "352,400 / 258,005"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+6.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,427 · 기 +4,448 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+19%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.04% (환산) vs 평균 0.53% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 370,000"}, {"label": "거래량 급증", "ok": true, "detail": "60,950,213 (환산) vs 평균 31,088,390"}, {"label": "회전율 급증", "ok": true, "detail": "1.04% (환산) vs 평균 0.53%"}, {"label": "RSI", "ok": true, "detail": "67"}]}
{"ts": "2026-06-19T09:02:06.405895+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19160, "qty": 325, "cost": 6227934, "path": "pullback", "reason": "눌림목 지정가 20,044 도달", "stop": 17760, "target": 21260, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "19,150 vs 18,862"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,616 / 18,862"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,616 / 19,361"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-31.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,162 · 기 +2,080 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.03% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "37,673 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.03% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 20,044 (현재 19,150)"}]}
{"ts": "2026-06-23T09:00:11.102596+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18820, "qty": 325, "proceeds": 6104573, "entry_price": 19160, "pnl": -123361, "pnl_pct": -1.77, "hold_from": "2026-06-19T09:02:06.405894+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 18,710)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,260"}, {"label": "추세(20일선)", "ok": false, "detail": "18,840"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -318 · 기 -227"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,528"}]}
{"ts": "2026-06-23T12:04:04.146347+09:00", "side": "SELL", "code": "086790", "name": "하나금융지주", "price": 117700, "qty": 47, "proceeds": 5521113, "entry_price": 130900, "pnl": -632110, "pnl_pct": -10.08, "hold_from": "2026-06-17T11:15:02.360190+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "118,039 (현재 117,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 150,191"}, {"label": "추세(20일선)", "ok": false, "detail": "118,130"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +332 · 기 -364"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 134,300"}]}
{"ts": "2026-06-23T12:32:04.187621+09:00", "side": "SELL", "code": "005930", "name": "삼성전자", "price": 330000, "qty": 16, "proceeds": 5269704, "entry_price": 373500, "pnl": -707192, "pnl_pct": -11.65, "hold_from": "2026-06-19T09:02:06.405498+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "331,259 (현재 330,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 436,861"}, {"label": "추세(20일선)", "ok": true, "detail": "329,025"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -3,792 · 기 +1,417"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 384,779"}]}
{"ts": "2026-06-24T09:04:06.122440+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 156700, "qty": 26, "cost": 4074811, "path": "pullback", "reason": "눌림목 지정가 165,075 도달", "stop": 120251, "target": 211374, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "156,200 vs 121,650"}, {"label": "정배열(5>20)", "ok": true, "detail": "143,260 / 121,650"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "143,260 / 121,703"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+46.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +210 · 기 +143 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+6%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "5.83% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": true, "detail": "2,860,073 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": true, "detail": "5.83% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 165,075 (현재 156,200)"}]}
{"ts": "2026-06-24T09:12:05.356215+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 17270, "qty": 296, "cost": 5112687, "path": "pullback", "reason": "눌림목 지정가 17,366 도달", "stop": 13981, "target": 22203, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "17,280 vs 12,914"}, {"label": "정배열(5>20)", "ok": true, "detail": "16,364 / 12,914"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "16,364 / 11,500"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+21.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +1,740 · 기 -508 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+16%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.34% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": false, "detail": "2,509,340 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": false, "detail": "2.34% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "65"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 17,366 (현재 17,280)"}]}
{"ts": "2026-06-24T09:46:04.787180+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 158200, "qty": 26, "cost": 4113817, "path": "pullback", "reason": "눌림목 지정가 158,264 도달", "stop": 120729, "target": 214407, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "158,000 vs 136,315"}, {"label": "정배열(5>20)", "ok": true, "detail": "172,240 / 136,315"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "172,240 / 99,750"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+56.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +41 · 기 +65 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+5%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "4.25% (환산) vs 평균 3.06% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 202,500"}, {"label": "거래량 급증", "ok": true, "detail": "822,940 (환산) vs 평균 591,925"}, {"label": "회전율 급증", "ok": false, "detail": "4.25% (환산) vs 평균 3.06%"}, {"label": "RSI", "ok": true, "detail": "61"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 158,264 (현재 158,000)"}]}
{"ts": "2026-06-24T11:12:05.905179+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 18260, "qty": 280, "cost": 5113567, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 13981, "target": 22203, "signals": [{"label": "손절선", "ok": true, "detail": "13,981 (현재 18,250)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,203"}, {"label": "추세(20일선)", "ok": true, "detail": "12,962"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +1,742 · 기 -508"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 18,094"}]}
{"ts": "2026-06-25T09:00:25.760420+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 179100, "qty": 23, "cost": 4119918, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 120729, "target": 214407, "signals": [{"label": "손절선", "ok": true, "detail": "120,729 (현재 178,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 214,407"}, {"label": "추세(20일선)", "ok": true, "detail": "137,330"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -56 · 기 +134"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 167,275"}]}
{"ts": "2026-06-25T09:04:05.749486+09:00", "side": "BUY", "code": "003490", "name": "대한항공", "price": 28900, "qty": 214, "cost": 6185528, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 26248, "target": 32878, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "28,850 vs 25,948"}, {"label": "정배열(5>20)", "ok": true, "detail": "26,110 / 25,948"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "26,110 / 25,216"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-2.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +1,577 · 기 -7 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.9/5"}, {"label": "상승여력", "ok": true, "detail": "+15%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.54% (환산) vs 평균 0.58% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 28,400"}, {"label": "거래량 급증", "ok": true, "detail": "5,629,873 (환산) vs 평균 2,146,231"}, {"label": "회전율 급증", "ok": true, "detail": "1.54% (환산) vs 평균 0.58%"}, {"label": "RSI", "ok": true, "detail": "64"}]}
{"ts": "2026-06-26T09:00:07.734466+09:00", "side": "SELL", "code": "403870", "name": "HPSP", "price": 50000, "qty": 71, "proceeds": 3543078, "entry_price": 62900, "pnl": -923492, "pnl_pct": -20.51, "hold_from": "2026-06-17T16:47:31.019762+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "48,962 (현재 51,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 83,807"}, {"label": "추세(20일선)", "ok": false, "detail": "52,268"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -311 · 기 -267"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 66,756"}]}
{"ts": "2026-06-26T10:14:04.066621+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 166900, "qty": 25, "cost": 4173126, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 120251, "target": 211374, "signals": [{"label": "손절선", "ok": true, "detail": "120,251 (현재 166,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 211,374"}, {"label": "추세(20일선)", "ok": true, "detail": "122,175"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -126 · 기 +320"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 165,659"}]}
{"ts": "2026-06-29T11:36:01.270820+09:00", "side": "BUY", "code": "034730", "name": "SK", "price": 745000, "qty": 7, "cost": 5215782, "path": "pullback", "reason": "눌림목 지정가 748,914 도달", "stop": 612829, "target": 943257, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "744,000 vs 676,650"}, {"label": "정배열(5>20)", "ok": true, "detail": "766,800 / 676,650"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "766,800 / 530,600"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+12.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -194 · 기 +152 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+8%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.35% (환산) vs 평균 0.45% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 883,000"}, {"label": "거래량 급증", "ok": true, "detail": "977,966 (환산) vs 평균 329,863"}, {"label": "회전율 급증", "ok": true, "detail": "1.35% (환산) vs 평균 0.45%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 748,914 (현재 744,000)"}]}
{"ts": "2026-06-29T14:18:01.491137+09:00", "side": "BUY", "code": "034730", "name": "SK", "price": 778000, "qty": 7, "cost": 5446817, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 612829, "target": 943257, "signals": [{"label": "손절선", "ok": true, "detail": "612,829 (현재 779,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 943,257"}, {"label": "추세(20일선)", "ok": true, "detail": "678,400"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -200 · 기 +143"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 778,043"}]}
{"ts": "2026-06-30T09:00:08.769060+09:00", "side": "BUY", "code": "403870", "name": "HPSP", "price": 55300, "qty": 81, "cost": 4479972, "path": "pullback", "reason": "눌림목 지정가 63,981 도달", "stop": 43200, "target": 73450, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "53,700 vs 52,402"}, {"label": "정배열(5>20)", "ok": true, "detail": "58,060 / 52,402"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "58,060 / 49,679"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+12.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +222 · 기 -821 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+28%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.00% (환산) vs 평균 5.97% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 71,500"}, {"label": "거래량 급증", "ok": false, "detail": "827 (환산) vs 평균 4,912,598"}, {"label": "회전율 급증", "ok": false, "detail": "0.00% (환산) vs 평균 5.97%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 63,981 (현재 53,700)"}]}
{"ts": "2026-06-30T09:02:03.191902+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 347500, "qty": 18, "cost": 6255938, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 305863, "target": 409956, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "347,000 vs 296,475"}, {"label": "정배열(5>20)", "ok": true, "detail": "315,600 / 296,475"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "315,600 / 305,533"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+29.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -19 · 기 +146 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+39%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.55% (환산) vs 평균 0.93% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 334,500"}, {"label": "거래량 급증", "ok": true, "detail": "160,800 (환산) vs 평균 96,436"}, {"label": "회전율 급증", "ok": true, "detail": "1.55% (환산) vs 평균 0.93%"}, {"label": "RSI", "ok": true, "detail": "66"}]}
{"ts": "2026-06-30T09:06:03.685224+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 360000, "qty": 17, "cost": 6120918, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 305863, "target": 409956, "signals": [{"label": "손절선", "ok": true, "detail": "305,863 (현재 360,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 409,956"}, {"label": "추세(20일선)", "ok": true, "detail": "297,125"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -19 · 기 +146"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 358,070"}]}
{"ts": "2026-07-01T09:46:03.072377+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 118200, "qty": 54, "cost": 6383757, "path": "pullback", "reason": "눌림목 지정가 122,286 도달", "stop": 111000, "target": 129000, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "118,200 vs 118,155"}, {"label": "정배열(5>20)", "ok": true, "detail": "120,240 / 118,155"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "120,240 / 118,368"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+3.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +55 · 기 -166 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.35% (환산) vs 평균 0.37% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 130,700"}, {"label": "거래량 급증", "ok": false, "detail": "969,420 (환산) vs 평균 1,026,357"}, {"label": "회전율 급증", "ok": false, "detail": "0.35% (환산) vs 평균 0.37%"}, {"label": "RSI", "ok": true, "detail": "49"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 122,286 (현재 118,200)"}]}
{"ts": "2026-07-01T11:06:02.358644+09:00", "side": "SELL", "code": "095610", "name": "테스", "price": 212000, "qty": 49, "proceeds": 10367743, "entry_price": 168010, "pnl": 2134009, "pnl_pct": 26.18, "hold_from": "2026-06-24T09:46:04.787179+09:00", "reason": "트레일링 익절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "213,193 (현재 213,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "139,065"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -229 · 기 +300"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-02T10:18:03.842638+09:00", "side": "BUY", "code": "009150", "name": "삼성전기", "price": 1985000, "qty": 3, "cost": 5955893, "path": "pullback", "reason": "눌림목 지정가 1,994,011 도달", "stop": 1901000, "target": 2111000, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "1,982,000 vs 1,967,800"}, {"label": "정배열(5>20)", "ok": true, "detail": "2,038,800 / 1,967,800"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "2,038,800 / 1,295,483"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+17.7%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +337 · 기 +193 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+6%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "4.19% (환산) vs 평균 1.76% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 2,417,000"}, {"label": "거래량 급증", "ok": true, "detail": "3,133,469 (환산) vs 평균 1,312,239"}, {"label": "회전율 급증", "ok": true, "detail": "4.19% (환산) vs 평균 1.76%"}, {"label": "RSI", "ok": true, "detail": "56"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 1,994,011 (현재 1,982,000)"}]}
{"ts": "2026-07-02T10:18:03.843238+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 122200, "qty": 52, "cost": 6355353, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 111000, "target": 129000, "signals": [{"label": "손절선", "ok": true, "detail": "111,000 (현재 122,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 129,000"}, {"label": "추세(20일선)", "ok": true, "detail": "118,345"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +22 · 기 -44"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 121,743"}]}
{"ts": "2026-07-02T11:04:07.590408+09:00", "side": "BUY", "code": "003490", "name": "대한항공", "price": 29600, "qty": 209, "cost": 6187328, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 26248, "target": 32878, "signals": [{"label": "손절선", "ok": true, "detail": "26,248 (현재 29,600)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 32,878"}, {"label": "추세(20일선)", "ok": true, "detail": "25,985"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -206 · 기 +1,008"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 29,586"}]}
{"ts": "2026-07-03T09:00:11.498696+09:00", "side": "SELL", "code": "009150", "name": "삼성전기", "price": 1895000, "qty": 3, "proceeds": 5673914, "entry_price": 1985000, "pnl": -281979, "pnl_pct": -4.53, "hold_from": "2026-07-02T10:18:03.842636+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "1,901,000 (현재 1,894,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 2,111,000"}, {"label": "추세(20일선)", "ok": false, "detail": "1,963,400"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +132 · 기 +129"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 2,084,495"}]}
{"ts": "2026-07-03T09:04:01.674579+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 14370, "qty": 576, "proceeds": 8260980, "entry_price": 17751, "pnl": -1965274, "pnl_pct": -19.05, "hold_from": "2026-06-24T09:12:05.356213+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "14,457 (현재 14,390)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,693"}, {"label": "추세(20일선)", "ok": true, "detail": "12,769"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -1,591 · 기 +253"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-03T09:28:01.645232+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 125700, "qty": 51, "proceeds": 6398199, "entry_price": 161700, "pnl": -1849738, "pnl_pct": -22.26, "hold_from": "2026-06-24T09:04:06.122439+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "125,865 (현재 125,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 215,453"}, {"label": "추세(20일선)", "ok": true, "detail": "120,125"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +674 · 기 -2,170"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-03T10:24:02.776648+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19040, "qty": 307, "cost": 5846157, "path": "pullback", "reason": "눌림목 지정가 20,004 도달", "stop": 17760, "target": 20960, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "19,030 vs 18,856"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,592 / 18,856"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,592 / 19,359"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+2.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -35 · 기 +168 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+34%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.54% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "619,193 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.54% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "49"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 20,004 (현재 19,030)"}]}
{"ts": "2026-07-06T09:00:10.405291+09:00", "side": "BUY", "code": "009150", "name": "삼성전기", "price": 1993000, "qty": 2, "cost": 3986598, "path": "pullback", "reason": "눌림목 지정가 1,995,439 도달", "stop": 1901000, "target": 2131000, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "1,975,000 vs 1,967,450"}, {"label": "정배열(5>20)", "ok": true, "detail": "2,037,400 / 1,967,450"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "2,037,400 / 1,295,367"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+9.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +151 · 기 +57 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+9%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.82% (환산) vs 평균 1.76% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 2,417,000"}, {"label": "거래량 급증", "ok": false, "detail": "615,080 (환산) vs 평균 1,312,239"}, {"label": "회전율 급증", "ok": false, "detail": "0.82% (환산) vs 평균 1.76%"}, {"label": "RSI", "ok": true, "detail": "55"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 1,995,439 (현재 1,975,000)"}]}
{"ts": "2026-07-06T09:00:10.407515+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 130600, "qty": 27, "cost": 3526729, "path": "pullback", "reason": "눌림목 지정가 164,068 도달", "stop": 96000, "target": 182500, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "133,100 vs 120,495"}, {"label": "정배열(5>20)", "ok": true, "detail": "138,640 / 120,495"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "138,640 / 121,318"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+17.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +782 · 기 -1,979 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+31%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.01% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": false, "detail": "4,080 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": false, "detail": "0.01% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "52"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 164,068 (현재 133,100)"}]}
{"ts": "2026-07-06T10:06:02.336512+09:00", "side": "SELL", "code": "009150", "name": "삼성전기", "price": 1900000, "qty": 2, "proceeds": 3792590, "entry_price": 1993000, "pnl": -194008, "pnl_pct": -4.67, "hold_from": "2026-07-06T09:00:10.405284+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "1,901,000 (현재 1,901,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 2,131,000"}, {"label": "추세(20일선)", "ok": false, "detail": "1,963,750"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +135 · 기 +46"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 2,089,780"}]}
{"ts": "2026-07-06T10:06:02.762234+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 13270, "qty": 318, "cost": 4220493, "path": "pullback", "reason": "눌림목 지정가 17,049 도달", "stop": 10360, "target": 17635, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "13,230 vs 12,711"}, {"label": "정배열(5>20)", "ok": true, "detail": "15,554 / 12,711"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "15,554 / 11,432"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-12.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,199 · 기 +137 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+51%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "12.00% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": true, "detail": "12,870,290 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": true, "detail": "12.00% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 17,049 (현재 13,230)"}]}
{"ts": "2026-07-06T10:20:01.603403+09:00", "side": "SELL", "code": "214450", "name": "파마리서치", "price": 311000, "qty": 35, "proceeds": 10863774, "entry_price": 353571, "pnl": -1513082, "pnl_pct": -12.04, "hold_from": "2026-06-30T09:02:03.191900+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "311,291 (현재 311,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 416,991"}, {"label": "추세(20일선)", "ok": true, "detail": "294,675"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -108 · 기 +225"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-06T10:42:01.677079+09:00", "side": "BUY", "code": "055550", "name": "신한지주", "price": 110000, "qty": 52, "cost": 5720858, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 99202, "target": 126197, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "109,900 vs 97,300"}, {"label": "정배열(5>20)", "ok": true, "detail": "101,160 / 97,300"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "101,160 / 96,623"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+4.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -642 · 기 +1,346 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+18%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.56% (환산) vs 평균 0.35% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 109,800"}, {"label": "거래량 급증", "ok": true, "detail": "2,664,497 (환산) vs 평균 1,653,581"}, {"label": "회전율 급증", "ok": true, "detail": "0.56% (환산) vs 평균 0.35%"}, {"label": "RSI", "ok": true, "detail": "64"}]}
{"ts": "2026-07-07T09:48:07.386596+09:00", "side": "SELL", "code": "403870", "name": "HPSP", "price": 43000, "qty": 81, "proceeds": 3476208, "entry_price": 55300, "pnl": -1003764, "pnl_pct": -22.24, "hold_from": "2026-06-30T09:00:08.769051+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "43,200 (현재 43,050)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 73,450"}, {"label": "추세(20일선)", "ok": false, "detail": "51,870"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +1,424 · 기 -5,706"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 59,449"}]}
{"ts": "2026-07-07T09:48:07.724025+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 148800, "qty": 23, "cost": 3422913, "path": "pullback", "reason": "눌림목 지정가 157,807 도달", "stop": 110414, "target": 206378, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "148,600 vs 135,845"}, {"label": "정배열(5>20)", "ok": true, "detail": "170,360 / 135,845"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "170,360 / 99,593"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+38.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +80 · 기 -197 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+19%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "6.44% (환산) vs 평균 3.06% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 202,500"}, {"label": "거래량 급증", "ok": true, "detail": "1,245,767 (환산) vs 평균 591,925"}, {"label": "회전율 급증", "ok": true, "detail": "6.44% (환산) vs 평균 3.06%"}, {"label": "RSI", "ok": true, "detail": "57"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 157,807 (현재 148,600)"}]}
{"ts": "2026-07-07T10:30:07.365316+09:00", "side": "SELL", "code": "034730", "name": "SK", "price": 628000, "qty": 14, "proceeds": 8774856, "entry_price": 761500, "pnl": -1887744, "pnl_pct": -17.53, "hold_from": "2026-06-29T11:36:01.270818+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "629,329 (현재 628,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 959,757"}, {"label": "추세(20일선)", "ok": false, "detail": "670,850"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -58 · 기 +6"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-07T12:02:08.233713+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 12230, "qty": 318, "proceeds": 3881556, "entry_price": 13270, "pnl": -338937, "pnl_pct": -7.84, "hold_from": "2026-07-06T10:06:02.762220+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "10,360 (현재 12,230)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 17,635"}, {"label": "추세(20일선)", "ok": false, "detail": "12,661"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -1,558 · 기 -4"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 14,272"}]}
{"ts": "2026-07-07T14:08:46.453882+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 177000, "qty": 19, "cost": 3363504, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 110414, "target": 206378, "signals": [{"label": "손절선", "ok": true, "detail": "110,414 (현재 177,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 206,378"}, {"label": "추세(20일선)", "ok": true, "detail": "134,320"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +152 · 기 -281"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 158,042"}]}
{"ts": "2026-07-07T14:08:49.108924+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 20750, "qty": 282, "cost": 5852378, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 17760, "target": 20960, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 20,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 20,960"}, {"label": "추세(20일선)", "ok": true, "detail": "18,884"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +156 · 기 +113"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,358"}]}
{"ts": "2026-07-08T09:00:18.338560+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 108300, "qty": 27, "proceeds": 2918398, "entry_price": 130600, "pnl": -608331, "pnl_pct": -17.08, "hold_from": "2026-07-06T09:00:10.407509+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "166,450 (현재 112,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": false, "detail": "119,475"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +243 · 기 -857"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-08T09:48:01.873959+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 161100, "qty": 34, "cost": 5478222, "path": "pullback", "reason": "눌림목 지정가 168,676 도달", "stop": 158000, "target": 165750, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "161,600 vs 149,870"}, {"label": "정배열(5>20)", "ok": true, "detail": "169,960 / 149,870"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "169,960 / 113,252"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+77.7%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +198 · 기 -309 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+11%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "3.83% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": true, "detail": "1,110,233 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": false, "detail": "3.83% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "56"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 168,676 (현재 161,600)"}]}
{"ts": "2026-07-08T10:26:01.968826+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 157600, "qty": 34, "proceeds": 5347951, "entry_price": 161100, "pnl": -130270, "pnl_pct": -2.17, "hold_from": "2026-07-08T09:48:01.873958+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "158,000 (현재 158,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 165,750"}, {"label": "추세(20일선)", "ok": true, "detail": "149,690"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +198 · 기 -312"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 170,862"}]}
{"ts": "2026-07-09T09:02:04.464551+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 158300, "qty": 34, "cost": 5383007, "path": "pullback", "reason": "눌림목 지정가 168,455 도달", "stop": 158000, "target": 158750, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "158,200 vs 149,700"}, {"label": "정배열(5>20)", "ok": true, "detail": "169,280 / 149,700"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "169,280 / 113,195"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+81.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +296 · 기 -306 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+13%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.72% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": false, "detail": "499,233 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": false, "detail": "1.72% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "55"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 168,455 (현재 158,200)"}]}
{"ts": "2026-07-09T09:10:01.826443+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 132300, "qty": 41, "cost": 5425114, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 117515, "target": 154477, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "132,100 vs 108,930"}, {"label": "정배열(5>20)", "ok": true, "detail": "115,600 / 108,930"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "115,600 / 113,232"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+22.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -184 · 기 +964 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+12%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.51% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 116,900"}, {"label": "거래량 급증", "ok": true, "detail": "572,860 (환산) vs 평균 359,705"}, {"label": "회전율 급증", "ok": true, "detail": "0.51% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-07-09T09:12:02.508832+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 156900, "qty": 34, "proceeds": 5324198, "entry_price": 158300, "pnl": -58810, "pnl_pct": -0.88, "hold_from": "2026-07-09T09:02:04.464549+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "158,000 (현재 156,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "149,635"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +296 · 기 -306"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-09T12:12:04.857248+09:00", "side": "SELL", "code": "003490", "name": "대한항공", "price": 26500, "qty": 423, "proceeds": 11187641, "entry_price": 29246, "pnl": -1185214, "pnl_pct": -9.39, "hold_from": "2026-06-25T09:04:05.749484+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "26,501 (현재 26,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 33,363"}, {"label": "추세(20일선)", "ok": true, "detail": "25,830"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -1,444 · 기 +2,767"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-10T09:00:12.054392+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 164000, "qty": 33, "cost": 5412812, "path": "pullback", "reason": "눌림목 지정가 169,105 도달", "stop": 158000, "target": 173000, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "162,200 vs 149,900"}, {"label": "정배열(5>20)", "ok": true, "detail": "170,080 / 149,900"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "170,080 / 113,262"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+85.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +225 · 기 -178 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+10%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.58% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": false, "detail": "746,107 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": false, "detail": "2.58% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "56"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 169,105 (현재 162,200)"}]}
{"ts": "2026-07-10T09:28:02.621407+09:00", "side": "BUY", "code": "105560", "name": "KB금융", "price": 185900, "qty": 29, "cost": 5391909, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 166448, "target": 215077, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "185,600 vs 159,890"}, {"label": "정배열(5>20)", "ok": true, "detail": "159,900 / 159,890"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "159,900 / 157,368"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+26.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,310 · 기 +1,527 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+16%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.06% (환산) vs 평균 0.46% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 182,700"}, {"label": "거래량 급증", "ok": true, "detail": "3,715,113 (환산) vs 평균 1,640,325"}, {"label": "회전율 급증", "ok": true, "detail": "1.06% (환산) vs 평균 0.46%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-07-10T09:46:11.475280+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 12830, "qty": 359, "cost": 4606661, "path": "pullback", "reason": "눌림목 지정가 16,984 도달", "stop": 10360, "target": 16535, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "12,820 vs 12,690"}, {"label": "정배열(5>20)", "ok": true, "detail": "15,472 / 12,690"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "15,472 / 11,425"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+1.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +228 · 기 +229 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+56%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "9.75% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": true, "detail": "10,460,473 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": true, "detail": "9.75% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 16,984 (현재 12,820)"}]}
{"ts": "2026-07-10T11:16:02.476055+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 13850, "qty": 333, "cost": 4612742, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 10360, "target": 16535, "signals": [{"label": "손절선", "ok": true, "detail": "10,360 (현재 13,850)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 16,535"}, {"label": "추세(20일선)", "ok": true, "detail": "12,742"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +210 · 기 +239"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,843"}]}
{"ts": "2026-07-13T09:00:11.140611+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 136900, "qty": 40, "cost": 5476821, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 117515, "target": 154477, "signals": [{"label": "손절선", "ok": true, "detail": "117,515 (현재 136,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 154,477"}, {"label": "추세(20일선)", "ok": true, "detail": "109,140"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -64 · 기 +919"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 136,164"}]}
{"ts": "2026-07-13T09:06:07.894851+09:00", "side": "BUY", "code": "055550", "name": "신한지주", "price": 112800, "qty": 51, "cost": 5753663, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 99202, "target": 126197, "signals": [{"label": "손절선", "ok": true, "detail": "99,202 (현재 112,800)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 126,197"}, {"label": "추세(20일선)", "ok": true, "detail": "97,445"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -358 · 기 +991"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 112,792"}]}
{"ts": "2026-07-13T09:36:02.274385+09:00", "side": "BUY", "code": "105560", "name": "KB금융", "price": 191000, "qty": 29, "cost": 5539831, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 166448, "target": 215077, "signals": [{"label": "손절선", "ok": true, "detail": "166,448 (현재 191,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 215,077"}, {"label": "추세(20일선)", "ok": true, "detail": "160,160"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -867 · 기 +1,393"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 190,952"}]}
{"ts": "2026-07-13T12:44:04.355182+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 187900, "qty": 33, "proceeds": 6188609, "entry_price": 164000, "pnl": 775797, "pnl_pct": 14.57, "hold_from": "2026-07-10T09:00:12.054383+09:00", "reason": "트레일링 익절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "189,133 (현재 187,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "151,185"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -254 · 기 +457"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-15T09:02:02.647341+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 135500, "qty": 23, "cost": 3116967, "path": "pullback", "reason": "눌림목 지정가 164,061 도달", "stop": 97022, "target": 193217, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "134,900 vs 120,585"}, {"label": "정배열(5>20)", "ok": true, "detail": "139,000 / 120,585"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "139,000 / 121,348"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+27.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,752 · 기 +1,989 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+31%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.30% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": false, "detail": "636,187 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": false, "detail": "1.30% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "53"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 164,061 (현재 134,900)"}]}
{"ts": "2026-07-15T14:32:01.884447+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18570, "qty": 589, "proceeds": 10916401, "entry_price": 19859, "pnl": -782133, "pnl_pct": -6.49, "hold_from": "2026-07-03T10:24:02.776647+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "18,586 (현재 18,570)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,767"}, {"label": "추세(20일선)", "ok": false, "detail": "18,833"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -214 · 기 +240"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-16T09:00:09.497626+09:00", "side": "SELL", "code": "095610", "name": "테스", "price": 209000, "qty": 42, "proceeds": 8760883, "entry_price": 161557, "pnl": 1974465, "pnl_pct": 29.37, "hold_from": "2026-07-07T09:48:07.724011+09:00", "reason": "트레일링 익절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "210,764 (현재 207,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "138,765"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -799 · 기 +891"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-16T14:16:02.480628+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 145700, "qty": 22, "cost": 3205881, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 97022, "target": 193217, "signals": [{"label": "손절선", "ok": true, "detail": "97,022 (현재 145,800)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 193,217"}, {"label": "추세(20일선)", "ok": true, "detail": "121,130"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -1,717 · 기 +2,299"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 145,295"}]}
{"ts": "2026-07-20T12:28:02.315811+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 10310, "qty": 692, "proceeds": 7120608, "entry_price": 13321, "pnl": -2098795, "pnl_pct": -22.6, "hold_from": "2026-07-10T09:46:11.475279+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "10,360 (현재 10,310)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 17,762"}, {"label": "추세(20일선)", "ok": false, "detail": "14,755"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -887 · 기 +515"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-20T12:46:02.278769+09:00", "side": "SELL", "code": "086790", "name": "하나금융지주", "price": 131800, "qty": 106, "proceeds": 13943557, "entry_price": 120162, "pnl": 1204446, "pnl_pct": 9.69, "hold_from": "2026-07-01T09:46:03.072371+09:00", "reason": "트레일링 익절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "131,911 (현재 131,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "118,840"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +0 · 기 +424"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-20T12:48:03.475310+09:00", "side": "SELL", "code": "105560", "name": "KB금융", "price": 168100, "qty": 58, "proceeds": 9730788, "entry_price": 188450, "pnl": -1200952, "pnl_pct": -10.8, "hold_from": "2026-07-10T09:28:02.621405+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "168,241 (현재 168,200)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 218,763"}, {"label": "추세(20일선)", "ok": true, "detail": "159,020"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -385 · 기 +288"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-20T14:12:02.376886+09:00", "side": "SELL", "code": "055550", "name": "신한지주", "price": 100100, "qty": 103, "proceeds": 10290195, "entry_price": 111386, "pnl": -1184326, "pnl_pct": -10.13, "hold_from": "2026-07-06T10:42:01.677078+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "100,217 (현재 100,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 128,141"}, {"label": "추세(20일선)", "ok": true, "detail": "96,810"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -168 · 기 +257"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-21T10:08:04.172930+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 133100, "qty": 40, "cost": 5324799, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 120243, "target": 152385, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "133,000 vs 118,895"}, {"label": "정배열(5>20)", "ok": true, "detail": "123,200 / 118,895"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "123,200 / 118,615"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+38.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +137 · 기 +185 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+22%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.57% (환산) vs 평균 0.37% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 130,700"}, {"label": "거래량 급증", "ok": true, "detail": "1,575,915 (환산) vs 평균 1,026,357"}, {"label": "회전율 급증", "ok": true, "detail": "0.57% (환산) vs 평균 0.37%"}, {"label": "RSI", "ok": true, "detail": "63"}]}
{"ts": "2026-07-21T10:12:01.045878+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 167000, "qty": 32, "cost": 5344802, "path": "pullback", "reason": "눌림목 지정가 169,640 도달", "stop": 158000, "target": 180500, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "167,000 vs 150,140"}, {"label": "정배열(5>20)", "ok": true, "detail": "171,040 / 150,140"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "171,040 / 113,342"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+92.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -534 · 기 +316 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+7%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "3.29% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": false, "detail": "951,819 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": false, "detail": "3.29% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "58"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 169,640 (현재 167,000)"}]}
{"ts": "2026-07-21T12:06:01.170286+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 344500, "qty": 15, "cost": 5168275, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 303577, "target": 405884, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "344,500 vs 296,350"}, {"label": "정배열(5>20)", "ok": true, "detail": "315,100 / 296,350"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "315,100 / 305,492"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+39.7%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -7 · 기 +1 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+43%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.38% (환산) vs 평균 0.93% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 334,500"}, {"label": "거래량 급증", "ok": true, "detail": "247,158 (환산) vs 평균 96,436"}, {"label": "회전율 급증", "ok": true, "detail": "2.38% (환산) vs 평균 0.93%"}, {"label": "RSI", "ok": true, "detail": "65"}]}
{"ts": "2026-07-22T09:00:07.016346+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 177600, "qty": 30, "cost": 5328799, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 158000, "target": 180500, "signals": [{"label": "손절선", "ok": true, "detail": "158,000 (현재 178,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 180,500"}, {"label": "추세(20일선)", "ok": true, "detail": "150,715"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -377 · 기 +151"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 175,894"}]}
{"ts": "2026-07-22T09:04:01.818827+09:00", "side": "BUY", "code": "161890", "name": "한국콜마", "price": 99200, "qty": 55, "cost": 5456818, "path": "pullback", "reason": "눌림목 지정가 98,848 도달", "stop": 92100, "target": 109850, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "98,800 vs 98,505"}, {"label": "정배열(5>20)", "ok": true, "detail": "107,060 / 98,505"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "107,060 / 91,913"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+27.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +29 · 기 -34 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.16% (환산) vs 평균 1.76% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 124,600"}, {"label": "거래량 급증", "ok": false, "detail": "272,433 (환산) vs 평균 415,172"}, {"label": "회전율 급증", "ok": false, "detail": "1.16% (환산) vs 평균 1.76%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 98,848 (현재 98,800)"}]}
{"ts": "2026-07-22T12:12:00.739533+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 157300, "qty": 62, "proceeds": 9733582, "entry_price": 172129, "pnl": -940018, "pnl_pct": -8.62, "hold_from": "2026-07-21T10:12:01.045877+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "158,000 (현재 157,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 193,323"}, {"label": "추세(20일선)", "ok": true, "detail": "149,655"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -407 · 기 +141"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-22T14:18:05.425551+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 14030, "qty": 290, "cost": 4069310, "path": "pullback", "reason": "눌림목 지정가 14,023 도달", "stop": 11077, "target": 18460, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "14,020 vs 12,776"}, {"label": "정배열(5>20)", "ok": true, "detail": "14,552 / 12,776"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "14,552 / 13,283"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+10.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,005 · 기 +1,723 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.97% (환산) vs 평균 1.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 15,870"}, {"label": "거래량 급증", "ok": false, "detail": "585,754 (환산) vs 평균 882,736"}, {"label": "회전율 급증", "ok": false, "detail": "0.97% (환산) vs 평균 1.47%"}, {"label": "RSI", "ok": true, "detail": "53"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 14,023 (현재 14,020)"}]}
{"ts": "2026-07-22T15:04:00.996718+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 158100, "qty": 22, "cost": 3478722, "path": "pullback", "reason": "눌림목 지정가 158,107 도달", "stop": 120314, "target": 214778, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "158,000 vs 136,315"}, {"label": "정배열(5>20)", "ok": true, "detail": "172,240 / 136,315"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "172,240 / 99,750"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+49.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -311 · 기 +22 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+24%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "5.02% (환산) vs 평균 3.06% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 202,500"}, {"label": "거래량 급증", "ok": true, "detail": "971,360 (환산) vs 평균 591,925"}, {"label": "회전율 급증", "ok": true, "detail": "5.02% (환산) vs 평균 3.06%"}, {"label": "RSI", "ok": true, "detail": "61"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 158,107 (현재 158,000)"}]}
{"ts": "2026-07-23T09:00:22.764736+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 160100, "qty": 33, "cost": 5284092, "path": "pullback", "reason": "눌림목 지정가 169,062 도달", "stop": 158000, "target": 163250, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "158,100 vs 149,695"}, {"label": "정배열(5>20)", "ok": true, "detail": "169,260 / 149,695"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "169,260 / 113,193"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+76.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -162 · 기 +37 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+13%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.05% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": false, "detail": "303,687 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": false, "detail": "1.05% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "55"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 169,062 (현재 158,100)"}]}
{"ts": "2026-07-23T09:32:04.412363+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 157800, "qty": 33, "proceeds": 5197246, "entry_price": 160100, "pnl": -86847, "pnl_pct": -1.44, "hold_from": "2026-07-23T09:00:22.764729+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "158,000 (현재 157,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "149,685"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -162 · 기 +37"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-23T09:44:04.285428+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 18850, "qty": 284, "cost": 5354203, "path": "pullback", "reason": "눌림목 지정가 20,001 도달", "stop": 17760, "target": 20485, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "18,850 vs 18,847"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,556 / 18,847"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,556 / 19,356"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+13.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -25 · 기 +6 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+34%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.34% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "388,767 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.34% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "48"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 20,001 (현재 18,850)"}]}
{"ts": "2026-07-23T12:18:01.544812+09:00", "side": "BUY", "code": "161890", "name": "한국콜마", "price": 103100, "qty": 53, "cost": 5465120, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 92100, "target": 109850, "signals": [{"label": "손절선", "ok": true, "detail": "92,100 (현재 103,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 109,850"}, {"label": "추세(20일선)", "ok": true, "detail": "98,720"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +222 · 기 -227"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 103,029"}]}
{"ts": "2026-07-23T12:22:02.595464+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 356000, "qty": 15, "cost": 5340801, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 303577, "target": 405884, "signals": [{"label": "손절선", "ok": true, "detail": "303,577 (현재 356,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 405,884"}, {"label": "추세(20일선)", "ok": true, "detail": "296,925"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +6 · 기 +26"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 355,034"}]}
{"ts": "2026-07-24T09:00:05.934969+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 111800, "qty": 45, "proceeds": 5021190, "entry_price": 140487, "pnl": -1301659, "pnl_pct": -20.42, "hold_from": "2026-07-15T09:02:02.647339+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "101,309 (현재 113,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 199,254"}, {"label": "추세(20일선)", "ok": false, "detail": "119,505"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -480 · 기 -206"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-24T09:00:05.936004+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18730, "qty": 284, "proceeds": 5308947, "entry_price": 18850, "pnl": -45256, "pnl_pct": -0.64, "hold_from": "2026-07-23T09:44:04.285427+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 18,730)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 20,485"}, {"label": "추세(20일선)", "ok": false, "detail": "18,841"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -5 · 기 -5"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,219"}]}
{"ts": "2026-07-24T09:26:01.008332+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 94000, "qty": 57, "cost": 5358804, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 82349, "target": 111476, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "93,900 vs 75,355"}, {"label": "정배열(5>20)", "ok": true, "detail": "84,140 / 75,355"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "84,140 / 75,153"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+61.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -113 · 기 +274 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+10%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.90% (환산) vs 평균 0.42% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 87,600"}, {"label": "거래량 급증", "ok": true, "detail": "829,560 (환산) vs 평균 392,182"}, {"label": "회전율 급증", "ok": true, "detail": "0.90% (환산) vs 평균 0.42%"}, {"label": "RSI", "ok": true, "detail": "72"}]}
{"ts": "2026-07-24T09:28:04.949807+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 14510, "qty": 280, "cost": 4063409, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 11077, "target": 18460, "signals": [{"label": "손절선", "ok": true, "detail": "11,077 (현재 15,400)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 18,460"}, {"label": "추세(20일선)", "ok": true, "detail": "12,845"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -857 · 기 +1,172"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 14,791"}]}
{"ts": "2026-07-24T09:48:01.197655+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 97000, "qty": 55, "cost": 5335800, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 82349, "target": 111476, "signals": [{"label": "손절선", "ok": true, "detail": "82,349 (현재 97,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 111,476"}, {"label": "추세(20일선)", "ok": true, "detail": "75,510"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -113 · 기 +274"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 96,977"}]}
{"ts": "2026-07-27T09:02:06.230471+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19100, "qty": 280, "cost": 5348802, "path": "pullback", "reason": "눌림목 지정가 20,032 도달", "stop": 17760, "target": 21110, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "19,070 vs 18,858"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,600 / 18,858"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,600 / 19,360"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+16.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +101 · 기 -3 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.13% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "146,760 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.13% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 20,032 (현재 19,070)"}]}
{"ts": "2026-07-28T10:08:02.771329+09:00", "side": "SELL", "code": "252990", "name": "샘씨엔에스", "price": 11170, "qty": 570, "proceeds": 6354485, "entry_price": 14266, "pnl": -1778235, "pnl_pct": -21.7, "hold_from": "2026-07-22T14:18:05.425549+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "11,223 (현재 11,220)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 18,831"}, {"label": "추세(20일선)", "ok": false, "detail": "12,636"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +106 · 기 -64"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-28T11:34:01.972452+09:00", "side": "SELL", "code": "095610", "name": "테스", "price": 120300, "qty": 22, "proceeds": 2641439, "entry_price": 158100, "pnl": -837283, "pnl_pct": -23.91, "hold_from": "2026-07-22T15:04:00.996717+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "120,314 (현재 120,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 214,778"}, {"label": "추세(20일선)", "ok": false, "detail": "134,430"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +285 · 기 -563"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 168,711"}]}
{"ts": "2026-07-29T09:02:02.230260+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6540, "qty": 651, "cost": 4258179, "path": "pullback", "reason": "눌림목 지정가 7,837 도달", "stop": 5295, "target": 8408, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "6,540 vs 4,829"}, {"label": "정배열(5>20)", "ok": true, "detail": "6,266 / 4,829"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,266 / 4,873"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+70.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +188 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.87% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "116,047 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "1.87% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "63"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,837 (현재 6,540)"}]}
{"ts": "2026-07-29T09:02:02.230501+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 117900, "qty": 42, "cost": 4952543, "path": "pullback", "reason": "눌림목 지정가 118,115 도달", "stop": 111200, "target": 127950, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "117,800 vs 113,445"}, {"label": "정배열(5>20)", "ok": true, "detail": "117,020 / 113,445"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "117,020 / 109,982"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+45.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +39 · 기 +307 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+26%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.03% (환산) vs 평균 0.17% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 123,300"}, {"label": "거래량 급증", "ok": false, "detail": "44,660 (환산) vs 평균 289,522"}, {"label": "회전율 급증", "ok": false, "detail": "0.03% (환산) vs 평균 0.17%"}, {"label": "RSI", "ok": true, "detail": "57"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 118,115 (현재 117,800)"}]}
{"ts": "2026-07-29T09:16:04.466782+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 120500, "qty": 41, "cost": 4941241, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 111200, "target": 127950, "signals": [{"label": "손절선", "ok": true, "detail": "111,200 (현재 120,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 127,950"}, {"label": "추세(20일선)", "ok": true, "detail": "113,580"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +39 · 기 +307"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 120,492"}]}
{"ts": "2026-07-29T09:24:09.977728+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 18950, "qty": 282, "cost": 5344702, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 17760, "target": 21110, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 20,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,110"}, {"label": "추세(20일선)", "ok": true, "detail": "18,884"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +99 · 기 +138"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,418"}]}
{"ts": "2026-07-29T09:24:09.978654+09:00", "side": "SELL", "code": "010950", "name": "S-Oil", "price": 128600, "qty": 81, "proceeds": 10396288, "entry_price": 134572, "pnl": -505647, "pnl_pct": -4.44, "hold_from": "2026-07-09T09:10:01.826441+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "119,115 (현재 116,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 157,756"}, {"label": "추세(20일선)", "ok": true, "detail": "107,870"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +43 · 기 +245"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T09:24:09.979284+09:00", "side": "SELL", "code": "078930", "name": "GS", "price": 87700, "qty": 112, "proceeds": 9803246, "entry_price": 95473, "pnl": -891358, "pnl_pct": -8.14, "hold_from": "2026-07-24T09:26:01.008331+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "83,565 (현재 83,200)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 113,335"}, {"label": "추세(20일선)", "ok": true, "detail": "74,040"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -59 · 기 +284"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T09:26:01.900494+09:00", "side": "SELL", "code": "003680", "name": "한성기업", "price": 6610, "qty": 651, "proceeds": 4294719, "entry_price": 6540, "pnl": 36540, "pnl_pct": 1.07, "hold_from": "2026-07-29T09:02:02.230258+09:00", "reason": "트레일링 익절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "7,526 (현재 6,610)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "4,833"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +188 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T09:28:01.384508+09:00", "side": "BUY", "code": "090850", "name": "현대이지웰", "price": 6390, "qty": 794, "cost": 5074421, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 5867, "target": 7174, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "6,380 vs 5,358"}, {"label": "정배열(5>20)", "ok": true, "detail": "5,742 / 5,358"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "5,742 / 5,622"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+43.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +73 · 기 -3 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.62% (환산) vs 평균 0.22% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 5,700"}, {"label": "거래량 급증", "ok": true, "detail": "134,413 (환산) vs 평균 49,512"}, {"label": "회전율 급증", "ok": true, "detail": "0.62% (환산) vs 평균 0.22%"}, {"label": "RSI", "ok": true, "detail": "73"}]}
{"ts": "2026-07-29T11:54:01.475203+09:00", "side": "SELL", "code": "086790", "name": "하나금융지주", "price": 120100, "qty": 40, "proceeds": 4794632, "entry_price": 133100, "pnl": -530166, "pnl_pct": -9.77, "hold_from": "2026-07-21T10:08:04.172929+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "120,243 (현재 120,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 152,385"}, {"label": "추세(20일선)", "ok": true, "detail": "118,250"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -13 · 기 -68"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 136,414"}]}
{"ts": "2026-07-29T13:34:03.589780+09:00", "side": "SELL", "code": "090850", "name": "현대이지웰", "price": 5860, "qty": 794, "proceeds": 4643767, "entry_price": 6390, "pnl": -430654, "pnl_pct": -8.29, "hold_from": "2026-07-29T09:28:01.384507+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,867 (현재 5,860)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 7,174"}, {"label": "추세(20일선)", "ok": true, "detail": "5,332"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +73 · 기 -3"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,525"}]}
{"ts": "2026-07-30T09:04:07.472638+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 121300, "qty": 41, "cost": 4974046, "path": "pullback", "reason": "눌림목 지정가 122,665 도달", "stop": 111000, "target": 136750, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "121,200 vs 118,305"}, {"label": "정배열(5>20)", "ok": true, "detail": "120,840 / 118,305"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "120,840 / 118,418"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+34.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -214 · 기 +182 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+36%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.18% (환산) vs 평균 0.37% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 130,700"}, {"label": "거래량 급증", "ok": false, "detail": "494,880 (환산) vs 평균 1,026,357"}, {"label": "회전율 급증", "ok": false, "detail": "0.18% (환산) vs 평균 0.37%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 122,665 (현재 121,200)"}]}
{"ts": "2026-07-30T09:04:07.473315+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6130, "qty": 603, "cost": 3696944, "path": "pullback", "reason": "눌림목 지정가 7,792 도달", "stop": 4793, "target": 8135, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "6,120 vs 4,808"}, {"label": "정배열(5>20)", "ok": true, "detail": "6,182 / 4,808"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,182 / 4,866"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+65.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +234 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "4.31% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "267,687 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "4.31% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,792 (현재 6,120)"}]}
{"ts": "2026-07-30T09:16:11.924015+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 125200, "qty": 40, "cost": 5008751, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 111000, "target": 136750, "signals": [{"label": "손절선", "ok": true, "detail": "111,000 (현재 125,400)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 136,750"}, {"label": "추세(20일선)", "ok": true, "detail": "118,515"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -214 · 기 +182"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 124,618"}]}
{"ts": "2026-07-30T09:16:11.924634+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 130900, "qty": 38, "cost": 4974946, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 116144, "target": 153035, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "130,900 vs 108,870"}, {"label": "정배열(5>20)", "ok": true, "detail": "115,360 / 108,870"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "115,360 / 113,212"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+49.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -6 · 기 +178 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+21%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.51% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 116,900"}, {"label": "거래량 급증", "ok": true, "detail": "571,193 (환산) vs 평균 359,705"}, {"label": "회전율 급증", "ok": true, "detail": "0.51% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "68"}]}
{"ts": "2026-07-30T09:18:10.159701+09:00", "side": "BUY", "code": "090850", "name": "현대이지웰", "price": 6310, "qty": 809, "cost": 5105556, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 5799, "target": 7077, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "6,300 vs 5,354"}, {"label": "정배열(5>20)", "ok": true, "detail": "5,726 / 5,354"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "5,726 / 5,621"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+46.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +87 · 기 +6 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.41% (환산) vs 평균 0.22% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 5,700"}, {"label": "거래량 급증", "ok": true, "detail": "87,813 (환산) vs 평균 49,512"}, {"label": "회전율 급증", "ok": true, "detail": "0.41% (환산) vs 평균 0.22%"}, {"label": "RSI", "ok": true, "detail": "72"}]}
{"ts": "2026-07-30T11:58:08.429556+09:00", "side": "SELL", "code": "161890", "name": "한국콜마", "price": 91700, "qty": 108, "proceeds": 9884288, "entry_price": 101114, "pnl": -1037650, "pnl_pct": -9.31, "hold_from": "2026-07-22T09:04:01.818826+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "92,100 (현재 91,800)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 114,635"}, {"label": "추세(20일선)", "ok": false, "detail": "98,155"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -7 · 기 +40"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-30T12:04:07.823153+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 87900, "qty": 56, "cost": 4923138, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 76706, "target": 104690, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "87,900 vs 75,055"}, {"label": "정배열(5>20)", "ok": true, "detail": "82,940 / 75,055"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "82,940 / 75,053"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+61.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -49 · 기 +280 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+17%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.79% (환산) vs 평균 0.42% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 87,600"}, {"label": "거래량 급증", "ok": true, "detail": "728,608 (환산) vs 평균 392,182"}, {"label": "회전율 급증", "ok": true, "detail": "0.79% (환산) vs 평균 0.42%"}, {"label": "RSI", "ok": true, "detail": "67"}]}
{"ts": "2026-07-31T09:06:07.012482+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6550, "qty": 564, "cost": 3694754, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 4793, "target": 8135, "signals": [{"label": "손절선", "ok": true, "detail": "4,793 (현재 6,640)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 8,135"}, {"label": "추세(20일선)", "ok": true, "detail": "4,834"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +355 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,453"}]}
{"ts": "2026-07-31T09:08:08.210477+09:00", "side": "SELL", "code": "078930", "name": "GS", "price": 69600, "qty": 56, "proceeds": 3890000, "entry_price": 87900, "pnl": -1033139, "pnl_pct": -20.82, "hold_from": "2026-07-30T12:04:07.823150+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "76,706 (현재 69,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 104,690"}, {"label": "추세(20일선)", "ok": false, "detail": "74,135"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -179 · 기 +325"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 91,095"}]}
{"ts": "2026-08-03T12:00:11.803727+09:00", "side": "BUY", "code": "194370", "name": "제이에스코퍼레이션", "price": 12910, "qty": 381, "cost": 4919448, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 11314, "target": 15304, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "12,930 vs 11,922"}, {"label": "정배열(5>20)", "ok": true, "detail": "12,138 / 11,922"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "12,138 / 11,924"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+27.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +7 · 기 +10 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+74%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.72% (환산) vs 평균 0.34% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 12,870"}, {"label": "거래량 급증", "ok": true, "detail": "208,994 (환산) vs 평균 99,303"}, {"label": "회전율 급증", "ok": true, "detail": "0.72% (환산) vs 평균 0.34%"}, {"label": "RSI", "ok": true, "detail": "63"}]}
{"ts": "2026-08-03T12:02:09.749937+09:00", "side": "BUY", "code": "194370", "name": "제이에스코퍼레이션", "price": 13420, "qty": 366, "cost": 4912457, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 11314, "target": 15304, "signals": [{"label": "손절선", "ok": true, "detail": "11,314 (현재 13,450)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 15,304"}, {"label": "추세(20일선)", "ok": true, "detail": "11,948"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +7 · 기 +10"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,339"}]}
{"ts": "2026-08-05T09:02:13.234273+09:00", "side": "SELL", "code": "090850", "name": "현대이지웰", "price": 5700, "qty": 809, "proceeds": 4602308, "entry_price": 6310, "pnl": -503248, "pnl_pct": -9.67, "hold_from": "2026-07-30T09:18:10.159696+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,799 (현재 5,730)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 7,077"}, {"label": "추세(20일선)", "ok": true, "detail": "5,326"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +14 · 기 -2"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,423"}]}
{"ts": "2026-08-05T09:02:13.234702+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 13040, "qty": 292, "cost": 3808251, "path": "pullback", "reason": "눌림목 지정가 13,947 도달", "stop": 10340, "target": 17090, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "13,040 vs 12,727"}, {"label": "정배열(5>20)", "ok": true, "detail": "14,356 / 12,727"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "14,356 / 13,267"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-6.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -72 · 기 +134 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.13% (환산) vs 평균 1.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 15,870"}, {"label": "거래량 급증", "ok": false, "detail": "78,333 (환산) vs 평균 882,736"}, {"label": "회전율 급증", "ok": false, "detail": "0.13% (환산) vs 평균 1.47%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 13,947 (현재 13,040)"}]}
{"ts": "2026-08-05T09:38:11.455259+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 13830, "qty": 275, "cost": 3803820, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 10340, "target": 17090, "signals": [{"label": "손절선", "ok": true, "detail": "10,340 (현재 13,860)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 17,090"}, {"label": "추세(20일선)", "ok": true, "detail": "12,768"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -72 · 기 +134"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,817"}]}
{"ts": "2026-08-06T09:00:19.135898+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18730, "qty": 562, "proceeds": 10505734, "entry_price": 19025, "pnl": -187770, "pnl_pct": -1.55, "hold_from": "2026-07-27T09:02:06.230469+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 18,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 20,922"}, {"label": "추세(20일선)", "ok": false, "detail": "18,842"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -203 · 기 -147"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-08-06T09:08:09.854205+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 136600, "qty": 22, "cost": 3005651, "path": "pullback", "reason": "눌림목 지정가 156,500 도달", "stop": 100700, "target": 190450, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "136,400 vs 135,235"}, {"label": "정배열(5>20)", "ok": true, "detail": "167,920 / 135,235"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "167,920 / 99,390"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+13.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -609 · 기 +419 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+44%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.58% (환산) vs 평균 3.06% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 202,500"}, {"label": "거래량 급증", "ok": false, "detail": "499,673 (환산) vs 평균 591,925"}, {"label": "회전율 급증", "ok": false, "detail": "2.58% (환산) vs 평균 3.06%"}, {"label": "RSI", "ok": true, "detail": "52"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 156,500 (현재 136,400)"}]}
{"ts": "2026-08-10T09:00:16.234540+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 136000, "qty": 37, "cost": 5032755, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 116144, "target": 153035, "signals": [{"label": "손절선", "ok": true, "detail": "116,144 (현재 137,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 153,035"}, {"label": "추세(20일선)", "ok": true, "detail": "109,175"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -253 · 기 +225"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 134,814"}]}
{"ts": "2026-08-10T13:04:16.292903+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 147100, "qty": 20, "cost": 2942441, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 100700, "target": 190450, "signals": [{"label": "손절선", "ok": true, "detail": "100,700 (현재 147,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 190,450"}, {"label": "추세(20일선)", "ok": true, "detail": "135,765"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -349 · 기 +177"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 146,939"}]}
@@ -0,0 +1,203 @@
{
"cash": 5168399.382999956,
"initial": 100000000,
"positions": {
"214450": {
"code": "214450",
"name": "파마리서치",
"sources": [
"auto"
],
"qty": 29,
"entry_price": 350051.724137931,
"entry_at": "2026-07-21T12:06:01.172122+09:00",
"stop": 307915,
"target": 434326,
"peak": 411500,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 409000,
"tranches": 2,
"tranche_value": 5274205.950343749,
"last_add_price": 356000
},
"138040": {
"code": "138040",
"name": "메리츠금융지주",
"sources": [
"auto"
],
"qty": 79,
"entry_price": 119183.54430379746,
"entry_at": "2026-07-29T09:02:02.233197+09:00",
"stop": 111200,
"target": 135151,
"peak": 127600,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 118,115 도달",
"cur_price": 123200,
"tranches": 2,
"tranche_value": 4798325.220406247,
"last_add_price": 120500
},
"086790": {
"code": "086790",
"name": "하나금융지주",
"sources": [
"auto"
],
"qty": 75,
"entry_price": 123224.0,
"entry_at": "2026-07-30T09:04:07.478234+09:00",
"stop": 111000,
"target": 147672,
"peak": 134600,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 122,665 도달",
"cur_price": 130600,
"tranches": 2,
"tranche_value": 4697478.874937497,
"last_add_price": 125200
},
"003680": {
"code": "003680",
"name": "한성기업",
"sources": [
"auto"
],
"qty": 1090,
"entry_price": 6333.064220183486,
"entry_at": "2026-07-30T09:04:07.479053+09:00",
"stop": 5039,
"target": 8921,
"peak": 6840,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 7,792 도달",
"cur_price": 6220,
"tranches": 2,
"tranche_value": 3453556.2895330573,
"last_add_price": 6550
},
"010950": {
"code": "010950",
"name": "S-Oil",
"sources": [
"auto"
],
"qty": 71,
"entry_price": 133414.08450704225,
"entry_at": "2026-07-30T09:16:11.930358+09:00",
"stop": 117758,
"target": 164727,
"peak": 139900,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 139600,
"tranches": 2,
"tranche_value": 4762406.753156248,
"last_add_price": 136000
},
"194370": {
"code": "194370",
"name": "제이에스코퍼레이션",
"sources": [
"auto"
],
"qty": 697,
"entry_price": 13160.243902439024,
"entry_at": "2026-08-03T12:00:11.808646+09:00",
"stop": 11445,
"target": 16590,
"peak": 14120,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 13370,
"tranches": 2,
"tranche_value": 4594021.1274374975,
"last_add_price": 13420
},
"252990": {
"code": "252990",
"name": "샘씨엔에스",
"sources": [
"auto"
],
"qty": 530,
"entry_price": 13423.075471698114,
"entry_at": "2026-08-05T09:02:13.240207+09:00",
"stop": 10340,
"target": 19589,
"peak": 15670,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 13,947 도달",
"cur_price": 15670,
"tranches": 2,
"tranche_value": 3561242.7967011826,
"last_add_price": 13830
},
"095610": {
"code": "095610",
"name": "테스",
"sources": [
"auto"
],
"qty": 39,
"entry_price": 141715.38461538462,
"entry_at": "2026-08-06T09:08:09.859483+09:00",
"stop": 100700,
"target": 223746,
"peak": 147300,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 156,500 도달",
"cur_price": 143700,
"tranches": 2,
"tranche_value": 2812742.868049803,
"last_add_price": 147100
}
},
"realized_pnl": -27823490.90800003,
"closed_trades": 36,
"wins": 2,
"peak_equity": 103066363.367,
"max_drawdown": 0.3059755316650401,
"last_exit": {
"030000": "2026-08-06",
"086790": "2026-07-29",
"005930": "2026-06-23",
"403870": "2026-07-07",
"093370": "2026-07-20",
"240810": "2026-07-24",
"009150": "2026-07-06",
"214450": "2026-07-06",
"034730": "2026-07-07",
"319660": "2026-07-23",
"003490": "2026-07-09",
"105560": "2026-07-20",
"055550": "2026-07-21",
"095610": "2026-07-28",
"252990": "2026-07-28",
"010950": "2026-07-29",
"078930": "2026-07-31",
"003680": "2026-07-29",
"090850": "2026-08-05",
"161890": "2026-07-30"
},
"created_at": "2026-06-15T14:55:00.582803+09:00",
"updated_at": "2026-08-10T15:28:14.946790+09:00"
}
@@ -0,0 +1,107 @@
{"ts": "2026-06-17T11:15:02.363537+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 130900, "qty": 47, "cost": 6153223, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 118039, "target": 156622, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "129,300 vs 118,195"}, {"label": "정배열(5>20)", "ok": true, "detail": "120,400 / 118,195"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "120,400 / 118,307"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-13.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +371 · 기 +158 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+22%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.12% (환산) vs 평균 0.38% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 126,500"}, {"label": "거래량 급증", "ok": true, "detail": "3,094,534 (환산) vs 평균 1,031,725"}, {"label": "회전율 급증", "ok": true, "detail": "1.12% (환산) vs 평균 0.38%"}, {"label": "RSI", "ok": true, "detail": "60"}]}
{"ts": "2026-06-17T16:47:31.044135+09:00", "side": "BUY", "code": "403870", "name": "HPSP", "price": 62900, "qty": 71, "cost": 4466570, "path": "pullback", "reason": "눌림목 지정가 64,531 도달", "stop": 48962, "target": 90776, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "62,800 vs 52,858"}, {"label": "정배열(5>20)", "ok": true, "detail": "59,880 / 52,858"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "59,880 / 49,831"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+21.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -4,434 · 기 +5,040 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+9%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "11.31% vs 평균 5.97% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 71,500"}, {"label": "거래량 급증", "ok": true, "detail": "9,309,211 vs 평균 4,912,598"}, {"label": "회전율 급증", "ok": true, "detail": "11.31% vs 평균 5.97%"}, {"label": "RSI", "ok": true, "detail": "58"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 64,531 (현재 62,800)"}]}
{"ts": "2026-06-19T09:02:06.409115+09:00", "side": "BUY", "code": "005930", "name": "삼성전자", "price": 373500, "qty": 16, "cost": 5976896, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 331259, "target": 457982, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "373,000 vs 325,400"}, {"label": "정배열(5>20)", "ok": true, "detail": "352,400 / 325,400"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "352,400 / 258,005"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+6.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,427 · 기 +4,448 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+19%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.04% (환산) vs 평균 0.53% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 370,000"}, {"label": "거래량 급증", "ok": true, "detail": "60,950,213 (환산) vs 평균 31,088,390"}, {"label": "회전율 급증", "ok": true, "detail": "1.04% (환산) vs 평균 0.53%"}, {"label": "RSI", "ok": true, "detail": "67"}]}
{"ts": "2026-06-19T09:02:06.409502+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19160, "qty": 325, "cost": 6227934, "path": "pullback", "reason": "눌림목 지정가 20,044 도달", "stop": 17760, "target": 21960, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "19,150 vs 18,862"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,616 / 18,862"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,616 / 19,361"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-31.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,162 · 기 +2,080 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.03% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "37,673 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.03% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 20,044 (현재 19,150)"}]}
{"ts": "2026-06-23T09:00:11.204360+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18820, "qty": 325, "proceeds": 6104573, "entry_price": 19160, "pnl": -123361, "pnl_pct": -1.77, "hold_from": "2026-06-19T09:02:06.409500+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 18,710)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,960"}, {"label": "추세(20일선)", "ok": false, "detail": "18,840"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -318 · 기 -227"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,528"}]}
{"ts": "2026-06-23T12:04:04.149244+09:00", "side": "SELL", "code": "086790", "name": "하나금융지주", "price": 117700, "qty": 47, "proceeds": 5521113, "entry_price": 130900, "pnl": -632110, "pnl_pct": -10.08, "hold_from": "2026-06-17T11:15:02.363536+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "118,039 (현재 117,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 156,622"}, {"label": "추세(20일선)", "ok": false, "detail": "118,130"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +332 · 기 -364"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 134,300"}]}
{"ts": "2026-06-23T12:32:04.189614+09:00", "side": "SELL", "code": "005930", "name": "삼성전자", "price": 330000, "qty": 16, "proceeds": 5269704, "entry_price": 373500, "pnl": -707192, "pnl_pct": -11.65, "hold_from": "2026-06-19T09:02:06.409114+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "331,259 (현재 330,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 457,982"}, {"label": "추세(20일선)", "ok": true, "detail": "329,025"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -3,792 · 기 +1,417"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 384,779"}]}
{"ts": "2026-06-24T09:04:06.124732+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 156700, "qty": 26, "cost": 4074811, "path": "pullback", "reason": "눌림목 지정가 165,075 도달", "stop": 120251, "target": 229599, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "156,200 vs 121,650"}, {"label": "정배열(5>20)", "ok": true, "detail": "143,260 / 121,650"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "143,260 / 121,703"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+46.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +210 · 기 +143 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+6%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "5.83% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": true, "detail": "2,860,073 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": true, "detail": "5.83% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 165,075 (현재 156,200)"}]}
{"ts": "2026-06-24T09:12:05.358231+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 17270, "qty": 296, "cost": 5112687, "path": "pullback", "reason": "눌림목 지정가 17,366 도달", "stop": 13981, "target": 23847, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "17,280 vs 12,914"}, {"label": "정배열(5>20)", "ok": true, "detail": "16,364 / 12,914"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "16,364 / 11,500"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+21.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +1,740 · 기 -508 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+16%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.34% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": false, "detail": "2,509,340 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": false, "detail": "2.34% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "65"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 17,366 (현재 17,280)"}]}
{"ts": "2026-06-24T09:46:04.789014+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 158200, "qty": 26, "cost": 4113817, "path": "pullback", "reason": "눌림목 지정가 158,264 도달", "stop": 120729, "target": 233143, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "158,000 vs 136,315"}, {"label": "정배열(5>20)", "ok": true, "detail": "172,240 / 136,315"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "172,240 / 99,750"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+56.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +41 · 기 +65 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+5%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "4.25% (환산) vs 평균 3.06% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 202,500"}, {"label": "거래량 급증", "ok": true, "detail": "822,940 (환산) vs 평균 591,925"}, {"label": "회전율 급증", "ok": false, "detail": "4.25% (환산) vs 평균 3.06%"}, {"label": "RSI", "ok": true, "detail": "61"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 158,264 (현재 158,000)"}]}
{"ts": "2026-06-24T11:12:05.907232+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 18260, "qty": 280, "cost": 5113567, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 13981, "target": 23847, "signals": [{"label": "손절선", "ok": true, "detail": "13,981 (현재 18,250)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 23,847"}, {"label": "추세(20일선)", "ok": true, "detail": "12,962"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +1,742 · 기 -508"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 18,094"}]}
{"ts": "2026-06-25T09:00:25.861919+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 179100, "qty": 23, "cost": 4119918, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 120729, "target": 233143, "signals": [{"label": "손절선", "ok": true, "detail": "120,729 (현재 178,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 233,143"}, {"label": "추세(20일선)", "ok": true, "detail": "137,330"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -56 · 기 +134"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 167,275"}]}
{"ts": "2026-06-25T09:04:05.751533+09:00", "side": "BUY", "code": "003490", "name": "대한항공", "price": 28900, "qty": 214, "cost": 6185528, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 26248, "target": 34203, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "28,850 vs 25,948"}, {"label": "정배열(5>20)", "ok": true, "detail": "26,110 / 25,948"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "26,110 / 25,216"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-2.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +1,577 · 기 -7 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.9/5"}, {"label": "상승여력", "ok": true, "detail": "+15%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.54% (환산) vs 평균 0.58% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 28,400"}, {"label": "거래량 급증", "ok": true, "detail": "5,629,873 (환산) vs 평균 2,146,231"}, {"label": "회전율 급증", "ok": true, "detail": "1.54% (환산) vs 평균 0.58%"}, {"label": "RSI", "ok": true, "detail": "64"}]}
{"ts": "2026-06-26T09:00:07.830878+09:00", "side": "SELL", "code": "403870", "name": "HPSP", "price": 50000, "qty": 71, "proceeds": 3543078, "entry_price": 62900, "pnl": -923492, "pnl_pct": -20.51, "hold_from": "2026-06-17T16:47:31.044127+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "48,962 (현재 51,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 90,776"}, {"label": "추세(20일선)", "ok": false, "detail": "52,268"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -311 · 기 -267"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 66,756"}]}
{"ts": "2026-06-26T10:14:04.068633+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 166900, "qty": 25, "cost": 4173126, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 120251, "target": 229599, "signals": [{"label": "손절선", "ok": true, "detail": "120,251 (현재 166,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 229,599"}, {"label": "추세(20일선)", "ok": true, "detail": "122,175"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -126 · 기 +320"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 165,659"}]}
{"ts": "2026-06-29T11:36:01.272649+09:00", "side": "BUY", "code": "034730", "name": "SK", "price": 745000, "qty": 7, "cost": 5215782, "path": "pullback", "reason": "눌림목 지정가 748,914 도달", "stop": 612829, "target": 1009343, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "744,000 vs 676,650"}, {"label": "정배열(5>20)", "ok": true, "detail": "766,800 / 676,650"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "766,800 / 530,600"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+12.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -194 · 기 +152 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+8%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.35% (환산) vs 평균 0.45% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 883,000"}, {"label": "거래량 급증", "ok": true, "detail": "977,966 (환산) vs 평균 329,863"}, {"label": "회전율 급증", "ok": true, "detail": "1.35% (환산) vs 평균 0.45%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 748,914 (현재 744,000)"}]}
{"ts": "2026-06-29T14:18:01.493145+09:00", "side": "BUY", "code": "034730", "name": "SK", "price": 778000, "qty": 7, "cost": 5446817, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 612829, "target": 1009343, "signals": [{"label": "손절선", "ok": true, "detail": "612,829 (현재 779,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 1,009,343"}, {"label": "추세(20일선)", "ok": true, "detail": "678,400"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -200 · 기 +143"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 778,043"}]}
{"ts": "2026-06-30T09:00:08.867646+09:00", "side": "BUY", "code": "403870", "name": "HPSP", "price": 55300, "qty": 81, "cost": 4479972, "path": "pullback", "reason": "눌림목 지정가 63,981 도달", "stop": 43200, "target": 79500, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "53,700 vs 52,402"}, {"label": "정배열(5>20)", "ok": true, "detail": "58,060 / 52,402"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "58,060 / 49,679"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+12.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +222 · 기 -821 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+28%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.00% (환산) vs 평균 5.97% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 71,500"}, {"label": "거래량 급증", "ok": false, "detail": "827 (환산) vs 평균 4,912,598"}, {"label": "회전율 급증", "ok": false, "detail": "0.00% (환산) vs 평균 5.97%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 63,981 (현재 53,700)"}]}
{"ts": "2026-06-30T09:02:03.194025+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 347500, "qty": 18, "cost": 6255938, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 305863, "target": 430774, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "347,000 vs 296,475"}, {"label": "정배열(5>20)", "ok": true, "detail": "315,600 / 296,475"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "315,600 / 305,533"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+29.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -19 · 기 +146 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+39%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.55% (환산) vs 평균 0.93% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 334,500"}, {"label": "거래량 급증", "ok": true, "detail": "160,800 (환산) vs 평균 96,436"}, {"label": "회전율 급증", "ok": true, "detail": "1.55% (환산) vs 평균 0.93%"}, {"label": "RSI", "ok": true, "detail": "66"}]}
{"ts": "2026-06-30T09:06:03.687096+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 360000, "qty": 17, "cost": 6120918, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 305863, "target": 430774, "signals": [{"label": "손절선", "ok": true, "detail": "305,863 (현재 360,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 430,774"}, {"label": "추세(20일선)", "ok": true, "detail": "297,125"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -19 · 기 +146"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 358,070"}]}
{"ts": "2026-07-01T09:46:03.082068+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 118200, "qty": 54, "cost": 6383757, "path": "pullback", "reason": "눌림목 지정가 122,286 도달", "stop": 111000, "target": 132600, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "118,200 vs 118,155"}, {"label": "정배열(5>20)", "ok": true, "detail": "120,240 / 118,155"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "120,240 / 118,368"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+3.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +55 · 기 -166 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.35% (환산) vs 평균 0.37% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 130,700"}, {"label": "거래량 급증", "ok": false, "detail": "969,420 (환산) vs 평균 1,026,357"}, {"label": "회전율 급증", "ok": false, "detail": "0.35% (환산) vs 평균 0.37%"}, {"label": "RSI", "ok": true, "detail": "49"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 122,286 (현재 118,200)"}]}
{"ts": "2026-07-02T10:18:03.846196+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 122200, "qty": 52, "cost": 6355353, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 111000, "target": 132600, "signals": [{"label": "손절선", "ok": true, "detail": "111,000 (현재 122,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 132,600"}, {"label": "추세(20일선)", "ok": true, "detail": "118,345"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +22 · 기 -44"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 121,743"}]}
{"ts": "2026-07-02T11:04:07.593139+09:00", "side": "BUY", "code": "003490", "name": "대한항공", "price": 29600, "qty": 209, "cost": 6187328, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 26248, "target": 34203, "signals": [{"label": "손절선", "ok": true, "detail": "26,248 (현재 29,600)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 34,203"}, {"label": "추세(20일선)", "ok": true, "detail": "25,985"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -206 · 기 +1,008"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 29,586"}]}
{"ts": "2026-07-03T09:04:01.676630+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 14370, "qty": 576, "proceeds": 8260980, "entry_price": 17751, "pnl": -1965274, "pnl_pct": -19.05, "hold_from": "2026-06-24T09:12:05.358230+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "14,457 (현재 14,390)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 24,340"}, {"label": "추세(20일선)", "ok": true, "detail": "12,769"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -1,591 · 기 +253"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-03T09:28:01.647159+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 125700, "qty": 51, "proceeds": 6398199, "entry_price": 161700, "pnl": -1849738, "pnl_pct": -22.26, "hold_from": "2026-06-24T09:04:06.124731+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "125,865 (현재 125,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 233,370"}, {"label": "추세(20일선)", "ok": true, "detail": "120,125"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +674 · 기 -2,170"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-03T10:24:02.778564+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19040, "qty": 301, "cost": 5731900, "path": "pullback", "reason": "눌림목 지정가 20,004 도달", "stop": 17760, "target": 21600, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "19,030 vs 18,856"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,592 / 18,856"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,592 / 19,359"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+2.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -35 · 기 +168 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+34%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.54% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "619,193 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.54% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "49"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 20,004 (현재 19,030)"}]}
{"ts": "2026-07-03T15:10:02.646131+09:00", "side": "BUY", "code": "009150", "name": "삼성전기", "price": 1971000, "qty": 2, "cost": 3942591, "path": "pullback", "reason": "눌림목 지정가 1,978,439 도달", "stop": 1901000, "target": 2111000, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "1,971,000 vs 1,967,250"}, {"label": "정배열(5>20)", "ok": true, "detail": "2,036,600 / 1,967,250"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "2,036,600 / 1,295,300"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+9.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +146 · 기 +126 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+10%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.46% (환산) vs 평균 1.76% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 2,417,000"}, {"label": "거래량 급증", "ok": true, "detail": "1,835,275 (환산) vs 평균 1,312,239"}, {"label": "회전율 급증", "ok": false, "detail": "2.46% (환산) vs 평균 1.76%"}, {"label": "RSI", "ok": true, "detail": "55"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 1,978,439 (현재 1,971,000)"}]}
{"ts": "2026-07-06T10:06:02.773863+09:00", "side": "SELL", "code": "009150", "name": "삼성전기", "price": 1900000, "qty": 2, "proceeds": 3792590, "entry_price": 1971000, "pnl": -150001, "pnl_pct": -3.6, "hold_from": "2026-07-03T15:10:02.646130+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "1,901,000 (현재 1,901,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 2,111,000"}, {"label": "추세(20일선)", "ok": false, "detail": "1,963,750"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +135 · 기 +46"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 2,067,780"}]}
{"ts": "2026-07-06T10:06:02.775173+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 123800, "qty": 32, "cost": 3962194, "path": "pullback", "reason": "눌림목 지정가 163,325 도달", "stop": 96000, "target": 179400, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "123,800 vs 120,030"}, {"label": "정배열(5>20)", "ok": true, "detail": "136,780 / 120,030"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "136,780 / 121,163"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+3.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +735 · 기 -1,982 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+41%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "6.92% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": true, "detail": "3,397,673 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": true, "detail": "6.92% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 163,325 (현재 123,800)"}]}
{"ts": "2026-07-06T10:20:01.605390+09:00", "side": "SELL", "code": "214450", "name": "파마리서치", "price": 311000, "qty": 35, "proceeds": 10863774, "entry_price": 353571, "pnl": -1513082, "pnl_pct": -12.04, "hold_from": "2026-06-30T09:02:03.194023+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "311,291 (현재 311,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 438,131"}, {"label": "추세(20일선)", "ok": true, "detail": "294,675"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -108 · 기 +225"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-06T10:22:04.511969+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 13300, "qty": 308, "cost": 4097014, "path": "pullback", "reason": "눌림목 지정가 17,049 도달", "stop": 10360, "target": 19180, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "13,290 vs 12,714"}, {"label": "정배열(5>20)", "ok": true, "detail": "15,566 / 12,714"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "15,566 / 11,433"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-12.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,199 · 기 +137 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+50%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "10.30% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": true, "detail": "11,050,727 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": true, "detail": "10.30% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 17,049 (현재 13,290)"}]}
{"ts": "2026-07-07T09:48:07.735262+09:00", "side": "SELL", "code": "403870", "name": "HPSP", "price": 43000, "qty": 81, "proceeds": 3476208, "entry_price": 55300, "pnl": -1003764, "pnl_pct": -22.24, "hold_from": "2026-06-30T09:00:08.867639+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "43,200 (현재 43,050)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 79,500"}, {"label": "추세(20일선)", "ok": false, "detail": "51,870"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +1,424 · 기 -5,706"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 59,449"}]}
{"ts": "2026-07-07T10:30:07.367218+09:00", "side": "SELL", "code": "034730", "name": "SK", "price": 628000, "qty": 14, "proceeds": 8774856, "entry_price": 761500, "pnl": -1887744, "pnl_pct": -17.53, "hold_from": "2026-06-29T11:36:01.272648+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "629,329 (현재 628,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 1,025,843"}, {"label": "추세(20일선)", "ok": false, "detail": "670,850"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -58 · 기 +6"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-07T12:02:08.236692+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 12230, "qty": 308, "proceeds": 3759495, "entry_price": 13300, "pnl": -337520, "pnl_pct": -8.05, "hold_from": "2026-07-06T10:22:04.511967+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "10,360 (현재 12,230)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 19,180"}, {"label": "추세(20일선)", "ok": false, "detail": "12,661"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -1,558 · 기 -4"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 14,302"}]}
{"ts": "2026-07-07T14:08:57.139182+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 20750, "qty": 277, "cost": 5748612, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 17760, "target": 21600, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 20,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,600"}, {"label": "추세(20일선)", "ok": true, "detail": "18,884"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +156 · 기 +113"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,358"}]}
{"ts": "2026-07-08T09:00:18.439712+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 108300, "qty": 32, "proceeds": 3458842, "entry_price": 123800, "pnl": -503352, "pnl_pct": -12.52, "hold_from": "2026-07-06T10:06:02.775166+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "166,450 (현재 112,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": false, "detail": "119,475"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +243 · 기 -857"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-08T09:48:01.875914+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 161100, "qty": 33, "cost": 5317097, "path": "pullback", "reason": "눌림목 지정가 168,676 도달", "stop": 158000, "target": 167300, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "161,600 vs 149,870"}, {"label": "정배열(5>20)", "ok": true, "detail": "169,960 / 149,870"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "169,960 / 113,252"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+77.7%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +198 · 기 -309 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+11%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "3.83% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": true, "detail": "1,110,233 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": false, "detail": "3.83% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "56"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 168,676 (현재 161,600)"}]}
{"ts": "2026-07-08T10:26:01.970785+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 157600, "qty": 33, "proceeds": 5190658, "entry_price": 161100, "pnl": -126439, "pnl_pct": -2.17, "hold_from": "2026-07-08T09:48:01.875913+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "158,000 (현재 158,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 167,300"}, {"label": "추세(20일선)", "ok": true, "detail": "149,690"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +198 · 기 -312"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 170,862"}]}
{"ts": "2026-07-09T09:02:04.466832+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 158300, "qty": 33, "cost": 5224684, "path": "pullback", "reason": "눌림목 지정가 168,455 도달", "stop": 158000, "target": 158900, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "158,200 vs 149,700"}, {"label": "정배열(5>20)", "ok": true, "detail": "169,280 / 149,700"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "169,280 / 113,195"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+81.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +296 · 기 -306 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+13%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.72% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": false, "detail": "499,233 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": false, "detail": "1.72% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "55"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 168,455 (현재 158,200)"}]}
{"ts": "2026-07-09T09:10:01.828360+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 132300, "qty": 40, "cost": 5292794, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 117515, "target": 161870, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "132,100 vs 108,930"}, {"label": "정배열(5>20)", "ok": true, "detail": "115,600 / 108,930"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "115,600 / 113,232"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+22.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -184 · 기 +964 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+12%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.51% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 116,900"}, {"label": "거래량 급증", "ok": true, "detail": "572,860 (환산) vs 평균 359,705"}, {"label": "회전율 급증", "ok": true, "detail": "0.51% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-07-09T09:12:02.510762+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 156900, "qty": 33, "proceeds": 5167603, "entry_price": 158300, "pnl": -57080, "pnl_pct": -0.88, "hold_from": "2026-07-09T09:02:04.466831+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "158,000 (현재 156,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "149,635"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +296 · 기 -306"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-09T12:12:04.859326+09:00", "side": "SELL", "code": "003490", "name": "대한항공", "price": 26500, "qty": 423, "proceeds": 11187641, "entry_price": 29246, "pnl": -1185214, "pnl_pct": -9.39, "hold_from": "2026-06-25T09:04:05.751532+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "26,501 (현재 26,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 34,735"}, {"label": "추세(20일선)", "ok": true, "detail": "25,830"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -1,444 · 기 +2,767"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-10T09:00:12.156468+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 164000, "qty": 32, "cost": 5248787, "path": "pullback", "reason": "눌림목 지정가 169,105 도달", "stop": 158000, "target": 176000, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "162,200 vs 149,900"}, {"label": "정배열(5>20)", "ok": true, "detail": "170,080 / 149,900"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "170,080 / 113,262"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+85.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +225 · 기 -178 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+10%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.58% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": false, "detail": "746,107 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": false, "detail": "2.58% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "56"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 169,105 (현재 162,200)"}]}
{"ts": "2026-07-10T09:28:02.623561+09:00", "side": "BUY", "code": "055550", "name": "신한지주", "price": 110900, "qty": 48, "cost": 5323998, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 99988, "target": 132725, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "110,700 vs 97,340"}, {"label": "정배열(5>20)", "ok": true, "detail": "101,320 / 97,340"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "101,320 / 96,637"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+22.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -756 · 기 +893 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+17%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.54% (환산) vs 평균 0.35% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 109,800"}, {"label": "거래량 급증", "ok": true, "detail": "2,541,113 (환산) vs 평균 1,653,581"}, {"label": "회전율 급증", "ok": true, "detail": "0.54% (환산) vs 평균 0.35%"}, {"label": "RSI", "ok": true, "detail": "65"}]}
{"ts": "2026-07-10T09:28:02.623841+09:00", "side": "BUY", "code": "105560", "name": "KB금융", "price": 185900, "qty": 29, "cost": 5391909, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 166448, "target": 224803, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "185,600 vs 159,890"}, {"label": "정배열(5>20)", "ok": true, "detail": "159,900 / 159,890"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "159,900 / 157,368"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+26.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,310 · 기 +1,527 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+16%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.06% (환산) vs 평균 0.46% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 182,700"}, {"label": "거래량 급증", "ok": true, "detail": "3,715,113 (환산) vs 평균 1,640,325"}, {"label": "회전율 급증", "ok": true, "detail": "1.06% (환산) vs 평균 0.46%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-07-10T09:46:11.477296+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 12830, "qty": 351, "cost": 4504005, "path": "pullback", "reason": "눌림목 지정가 16,984 도달", "stop": 10360, "target": 17770, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "12,820 vs 12,690"}, {"label": "정배열(5>20)", "ok": true, "detail": "15,472 / 12,690"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "15,472 / 11,425"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+1.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +228 · 기 +229 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+56%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "9.75% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": true, "detail": "10,460,473 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": true, "detail": "9.75% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 16,984 (현재 12,820)"}]}
{"ts": "2026-07-10T10:14:04.440996+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 173600, "qty": 31, "cost": 5382407, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 158000, "target": 176000, "signals": [{"label": "손절선", "ok": true, "detail": "158,000 (현재 173,600)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 176,000"}, {"label": "추세(20일선)", "ok": true, "detail": "150,470"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +205 · 기 -155"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 173,548"}]}
{"ts": "2026-07-10T11:16:02.478050+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 13850, "qty": 325, "cost": 4501925, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 10360, "target": 17770, "signals": [{"label": "손절선", "ok": true, "detail": "10,360 (현재 13,850)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 17,770"}, {"label": "추세(20일선)", "ok": true, "detail": "12,742"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +210 · 기 +239"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,843"}]}
{"ts": "2026-07-13T09:00:11.239464+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 136900, "qty": 39, "cost": 5339901, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 117515, "target": 161870, "signals": [{"label": "손절선", "ok": true, "detail": "117,515 (현재 136,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 161,870"}, {"label": "추세(20일선)", "ok": true, "detail": "109,140"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -64 · 기 +919"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 136,164"}]}
{"ts": "2026-07-13T09:36:02.276346+09:00", "side": "BUY", "code": "105560", "name": "KB금융", "price": 191000, "qty": 28, "cost": 5348802, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 166448, "target": 224803, "signals": [{"label": "손절선", "ok": true, "detail": "166,448 (현재 191,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 224,803"}, {"label": "추세(20일선)", "ok": true, "detail": "160,160"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -867 · 기 +1,393"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 190,952"}]}
{"ts": "2026-07-13T12:44:04.357132+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 187900, "qty": 63, "proceeds": 11814616, "entry_price": 168724, "pnl": 1183422, "pnl_pct": 11.37, "hold_from": "2026-07-10T09:00:12.156459+09:00", "reason": "트레일링 익절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "189,133 (현재 187,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "151,185"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -254 · 기 +457"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-15T09:02:02.649553+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 135500, "qty": 23, "cost": 3116967, "path": "pullback", "reason": "눌림목 지정가 164,061 도달", "stop": 97022, "target": 212456, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "134,900 vs 120,585"}, {"label": "정배열(5>20)", "ok": true, "detail": "139,000 / 120,585"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "139,000 / 121,348"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+27.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,752 · 기 +1,989 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+31%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.30% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": false, "detail": "636,187 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": false, "detail": "1.30% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "53"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 164,061 (현재 134,900)"}]}
{"ts": "2026-07-15T14:32:01.886416+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18570, "qty": 578, "proceeds": 10712530, "entry_price": 19859, "pnl": -767982, "pnl_pct": -6.49, "hold_from": "2026-07-03T10:24:02.778563+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "18,587 (현재 18,570)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,404"}, {"label": "추세(20일선)", "ok": false, "detail": "18,833"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -214 · 기 +240"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-16T14:16:02.482790+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 145700, "qty": 21, "cost": 3060159, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 97022, "target": 212456, "signals": [{"label": "손절선", "ok": true, "detail": "97,022 (현재 145,800)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 212,456"}, {"label": "추세(20일선)", "ok": true, "detail": "121,130"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -1,717 · 기 +2,299"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 145,295"}]}
{"ts": "2026-07-20T12:28:02.317762+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 10310, "qty": 676, "proceeds": 6955969, "entry_price": 13320, "pnl": -2049961, "pnl_pct": -22.6, "hold_from": "2026-07-10T09:46:11.477294+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "10,360 (현재 10,310)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 19,241"}, {"label": "추세(20일선)", "ok": false, "detail": "14,755"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -887 · 기 +515"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-20T12:46:02.280771+09:00", "side": "SELL", "code": "086790", "name": "하나금융지주", "price": 131800, "qty": 106, "proceeds": 13943557, "entry_price": 120162, "pnl": 1204446, "pnl_pct": 9.69, "hold_from": "2026-07-01T09:46:03.082062+09:00", "reason": "트레일링 익절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "131,911 (현재 131,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "118,840"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +0 · 기 +424"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-20T12:50:02.291040+09:00", "side": "SELL", "code": "105560", "name": "KB금융", "price": 167800, "qty": 57, "proceeds": 9545949, "entry_price": 188405, "pnl": -1194762, "pnl_pct": -10.94, "hold_from": "2026-07-10T09:28:02.623839+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "168,196 (현재 167,800)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 228,823"}, {"label": "추세(20일선)", "ok": true, "detail": "159,000"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -385 · 기 +288"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-21T09:02:05.674730+09:00", "side": "SELL", "code": "055550", "name": "신한지주", "price": 99300, "qty": 48, "proceeds": 4757106, "entry_price": 110900, "pnl": -566893, "pnl_pct": -10.46, "hold_from": "2026-07-10T09:28:02.623560+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "99,988 (현재 99,400)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 132,725"}, {"label": "추세(20일선)", "ok": true, "detail": "96,775"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -141 · 기 +150"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 113,471"}]}
{"ts": "2026-07-21T10:08:04.174963+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 133100, "qty": 39, "cost": 5191679, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 120243, "target": 158813, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "133,000 vs 118,895"}, {"label": "정배열(5>20)", "ok": true, "detail": "123,200 / 118,895"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "123,200 / 118,615"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+38.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +137 · 기 +185 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+22%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.57% (환산) vs 평균 0.37% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 130,700"}, {"label": "거래량 급증", "ok": true, "detail": "1,575,915 (환산) vs 평균 1,026,357"}, {"label": "회전율 급증", "ok": true, "detail": "0.57% (환산) vs 평균 0.37%"}, {"label": "RSI", "ok": true, "detail": "63"}]}
{"ts": "2026-07-21T10:12:01.047659+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 167000, "qty": 31, "cost": 5177777, "path": "pullback", "reason": "눌림목 지정가 169,640 도달", "stop": 158000, "target": 185000, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "167,000 vs 150,140"}, {"label": "정배열(5>20)", "ok": true, "detail": "171,040 / 150,140"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "171,040 / 113,342"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+92.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -534 · 기 +316 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+7%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "3.29% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": false, "detail": "951,819 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": false, "detail": "3.29% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "58"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 169,640 (현재 167,000)"}]}
{"ts": "2026-07-21T12:06:01.172123+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 344500, "qty": 15, "cost": 5168275, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 303577, "target": 426346, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "344,500 vs 296,350"}, {"label": "정배열(5>20)", "ok": true, "detail": "315,100 / 296,350"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "315,100 / 305,492"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+39.7%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -7 · 기 +1 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+43%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.38% (환산) vs 평균 0.93% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 334,500"}, {"label": "거래량 급증", "ok": true, "detail": "247,158 (환산) vs 평균 96,436"}, {"label": "회전율 급증", "ok": true, "detail": "2.38% (환산) vs 평균 0.93%"}, {"label": "RSI", "ok": true, "detail": "65"}]}
{"ts": "2026-07-22T09:00:07.120141+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 177600, "qty": 29, "cost": 5151173, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 158000, "target": 185000, "signals": [{"label": "손절선", "ok": true, "detail": "158,000 (현재 178,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 185,000"}, {"label": "추세(20일선)", "ok": true, "detail": "150,715"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -377 · 기 +151"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 175,894"}]}
{"ts": "2026-07-22T09:04:01.820566+09:00", "side": "BUY", "code": "161890", "name": "한국콜마", "price": 99200, "qty": 53, "cost": 5258389, "path": "pullback", "reason": "눌림목 지정가 98,848 도달", "stop": 92100, "target": 113400, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "98,800 vs 98,505"}, {"label": "정배열(5>20)", "ok": true, "detail": "107,060 / 98,505"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "107,060 / 91,913"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+27.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +29 · 기 -34 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.16% (환산) vs 평균 1.76% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 124,600"}, {"label": "거래량 급증", "ok": false, "detail": "272,433 (환산) vs 평균 415,172"}, {"label": "회전율 급증", "ok": false, "detail": "1.16% (환산) vs 평균 1.76%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 98,848 (현재 98,800)"}]}
{"ts": "2026-07-22T12:12:00.741239+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 157300, "qty": 60, "proceeds": 9419596, "entry_price": 172123, "pnl": -909353, "pnl_pct": -8.61, "hold_from": "2026-07-21T10:12:01.047658+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "158,000 (현재 157,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 200,370"}, {"label": "추세(20일선)", "ok": true, "detail": "149,655"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -407 · 기 +141"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-22T14:18:05.427296+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 14030, "qty": 280, "cost": 3928989, "path": "pullback", "reason": "눌림목 지정가 14,023 도달", "stop": 11077, "target": 19936, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "14,020 vs 12,776"}, {"label": "정배열(5>20)", "ok": true, "detail": "14,552 / 12,776"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "14,552 / 13,283"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+10.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,005 · 기 +1,723 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.97% (환산) vs 평균 1.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 15,870"}, {"label": "거래량 급증", "ok": false, "detail": "585,754 (환산) vs 평균 882,736"}, {"label": "회전율 급증", "ok": false, "detail": "0.97% (환산) vs 평균 1.47%"}, {"label": "RSI", "ok": true, "detail": "53"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 14,023 (현재 14,020)"}]}
{"ts": "2026-07-23T09:00:22.864455+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 160100, "qty": 32, "cost": 5123968, "path": "pullback", "reason": "눌림목 지정가 169,062 도달", "stop": 158000, "target": 164300, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "158,100 vs 149,695"}, {"label": "정배열(5>20)", "ok": true, "detail": "169,260 / 149,695"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "169,260 / 113,193"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+76.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -162 · 기 +37 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+13%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.05% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": false, "detail": "303,687 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": false, "detail": "1.05% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "55"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 169,062 (현재 158,100)"}]}
{"ts": "2026-07-23T09:32:04.414108+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 157800, "qty": 32, "proceeds": 5039753, "entry_price": 160100, "pnl": -84215, "pnl_pct": -1.44, "hold_from": "2026-07-23T09:00:22.864448+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "158,000 (현재 157,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "149,685"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -162 · 기 +37"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-23T09:44:04.287798+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 18850, "qty": 274, "cost": 5165675, "path": "pullback", "reason": "눌림목 지정가 20,001 도달", "stop": 17760, "target": 21030, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "18,850 vs 18,847"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,556 / 18,847"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,556 / 19,356"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+13.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -25 · 기 +6 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+34%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.34% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "388,767 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.34% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "48"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 20,001 (현재 18,850)"}]}
{"ts": "2026-07-23T12:18:01.546609+09:00", "side": "BUY", "code": "161890", "name": "한국콜마", "price": 103100, "qty": 51, "cost": 5258889, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 92100, "target": 113400, "signals": [{"label": "손절선", "ok": true, "detail": "92,100 (현재 103,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 113,400"}, {"label": "추세(20일선)", "ok": true, "detail": "98,720"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +222 · 기 -227"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 103,029"}]}
{"ts": "2026-07-23T12:22:02.597376+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 356000, "qty": 14, "cost": 4984748, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 303577, "target": 426346, "signals": [{"label": "손절선", "ok": true, "detail": "303,577 (현재 356,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 426,346"}, {"label": "추세(20일선)", "ok": true, "detail": "296,925"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +6 · 기 +26"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 355,034"}]}
{"ts": "2026-07-24T09:00:06.038474+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 111800, "qty": 44, "proceeds": 4909608, "entry_price": 140368, "pnl": -1267519, "pnl_pct": -20.35, "hold_from": "2026-07-15T09:02:02.649551+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "101,190 (현재 113,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 218,724"}, {"label": "추세(20일선)", "ok": false, "detail": "119,505"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -480 · 기 -206"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-24T09:00:06.040488+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18730, "qty": 274, "proceeds": 5122013, "entry_price": 18850, "pnl": -43662, "pnl_pct": -0.64, "hold_from": "2026-07-23T09:44:04.287796+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 18,730)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,030"}, {"label": "추세(20일선)", "ok": false, "detail": "18,841"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -5 · 기 -5"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,219"}]}
{"ts": "2026-07-24T09:26:01.010231+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 94000, "qty": 54, "cost": 5076761, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 82349, "target": 117301, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "93,900 vs 75,355"}, {"label": "정배열(5>20)", "ok": true, "detail": "84,140 / 75,355"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "84,140 / 75,153"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+61.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -113 · 기 +274 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+10%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.90% (환산) vs 평균 0.42% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 87,600"}, {"label": "거래량 급증", "ok": true, "detail": "829,560 (환산) vs 평균 392,182"}, {"label": "회전율 급증", "ok": true, "detail": "0.90% (환산) vs 평균 0.42%"}, {"label": "RSI", "ok": true, "detail": "72"}]}
{"ts": "2026-07-24T09:28:04.951474+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 14510, "qty": 271, "cost": 3932800, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 11077, "target": 19936, "signals": [{"label": "손절선", "ok": true, "detail": "11,077 (현재 15,400)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 19,936"}, {"label": "추세(20일선)", "ok": true, "detail": "12,845"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -857 · 기 +1,172"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 14,791"}]}
{"ts": "2026-07-24T09:48:01.199521+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 97000, "qty": 53, "cost": 5141771, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 82349, "target": 117301, "signals": [{"label": "손절선", "ok": true, "detail": "82,349 (현재 97,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 117,301"}, {"label": "추세(20일선)", "ok": true, "detail": "75,510"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -113 · 기 +274"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 96,977"}]}
{"ts": "2026-07-27T09:02:06.232738+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19100, "qty": 268, "cost": 5119568, "path": "pullback", "reason": "눌림목 지정가 20,032 도달", "stop": 17760, "target": 21780, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "19,070 vs 18,858"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,600 / 18,858"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,600 / 19,360"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+16.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +101 · 기 -3 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.13% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "146,760 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.13% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 20,032 (현재 19,070)"}]}
{"ts": "2026-07-28T09:00:16.262420+09:00", "side": "SELL", "code": "095610", "name": "테스", "price": 126200, "qty": 49, "proceeds": 6171742, "entry_price": 168010, "pnl": -2061993, "pnl_pct": -24.89, "hold_from": "2026-06-24T09:46:04.789013+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "131,710 (현재 128,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 240,610"}, {"label": "추세(20일선)", "ok": false, "detail": "134,815"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +269 · 기 -554"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-28T09:00:16.264486+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6780, "qty": 691, "cost": 4685683, "path": "pullback", "reason": "눌림목 지정가 7,884 도달", "stop": 5628, "target": 9085, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "7,050 vs 4,855"}, {"label": "정배열(5>20)", "ok": true, "detail": "6,368 / 4,855"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,368 / 4,882"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+73.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +86 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.01% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "813 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "0.01% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "69"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,884 (현재 7,050)"}]}
{"ts": "2026-07-28T09:10:01.745416+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 7100, "qty": 660, "cost": 4686703, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 5628, "target": 9085, "signals": [{"label": "손절선", "ok": true, "detail": "5,628 (현재 7,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 9,085"}, {"label": "추세(20일선)", "ok": true, "detail": "4,857"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +86 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 7,079"}]}
{"ts": "2026-07-28T10:08:02.773145+09:00", "side": "SELL", "code": "252990", "name": "샘씨엔에스", "price": 11170, "qty": 551, "proceeds": 6142668, "entry_price": 14266, "pnl": -1719121, "pnl_pct": -21.7, "hold_from": "2026-07-22T14:18:05.427295+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "11,223 (현재 11,220)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 20,352"}, {"label": "추세(20일선)", "ok": false, "detail": "12,636"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +106 · 기 -64"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T09:02:02.233198+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 117900, "qty": 40, "cost": 4716707, "path": "pullback", "reason": "눌림목 지정가 118,115 도달", "stop": 111200, "target": 131300, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "117,800 vs 113,445"}, {"label": "정배열(5>20)", "ok": true, "detail": "117,020 / 113,445"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "117,020 / 109,982"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+45.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +39 · 기 +307 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+26%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.03% (환산) vs 평균 0.17% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 123,300"}, {"label": "거래량 급증", "ok": false, "detail": "44,660 (환산) vs 평균 289,522"}, {"label": "회전율 급증", "ok": false, "detail": "0.03% (환산) vs 평균 0.17%"}, {"label": "RSI", "ok": true, "detail": "57"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 118,115 (현재 117,800)"}]}
{"ts": "2026-07-29T09:16:04.468572+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 120500, "qty": 39, "cost": 4700205, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 111200, "target": 131300, "signals": [{"label": "손절선", "ok": true, "detail": "111,200 (현재 120,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 131,300"}, {"label": "추세(20일선)", "ok": true, "detail": "113,580"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +39 · 기 +307"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 120,492"}]}
{"ts": "2026-07-29T09:24:09.985527+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 18950, "qty": 270, "cost": 5117267, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 17760, "target": 21780, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 20,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,780"}, {"label": "추세(20일선)", "ok": true, "detail": "18,884"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +99 · 기 +138"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,418"}]}
{"ts": "2026-07-29T09:24:09.986194+09:00", "side": "SELL", "code": "010950", "name": "S-Oil", "price": 128600, "qty": 79, "proceeds": 10139589, "entry_price": 134571, "pnl": -493105, "pnl_pct": -4.44, "hold_from": "2026-07-09T09:10:01.828358+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "119,115 (현재 116,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 165,484"}, {"label": "추세(20일선)", "ok": true, "detail": "107,870"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +43 · 기 +245"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T09:24:09.986674+09:00", "side": "SELL", "code": "078930", "name": "GS", "price": 87700, "qty": 107, "proceeds": 9365601, "entry_price": 95486, "pnl": -852931, "pnl_pct": -8.15, "hold_from": "2026-07-24T09:26:01.010230+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "83,578 (현재 83,200)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 119,302"}, {"label": "추세(20일선)", "ok": true, "detail": "74,040"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -59 · 기 +284"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T09:28:01.386230+09:00", "side": "BUY", "code": "090850", "name": "현대이지웰", "price": 6390, "qty": 754, "cost": 4818783, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 5867, "target": 7435, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "6,380 vs 5,358"}, {"label": "정배열(5>20)", "ok": true, "detail": "5,742 / 5,358"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "5,742 / 5,622"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+43.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +73 · 기 -3 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.62% (환산) vs 평균 0.22% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 5,700"}, {"label": "거래량 급증", "ok": true, "detail": "134,413 (환산) vs 평균 49,512"}, {"label": "회전율 급증", "ok": true, "detail": "0.62% (환산) vs 평균 0.22%"}, {"label": "RSI", "ok": true, "detail": "73"}]}
{"ts": "2026-07-29T11:54:01.477218+09:00", "side": "SELL", "code": "086790", "name": "하나금융지주", "price": 120100, "qty": 39, "proceeds": 4674766, "entry_price": 133100, "pnl": -516912, "pnl_pct": -9.77, "hold_from": "2026-07-21T10:08:04.174962+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "120,243 (현재 120,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 158,813"}, {"label": "추세(20일선)", "ok": true, "detail": "118,250"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -13 · 기 -68"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 136,414"}]}
{"ts": "2026-07-29T13:06:06.518446+09:00", "side": "SELL", "code": "003680", "name": "한성기업", "price": 5690, "qty": 1351, "proceeds": 7672200, "entry_price": 6936, "pnl": -1700186, "pnl_pct": -17.97, "hold_from": "2026-07-28T09:00:16.264480+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,741 (현재 5,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 9,327"}, {"label": "추세(20일선)", "ok": true, "detail": "4,787"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +185 · 기 +0"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T13:34:03.591638+09:00", "side": "SELL", "code": "090850", "name": "현대이지웰", "price": 5860, "qty": 754, "proceeds": 4409824, "entry_price": 6390, "pnl": -408959, "pnl_pct": -8.29, "hold_from": "2026-07-29T09:28:01.386229+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,867 (현재 5,860)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 7,435"}, {"label": "추세(20일선)", "ok": true, "detail": "5,332"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +73 · 기 -3"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,525"}]}
{"ts": "2026-07-30T09:04:07.478237+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 121300, "qty": 38, "cost": 4610091, "path": "pullback", "reason": "눌림목 지정가 122,665 도달", "stop": 111000, "target": 141900, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "121,200 vs 118,305"}, {"label": "정배열(5>20)", "ok": true, "detail": "120,840 / 118,305"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "120,840 / 118,418"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+34.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -214 · 기 +182 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+36%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.18% (환산) vs 평균 0.37% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 130,700"}, {"label": "거래량 급증", "ok": false, "detail": "494,880 (환산) vs 평균 1,026,357"}, {"label": "회전율 급증", "ok": false, "detail": "0.18% (환산) vs 평균 0.37%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 122,665 (현재 121,200)"}]}
{"ts": "2026-07-30T09:04:07.479057+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6130, "qty": 563, "cost": 3451708, "path": "pullback", "reason": "눌림목 지정가 7,792 도달", "stop": 4793, "target": 8804, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "6,120 vs 4,808"}, {"label": "정배열(5>20)", "ok": true, "detail": "6,182 / 4,808"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,182 / 4,866"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+65.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +234 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "4.31% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "267,687 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "4.31% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,792 (현재 6,120)"}]}
{"ts": "2026-07-30T09:16:11.929896+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 125200, "qty": 37, "cost": 4633095, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 111000, "target": 141900, "signals": [{"label": "손절선", "ok": true, "detail": "111,000 (현재 125,400)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 141,900"}, {"label": "추세(20일선)", "ok": true, "detail": "118,515"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -214 · 기 +182"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 124,618"}]}
{"ts": "2026-07-30T09:16:11.930362+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 130900, "qty": 36, "cost": 4713107, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 116144, "target": 160413, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "130,900 vs 108,870"}, {"label": "정배열(5>20)", "ok": true, "detail": "115,360 / 108,870"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "115,360 / 113,212"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+49.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -6 · 기 +178 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+21%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.51% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 116,900"}, {"label": "거래량 급증", "ok": true, "detail": "571,193 (환산) vs 평균 359,705"}, {"label": "회전율 급증", "ok": true, "detail": "0.51% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "68"}]}
{"ts": "2026-07-30T09:18:10.166025+09:00", "side": "BUY", "code": "090850", "name": "현대이지웰", "price": 6310, "qty": 756, "cost": 4771076, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 5799, "target": 7332, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "6,300 vs 5,354"}, {"label": "정배열(5>20)", "ok": true, "detail": "5,726 / 5,354"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "5,726 / 5,621"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+46.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +87 · 기 +6 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.41% (환산) vs 평균 0.22% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 5,700"}, {"label": "거래량 급증", "ok": true, "detail": "87,813 (환산) vs 평균 49,512"}, {"label": "회전율 급증", "ok": true, "detail": "0.41% (환산) vs 평균 0.22%"}, {"label": "RSI", "ok": true, "detail": "72"}]}
{"ts": "2026-07-30T11:58:08.434750+09:00", "side": "SELL", "code": "161890", "name": "한국콜마", "price": 91700, "qty": 104, "proceeds": 9518203, "entry_price": 101112, "pnl": -999074, "pnl_pct": -9.31, "hold_from": "2026-07-22T09:04:01.820564+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "92,100 (현재 91,800)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 119,138"}, {"label": "추세(20일선)", "ok": false, "detail": "98,155"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -7 · 기 +40"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-30T12:04:07.828079+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 87900, "qty": 52, "cost": 4571486, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 76706, "target": 110287, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "87,900 vs 75,055"}, {"label": "정배열(5>20)", "ok": true, "detail": "82,940 / 75,055"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "82,940 / 75,053"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+61.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -49 · 기 +280 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+17%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.79% (환산) vs 평균 0.42% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 87,600"}, {"label": "거래량 급증", "ok": true, "detail": "728,608 (환산) vs 평균 392,182"}, {"label": "회전율 급증", "ok": true, "detail": "0.79% (환산) vs 평균 0.42%"}, {"label": "RSI", "ok": true, "detail": "67"}]}
{"ts": "2026-07-31T09:06:07.018008+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6550, "qty": 527, "cost": 3452368, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 4793, "target": 8804, "signals": [{"label": "손절선", "ok": true, "detail": "4,793 (현재 6,640)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 8,804"}, {"label": "추세(20일선)", "ok": true, "detail": "4,834"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +355 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,453"}]}
{"ts": "2026-07-31T09:08:08.215128+09:00", "side": "SELL", "code": "078930", "name": "GS", "price": 69600, "qty": 52, "proceeds": 3612143, "entry_price": 87900, "pnl": -959343, "pnl_pct": -20.82, "hold_from": "2026-07-30T12:04:07.828076+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "76,706 (현재 69,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 110,287"}, {"label": "추세(20일선)", "ok": false, "detail": "74,135"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -179 · 기 +325"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 91,095"}]}
{"ts": "2026-08-03T12:00:11.808649+09:00", "side": "BUY", "code": "194370", "name": "제이에스코퍼레이션", "price": 12910, "qty": 355, "cost": 4583737, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 11314, "target": 16103, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "12,930 vs 11,922"}, {"label": "정배열(5>20)", "ok": true, "detail": "12,138 / 11,922"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "12,138 / 11,924"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+27.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +7 · 기 +10 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+74%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.72% (환산) vs 평균 0.34% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 12,870"}, {"label": "거래량 급증", "ok": true, "detail": "208,994 (환산) vs 평균 99,303"}, {"label": "회전율 급증", "ok": true, "detail": "0.72% (환산) vs 평균 0.34%"}, {"label": "RSI", "ok": true, "detail": "63"}]}
{"ts": "2026-08-03T12:02:09.754781+09:00", "side": "BUY", "code": "194370", "name": "제이에스코퍼레이션", "price": 13420, "qty": 342, "cost": 4590328, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 11314, "target": 16103, "signals": [{"label": "손절선", "ok": true, "detail": "11,314 (현재 13,450)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 16,103"}, {"label": "추세(20일선)", "ok": true, "detail": "11,948"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +7 · 기 +10"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,339"}]}
{"ts": "2026-08-05T09:02:13.239905+09:00", "side": "SELL", "code": "090850", "name": "현대이지웰", "price": 5700, "qty": 756, "proceeds": 4300797, "entry_price": 6310, "pnl": -470278, "pnl_pct": -9.67, "hold_from": "2026-07-30T09:18:10.166021+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,799 (현재 5,730)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 7,332"}, {"label": "추세(20일선)", "ok": true, "detail": "5,326"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +14 · 기 -2"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,423"}]}
{"ts": "2026-08-05T09:02:13.240210+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 13040, "qty": 273, "cost": 3560454, "path": "pullback", "reason": "눌림목 지정가 13,947 도달", "stop": 10340, "target": 18440, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "13,040 vs 12,727"}, {"label": "정배열(5>20)", "ok": true, "detail": "14,356 / 12,727"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "14,356 / 13,267"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-6.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -72 · 기 +134 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.13% (환산) vs 평균 1.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 15,870"}, {"label": "거래량 급증", "ok": false, "detail": "78,333 (환산) vs 평균 882,736"}, {"label": "회전율 급증", "ok": false, "detail": "0.13% (환산) vs 평균 1.47%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 13,947 (현재 13,040)"}]}
{"ts": "2026-08-05T09:38:11.460384+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 13830, "qty": 257, "cost": 3554843, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 10340, "target": 18440, "signals": [{"label": "손절선", "ok": true, "detail": "10,340 (현재 13,860)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 18,440"}, {"label": "추세(20일선)", "ok": true, "detail": "12,768"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -72 · 기 +134"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,817"}]}
{"ts": "2026-08-06T09:00:19.244607+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18730, "qty": 538, "proceeds": 10057090, "entry_price": 19025, "pnl": -179745, "pnl_pct": -1.55, "hold_from": "2026-07-27T09:02:06.232736+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 18,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,554"}, {"label": "추세(20일선)", "ok": false, "detail": "18,842"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -203 · 기 -147"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-08-06T09:08:09.859487+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 136600, "qty": 20, "cost": 2732410, "path": "pullback", "reason": "눌림목 지정가 156,500 도달", "stop": 100700, "target": 208400, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "136,400 vs 135,235"}, {"label": "정배열(5>20)", "ok": true, "detail": "167,920 / 135,235"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "167,920 / 99,390"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+13.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -609 · 기 +419 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+44%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.58% (환산) vs 평균 3.06% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 202,500"}, {"label": "거래량 급증", "ok": false, "detail": "499,673 (환산) vs 평균 591,925"}, {"label": "회전율 급증", "ok": false, "detail": "2.58% (환산) vs 평균 3.06%"}, {"label": "RSI", "ok": true, "detail": "52"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 156,500 (현재 136,400)"}]}
{"ts": "2026-08-10T09:00:16.336294+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 136000, "qty": 35, "cost": 4760714, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 116144, "target": 160413, "signals": [{"label": "손절선", "ok": true, "detail": "116,144 (현재 137,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 160,413"}, {"label": "추세(20일선)", "ok": true, "detail": "109,175"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -253 · 기 +225"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 134,814"}]}
{"ts": "2026-08-10T13:04:16.298738+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 147100, "qty": 19, "cost": 2795319, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 100700, "target": 208400, "signals": [{"label": "손절선", "ok": true, "detail": "100,700 (현재 147,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 208,400"}, {"label": "추세(20일선)", "ok": true, "detail": "135,765"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -349 · 기 +177"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 146,939"}]}
@@ -0,0 +1,204 @@
{
"cash": 18766096.933500007,
"initial": 100000000,
"positions": {
"214450": {
"code": "214450",
"name": "파마리서치",
"sources": [
"auto"
],
"qty": 27,
"entry_price": 350037.037037037,
"entry_at": "2026-07-21T12:06:01.173991+09:00",
"stop": 318434,
"target": 413243,
"peak": 411500,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 409000,
"tranches": 2,
"tranche_value": 4947379.149752503,
"last_add_price": 356000
},
"138040": {
"code": "138040",
"name": "메리츠금융지주",
"sources": [
"auto"
],
"qty": 85,
"entry_price": 119184.70588235294,
"entry_at": "2026-07-29T09:02:02.235827+09:00",
"stop": 111408,
"target": 134739,
"peak": 127600,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 118,115 도달",
"cur_price": 123200,
"tranches": 2,
"tranche_value": 5120146.001656252,
"last_add_price": 120500
},
"086790": {
"code": "086790",
"name": "하나금융지주",
"sources": [
"auto"
],
"qty": 79,
"entry_price": 123225.3164556962,
"entry_at": "2026-07-30T09:04:07.484187+09:00",
"stop": 113272,
"target": 143132,
"peak": 134600,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 122,665 도달",
"cur_price": 130600,
"tranches": 2,
"tranche_value": 4929642.288776176,
"last_add_price": 125200
},
"003680": {
"code": "003680",
"name": "한성기업",
"sources": [
"auto"
],
"qty": 782,
"entry_price": 6333.017902813299,
"entry_at": "2026-07-30T09:04:07.484676+09:00",
"stop": 5363,
"target": 8274,
"peak": 6840,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 7,792 도달",
"cur_price": 6220,
"tranches": 2,
"tranche_value": 2477780.379475499,
"last_add_price": 6550
},
"194370": {
"code": "194370",
"name": "제이에스코퍼레이션",
"sources": [
"auto"
],
"qty": 652,
"entry_price": 13160.306748466257,
"entry_at": "2026-08-03T12:00:11.814094+09:00",
"stop": 11874,
"target": 15733,
"peak": 14120,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 13370,
"tranches": 2,
"tranche_value": 4296364.655919675,
"last_add_price": 13420
},
"095610": {
"code": "095610",
"name": "테스",
"sources": [
"auto"
],
"qty": 23,
"entry_price": 141495.65217391305,
"entry_at": "2026-08-04T09:04:09.467464+09:00",
"stop": 111689,
"target": 201110,
"peak": 148000,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 156,279 도달",
"cur_price": 143700,
"tranches": 2,
"tranche_value": 1735357.9457375815,
"last_add_price": 147600
},
"078930": {
"code": "078930",
"name": "GS",
"sources": [
"auto"
],
"qty": 94,
"entry_price": 91917.02127659574,
"entry_at": "2026-08-04T09:48:09.782722+09:00",
"stop": 83393,
"target": 108965,
"peak": 101600,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 97700,
"tranches": 2,
"tranche_value": 4361392.052247569,
"last_add_price": 93500
},
"252990": {
"code": "252990",
"name": "샘씨엔에스",
"sources": [
"auto"
],
"qty": 336,
"entry_price": 13777.32142857143,
"entry_at": "2026-08-06T09:00:19.347937+09:00",
"stop": 11540,
"target": 18252,
"peak": 15670,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 13,975 도달",
"cur_price": 15670,
"tranches": 2,
"tranche_value": 2326313.326987872,
"last_add_price": 14290
}
},
"realized_pnl": -21851777.083500035,
"closed_trades": 49,
"wins": 4,
"peak_equity": 101291892.54300004,
"max_drawdown": 0.2315722523502305,
"last_exit": {
"086790": "2026-07-28",
"030000": "2026-08-06",
"005930": "2026-06-23",
"403870": "2026-07-02",
"095610": "2026-07-28",
"003490": "2026-07-07",
"093370": "2026-07-20",
"240810": "2026-07-23",
"009150": "2026-07-06",
"034730": "2026-07-08",
"214450": "2026-07-06",
"055550": "2026-07-20",
"319660": "2026-07-23",
"105560": "2026-07-20",
"024060": "2026-07-27",
"252990": "2026-07-28",
"078930": "2026-07-31",
"010950": "2026-08-03",
"090850": "2026-08-04",
"003680": "2026-07-29",
"161890": "2026-07-30"
},
"created_at": "2026-06-15T14:55:00.582834+09:00",
"updated_at": "2026-08-10T15:28:14.952220+09:00"
}
@@ -0,0 +1,139 @@
{"ts": "2026-06-17T11:15:02.370121+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 130900, "qty": 47, "cost": 6153223, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 121254, "target": 150191, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "129,300 vs 118,195"}, {"label": "정배열(5>20)", "ok": true, "detail": "120,400 / 118,195"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "120,400 / 118,307"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-13.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +371 · 기 +158 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+22%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.12% (환산) vs 평균 0.38% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 126,500"}, {"label": "거래량 급증", "ok": true, "detail": "3,094,534 (환산) vs 평균 1,031,725"}, {"label": "회전율 급증", "ok": true, "detail": "1.12% (환산) vs 평균 0.38%"}, {"label": "RSI", "ok": true, "detail": "60"}]}
{"ts": "2026-06-17T16:47:31.091519+09:00", "side": "BUY", "code": "403870", "name": "HPSP", "price": 62900, "qty": 47, "cost": 2956743, "path": "pullback", "reason": "눌림목 지정가 64,531 도달", "stop": 52447, "target": 83807, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "62,800 vs 52,858"}, {"label": "정배열(5>20)", "ok": true, "detail": "59,880 / 52,858"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "59,880 / 49,831"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+21.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -4,434 · 기 +5,040 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+9%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "11.31% vs 평균 5.97% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 71,500"}, {"label": "거래량 급증", "ok": true, "detail": "9,309,211 vs 평균 4,912,598"}, {"label": "회전율 급증", "ok": true, "detail": "11.31% vs 평균 5.97%"}, {"label": "RSI", "ok": true, "detail": "58"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 64,531 (현재 62,800)"}]}
{"ts": "2026-06-19T09:02:06.416305+09:00", "side": "BUY", "code": "005930", "name": "삼성전자", "price": 373500, "qty": 15, "cost": 5603340, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 341819, "target": 436861, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "373,000 vs 325,400"}, {"label": "정배열(5>20)", "ok": true, "detail": "352,400 / 325,400"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "352,400 / 258,005"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+6.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,427 · 기 +4,448 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+19%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.04% (환산) vs 평균 0.53% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 370,000"}, {"label": "거래량 급증", "ok": true, "detail": "60,950,213 (환산) vs 평균 31,088,390"}, {"label": "회전율 급증", "ok": true, "detail": "1.04% (환산) vs 평균 0.53%"}, {"label": "RSI", "ok": true, "detail": "67"}]}
{"ts": "2026-06-19T09:02:06.416697+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19160, "qty": 325, "cost": 6227934, "path": "pullback", "reason": "눌림목 지정가 20,044 도달", "stop": 18100, "target": 21279, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "19,150 vs 18,862"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,616 / 18,862"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,616 / 19,361"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-31.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,162 · 기 +2,080 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.03% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "37,673 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.03% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 20,044 (현재 19,150)"}]}
{"ts": "2026-06-19T13:32:02.859717+09:00", "side": "SELL", "code": "086790", "name": "하나금융지주", "price": 121100, "qty": 47, "proceeds": 5680601, "entry_price": 130900, "pnl": -472622, "pnl_pct": -7.49, "hold_from": "2026-06-17T11:15:02.370120+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "121,254 (현재 121,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 150,191"}, {"label": "추세(20일선)", "ok": true, "detail": "118,300"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +531 · 기 -129"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 134,178"}]}
{"ts": "2026-06-23T09:00:11.312560+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18820, "qty": 325, "proceeds": 6104573, "entry_price": 19160, "pnl": -123361, "pnl_pct": -1.77, "hold_from": "2026-06-19T09:02:06.416696+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "18,100 (현재 18,710)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,279"}, {"label": "추세(20일선)", "ok": false, "detail": "18,840"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -318 · 기 -227"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,528"}]}
{"ts": "2026-06-23T09:04:35.888866+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 121000, "qty": 49, "cost": 5929889, "path": "pullback", "reason": "눌림목 지정가 122,636 도달", "stop": 111004, "target": 140992, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "121,200 vs 118,305"}, {"label": "정배열(5>20)", "ok": true, "detail": "120,840 / 118,305"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "120,840 / 118,418"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-14.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +310 · 기 -361 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+30%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.12% (환산) vs 평균 0.37% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 130,700"}, {"label": "거래량 급증", "ok": false, "detail": "324,680 (환산) vs 평균 1,026,357"}, {"label": "회전율 급증", "ok": false, "detail": "0.12% (환산) vs 평균 0.37%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 122,636 (현재 121,200)"}]}
{"ts": "2026-06-23T09:26:03.173057+09:00", "side": "SELL", "code": "005930", "name": "삼성전자", "price": 339500, "qty": 15, "proceeds": 5082570, "entry_price": 373500, "pnl": -520771, "pnl_pct": -9.1, "hold_from": "2026-06-19T09:02:06.416304+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "341,819 (현재 340,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 436,861"}, {"label": "추세(20일선)", "ok": true, "detail": "329,525"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -3,330 · 기 +1,369"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 384,493"}]}
{"ts": "2026-06-24T09:04:06.126905+09:00", "side": "SELL", "code": "403870", "name": "HPSP", "price": 52300, "qty": 47, "proceeds": 2453307, "entry_price": 62900, "pnl": -503437, "pnl_pct": -16.85, "hold_from": "2026-06-17T16:47:31.091510+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "52,447 (현재 52,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 83,807"}, {"label": "추세(20일선)", "ok": false, "detail": "52,332"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +711 · 기 -2,060"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 66,717"}]}
{"ts": "2026-06-24T09:04:06.127006+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 156700, "qty": 17, "cost": 2664300, "path": "pullback", "reason": "눌림목 지정가 165,075 도달", "stop": 129363, "target": 211374, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "156,200 vs 121,650"}, {"label": "정배열(5>20)", "ok": true, "detail": "143,260 / 121,650"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "143,260 / 121,703"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+46.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +210 · 기 +143 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+6%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "5.83% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": true, "detail": "2,860,073 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": true, "detail": "5.83% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 165,075 (현재 156,200)"}]}
{"ts": "2026-06-24T09:12:05.360263+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 17270, "qty": 198, "cost": 3419973, "path": "pullback", "reason": "눌림목 지정가 17,366 도달", "stop": 14804, "target": 22203, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "17,280 vs 12,914"}, {"label": "정배열(5>20)", "ok": true, "detail": "16,364 / 12,914"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "16,364 / 11,500"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+21.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +1,740 · 기 -508 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+16%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.34% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": false, "detail": "2,509,340 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": false, "detail": "2.34% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "65"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 17,366 (현재 17,280)"}]}
{"ts": "2026-06-24T09:46:04.790839+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 158200, "qty": 17, "cost": 2689803, "path": "pullback", "reason": "눌림목 지정가 158,264 도달", "stop": 130097, "target": 214407, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "158,000 vs 136,315"}, {"label": "정배열(5>20)", "ok": true, "detail": "172,240 / 136,315"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "172,240 / 99,750"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+56.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +41 · 기 +65 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+5%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "4.25% (환산) vs 평균 3.06% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 202,500"}, {"label": "거래량 급증", "ok": true, "detail": "822,940 (환산) vs 평균 591,925"}, {"label": "회전율 급증", "ok": false, "detail": "4.25% (환산) vs 평균 3.06%"}, {"label": "RSI", "ok": true, "detail": "61"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 158,264 (현재 158,000)"}]}
{"ts": "2026-06-24T11:12:05.909226+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 18260, "qty": 187, "cost": 3415132, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 14804, "target": 22203, "signals": [{"label": "손절선", "ok": true, "detail": "14,804 (현재 18,250)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,203"}, {"label": "추세(20일선)", "ok": true, "detail": "12,962"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +1,742 · 기 -508"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 18,094"}]}
{"ts": "2026-06-25T09:00:25.960256+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 179100, "qty": 15, "cost": 2686903, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 130097, "target": 214407, "signals": [{"label": "손절선", "ok": true, "detail": "130,097 (현재 178,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 214,407"}, {"label": "추세(20일선)", "ok": true, "detail": "137,330"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -56 · 기 +134"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 167,275"}]}
{"ts": "2026-06-25T09:02:04.081932+09:00", "side": "BUY", "code": "403870", "name": "HPSP", "price": 53200, "qty": 49, "cost": 2607191, "path": "pullback", "reason": "눌림목 지정가 63,881 도달", "stop": 43200, "target": 73200, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "53,300 vs 52,382"}, {"label": "정배열(5>20)", "ok": true, "detail": "57,980 / 52,382"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "57,980 / 49,672"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+15.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +406 · 기 -1,461 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+29%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.21% (환산) vs 평균 5.97% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 71,500"}, {"label": "거래량 급증", "ok": false, "detail": "1,819,047 (환산) vs 평균 4,912,598"}, {"label": "회전율 급증", "ok": false, "detail": "2.21% (환산) vs 평균 5.97%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 63,881 (현재 53,300)"}]}
{"ts": "2026-06-25T09:04:05.753481+09:00", "side": "BUY", "code": "003490", "name": "대한항공", "price": 28900, "qty": 214, "cost": 6185528, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 26911, "target": 32878, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "28,850 vs 25,948"}, {"label": "정배열(5>20)", "ok": true, "detail": "26,110 / 25,948"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "26,110 / 25,216"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-2.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +1,577 · 기 -7 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.9/5"}, {"label": "상승여력", "ok": true, "detail": "+15%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.54% (환산) vs 평균 0.58% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 28,400"}, {"label": "거래량 급증", "ok": true, "detail": "5,629,873 (환산) vs 평균 2,146,231"}, {"label": "회전율 급증", "ok": true, "detail": "1.54% (환산) vs 평균 0.58%"}, {"label": "RSI", "ok": true, "detail": "64"}]}
{"ts": "2026-06-26T09:00:07.932477+09:00", "side": "SELL", "code": "403870", "name": "HPSP", "price": 50000, "qty": 49, "proceeds": 2445222, "entry_price": 53200, "pnl": -161969, "pnl_pct": -6.02, "hold_from": "2026-06-25T09:02:04.081930+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "43,200 (현재 51,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 73,200"}, {"label": "추세(20일선)", "ok": false, "detail": "52,268"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -311 · 기 -267"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 57,056"}]}
{"ts": "2026-06-26T10:06:05.272373+09:00", "side": "SELL", "code": "086790", "name": "하나금융지주", "price": 110600, "qty": 49, "proceeds": 5408832, "entry_price": 121000, "pnl": -521057, "pnl_pct": -8.6, "hold_from": "2026-06-23T09:04:35.888864+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "111,004 (현재 110,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 140,992"}, {"label": "추세(20일선)", "ok": false, "detail": "117,780"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +34 · 기 -271"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 124,653"}]}
{"ts": "2026-06-26T10:14:04.070691+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 166900, "qty": 16, "cost": 2670801, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 129363, "target": 211374, "signals": [{"label": "손절선", "ok": true, "detail": "129,363 (현재 166,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 211,374"}, {"label": "추세(20일선)", "ok": true, "detail": "122,175"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -126 · 기 +320"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 165,659"}]}
{"ts": "2026-06-29T11:36:01.274496+09:00", "side": "BUY", "code": "034730", "name": "SK", "price": 745000, "qty": 4, "cost": 2980447, "path": "pullback", "reason": "눌림목 지정가 748,914 도달", "stop": 645871, "target": 943257, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "744,000 vs 676,650"}, {"label": "정배열(5>20)", "ok": true, "detail": "766,800 / 676,650"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "766,800 / 530,600"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+12.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -194 · 기 +152 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+8%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.35% (환산) vs 평균 0.45% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 883,000"}, {"label": "거래량 급증", "ok": true, "detail": "977,966 (환산) vs 평균 329,863"}, {"label": "회전율 급증", "ok": true, "detail": "1.35% (환산) vs 평균 0.45%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 748,914 (현재 744,000)"}]}
{"ts": "2026-06-29T14:18:01.495030+09:00", "side": "BUY", "code": "034730", "name": "SK", "price": 778000, "qty": 4, "cost": 3112467, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 645871, "target": 943257, "signals": [{"label": "손절선", "ok": true, "detail": "645,871 (현재 779,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 943,257"}, {"label": "추세(20일선)", "ok": true, "detail": "678,400"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -200 · 기 +143"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 778,043"}]}
{"ts": "2026-06-30T09:00:08.974331+09:00", "side": "BUY", "code": "403870", "name": "HPSP", "price": 55300, "qty": 43, "cost": 2378257, "path": "pullback", "reason": "눌림목 지정가 63,981 도달", "stop": 44022, "target": 77857, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "53,700 vs 52,402"}, {"label": "정배열(5>20)", "ok": true, "detail": "58,060 / 52,402"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "58,060 / 49,679"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+12.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +222 · 기 -821 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+28%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.00% (환산) vs 평균 5.97% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 71,500"}, {"label": "거래량 급증", "ok": false, "detail": "827 (환산) vs 평균 4,912,598"}, {"label": "회전율 급증", "ok": false, "detail": "0.00% (환산) vs 평균 5.97%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 63,981 (현재 53,700)"}]}
{"ts": "2026-06-30T09:02:03.196119+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 347500, "qty": 15, "cost": 5213282, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 316272, "target": 409956, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "347,000 vs 296,475"}, {"label": "정배열(5>20)", "ok": true, "detail": "315,600 / 296,475"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "315,600 / 305,533"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+29.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -19 · 기 +146 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+39%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.55% (환산) vs 평균 0.93% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 334,500"}, {"label": "거래량 급증", "ok": true, "detail": "160,800 (환산) vs 평균 96,436"}, {"label": "회전율 급증", "ok": true, "detail": "1.55% (환산) vs 평균 0.93%"}, {"label": "RSI", "ok": true, "detail": "66"}]}
{"ts": "2026-06-30T09:06:03.688864+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 360000, "qty": 15, "cost": 5400810, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 316272, "target": 409956, "signals": [{"label": "손절선", "ok": true, "detail": "316,272 (현재 360,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 409,956"}, {"label": "추세(20일선)", "ok": true, "detail": "297,125"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -19 · 기 +146"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 358,070"}]}
{"ts": "2026-07-01T09:46:03.088455+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 118200, "qty": 53, "cost": 6265540, "path": "pullback", "reason": "눌림목 지정가 122,286 도달", "stop": 111000, "target": 132600, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "118,200 vs 118,155"}, {"label": "정배열(5>20)", "ok": true, "detail": "120,240 / 118,155"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "120,240 / 118,368"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+3.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +55 · 기 -166 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.35% (환산) vs 평균 0.37% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 130,700"}, {"label": "거래량 급증", "ok": false, "detail": "969,420 (환산) vs 평균 1,026,357"}, {"label": "회전율 급증", "ok": false, "detail": "0.35% (환산) vs 평균 0.37%"}, {"label": "RSI", "ok": true, "detail": "49"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 122,286 (현재 118,200)"}]}
{"ts": "2026-07-01T11:06:02.362779+09:00", "side": "SELL", "code": "095610", "name": "테스", "price": 212000, "qty": 32, "proceeds": 6770771, "entry_price": 167997, "pnl": 1394065, "pnl_pct": 26.19, "hold_from": "2026-06-24T09:46:04.790837+09:00", "reason": "트레일링 익절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "213,193 (현재 213,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "139,065"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -229 · 기 +300"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-02T09:08:01.925087+09:00", "side": "SELL", "code": "003490", "name": "대한항공", "price": 26900, "qty": 214, "proceeds": 5745375, "entry_price": 28900, "pnl": -440153, "pnl_pct": -6.92, "hold_from": "2026-06-25T09:04:05.753479+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "26,911 (현재 26,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 32,878"}, {"label": "추세(20일선)", "ok": true, "detail": "25,850"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -249 · 기 +991"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 29,517"}]}
{"ts": "2026-07-02T10:18:03.848986+09:00", "side": "BUY", "code": "009150", "name": "삼성전기", "price": 1985000, "qty": 3, "cost": 5955893, "path": "pullback", "reason": "눌림목 지정가 1,994,011 도달", "stop": 1901000, "target": 2153000, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "1,982,000 vs 1,967,800"}, {"label": "정배열(5>20)", "ok": true, "detail": "2,038,800 / 1,967,800"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "2,038,800 / 1,295,483"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+17.7%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +337 · 기 +193 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+6%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "4.19% (환산) vs 평균 1.76% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 2,417,000"}, {"label": "거래량 급증", "ok": true, "detail": "3,133,469 (환산) vs 평균 1,312,239"}, {"label": "회전율 급증", "ok": true, "detail": "4.19% (환산) vs 평균 1.76%"}, {"label": "RSI", "ok": true, "detail": "56"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 1,994,011 (현재 1,982,000)"}]}
{"ts": "2026-07-02T10:18:03.849511+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 122200, "qty": 51, "cost": 6233135, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 111000, "target": 132600, "signals": [{"label": "손절선", "ok": true, "detail": "111,000 (현재 122,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 132,600"}, {"label": "추세(20일선)", "ok": true, "detail": "118,345"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +22 · 기 -44"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 121,743"}]}
{"ts": "2026-07-02T10:34:04.127790+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 18860, "qty": 323, "cost": 6092694, "path": "pullback", "reason": "눌림목 지정가 19,970 도달", "stop": 17760, "target": 21060, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "18,860 vs 18,848"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,558 / 18,848"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,558 / 19,356"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+3.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -339 · 기 +110 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+35%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.80% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "924,985 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.80% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "48"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,970 (현재 18,860)"}]}
{"ts": "2026-07-02T11:20:02.063884+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 22550, "qty": 270, "cost": 6089413, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 17760, "target": 21060, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 19,350)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,060"}, {"label": "추세(20일선)", "ok": true, "detail": "18,872"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -339 · 기 +110"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,250"}]}
{"ts": "2026-07-02T11:22:01.973024+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 19000, "qty": 593, "proceeds": 11245029, "entry_price": 20540, "pnl": -937078, "pnl_pct": -7.5, "hold_from": "2026-07-02T10:34:04.127788+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "19,370 (현재 19,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,880"}, {"label": "추세(20일선)", "ok": true, "detail": "18,860"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -339 · 기 +110"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-02T12:42:02.228705+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 15250, "qty": 385, "proceeds": 5859801, "entry_price": 17751, "pnl": -975304, "pnl_pct": -14.09, "hold_from": "2026-06-24T09:12:05.360261+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "15,280 (현재 15,280)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,692"}, {"label": "추세(20일선)", "ok": true, "detail": "12,814"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -1,920 · 기 +434"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-02T14:28:02.067492+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 134800, "qty": 33, "proceeds": 4439726, "entry_price": 161645, "pnl": -895375, "pnl_pct": -16.61, "hold_from": "2026-06-24T09:04:06.127005+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "134,769 (현재 134,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 215,398"}, {"label": "추세(20일선)", "ok": true, "detail": "120,575"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +395 · 기 -1,516"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-02T15:04:06.193807+09:00", "side": "SELL", "code": "403870", "name": "HPSP", "price": 43900, "qty": 43, "proceeds": 1884019, "entry_price": 55300, "pnl": -494238, "pnl_pct": -20.61, "hold_from": "2026-06-30T09:00:08.974321+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "44,022 (현재 43,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 77,857"}, {"label": "추세(20일선)", "ok": false, "detail": "51,912"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +2,379 · 기 -6,625"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 59,411"}]}
{"ts": "2026-07-03T09:00:11.710324+09:00", "side": "SELL", "code": "009150", "name": "삼성전기", "price": 1895000, "qty": 3, "proceeds": 5673914, "entry_price": 1985000, "pnl": -281979, "pnl_pct": -4.53, "hold_from": "2026-07-02T10:18:03.848984+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "1,901,000 (현재 1,894,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 2,153,000"}, {"label": "추세(20일선)", "ok": false, "detail": "1,963,400"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +132 · 기 +129"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 2,084,495"}]}
{"ts": "2026-07-03T09:02:04.930160+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 133400, "qty": 16, "cost": 2134720, "path": "pullback", "reason": "눌림목 지정가 163,875 도달", "stop": 104263, "target": 191674, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "133,300 vs 120,505"}, {"label": "정배열(5>20)", "ok": true, "detail": "138,680 / 120,505"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "138,680 / 121,322"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+18.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +674 · 기 -2,170 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+31%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.16% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": false, "detail": "571,607 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": false, "detail": "1.16% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "52"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 163,875 (현재 133,300)"}]}
{"ts": "2026-07-03T09:02:04.930278+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 14660, "qty": 172, "cost": 2521898, "path": "pullback", "reason": "눌림목 지정가 17,179 도달", "stop": 11914, "target": 20152, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "14,680 vs 12,784"}, {"label": "정배열(5>20)", "ok": true, "detail": "15,844 / 12,784"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "15,844 / 11,456"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+12.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,591 · 기 +253 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+36%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.92% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": false, "detail": "991,593 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": false, "detail": "0.92% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "55"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 17,179 (현재 14,680)"}]}
{"ts": "2026-07-03T09:10:03.679429+09:00", "side": "SELL", "code": "034730", "name": "SK", "price": 656000, "qty": 8, "proceeds": 5237766, "entry_price": 761500, "pnl": -855147, "pnl_pct": -13.85, "hold_from": "2026-06-29T11:36:01.274495+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "662,371 (현재 657,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 959,757"}, {"label": "추세(20일선)", "ok": false, "detail": "672,300"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -51 · 기 +3"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-03T10:24:02.780679+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19040, "qty": 309, "cost": 5884243, "path": "pullback", "reason": "눌림목 지정가 20,004 도달", "stop": 17921, "target": 21277, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "19,030 vs 18,856"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,592 / 18,856"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,592 / 19,359"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+2.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -35 · 기 +168 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+34%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.54% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "619,193 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.54% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "49"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 20,004 (현재 19,030)"}]}
{"ts": "2026-07-03T12:00:02.655618+09:00", "side": "BUY", "code": "003490", "name": "대한항공", "price": 28800, "qty": 204, "cost": 5876081, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 26795, "target": 32810, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "28,750 vs 25,942"}, {"label": "정배열(5>20)", "ok": true, "detail": "26,090 / 25,942"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "26,090 / 25,214"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+8.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +55 · 기 +1,952 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.9/5"}, {"label": "상승여력", "ok": true, "detail": "+20%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.38% (환산) vs 평균 0.58% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 28,400"}, {"label": "거래량 급증", "ok": true, "detail": "5,054,442 (환산) vs 평균 2,146,231"}, {"label": "회전율 급증", "ok": true, "detail": "1.38% (환산) vs 평균 0.58%"}, {"label": "RSI", "ok": true, "detail": "64"}]}
{"ts": "2026-07-06T09:00:10.612644+09:00", "side": "BUY", "code": "009150", "name": "삼성전기", "price": 1993000, "qty": 2, "cost": 3986598, "path": "pullback", "reason": "눌림목 지정가 1,995,439 도달", "stop": 1901000, "target": 2177000, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "1,975,000 vs 1,967,450"}, {"label": "정배열(5>20)", "ok": true, "detail": "2,037,400 / 1,967,450"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "2,037,400 / 1,295,367"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+9.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +151 · 기 +57 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+9%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.82% (환산) vs 평균 1.76% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 2,417,000"}, {"label": "거래량 급증", "ok": false, "detail": "615,080 (환산) vs 평균 1,312,239"}, {"label": "회전율 급증", "ok": false, "detail": "0.82% (환산) vs 평균 1.76%"}, {"label": "RSI", "ok": true, "detail": "55"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 1,995,439 (현재 1,975,000)"}]}
{"ts": "2026-07-06T09:00:10.615930+09:00", "side": "BUY", "code": "034730", "name": "SK", "price": 690000, "qty": 5, "cost": 3450518, "path": "pullback", "reason": "눌림목 지정가 747,129 도달", "stop": 604000, "target": 862000, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "695,000 vs 674,200"}, {"label": "정배열(5>20)", "ok": true, "detail": "757,000 / 674,200"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "757,000 / 529,783"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+3.7%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -81 · 기 +57 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+21%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.17% (환산) vs 평균 0.45% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 883,000"}, {"label": "거래량 급증", "ok": false, "detail": "124,240 (환산) vs 평균 329,863"}, {"label": "회전율 급증", "ok": false, "detail": "0.17% (환산) vs 평균 0.45%"}, {"label": "RSI", "ok": true, "detail": "54"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 747,129 (현재 695,000)"}]}
{"ts": "2026-07-06T09:18:01.676321+09:00", "side": "BUY", "code": "003490", "name": "대한항공", "price": 29500, "qty": 199, "cost": 5871381, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 26795, "target": 32810, "signals": [{"label": "손절선", "ok": true, "detail": "26,795 (현재 29,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 32,810"}, {"label": "추세(20일선)", "ok": true, "detail": "25,980"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -142 · 기 +2,052"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 29,483"}]}
{"ts": "2026-07-06T09:32:06.685583+09:00", "side": "SELL", "code": "214450", "name": "파마리서치", "price": 322000, "qty": 30, "proceeds": 9641163, "entry_price": 353750, "pnl": -972929, "pnl_pct": -8.98, "hold_from": "2026-06-30T09:02:03.196117+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "322,040 (현재 322,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 417,170"}, {"label": "추세(20일선)", "ok": true, "detail": "295,225"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -111 · 기 +227"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-06T09:34:02.069889+09:00", "side": "BUY", "code": "055550", "name": "신한지주", "price": 110000, "qty": 53, "cost": 5830875, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 101901, "target": 126197, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "110,300 vs 97,320"}, {"label": "정배열(5>20)", "ok": true, "detail": "101,240 / 97,320"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "101,240 / 96,630"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+3.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -717 · 기 +1,343 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+17%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.55% (환산) vs 평균 0.35% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 109,800"}, {"label": "거래량 급증", "ok": true, "detail": "2,617,853 (환산) vs 평균 1,653,581"}, {"label": "회전율 급증", "ok": true, "detail": "0.55% (환산) vs 평균 0.35%"}, {"label": "RSI", "ok": true, "detail": "64"}]}
{"ts": "2026-07-06T10:06:02.783059+09:00", "side": "SELL", "code": "009150", "name": "삼성전기", "price": 1900000, "qty": 2, "proceeds": 3792590, "entry_price": 1993000, "pnl": -194008, "pnl_pct": -4.67, "hold_from": "2026-07-06T09:00:10.612637+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "1,901,000 (현재 1,901,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 2,177,000"}, {"label": "추세(20일선)", "ok": false, "detail": "1,963,750"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +135 · 기 +46"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 2,089,780"}]}
{"ts": "2026-07-07T09:12:07.274613+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 155900, "qty": 16, "cost": 2494774, "path": "pullback", "reason": "눌림목 지정가 158,314 도달", "stop": 127872, "target": 211957, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "155,800 vs 136,205"}, {"label": "정배열(5>20)", "ok": true, "detail": "171,800 / 136,205"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "171,800 / 99,713"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+43.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +80 · 기 -197 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+14%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "3.33% (환산) vs 평균 3.06% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 202,500"}, {"label": "거래량 급증", "ok": false, "detail": "645,567 (환산) vs 평균 591,925"}, {"label": "회전율 급증", "ok": false, "detail": "3.33% (환산) vs 평균 3.06%"}, {"label": "RSI", "ok": true, "detail": "60"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 158,314 (현재 155,800)"}]}
{"ts": "2026-07-07T12:02:08.239582+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 12230, "qty": 172, "proceeds": 2099458, "entry_price": 14660, "pnl": -422440, "pnl_pct": -16.58, "hold_from": "2026-07-03T09:02:04.930276+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "11,914 (현재 12,230)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 20,152"}, {"label": "추세(20일선)", "ok": false, "detail": "12,661"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -1,558 · 기 -4"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 15,662"}]}
{"ts": "2026-07-07T14:08:59.775629+09:00", "side": "SELL", "code": "003490", "name": "대한항공", "price": 26600, "qty": 403, "proceeds": 10698896, "entry_price": 29146, "pnl": -1048565, "pnl_pct": -8.73, "hold_from": "2026-07-03T12:00:02.655615+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "27,098 (현재 26,600)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 33,241"}, {"label": "추세(20일선)", "ok": true, "detail": "25,870"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -532 · 기 +3,040"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-07T14:09:02.333014+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 183300, "qty": 11, "cost": 2016602, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 104263, "target": 191674, "signals": [{"label": "손절선", "ok": true, "detail": "104,263 (현재 183,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 191,674"}, {"label": "추세(20일선)", "ok": true, "detail": "120,210"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +263 · 기 -1,543"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 141,825"}]}
{"ts": "2026-07-07T14:09:02.334098+09:00", "side": "SELL", "code": "055550", "name": "신한지주", "price": 99600, "qty": 53, "proceeds": 5268506, "entry_price": 110000, "pnl": -562368, "pnl_pct": -9.45, "hold_from": "2026-07-06T09:34:02.069888+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "101,901 (현재 99,600)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 126,197"}, {"label": "추세(20일선)", "ok": true, "detail": "96,645"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -733 · 기 +1,535"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 112,480"}]}
{"ts": "2026-07-07T14:09:02.334527+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 177000, "qty": 14, "cost": 2478372, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 127872, "target": 211957, "signals": [{"label": "손절선", "ok": true, "detail": "127,872 (현재 177,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 211,957"}, {"label": "추세(20일선)", "ok": true, "detail": "134,320"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +152 · 기 -281"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 165,142"}]}
{"ts": "2026-07-07T14:09:05.070494+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 20750, "qty": 284, "cost": 5893884, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 17921, "target": 21277, "signals": [{"label": "손절선", "ok": true, "detail": "17,921 (현재 20,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,277"}, {"label": "추세(20일선)", "ok": true, "detail": "18,884"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +156 · 기 +113"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,358"}]}
{"ts": "2026-07-07T14:09:05.071322+09:00", "side": "BUY", "code": "034730", "name": "SK", "price": 815000, "qty": 4, "cost": 3260489, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 604000, "target": 862000, "signals": [{"label": "손절선", "ok": true, "detail": "604,000 (현재 815,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 862,000"}, {"label": "추세(20일선)", "ok": true, "detail": "673,250"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -44 · 기 +3"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 721,777"}]}
{"ts": "2026-07-08T09:00:18.539196+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 108300, "qty": 27, "proceeds": 2918398, "entry_price": 153730, "pnl": -1232925, "pnl_pct": -29.55, "hold_from": "2026-07-03T09:02:04.930159+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "128,455 (현재 112,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 204,279"}, {"label": "추세(20일선)", "ok": false, "detail": "119,475"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +243 · 기 -857"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-08T09:00:18.540319+09:00", "side": "SELL", "code": "095610", "name": "테스", "price": 137900, "qty": 30, "proceeds": 4128933, "entry_price": 165747, "pnl": -844213, "pnl_pct": -16.8, "hold_from": "2026-07-07T09:12:07.274612+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "138,020 (현재 137,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 221,200"}, {"label": "추세(20일선)", "ok": true, "detail": "135,310"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +458 · 기 -572"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-08T09:00:18.540951+09:00", "side": "SELL", "code": "034730", "name": "SK", "price": 602000, "qty": 9, "proceeds": 5407435, "entry_price": 745556, "pnl": -1303572, "pnl_pct": -19.25, "hold_from": "2026-07-06T09:00:10.615923+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "650,225 (현재 602,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 936,217"}, {"label": "추세(20일선)", "ok": false, "detail": "669,550"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +49 · 기 -19"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-08T09:12:05.971902+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18900, "qty": 593, "proceeds": 11185845, "entry_price": 19859, "pnl": -592281, "pnl_pct": -4.83, "hold_from": "2026-07-03T10:24:02.780678+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "18,905 (현재 18,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,767"}, {"label": "추세(20일선)", "ok": true, "detail": "18,850"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +193 · 기 +193"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-08T09:48:01.877778+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 161100, "qty": 34, "cost": 5478222, "path": "pullback", "reason": "눌림목 지정가 168,676 도달", "stop": 158000, "target": 167300, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "161,600 vs 149,870"}, {"label": "정배열(5>20)", "ok": true, "detail": "169,960 / 149,870"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "169,960 / 113,252"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+77.7%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +198 · 기 -309 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+11%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "3.83% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": true, "detail": "1,110,233 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": false, "detail": "3.83% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "56"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 168,676 (현재 161,600)"}]}
{"ts": "2026-07-08T10:26:01.972671+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 157600, "qty": 34, "proceeds": 5347951, "entry_price": 161100, "pnl": -130270, "pnl_pct": -2.17, "hold_from": "2026-07-08T09:48:01.877777+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "158,000 (현재 158,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 167,300"}, {"label": "추세(20일선)", "ok": true, "detail": "149,690"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +198 · 기 -312"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 170,862"}]}
{"ts": "2026-07-09T09:02:04.468926+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 144400, "qty": 14, "cost": 2021903, "path": "pullback", "reason": "눌림목 지정가 156,479 도달", "stop": 113618, "target": 205964, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "144,400 vs 135,635"}, {"label": "정배열(5>20)", "ok": true, "detail": "169,520 / 135,635"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "169,520 / 99,523"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+42.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +503 · 기 -501 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+23%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.94% (환산) vs 평균 3.06% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 202,500"}, {"label": "거래량 급증", "ok": false, "detail": "569,187 (환산) vs 평균 591,925"}, {"label": "회전율 급증", "ok": false, "detail": "2.94% (환산) vs 평균 3.06%"}, {"label": "RSI", "ok": true, "detail": "55"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 156,479 (현재 144,400)"}]}
{"ts": "2026-07-09T09:02:04.469080+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19110, "qty": 284, "cost": 5428054, "path": "pullback", "reason": "눌림목 지정가 20,021 도달", "stop": 18017, "target": 21296, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "19,070 vs 18,858"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,600 / 18,858"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,600 / 19,360"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+0.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -10 · 기 +164 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.08% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "93,540 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.08% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 20,021 (현재 19,070)"}]}
{"ts": "2026-07-09T09:02:04.469208+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 158300, "qty": 34, "cost": 5383007, "path": "pullback", "reason": "눌림목 지정가 168,455 도달", "stop": 158000, "target": 158900, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "158,200 vs 149,700"}, {"label": "정배열(5>20)", "ok": true, "detail": "169,280 / 149,700"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "169,280 / 113,195"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+81.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +296 · 기 -306 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+13%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.72% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": false, "detail": "499,233 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": false, "detail": "1.72% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "55"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 168,455 (현재 158,200)"}]}
{"ts": "2026-07-09T09:10:01.830228+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 132300, "qty": 39, "cost": 5160474, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 121211, "target": 154477, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "132,100 vs 108,930"}, {"label": "정배열(5>20)", "ok": true, "detail": "115,600 / 108,930"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "115,600 / 113,232"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+22.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -184 · 기 +964 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+12%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.51% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 116,900"}, {"label": "거래량 급증", "ok": true, "detail": "572,860 (환산) vs 평균 359,705"}, {"label": "회전율 급증", "ok": true, "detail": "0.51% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-07-09T09:12:02.512640+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 156900, "qty": 34, "proceeds": 5324198, "entry_price": 158300, "pnl": -58810, "pnl_pct": -0.88, "hold_from": "2026-07-09T09:02:04.469207+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "158,000 (현재 156,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "149,635"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +296 · 기 -306"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-10T09:00:12.254806+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 158000, "qty": 12, "cost": 1896284, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 113618, "target": 205964, "signals": [{"label": "손절선", "ok": true, "detail": "113,618 (현재 157,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 205,964"}, {"label": "추세(20일선)", "ok": true, "detail": "136,265"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +452 · 기 -360"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 154,000"}]}
{"ts": "2026-07-10T09:00:12.255872+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 164000, "qty": 33, "cost": 5412812, "path": "pullback", "reason": "눌림목 지정가 169,105 도달", "stop": 158000, "target": 176000, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "162,200 vs 149,900"}, {"label": "정배열(5>20)", "ok": true, "detail": "170,080 / 149,900"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "170,080 / 113,262"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+85.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +225 · 기 -178 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+10%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.58% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": false, "detail": "746,107 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": false, "detail": "2.58% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "56"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 169,105 (현재 162,200)"}]}
{"ts": "2026-07-10T09:28:02.625956+09:00", "side": "BUY", "code": "055550", "name": "신한지주", "price": 110900, "qty": 49, "cost": 5434915, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 102716, "target": 127268, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "110,700 vs 97,340"}, {"label": "정배열(5>20)", "ok": true, "detail": "101,320 / 97,340"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "101,320 / 96,637"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+22.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -756 · 기 +893 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+17%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.54% (환산) vs 평균 0.35% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 109,800"}, {"label": "거래량 급증", "ok": true, "detail": "2,541,113 (환산) vs 평균 1,653,581"}, {"label": "회전율 급증", "ok": true, "detail": "0.54% (환산) vs 평균 0.35%"}, {"label": "RSI", "ok": true, "detail": "65"}]}
{"ts": "2026-07-10T09:28:02.626187+09:00", "side": "BUY", "code": "105560", "name": "KB금융", "price": 185900, "qty": 29, "cost": 5391909, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 171311, "target": 215077, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "185,600 vs 159,890"}, {"label": "정배열(5>20)", "ok": true, "detail": "159,900 / 159,890"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "159,900 / 157,368"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+26.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,310 · 기 +1,527 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+16%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.06% (환산) vs 평균 0.46% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 182,700"}, {"label": "거래량 급증", "ok": true, "detail": "3,715,113 (환산) vs 평균 1,640,325"}, {"label": "회전율 급증", "ok": true, "detail": "1.06% (환산) vs 평균 0.46%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-07-10T09:46:11.479245+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 12830, "qty": 177, "cost": 2271251, "path": "pullback", "reason": "눌림목 지정가 16,984 도달", "stop": 10360, "target": 17770, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "12,820 vs 12,690"}, {"label": "정배열(5>20)", "ok": true, "detail": "15,472 / 12,690"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "15,472 / 11,425"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+1.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +228 · 기 +229 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+56%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "9.75% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": true, "detail": "10,460,473 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": true, "detail": "9.75% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 16,984 (현재 12,820)"}]}
{"ts": "2026-07-10T10:14:04.442897+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 173600, "qty": 31, "cost": 5382407, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 158000, "target": 176000, "signals": [{"label": "손절선", "ok": true, "detail": "158,000 (현재 173,600)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 176,000"}, {"label": "추세(20일선)", "ok": true, "detail": "150,470"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +205 · 기 -155"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 173,548"}]}
{"ts": "2026-07-10T11:16:02.480010+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 13850, "qty": 164, "cost": 2271741, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 10360, "target": 17770, "signals": [{"label": "손절선", "ok": true, "detail": "10,360 (현재 13,850)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 17,770"}, {"label": "추세(20일선)", "ok": true, "detail": "12,742"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +210 · 기 +239"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,843"}]}
{"ts": "2026-07-13T09:00:11.349887+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 136900, "qty": 38, "cost": 5202980, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 121211, "target": 154477, "signals": [{"label": "손절선", "ok": true, "detail": "121,211 (현재 136,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 154,477"}, {"label": "추세(20일선)", "ok": true, "detail": "109,140"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -64 · 기 +919"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 136,164"}]}
{"ts": "2026-07-13T09:36:02.278182+09:00", "side": "BUY", "code": "105560", "name": "KB금융", "price": 191000, "qty": 28, "cost": 5348802, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 171311, "target": 215077, "signals": [{"label": "손절선", "ok": true, "detail": "171,311 (현재 191,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 215,077"}, {"label": "추세(20일선)", "ok": true, "detail": "160,160"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -867 · 기 +1,393"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 190,952"}]}
{"ts": "2026-07-13T12:44:04.359037+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 187900, "qty": 64, "proceeds": 12002150, "entry_price": 168650, "pnl": 1206931, "pnl_pct": 11.41, "hold_from": "2026-07-10T09:00:12.255866+09:00", "reason": "트레일링 익절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "189,133 (현재 187,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "151,185"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -254 · 기 +457"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-15T09:02:02.651823+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 135500, "qty": 15, "cost": 2032805, "path": "pullback", "reason": "눌림목 지정가 164,061 도달", "stop": 106641, "target": 193217, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "134,900 vs 120,585"}, {"label": "정배열(5>20)", "ok": true, "detail": "139,000 / 120,585"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "139,000 / 121,348"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+27.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,752 · 기 +1,989 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+31%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.30% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": false, "detail": "636,187 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": false, "detail": "1.30% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "53"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 164,061 (현재 134,900)"}]}
{"ts": "2026-07-16T09:00:09.696452+09:00", "side": "SELL", "code": "095610", "name": "테스", "price": 209000, "qty": 26, "proceeds": 5423404, "entry_price": 150677, "pnl": 1505216, "pnl_pct": 38.71, "hold_from": "2026-07-09T09:02:04.468924+09:00", "reason": "트레일링 익절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "210,764 (현재 207,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "138,765"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -799 · 기 +891"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-16T09:00:09.698334+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18580, "qty": 284, "proceeds": 5266430, "entry_price": 19110, "pnl": -161624, "pnl_pct": -2.77, "hold_from": "2026-07-09T09:02:04.469079+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "18,017 (현재 18,560)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,296"}, {"label": "추세(20일선)", "ok": false, "detail": "18,832"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -120 · 기 -150"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,486"}]}
{"ts": "2026-07-16T14:16:02.484959+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 145700, "qty": 14, "cost": 2040106, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 106641, "target": 193217, "signals": [{"label": "손절선", "ok": true, "detail": "106,641 (현재 145,800)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 193,217"}, {"label": "추세(20일선)", "ok": true, "detail": "121,130"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -1,717 · 기 +2,299"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 145,295"}]}
{"ts": "2026-07-20T09:04:02.883312+09:00", "side": "SELL", "code": "055550", "name": "신한지주", "price": 102700, "qty": 49, "proceeds": 5022487, "entry_price": 110900, "pnl": -412428, "pnl_pct": -7.39, "hold_from": "2026-07-10T09:28:02.625955+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "102,716 (현재 102,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 127,268"}, {"label": "추세(20일선)", "ok": true, "detail": "96,940"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -111 · 기 +265"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 113,514"}]}
{"ts": "2026-07-20T09:04:02.883701+09:00", "side": "SELL", "code": "105560", "name": "KB금융", "price": 173000, "qty": 57, "proceeds": 9841771, "entry_price": 188405, "pnl": -898940, "pnl_pct": -8.18, "hold_from": "2026-07-10T09:28:02.626186+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "173,249 (현재 173,200)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 218,718"}, {"label": "추세(20일선)", "ok": true, "detail": "159,270"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -332 · 기 +291"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-20T12:28:02.319650+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 10310, "qty": 341, "proceeds": 3508854, "entry_price": 13321, "pnl": -1034137, "pnl_pct": -22.6, "hold_from": "2026-07-10T09:46:11.479243+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "10,360 (현재 10,310)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 19,242"}, {"label": "추세(20일선)", "ok": false, "detail": "14,755"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -887 · 기 +515"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-20T12:46:02.282718+09:00", "side": "SELL", "code": "086790", "name": "하나금융지주", "price": 131800, "qty": 104, "proceeds": 13680471, "entry_price": 120162, "pnl": 1181796, "pnl_pct": 9.69, "hold_from": "2026-07-01T09:46:03.088452+09:00", "reason": "트레일링 익절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "131,911 (현재 131,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "118,840"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +0 · 기 +424"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-21T10:08:04.176921+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 133100, "qty": 41, "cost": 5457919, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 123458, "target": 152385, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "133,000 vs 118,895"}, {"label": "정배열(5>20)", "ok": true, "detail": "123,200 / 118,895"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "123,200 / 118,615"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+38.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +137 · 기 +185 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+22%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.57% (환산) vs 평균 0.37% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 130,700"}, {"label": "거래량 급증", "ok": true, "detail": "1,575,915 (환산) vs 평균 1,026,357"}, {"label": "회전율 급증", "ok": true, "detail": "0.57% (환산) vs 평균 0.37%"}, {"label": "RSI", "ok": true, "detail": "63"}]}
{"ts": "2026-07-21T10:12:01.049414+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 167000, "qty": 32, "cost": 5344802, "path": "pullback", "reason": "눌림목 지정가 169,640 도달", "stop": 158000, "target": 185000, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "167,000 vs 150,140"}, {"label": "정배열(5>20)", "ok": true, "detail": "171,040 / 150,140"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "171,040 / 113,342"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+92.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -534 · 기 +316 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+7%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "3.29% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": false, "detail": "951,819 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": false, "detail": "3.29% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "58"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 169,640 (현재 167,000)"}]}
{"ts": "2026-07-21T12:06:01.173992+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 344500, "qty": 14, "cost": 4823723, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 313808, "target": 405884, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "344,500 vs 296,350"}, {"label": "정배열(5>20)", "ok": true, "detail": "315,100 / 296,350"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "315,100 / 305,492"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+39.7%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -7 · 기 +1 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+43%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.38% (환산) vs 평균 0.93% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 334,500"}, {"label": "거래량 급증", "ok": true, "detail": "247,158 (환산) vs 평균 96,436"}, {"label": "회전율 급증", "ok": true, "detail": "2.38% (환산) vs 평균 0.93%"}, {"label": "RSI", "ok": true, "detail": "65"}]}
{"ts": "2026-07-22T09:00:07.219239+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 177600, "qty": 31, "cost": 5506426, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 158000, "target": 185000, "signals": [{"label": "손절선", "ok": true, "detail": "158,000 (현재 178,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 185,000"}, {"label": "추세(20일선)", "ok": true, "detail": "150,715"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -377 · 기 +151"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 175,894"}]}
{"ts": "2026-07-22T09:04:01.822293+09:00", "side": "BUY", "code": "161890", "name": "한국콜마", "price": 99200, "qty": 55, "cost": 5456818, "path": "pullback", "reason": "눌림목 지정가 98,848 도달", "stop": 92100, "target": 113400, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "98,800 vs 98,505"}, {"label": "정배열(5>20)", "ok": true, "detail": "107,060 / 98,505"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "107,060 / 91,913"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+27.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +29 · 기 -34 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.16% (환산) vs 평균 1.76% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 124,600"}, {"label": "거래량 급증", "ok": false, "detail": "272,433 (환산) vs 평균 415,172"}, {"label": "회전율 급증", "ok": false, "detail": "1.16% (환산) vs 평균 1.76%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 98,848 (현재 98,800)"}]}
{"ts": "2026-07-22T12:12:00.742954+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 157300, "qty": 63, "proceeds": 9890576, "entry_price": 172216, "pnl": -960652, "pnl_pct": -8.66, "hold_from": "2026-07-21T10:12:01.049412+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "158,000 (현재 157,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 200,648"}, {"label": "추세(20일선)", "ok": true, "detail": "149,655"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -407 · 기 +141"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-22T14:18:05.429023+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 14030, "qty": 196, "cost": 2750292, "path": "pullback", "reason": "눌림목 지정가 14,023 도달", "stop": 11815, "target": 18460, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "14,020 vs 12,776"}, {"label": "정배열(5>20)", "ok": true, "detail": "14,552 / 12,776"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "14,552 / 13,283"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+10.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,005 · 기 +1,723 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.97% (환산) vs 평균 1.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 15,870"}, {"label": "거래량 급증", "ok": false, "detail": "585,754 (환산) vs 평균 882,736"}, {"label": "회전율 급증", "ok": false, "detail": "0.97% (환산) vs 평균 1.47%"}, {"label": "RSI", "ok": true, "detail": "53"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 14,023 (현재 14,020)"}]}
{"ts": "2026-07-22T15:04:01.000490+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 158100, "qty": 15, "cost": 2371856, "path": "pullback", "reason": "눌림목 지정가 158,107 도달", "stop": 129761, "target": 214778, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "158,000 vs 136,315"}, {"label": "정배열(5>20)", "ok": true, "detail": "172,240 / 136,315"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "172,240 / 99,750"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+49.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -311 · 기 +22 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+24%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "5.02% (환산) vs 평균 3.06% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 202,500"}, {"label": "거래량 급증", "ok": true, "detail": "971,360 (환산) vs 평균 591,925"}, {"label": "회전율 급증", "ok": true, "detail": "5.02% (환산) vs 평균 3.06%"}, {"label": "RSI", "ok": true, "detail": "61"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 158,107 (현재 158,000)"}]}
{"ts": "2026-07-23T09:00:22.967757+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 160100, "qty": 33, "cost": 5284092, "path": "pullback", "reason": "눌림목 지정가 169,062 도달", "stop": 158000, "target": 164300, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "158,100 vs 149,695"}, {"label": "정배열(5>20)", "ok": true, "detail": "169,260 / 149,695"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "169,260 / 113,193"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+76.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -162 · 기 +37 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+13%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.05% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": false, "detail": "303,687 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": false, "detail": "1.05% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "55"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 169,062 (현재 158,100)"}]}
{"ts": "2026-07-23T09:32:04.415818+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 157800, "qty": 33, "proceeds": 5197246, "entry_price": 160100, "pnl": -86847, "pnl_pct": -1.44, "hold_from": "2026-07-23T09:00:22.967750+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "158,000 (현재 157,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "149,685"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -162 · 기 +37"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-23T09:44:04.290079+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 18850, "qty": 288, "cost": 5429614, "path": "pullback", "reason": "눌림목 지정가 20,001 도달", "stop": 17760, "target": 21030, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "18,850 vs 18,847"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,556 / 18,847"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,556 / 19,356"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+13.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -25 · 기 +6 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+34%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.34% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "388,767 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.34% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "48"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 20,001 (현재 18,850)"}]}
{"ts": "2026-07-23T10:50:06.147431+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 110600, "qty": 29, "proceeds": 3201146, "entry_price": 140424, "pnl": -871765, "pnl_pct": -21.24, "hold_from": "2026-07-15T09:02:02.651821+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "111,041 (현재 110,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 199,191"}, {"label": "추세(20일선)", "ok": false, "detail": "119,375"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -847 · 기 +78"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-23T10:50:06.624000+09:00", "side": "BUY", "code": "024060", "name": "흥구석유", "price": 14210, "qty": 237, "cost": 3368275, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 12373, "target": 17884, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "14,210 vs 10,945"}, {"label": "정배열(5>20)", "ok": true, "detail": "13,160 / 10,945"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "13,160 / 12,687"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+56.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +109 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "85.12% (환산) vs 평균 31.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 13,990"}, {"label": "거래량 급증", "ok": true, "detail": "12,769,006 (환산) vs 평균 4,720,532"}, {"label": "회전율 급증", "ok": true, "detail": "85.12% (환산) vs 평균 31.47%"}, {"label": "RSI", "ok": true, "detail": "66"}]}
{"ts": "2026-07-23T12:18:01.548380+09:00", "side": "BUY", "code": "161890", "name": "한국콜마", "price": 103100, "qty": 53, "cost": 5465120, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 92100, "target": 113400, "signals": [{"label": "손절선", "ok": true, "detail": "92,100 (현재 103,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 113,400"}, {"label": "추세(20일선)", "ok": true, "detail": "98,720"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +222 · 기 -227"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 103,029"}]}
{"ts": "2026-07-23T12:22:02.599151+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 356000, "qty": 13, "cost": 4628694, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 313808, "target": 405884, "signals": [{"label": "손절선", "ok": true, "detail": "313,808 (현재 356,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 405,884"}, {"label": "추세(20일선)", "ok": true, "detail": "296,925"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +6 · 기 +26"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 355,034"}]}
{"ts": "2026-07-24T09:00:06.141552+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18730, "qty": 288, "proceeds": 5383721, "entry_price": 18850, "pnl": -45893, "pnl_pct": -0.64, "hold_from": "2026-07-23T09:44:04.290078+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 18,730)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,030"}, {"label": "추세(20일선)", "ok": false, "detail": "18,841"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -5 · 기 -5"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,219"}]}
{"ts": "2026-07-24T09:02:04.046831+09:00", "side": "BUY", "code": "024060", "name": "흥구석유", "price": 15060, "qty": 223, "cost": 3358884, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 12373, "target": 17884, "signals": [{"label": "손절선", "ok": true, "detail": "12,373 (현재 15,020)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 17,884"}, {"label": "추세(20일선)", "ok": true, "detail": "10,986"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +208 · 기 -2"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 14,836"}]}
{"ts": "2026-07-24T09:26:01.012058+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 94000, "qty": 49, "cost": 4606691, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 85262, "target": 111476, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "93,900 vs 75,355"}, {"label": "정배열(5>20)", "ok": true, "detail": "84,140 / 75,355"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "84,140 / 75,153"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+61.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -113 · 기 +274 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+10%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.90% (환산) vs 평균 0.42% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 87,600"}, {"label": "거래량 급증", "ok": true, "detail": "829,560 (환산) vs 평균 392,182"}, {"label": "회전율 급증", "ok": true, "detail": "0.90% (환산) vs 평균 0.42%"}, {"label": "RSI", "ok": true, "detail": "72"}]}
{"ts": "2026-07-24T09:28:04.953126+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 14510, "qty": 189, "cost": 2742801, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 11815, "target": 18460, "signals": [{"label": "손절선", "ok": true, "detail": "11,815 (현재 15,400)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 18,460"}, {"label": "추세(20일선)", "ok": true, "detail": "12,845"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -857 · 기 +1,172"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 14,791"}]}
{"ts": "2026-07-24T09:48:01.201233+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 97000, "qty": 48, "cost": 4656698, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 85262, "target": 111476, "signals": [{"label": "손절선", "ok": true, "detail": "85,262 (현재 97,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 111,476"}, {"label": "추세(20일선)", "ok": true, "detail": "75,510"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -113 · 기 +274"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 96,977"}]}
{"ts": "2026-07-27T09:04:05.318974+09:00", "side": "SELL", "code": "024060", "name": "흥구석유", "price": 12200, "qty": 460, "proceeds": 5601057, "entry_price": 14622, "pnl": -1126102, "pnl_pct": -16.56, "hold_from": "2026-07-23T10:50:06.623985+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "12,744 (현재 12,250)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 18,378"}, {"label": "추세(20일선)", "ok": true, "detail": "10,847"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -85 · 기 +2"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-27T09:06:01.482560+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19170, "qty": 278, "cost": 5330059, "path": "pullback", "reason": "눌림목 지정가 20,032 도달", "stop": 18093, "target": 21324, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "19,060 vs 18,858"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,598 / 18,858"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,598 / 19,360"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+17.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +101 · 기 -3 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.13% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "153,733 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.13% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 20,032 (현재 19,060)"}]}
{"ts": "2026-07-28T09:00:16.370466+09:00", "side": "SELL", "code": "095610", "name": "테스", "price": 126200, "qty": 15, "proceeds": 1889309, "entry_price": 158100, "pnl": -482547, "pnl_pct": -20.18, "hold_from": "2026-07-22T15:04:01.000489+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "129,761 (현재 128,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 214,778"}, {"label": "추세(20일선)", "ok": false, "detail": "134,815"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +269 · 기 -554"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 168,554"}]}
{"ts": "2026-07-28T09:00:16.371386+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6780, "qty": 486, "cost": 3295574, "path": "pullback", "reason": "눌림목 지정가 7,884 도달", "stop": 5916, "target": 8509, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "7,050 vs 4,855"}, {"label": "정배열(5>20)", "ok": true, "detail": "6,368 / 4,855"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,368 / 4,882"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+73.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +86 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.01% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "813 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "0.01% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "69"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,884 (현재 7,050)"}]}
{"ts": "2026-07-28T09:02:04.754909+09:00", "side": "SELL", "code": "252990", "name": "샘씨엔에스", "price": 11920, "qty": 385, "proceeds": 4580251, "entry_price": 14266, "pnl": -912843, "pnl_pct": -16.44, "hold_from": "2026-07-22T14:18:05.429022+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "11,983 (현재 11,960)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 18,830"}, {"label": "추세(20일선)", "ok": false, "detail": "12,673"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +84 · 기 -61"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-28T09:10:01.747136+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 7100, "qty": 464, "cost": 3294894, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 5916, "target": 8509, "signals": [{"label": "손절선", "ok": true, "detail": "5,916 (현재 7,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 8,509"}, {"label": "추세(20일선)", "ok": true, "detail": "4,857"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +86 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 7,079"}]}
{"ts": "2026-07-28T13:24:01.023779+09:00", "side": "SELL", "code": "086790", "name": "하나금융지주", "price": 123300, "qty": 41, "proceeds": 5045442, "entry_price": 133100, "pnl": -412476, "pnl_pct": -7.36, "hold_from": "2026-07-21T10:08:04.176920+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "123,458 (현재 123,400)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 152,385"}, {"label": "추세(20일선)", "ok": true, "detail": "118,415"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +122 · 기 -106"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 136,361"}]}
{"ts": "2026-07-29T09:02:02.235829+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 117900, "qty": 43, "cost": 5070460, "path": "pullback", "reason": "눌림목 지정가 118,115 도달", "stop": 111200, "target": 131300, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "117,800 vs 113,445"}, {"label": "정배열(5>20)", "ok": true, "detail": "117,020 / 113,445"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "117,020 / 109,982"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+45.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +39 · 기 +307 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+26%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.03% (환산) vs 평균 0.17% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 123,300"}, {"label": "거래량 급증", "ok": false, "detail": "44,660 (환산) vs 평균 289,522"}, {"label": "회전율 급증", "ok": false, "detail": "0.03% (환산) vs 평균 0.17%"}, {"label": "RSI", "ok": true, "detail": "57"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 118,115 (현재 117,800)"}]}
{"ts": "2026-07-29T09:04:02.482605+09:00", "side": "SELL", "code": "078930", "name": "GS", "price": 85500, "qty": 97, "proceeds": 8277328, "entry_price": 95485, "pnl": -986062, "pnl_pct": -10.46, "hold_from": "2026-07-24T09:26:01.012056+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "86,554 (현재 85,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 113,346"}, {"label": "추세(20일선)", "ok": true, "detail": "74,935"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -59 · 기 +284"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T09:16:04.470378+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 120500, "qty": 42, "cost": 5061759, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 111200, "target": 131300, "signals": [{"label": "손절선", "ok": true, "detail": "111,200 (현재 120,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 131,300"}, {"label": "추세(20일선)", "ok": true, "detail": "113,580"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +39 · 기 +307"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 120,492"}]}
{"ts": "2026-07-29T09:24:09.991614+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 18950, "qty": 281, "cost": 5325749, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 18093, "target": 21324, "signals": [{"label": "손절선", "ok": true, "detail": "18,093 (현재 20,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,324"}, {"label": "추세(20일선)", "ok": true, "detail": "18,884"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +99 · 기 +138"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,488"}]}
{"ts": "2026-07-29T09:24:09.992155+09:00", "side": "SELL", "code": "010950", "name": "S-Oil", "price": 128600, "qty": 77, "proceeds": 9882891, "entry_price": 134570, "pnl": -480564, "pnl_pct": -4.44, "hold_from": "2026-07-09T09:10:01.830227+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "122,978 (현재 116,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 157,755"}, {"label": "추세(20일선)", "ok": true, "detail": "107,870"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +43 · 기 +245"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T09:28:01.387952+09:00", "side": "BUY", "code": "090850", "name": "현대이지웰", "price": 6390, "qty": 801, "cost": 5119158, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 5998, "target": 7174, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "6,380 vs 5,358"}, {"label": "정배열(5>20)", "ok": true, "detail": "5,742 / 5,358"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "5,742 / 5,622"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+43.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +73 · 기 -3 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.62% (환산) vs 평균 0.22% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 5,700"}, {"label": "거래량 급증", "ok": true, "detail": "134,413 (환산) vs 평균 49,512"}, {"label": "회전율 급증", "ok": true, "detail": "0.62% (환산) vs 평균 0.22%"}, {"label": "RSI", "ok": true, "detail": "73"}]}
{"ts": "2026-07-29T10:42:05.416427+09:00", "side": "SELL", "code": "090850", "name": "현대이지웰", "price": 5980, "qty": 801, "proceeds": 4780640, "entry_price": 6390, "pnl": -338518, "pnl_pct": -6.42, "hold_from": "2026-07-29T09:28:01.387951+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,998 (현재 5,980)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 7,174"}, {"label": "추세(20일선)", "ok": true, "detail": "5,338"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +77 · 기 -3"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,521"}]}
{"ts": "2026-07-29T11:18:04.428660+09:00", "side": "SELL", "code": "003680", "name": "한성기업", "price": 6000, "qty": 950, "proceeds": 5688885, "entry_price": 6936, "pnl": -901583, "pnl_pct": -13.5, "hold_from": "2026-07-28T09:00:16.371383+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "6,040 (현재 6,020)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 8,729"}, {"label": "추세(20일선)", "ok": true, "detail": "4,803"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +185 · 기 +0"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-30T09:04:07.484190+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 121300, "qty": 40, "cost": 4852728, "path": "pullback", "reason": "눌림목 지정가 122,665 도달", "stop": 111347, "target": 141206, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "121,200 vs 118,305"}, {"label": "정배열(5>20)", "ok": true, "detail": "120,840 / 118,305"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "120,840 / 118,418"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+34.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -214 · 기 +182 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+36%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.18% (환산) vs 평균 0.37% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 130,700"}, {"label": "거래량 급증", "ok": false, "detail": "494,880 (환산) vs 평균 1,026,357"}, {"label": "회전율 급증", "ok": false, "detail": "0.18% (환산) vs 평균 0.37%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 122,665 (현재 121,200)"}]}
{"ts": "2026-07-30T09:04:07.484679+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6130, "qty": 404, "cost": 2476891, "path": "pullback", "reason": "눌림목 지정가 7,792 도달", "stop": 5127, "target": 8135, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "6,120 vs 4,808"}, {"label": "정배열(5>20)", "ok": true, "detail": "6,182 / 4,808"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,182 / 4,866"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+65.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +234 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "4.31% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "267,687 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "4.31% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,792 (현재 6,120)"}]}
{"ts": "2026-07-30T09:16:11.934766+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 125200, "qty": 39, "cost": 4883532, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 111347, "target": 141206, "signals": [{"label": "손절선", "ok": true, "detail": "111,347 (현재 125,400)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 141,206"}, {"label": "추세(20일선)", "ok": true, "detail": "118,515"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -214 · 기 +182"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 124,618"}]}
{"ts": "2026-07-30T09:16:11.935114+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 130900, "qty": 37, "cost": 4844026, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 119833, "target": 153035, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "130,900 vs 108,870"}, {"label": "정배열(5>20)", "ok": true, "detail": "115,360 / 108,870"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "115,360 / 113,212"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+49.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -6 · 기 +178 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+21%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.51% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 116,900"}, {"label": "거래량 급증", "ok": true, "detail": "571,193 (환산) vs 평균 359,705"}, {"label": "회전율 급증", "ok": true, "detail": "0.51% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "68"}]}
{"ts": "2026-07-30T09:18:10.171049+09:00", "side": "BUY", "code": "090850", "name": "현대이지웰", "price": 6310, "qty": 813, "cost": 5130800, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 5927, "target": 7077, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "6,300 vs 5,354"}, {"label": "정배열(5>20)", "ok": true, "detail": "5,726 / 5,354"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "5,726 / 5,621"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+46.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +87 · 기 +6 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.41% (환산) vs 평균 0.22% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 5,700"}, {"label": "거래량 급증", "ok": true, "detail": "87,813 (환산) vs 평균 49,512"}, {"label": "회전율 급증", "ok": true, "detail": "0.41% (환산) vs 평균 0.22%"}, {"label": "RSI", "ok": true, "detail": "72"}]}
{"ts": "2026-07-30T11:58:08.439672+09:00", "side": "SELL", "code": "161890", "name": "한국콜마", "price": 91700, "qty": 108, "proceeds": 9884288, "entry_price": 101114, "pnl": -1037650, "pnl_pct": -9.31, "hold_from": "2026-07-22T09:04:01.822292+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "92,100 (현재 91,800)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 119,142"}, {"label": "추세(20일선)", "ok": false, "detail": "98,155"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -7 · 기 +40"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-30T12:04:07.833676+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 87900, "qty": 47, "cost": 4131920, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 79505, "target": 104690, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "87,900 vs 75,055"}, {"label": "정배열(5>20)", "ok": true, "detail": "82,940 / 75,055"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "82,940 / 75,053"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+61.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -49 · 기 +280 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+17%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.79% (환산) vs 평균 0.42% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 87,600"}, {"label": "거래량 급증", "ok": true, "detail": "728,608 (환산) vs 평균 392,182"}, {"label": "회전율 급증", "ok": true, "detail": "0.79% (환산) vs 평균 0.42%"}, {"label": "RSI", "ok": true, "detail": "67"}]}
{"ts": "2026-07-31T09:06:07.022640+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6550, "qty": 378, "cost": 2476271, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 5127, "target": 8135, "signals": [{"label": "손절선", "ok": true, "detail": "5,127 (현재 6,640)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 8,135"}, {"label": "추세(20일선)", "ok": true, "detail": "4,834"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +355 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,453"}]}
{"ts": "2026-07-31T09:06:07.022939+09:00", "side": "SELL", "code": "078930", "name": "GS", "price": 77700, "qty": 47, "proceeds": 3644779, "entry_price": 87900, "pnl": -487141, "pnl_pct": -11.6, "hold_from": "2026-07-30T12:04:07.833673+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "79,505 (현재 78,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 104,690"}, {"label": "추세(20일선)", "ok": true, "detail": "74,560"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -179 · 기 +325"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 90,898"}]}
{"ts": "2026-08-03T09:36:12.036330+09:00", "side": "SELL", "code": "010950", "name": "S-Oil", "price": 119700, "qty": 37, "proceeds": 4420264, "entry_price": 130900, "pnl": -423763, "pnl_pct": -8.56, "hold_from": "2026-07-30T09:16:11.935111+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "119,833 (현재 119,800)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 153,035"}, {"label": "추세(20일선)", "ok": true, "detail": "108,315"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -35 · 기 +48"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 134,411"}]}
{"ts": "2026-08-03T12:00:11.814098+09:00", "side": "BUY", "code": "194370", "name": "제이에스코퍼레이션", "price": 12910, "qty": 332, "cost": 4286763, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 11713, "target": 15304, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "12,930 vs 11,922"}, {"label": "정배열(5>20)", "ok": true, "detail": "12,138 / 11,922"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "12,138 / 11,924"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+27.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +7 · 기 +10 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+74%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.72% (환산) vs 평균 0.34% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 12,870"}, {"label": "거래량 급증", "ok": true, "detail": "208,994 (환산) vs 평균 99,303"}, {"label": "회전율 급증", "ok": true, "detail": "0.72% (환산) vs 평균 0.34%"}, {"label": "RSI", "ok": true, "detail": "63"}]}
{"ts": "2026-08-03T12:02:09.760295+09:00", "side": "BUY", "code": "194370", "name": "제이에스코퍼레이션", "price": 13420, "qty": 320, "cost": 4295044, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 11713, "target": 15304, "signals": [{"label": "손절선", "ok": true, "detail": "11,713 (현재 13,450)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 15,304"}, {"label": "추세(20일선)", "ok": true, "detail": "11,948"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +7 · 기 +10"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,339"}]}
{"ts": "2026-08-04T09:04:09.467468+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 135900, "qty": 12, "cost": 1631045, "path": "pullback", "reason": "눌림목 지정가 156,279 도달", "stop": 104818, "target": 198064, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "135,700 vs 135,200"}, {"label": "정배열(5>20)", "ok": true, "detail": "167,780 / 135,200"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "167,780 / 99,378"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+24.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +23 · 기 +54 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+45%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "6.62% (환산) vs 평균 3.06% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 202,500"}, {"label": "거래량 급증", "ok": true, "detail": "1,281,140 (환산) vs 평균 591,925"}, {"label": "회전율 급증", "ok": true, "detail": "6.62% (환산) vs 평균 3.06%"}, {"label": "RSI", "ok": true, "detail": "52"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 156,279 (현재 135,700)"}]}
{"ts": "2026-08-04T09:48:09.380105+09:00", "side": "SELL", "code": "090850", "name": "현대이지웰", "price": 5920, "qty": 813, "proceeds": 4803575, "entry_price": 6310, "pnl": -327225, "pnl_pct": -6.18, "hold_from": "2026-07-30T09:18:10.171043+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,927 (현재 5,925)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 7,077"}, {"label": "추세(20일선)", "ok": true, "detail": "5,336"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +34 · 기 +9"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,429"}]}
{"ts": "2026-08-04T09:48:09.782738+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 90400, "qty": 48, "cost": 4339851, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 82176, "target": 106848, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "90,400 vs 75,180"}, {"label": "정배열(5>20)", "ok": true, "detail": "83,440 / 75,180"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "83,440 / 75,095"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+57.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +68 · 기 +117 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+14%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.85% (환산) vs 평균 0.42% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 87,600"}, {"label": "거래량 급증", "ok": true, "detail": "783,140 (환산) vs 평균 392,182"}, {"label": "회전율 급증", "ok": true, "detail": "0.85% (환산) vs 평균 0.42%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-08-04T10:32:12.784971+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 93500, "qty": 46, "cost": 4301645, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 82176, "target": 106848, "signals": [{"label": "손절선", "ok": true, "detail": "82,176 (현재 93,400)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 106,848"}, {"label": "추세(20일선)", "ok": true, "detail": "75,330"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +57 · 기 +117"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 93,241"}]}
{"ts": "2026-08-05T09:00:15.136122+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 147600, "qty": 11, "cost": 1623844, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 104818, "target": 198064, "signals": [{"label": "손절선", "ok": true, "detail": "104,818 (현재 147,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 198,064"}, {"label": "추세(20일선)", "ok": true, "detail": "135,790"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -256 · 기 +200"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 145,836"}]}
{"ts": "2026-08-06T09:00:19.346339+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18730, "qty": 559, "proceeds": 10449653, "entry_price": 19059, "pnl": -206155, "pnl_pct": -1.73, "hold_from": "2026-07-27T09:06:01.482556+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "18,105 (현재 18,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 20,968"}, {"label": "추세(20일선)", "ok": false, "detail": "18,842"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -203 · 기 -147"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-08-06T09:00:19.347943+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 13300, "qty": 174, "cost": 2314547, "path": "pullback", "reason": "눌림목 지정가 13,975 도달", "stop": 11012, "target": 17875, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "13,300 vs 12,740"}, {"label": "정배열(5>20)", "ok": true, "detail": "14,408 / 12,740"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "14,408 / 13,271"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-5.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -352 · 기 +499 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.00% (환산) vs 평균 1.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 15,870"}, {"label": "거래량 급증", "ok": false, "detail": "7 (환산) vs 평균 882,736"}, {"label": "회전율 급증", "ok": false, "detail": "0.00% (환산) vs 평균 1.47%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 13,975 (현재 13,300)"}]}
{"ts": "2026-08-07T09:02:12.182518+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 14290, "qty": 162, "cost": 2315327, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 11012, "target": 17875, "signals": [{"label": "손절선", "ok": true, "detail": "11,012 (현재 14,240)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 17,875"}, {"label": "추세(20일선)", "ok": true, "detail": "12,787"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -216 · 기 +313"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 14,046"}]}
@@ -0,0 +1,203 @@
{
"cash": 30174817.51399994,
"initial": 100000000,
"positions": {
"003680": {
"code": "003680",
"name": "한성기업",
"sources": [
"auto"
],
"qty": 831,
"entry_price": 6333.1768953068595,
"entry_at": "2026-07-30T09:04:07.489609+09:00",
"stop": 5363,
"target": 7789,
"peak": 6840,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 7,457 도달",
"cur_price": 6220,
"tranches": 2,
"tranche_value": 2634409.858223602,
"last_add_price": 6550
},
"194370": {
"code": "194370",
"name": "제이에스코퍼레이션",
"sources": [
"auto"
],
"qty": 681,
"entry_price": 13160.132158590308,
"entry_at": "2026-08-03T12:00:11.819202+09:00",
"stop": 11874,
"target": 15089,
"peak": 14120,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 13370,
"tranches": 2,
"tranche_value": 4489026.732352336,
"last_add_price": 13420
},
"095610": {
"code": "095610",
"name": "테스",
"sources": [
"auto"
],
"qty": 25,
"entry_price": 141516.0,
"entry_at": "2026-08-04T09:04:09.472084+09:00",
"stop": 111709,
"target": 186227,
"peak": 148000,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 145,918 도달",
"cur_price": 143700,
"tranches": 2,
"tranche_value": 1812315.6154018787,
"last_add_price": 147600
},
"078930": {
"code": "078930",
"name": "GS",
"sources": [
"auto"
],
"qty": 98,
"entry_price": 91714.28571428571,
"entry_at": "2026-08-04T09:34:09.331555+09:00",
"stop": 83191,
"target": 104500,
"peak": 101600,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 97700,
"tranches": 2,
"tranche_value": 4576294.319379674,
"last_add_price": 93500
},
"252990": {
"code": "252990",
"name": "샘씨엔에스",
"sources": [
"auto"
],
"qty": 325,
"entry_price": 13205.784615384615,
"entry_at": "2026-08-04T11:00:12.174914+09:00",
"stop": 10876,
"target": 16700,
"peak": 15670,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 13,033 도달",
"cur_price": 15670,
"tranches": 2,
"tranche_value": 2154436.3245398356,
"last_add_price": 13640
},
"068270": {
"code": "068270",
"name": "셀트리온",
"sources": [
"interest"
],
"qty": 52,
"entry_price": 196100.0,
"entry_at": "2026-08-06T09:14:10.570384+09:00",
"stop": 183083,
"target": 215625,
"peak": 201000,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 201000,
"tranches": 2,
"tranche_value": 5207451.256718745,
"last_add_price": 198600
},
"138040": {
"code": "138040",
"name": "메리츠금융지주",
"sources": [
"auto"
],
"qty": 41,
"entry_price": 124100,
"entry_at": "2026-08-06T09:34:15.935443+09:00",
"stop": 116569,
"target": 135396,
"peak": 126400,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 123200,
"tranches": 1,
"tranche_value": 5180171.914218746,
"last_add_price": 124100
},
"030000": {
"code": "030000",
"name": "제일기획",
"sources": [
"auto"
],
"qty": 267,
"entry_price": 19170,
"entry_at": "2026-08-07T11:26:13.309490+09:00",
"stop": 18088,
"target": 20793,
"peak": 19270,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 19,668 도달",
"cur_price": 18970,
"tranches": 1,
"tranche_value": 5126950.954531247,
"last_add_price": 19170
}
},
"realized_pnl": -18371075.527500026,
"closed_trades": 46,
"wins": 6,
"peak_equity": 100161893.89500001,
"max_drawdown": 0.18418431144422467,
"last_exit": {
"086790": "2026-07-28",
"030000": "2026-08-06",
"005930": "2026-06-23",
"403870": "2026-07-02",
"003490": "2026-07-07",
"240810": "2026-07-23",
"093370": "2026-07-20",
"214450": "2026-08-07",
"055550": "2026-07-20",
"034730": "2026-07-08",
"319660": "2026-07-23",
"095610": "2026-07-29",
"105560": "2026-07-20",
"010950": "2026-08-03",
"024060": "2026-07-27",
"003680": "2026-07-29",
"138040": "2026-08-04",
"252990": "2026-07-28",
"090850": "2026-08-06",
"078930": "2026-07-31"
},
"created_at": "2026-06-15T14:55:00.582849+09:00",
"updated_at": "2026-08-10T15:28:14.957758+09:00"
}
@@ -0,0 +1,124 @@
{"ts": "2026-06-17T11:15:02.373468+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 130900, "qty": 47, "cost": 6153223, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 121254, "target": 145369, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "129,300 vs 118,195"}, {"label": "정배열(5>20)", "ok": true, "detail": "120,400 / 118,195"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "120,400 / 118,307"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-13.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +371 · 기 +158 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+22%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.12% (환산) vs 평균 0.38% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 126,500"}, {"label": "거래량 급증", "ok": true, "detail": "3,094,534 (환산) vs 평균 1,031,725"}, {"label": "회전율 급증", "ok": true, "detail": "1.12% (환산) vs 평균 0.38%"}, {"label": "RSI", "ok": true, "detail": "60"}]}
{"ts": "2026-06-19T09:02:06.419908+09:00", "side": "BUY", "code": "005930", "name": "삼성전자", "price": 373500, "qty": 15, "cost": 5603340, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 341819, "target": 421021, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "373,000 vs 325,400"}, {"label": "정배열(5>20)", "ok": true, "detail": "352,400 / 325,400"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "352,400 / 258,005"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+6.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,427 · 기 +4,448 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+19%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.04% (환산) vs 평균 0.53% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 370,000"}, {"label": "거래량 급증", "ok": true, "detail": "60,950,213 (환산) vs 평균 31,088,390"}, {"label": "회전율 급증", "ok": true, "detail": "1.04% (환산) vs 평균 0.53%"}, {"label": "RSI", "ok": true, "detail": "67"}]}
{"ts": "2026-06-19T09:02:06.420289+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19160, "qty": 325, "cost": 6227934, "path": "pullback", "reason": "눌림목 지정가 19,690 도달", "stop": 18100, "target": 20749, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "19,150 vs 18,862"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,616 / 18,862"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,616 / 19,361"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-31.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,162 · 기 +2,080 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.03% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "37,673 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.03% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,690 (현재 19,150)"}]}
{"ts": "2026-06-19T13:32:02.863105+09:00", "side": "SELL", "code": "086790", "name": "하나금융지주", "price": 121100, "qty": 47, "proceeds": 5680601, "entry_price": 130900, "pnl": -472622, "pnl_pct": -7.49, "hold_from": "2026-06-17T11:15:02.373467+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "121,254 (현재 121,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 145,369"}, {"label": "추세(20일선)", "ok": true, "detail": "118,300"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +531 · 기 -129"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 134,178"}]}
{"ts": "2026-06-23T09:00:11.412554+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18820, "qty": 325, "proceeds": 6104573, "entry_price": 19160, "pnl": -123361, "pnl_pct": -1.77, "hold_from": "2026-06-19T09:02:06.420288+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "18,100 (현재 18,710)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 20,749"}, {"label": "추세(20일선)", "ok": false, "detail": "18,840"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -318 · 기 -227"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,528"}]}
{"ts": "2026-06-23T09:26:03.174954+09:00", "side": "SELL", "code": "005930", "name": "삼성전자", "price": 339500, "qty": 15, "proceeds": 5082570, "entry_price": 373500, "pnl": -520771, "pnl_pct": -9.1, "hold_from": "2026-06-19T09:02:06.419907+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "341,819 (현재 340,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 421,021"}, {"label": "추세(20일선)", "ok": true, "detail": "329,525"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -3,330 · 기 +1,369"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 384,493"}]}
{"ts": "2026-06-24T09:02:02.384682+09:00", "side": "BUY", "code": "403870", "name": "HPSP", "price": 53200, "qty": 49, "cost": 2607191, "path": "pullback", "reason": "눌림목 지정가 60,114 도달", "stop": 43200, "target": 68200, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "53,200 vs 52,378"}, {"label": "정배열(5>20)", "ok": true, "detail": "57,960 / 52,378"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "57,960 / 49,671"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+20.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +711 · 기 -2,060 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+29%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.34% (환산) vs 평균 5.97% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 71,500"}, {"label": "거래량 급증", "ok": false, "detail": "1,102,733 (환산) vs 평균 4,912,598"}, {"label": "회전율 급증", "ok": false, "detail": "1.34% (환산) vs 평균 5.97%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 60,114 (현재 53,200)"}]}
{"ts": "2026-06-24T09:08:00.996646+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 155400, "qty": 18, "cost": 2797620, "path": "pullback", "reason": "눌림목 지정가 155,963 도달", "stop": 128063, "target": 196406, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "155,400 vs 121,610"}, {"label": "정배열(5>20)", "ok": true, "detail": "143,100 / 121,610"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "143,100 / 121,690"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+45.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +210 · 기 +143 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+6%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "6.50% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": true, "detail": "3,192,593 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": true, "detail": "6.50% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 155,963 (현재 155,400)"}]}
{"ts": "2026-06-25T09:04:05.755437+09:00", "side": "BUY", "code": "003490", "name": "대한항공", "price": 28900, "qty": 213, "cost": 6156623, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 26911, "target": 31883, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "28,850 vs 25,948"}, {"label": "정배열(5>20)", "ok": true, "detail": "26,110 / 25,948"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "26,110 / 25,216"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-2.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +1,577 · 기 -7 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.9/5"}, {"label": "상승여력", "ok": true, "detail": "+15%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.54% (환산) vs 평균 0.58% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 28,400"}, {"label": "거래량 급증", "ok": true, "detail": "5,629,873 (환산) vs 평균 2,146,231"}, {"label": "회전율 급증", "ok": true, "detail": "1.54% (환산) vs 평균 0.58%"}, {"label": "RSI", "ok": true, "detail": "64"}]}
{"ts": "2026-06-26T09:00:08.028417+09:00", "side": "SELL", "code": "403870", "name": "HPSP", "price": 50000, "qty": 49, "proceeds": 2445222, "entry_price": 53200, "pnl": -161969, "pnl_pct": -6.02, "hold_from": "2026-06-24T09:02:02.384681+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "43,200 (현재 51,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 68,200"}, {"label": "추세(20일선)", "ok": false, "detail": "52,268"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -311 · 기 -267"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 57,056"}]}
{"ts": "2026-06-26T09:04:03.906588+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 164900, "qty": 17, "cost": 2803720, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 128063, "target": 196406, "signals": [{"label": "손절선", "ok": true, "detail": "128,063 (현재 164,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 196,406"}, {"label": "추세(20일선)", "ok": true, "detail": "122,075"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -140 · 기 +323"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 164,359"}]}
{"ts": "2026-06-30T09:00:09.070574+09:00", "side": "BUY", "code": "403870", "name": "HPSP", "price": 55300, "qty": 43, "cost": 2378257, "path": "pullback", "reason": "눌림목 지정가 60,222 도달", "stop": 44022, "target": 72218, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "53,700 vs 52,402"}, {"label": "정배열(5>20)", "ok": true, "detail": "58,060 / 52,402"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "58,060 / 49,679"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+12.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +222 · 기 -821 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+28%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.00% (환산) vs 평균 5.97% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 71,500"}, {"label": "거래량 급증", "ok": false, "detail": "827 (환산) vs 평균 4,912,598"}, {"label": "회전율 급증", "ok": false, "detail": "0.00% (환산) vs 평균 5.97%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 60,222 (현재 53,700)"}]}
{"ts": "2026-06-30T09:02:03.198048+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 347500, "qty": 15, "cost": 5213282, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 316272, "target": 394342, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "347,000 vs 296,475"}, {"label": "정배열(5>20)", "ok": true, "detail": "315,600 / 296,475"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "315,600 / 305,533"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+29.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -19 · 기 +146 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+39%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.55% (환산) vs 평균 0.93% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 334,500"}, {"label": "거래량 급증", "ok": true, "detail": "160,800 (환산) vs 평균 96,436"}, {"label": "회전율 급증", "ok": true, "detail": "1.55% (환산) vs 평균 0.93%"}, {"label": "RSI", "ok": true, "detail": "66"}]}
{"ts": "2026-06-30T09:06:03.690639+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 360000, "qty": 15, "cost": 5400810, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 316272, "target": 394342, "signals": [{"label": "손절선", "ok": true, "detail": "316,272 (현재 360,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 394,342"}, {"label": "추세(20일선)", "ok": true, "detail": "297,125"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -19 · 기 +146"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 358,070"}]}
{"ts": "2026-07-01T09:46:03.094629+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 118200, "qty": 52, "cost": 6147322, "path": "pullback", "reason": "눌림목 지정가 118,779 도달", "stop": 111000, "target": 129000, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "118,200 vs 118,155"}, {"label": "정배열(5>20)", "ok": true, "detail": "120,240 / 118,155"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "120,240 / 118,368"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+3.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +55 · 기 -166 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.35% (환산) vs 평균 0.37% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 130,700"}, {"label": "거래량 급증", "ok": false, "detail": "969,420 (환산) vs 평균 1,026,357"}, {"label": "회전율 급증", "ok": false, "detail": "0.35% (환산) vs 평균 0.37%"}, {"label": "RSI", "ok": true, "detail": "49"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 118,779 (현재 118,200)"}]}
{"ts": "2026-07-02T09:00:22.920464+09:00", "side": "BUY", "code": "034730", "name": "SK", "price": 707000, "qty": 4, "cost": 2828424, "path": "pullback", "reason": "눌림목 지정가 714,693 도달", "stop": 606693, "target": 857461, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "714,000 vs 675,150"}, {"label": "정배열(5>20)", "ok": true, "detail": "760,800 / 675,150"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "760,800 / 530,100"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+11.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -198 · 기 +92 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+17%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.32% (환산) vs 평균 0.45% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 883,000"}, {"label": "거래량 급증", "ok": false, "detail": "230,413 (환산) vs 평균 329,863"}, {"label": "회전율 급증", "ok": false, "detail": "0.32% (환산) vs 평균 0.45%"}, {"label": "RSI", "ok": true, "detail": "55"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 714,693 (현재 714,000)"}]}
{"ts": "2026-07-02T09:08:01.927589+09:00", "side": "SELL", "code": "003490", "name": "대한항공", "price": 26900, "qty": 213, "proceeds": 5718527, "entry_price": 28900, "pnl": -438096, "pnl_pct": -6.92, "hold_from": "2026-06-25T09:04:05.755436+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "26,911 (현재 26,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 31,883"}, {"label": "추세(20일선)", "ok": true, "detail": "25,850"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -249 · 기 +991"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 29,517"}]}
{"ts": "2026-07-02T10:18:03.852108+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 15980, "qty": 184, "cost": 2940761, "path": "pullback", "reason": "눌림목 지정가 16,358 도달", "stop": 13328, "target": 19958, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "15,980 vs 12,848"}, {"label": "정배열(5>20)", "ok": true, "detail": "16,104 / 12,848"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "16,104 / 11,478"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+25.7%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,833 · 기 +437 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+25%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "9.98% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": true, "detail": "10,701,165 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": true, "detail": "9.98% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "60"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 16,358 (현재 15,980)"}]}
{"ts": "2026-07-02T10:18:03.852576+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 122200, "qty": 51, "cost": 6233135, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 111000, "target": 129000, "signals": [{"label": "손절선", "ok": true, "detail": "111,000 (현재 122,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 129,000"}, {"label": "추세(20일선)", "ok": true, "detail": "118,345"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +22 · 기 -44"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 121,743"}]}
{"ts": "2026-07-02T10:34:04.129838+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 18860, "qty": 325, "cost": 6130419, "path": "pullback", "reason": "눌림목 지정가 19,580 도달", "stop": 17760, "target": 20510, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "18,860 vs 18,848"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,558 / 18,848"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,558 / 19,356"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+3.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -339 · 기 +110 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+35%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.80% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "924,985 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.80% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "48"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,580 (현재 18,860)"}]}
{"ts": "2026-07-02T11:20:02.066064+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 22550, "qty": 272, "cost": 6134520, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 17760, "target": 20510, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 19,350)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 20,510"}, {"label": "추세(20일선)", "ok": true, "detail": "18,872"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -339 · 기 +110"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,250"}]}
{"ts": "2026-07-02T11:22:01.974965+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 19000, "qty": 597, "proceeds": 11320881, "entry_price": 20541, "pnl": -944058, "pnl_pct": -7.5, "hold_from": "2026-07-02T10:34:04.129836+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "19,371 (현재 19,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,296"}, {"label": "추세(20일선)", "ok": true, "detail": "18,860"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -339 · 기 +110"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-02T14:48:03.083104+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 133000, "qty": 35, "proceeds": 4645923, "entry_price": 160014, "pnl": -955417, "pnl_pct": -16.88, "hold_from": "2026-06-24T09:08:00.996645+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "133,138 (현재 133,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 200,329"}, {"label": "추세(20일선)", "ok": true, "detail": "120,490"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +395 · 기 -1,516"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-02T15:04:06.195753+09:00", "side": "SELL", "code": "403870", "name": "HPSP", "price": 43900, "qty": 43, "proceeds": 1884019, "entry_price": 55300, "pnl": -494238, "pnl_pct": -20.61, "hold_from": "2026-06-30T09:00:09.070565+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "44,022 (현재 43,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 72,218"}, {"label": "추세(20일선)", "ok": false, "detail": "51,912"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +2,379 · 기 -6,625"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 59,411"}]}
{"ts": "2026-07-03T09:02:04.932435+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 133400, "qty": 16, "cost": 2134720, "path": "pullback", "reason": "눌림목 지정가 154,163 도달", "stop": 104263, "target": 177106, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "133,300 vs 120,505"}, {"label": "정배열(5>20)", "ok": true, "detail": "138,680 / 120,505"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "138,680 / 121,322"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+18.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +674 · 기 -2,170 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+31%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.16% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": false, "detail": "571,607 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": false, "detail": "1.16% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "52"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 154,163 (현재 133,300)"}]}
{"ts": "2026-07-03T09:56:06.778013+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 13310, "qty": 184, "proceeds": 2444264, "entry_price": 15980, "pnl": -496497, "pnl_pct": -16.71, "hold_from": "2026-07-02T10:18:03.852106+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "13,328 (현재 13,320)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 19,958"}, {"label": "추세(20일선)", "ok": true, "detail": "12,716"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -1,591 · 기 +253"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 16,944"}]}
{"ts": "2026-07-03T10:24:02.782678+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19040, "qty": 313, "cost": 5960414, "path": "pullback", "reason": "눌림목 지정가 19,631 도달", "stop": 17921, "target": 20718, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "19,030 vs 18,856"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,592 / 18,856"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,592 / 19,359"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+2.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -35 · 기 +168 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+34%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.54% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "619,193 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.54% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "49"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,631 (현재 19,030)"}]}
{"ts": "2026-07-03T12:00:02.658109+09:00", "side": "BUY", "code": "003490", "name": "대한항공", "price": 28800, "qty": 207, "cost": 5962494, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 26795, "target": 31807, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "28,750 vs 25,942"}, {"label": "정배열(5>20)", "ok": true, "detail": "26,090 / 25,942"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "26,090 / 25,214"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+8.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +55 · 기 +1,952 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.9/5"}, {"label": "상승여력", "ok": true, "detail": "+20%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.38% (환산) vs 평균 0.58% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 28,400"}, {"label": "거래량 급증", "ok": true, "detail": "5,054,442 (환산) vs 평균 2,146,231"}, {"label": "회전율 급증", "ok": true, "detail": "1.38% (환산) vs 평균 0.58%"}, {"label": "RSI", "ok": true, "detail": "64"}]}
{"ts": "2026-07-06T09:00:10.720383+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 14510, "qty": 172, "cost": 2496094, "path": "pullback", "reason": "눌림목 지정가 16,248 도달", "stop": 11748, "target": 18653, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "14,490 vs 12,774"}, {"label": "정배열(5>20)", "ok": true, "detail": "15,806 / 12,774"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "15,806 / 11,453"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+7.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,226 · 기 +134 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+38%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.02% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": false, "detail": "20,667 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": false, "detail": "0.02% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "54"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 16,248 (현재 14,490)"}]}
{"ts": "2026-07-06T09:18:01.678295+09:00", "side": "BUY", "code": "003490", "name": "대한항공", "price": 29500, "qty": 202, "cost": 5959894, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 26795, "target": 31807, "signals": [{"label": "손절선", "ok": true, "detail": "26,795 (현재 29,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 31,807"}, {"label": "추세(20일선)", "ok": true, "detail": "25,980"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -142 · 기 +2,052"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 29,483"}]}
{"ts": "2026-07-06T09:32:06.687499+09:00", "side": "SELL", "code": "214450", "name": "파마리서치", "price": 322000, "qty": 30, "proceeds": 9641163, "entry_price": 353750, "pnl": -972929, "pnl_pct": -8.98, "hold_from": "2026-06-30T09:02:03.198047+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "322,040 (현재 322,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 401,315"}, {"label": "추세(20일선)", "ok": true, "detail": "295,225"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -111 · 기 +227"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-06T09:34:02.072447+09:00", "side": "BUY", "code": "055550", "name": "신한지주", "price": 110000, "qty": 53, "cost": 5830875, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 101901, "target": 122148, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "110,300 vs 97,320"}, {"label": "정배열(5>20)", "ok": true, "detail": "101,240 / 97,320"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "101,240 / 96,630"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+3.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -717 · 기 +1,343 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+17%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.55% (환산) vs 평균 0.35% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 109,800"}, {"label": "거래량 급증", "ok": true, "detail": "2,617,853 (환산) vs 평균 1,653,581"}, {"label": "회전율 급증", "ok": true, "detail": "0.55% (환산) vs 평균 0.35%"}, {"label": "RSI", "ok": true, "detail": "64"}]}
{"ts": "2026-07-07T10:06:07.254677+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 147500, "qty": 16, "cost": 2360354, "path": "pullback", "reason": "눌림목 지정가 148,050 도달", "stop": 118550, "target": 190925, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "147,400 vs 135,785"}, {"label": "정배열(5>20)", "ok": true, "detail": "170,120 / 135,785"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "170,120 / 99,573"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+37.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +96 · 기 -196 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+20%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "7.06% (환산) vs 평균 3.06% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 202,500"}, {"label": "거래량 급증", "ok": true, "detail": "1,366,200 (환산) vs 평균 591,925"}, {"label": "회전율 급증", "ok": true, "detail": "7.06% (환산) vs 평균 3.06%"}, {"label": "RSI", "ok": true, "detail": "56"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 148,050 (현재 147,400)"}]}
{"ts": "2026-07-07T12:02:08.242336+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 12230, "qty": 172, "proceeds": 2099458, "entry_price": 14510, "pnl": -396636, "pnl_pct": -15.71, "hold_from": "2026-07-06T09:00:10.720378+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "11,748 (현재 12,230)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 18,653"}, {"label": "추세(20일선)", "ok": false, "detail": "12,661"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -1,558 · 기 -4"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 15,512"}]}
{"ts": "2026-07-07T14:09:07.839518+09:00", "side": "SELL", "code": "003490", "name": "대한항공", "price": 26600, "qty": 409, "proceeds": 10858185, "entry_price": 29146, "pnl": -1064203, "pnl_pct": -8.73, "hold_from": "2026-07-03T12:00:02.658107+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "27,098 (현재 26,600)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 32,217"}, {"label": "추세(20일선)", "ok": true, "detail": "25,870"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -532 · 기 +3,040"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-07T14:09:10.517865+09:00", "side": "SELL", "code": "055550", "name": "신한지주", "price": 99600, "qty": 53, "proceeds": 5268506, "entry_price": 110000, "pnl": -562368, "pnl_pct": -9.45, "hold_from": "2026-07-06T09:34:02.072445+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "101,901 (현재 99,600)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 122,148"}, {"label": "추세(20일선)", "ok": true, "detail": "96,645"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -733 · 기 +1,535"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 112,480"}]}
{"ts": "2026-07-07T14:09:10.518815+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 177000, "qty": 13, "cost": 2301345, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 118550, "target": 190925, "signals": [{"label": "손절선", "ok": true, "detail": "118,550 (현재 177,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 190,925"}, {"label": "추세(20일선)", "ok": true, "detail": "134,320"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +152 · 기 -281"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 156,742"}]}
{"ts": "2026-07-07T14:09:13.266017+09:00", "side": "BUY", "code": "034730", "name": "SK", "price": 815000, "qty": 4, "cost": 3260489, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 606693, "target": 857461, "signals": [{"label": "손절선", "ok": true, "detail": "606,693 (현재 815,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 857,461"}, {"label": "추세(20일선)", "ok": true, "detail": "673,250"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -44 · 기 +3"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 738,777"}]}
{"ts": "2026-07-08T09:00:18.642297+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 108300, "qty": 16, "proceeds": 1729421, "entry_price": 133400, "pnl": -405299, "pnl_pct": -18.82, "hold_from": "2026-07-03T09:02:04.932434+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "166,450 (현재 112,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": false, "detail": "119,475"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +243 · 기 -857"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-08T09:00:18.643415+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 19110, "qty": 313, "proceeds": 5969766, "entry_price": 19040, "pnl": 9352, "pnl_pct": 0.37, "hold_from": "2026-07-03T10:24:02.782677+09:00", "reason": "트레일링 익절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "19,796 (현재 19,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "18,860"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +193 · 기 +193"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-08T09:00:18.643833+09:00", "side": "SELL", "code": "034730", "name": "SK", "price": 602000, "qty": 8, "proceeds": 4806609, "entry_price": 761000, "pnl": -1282304, "pnl_pct": -20.89, "hold_from": "2026-07-02T09:00:22.920458+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "665,669 (현재 602,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 903,996"}, {"label": "추세(20일선)", "ok": false, "detail": "669,550"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +49 · 기 -19"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-09T09:02:04.471279+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19110, "qty": 295, "cost": 5638296, "path": "pullback", "reason": "눌림목 지정가 19,657 도달", "stop": 18017, "target": 20749, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "19,070 vs 18,858"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,600 / 18,858"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,600 / 19,360"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+0.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -10 · 기 +164 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.08% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "93,540 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.08% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,657 (현재 19,070)"}]}
{"ts": "2026-07-09T09:02:04.471408+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 158300, "qty": 35, "cost": 5541331, "path": "pullback", "reason": "눌림목 지정가 158,582 도달", "stop": 158000, "target": 158750, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "158,200 vs 149,700"}, {"label": "정배열(5>20)", "ok": true, "detail": "169,280 / 149,700"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "169,280 / 113,195"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+81.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +296 · 기 -306 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+13%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.72% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": false, "detail": "499,233 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": false, "detail": "1.72% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "55"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 158,582 (현재 158,200)"}]}
{"ts": "2026-07-09T09:10:01.832068+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 132300, "qty": 40, "cost": 5292794, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 121211, "target": 148933, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "132,100 vs 108,930"}, {"label": "정배열(5>20)", "ok": true, "detail": "115,600 / 108,930"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "115,600 / 113,232"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+22.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -184 · 기 +964 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+12%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.51% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 116,900"}, {"label": "거래량 급증", "ok": true, "detail": "572,860 (환산) vs 평균 359,705"}, {"label": "회전율 급증", "ok": true, "detail": "0.51% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-07-09T09:12:02.514470+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 156900, "qty": 35, "proceeds": 5480792, "entry_price": 158300, "pnl": -60540, "pnl_pct": -0.88, "hold_from": "2026-07-09T09:02:04.471407+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "158,000 (현재 156,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "149,635"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +296 · 기 -306"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-10T09:24:02.110194+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 158900, "qty": 36, "cost": 5721258, "path": "pullback", "reason": "눌림목 지정가 159,557 도달", "stop": 158000, "target": 160250, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "158,800 vs 149,730"}, {"label": "정배열(5>20)", "ok": true, "detail": "169,400 / 149,730"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "169,400 / 113,205"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+82.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +225 · 기 -178 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+13%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "5.62% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": true, "detail": "1,627,273 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": true, "detail": "5.62% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "55"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 159,557 (현재 158,800)"}]}
{"ts": "2026-07-10T09:28:02.628177+09:00", "side": "BUY", "code": "055550", "name": "신한지주", "price": 110900, "qty": 51, "cost": 5656748, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 102716, "target": 123176, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "110,700 vs 97,340"}, {"label": "정배열(5>20)", "ok": true, "detail": "101,320 / 97,340"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "101,320 / 96,637"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+22.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -756 · 기 +893 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+17%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.54% (환산) vs 평균 0.35% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 109,800"}, {"label": "거래량 급증", "ok": true, "detail": "2,541,113 (환산) vs 평균 1,653,581"}, {"label": "회전율 급증", "ok": true, "detail": "0.54% (환산) vs 평균 0.35%"}, {"label": "RSI", "ok": true, "detail": "65"}]}
{"ts": "2026-07-10T09:28:02.628442+09:00", "side": "BUY", "code": "105560", "name": "KB금융", "price": 185900, "qty": 30, "cost": 5577837, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 171311, "target": 207783, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "185,600 vs 159,890"}, {"label": "정배열(5>20)", "ok": true, "detail": "159,900 / 159,890"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "159,900 / 157,368"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+26.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,310 · 기 +1,527 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+16%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.06% (환산) vs 평균 0.46% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 182,700"}, {"label": "거래량 급증", "ok": true, "detail": "3,715,113 (환산) vs 평균 1,640,325"}, {"label": "회전율 급증", "ok": true, "detail": "1.06% (환산) vs 평균 0.46%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-07-10T09:46:11.481167+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 12830, "qty": 185, "cost": 2373906, "path": "pullback", "reason": "눌림목 지정가 15,971 도달", "stop": 10360, "target": 16535, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "12,820 vs 12,690"}, {"label": "정배열(5>20)", "ok": true, "detail": "15,472 / 12,690"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "15,472 / 11,425"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+1.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +228 · 기 +229 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+56%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "9.75% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": true, "detail": "10,460,473 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": true, "detail": "9.75% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 15,971 (현재 12,820)"}]}
{"ts": "2026-07-10T11:16:02.481956+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 13850, "qty": 171, "cost": 2368705, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 10360, "target": 16535, "signals": [{"label": "손절선", "ok": true, "detail": "10,360 (현재 13,850)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 16,535"}, {"label": "추세(20일선)", "ok": true, "detail": "12,742"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +210 · 기 +239"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,843"}]}
{"ts": "2026-07-13T09:00:11.456776+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 136900, "qty": 39, "cost": 5339901, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 121211, "target": 148933, "signals": [{"label": "손절선", "ok": true, "detail": "121,211 (현재 136,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 148,933"}, {"label": "추세(20일선)", "ok": true, "detail": "109,140"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -64 · 기 +919"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 136,164"}]}
{"ts": "2026-07-13T09:36:02.280029+09:00", "side": "BUY", "code": "105560", "name": "KB금융", "price": 191000, "qty": 29, "cost": 5539831, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 171311, "target": 207783, "signals": [{"label": "손절선", "ok": true, "detail": "171,311 (현재 191,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 207,783"}, {"label": "추세(20일선)", "ok": true, "detail": "160,160"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -867 · 기 +1,393"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 190,952"}]}
{"ts": "2026-07-13T12:44:04.360896+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 187900, "qty": 36, "proceeds": 6751209, "entry_price": 158900, "pnl": 1029951, "pnl_pct": 18.25, "hold_from": "2026-07-10T09:24:02.110193+09:00", "reason": "트레일링 익절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "189,133 (현재 187,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "151,185"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -254 · 기 +457"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-15T09:02:02.654017+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 135500, "qty": 16, "cost": 2168325, "path": "pullback", "reason": "눌림목 지정가 154,441 도달", "stop": 106641, "target": 178788, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "134,900 vs 120,585"}, {"label": "정배열(5>20)", "ok": true, "detail": "139,000 / 120,585"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "139,000 / 121,348"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+27.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,752 · 기 +1,989 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+31%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.30% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": false, "detail": "636,187 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": false, "detail": "1.30% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "53"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 154,441 (현재 134,900)"}]}
{"ts": "2026-07-16T09:00:09.801744+09:00", "side": "SELL", "code": "095610", "name": "테스", "price": 209000, "qty": 29, "proceeds": 6049181, "entry_price": 160724, "pnl": 1387482, "pnl_pct": 30.04, "hold_from": "2026-07-07T10:06:07.254675+09:00", "reason": "트레일링 익절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "210,764 (현재 207,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "138,765"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -799 · 기 +891"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-16T09:00:09.803580+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18580, "qty": 295, "proceeds": 5470412, "entry_price": 19110, "pnl": -167884, "pnl_pct": -2.77, "hold_from": "2026-07-09T09:02:04.471277+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "18,017 (현재 18,560)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 20,749"}, {"label": "추세(20일선)", "ok": false, "detail": "18,832"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -120 · 기 -150"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,486"}]}
{"ts": "2026-07-16T14:16:02.487100+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 145700, "qty": 15, "cost": 2185828, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 106641, "target": 178788, "signals": [{"label": "손절선", "ok": true, "detail": "106,641 (현재 145,800)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 178,788"}, {"label": "추세(20일선)", "ok": true, "detail": "121,130"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -1,717 · 기 +2,299"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 145,295"}]}
{"ts": "2026-07-20T09:04:02.885762+09:00", "side": "SELL", "code": "055550", "name": "신한지주", "price": 102700, "qty": 51, "proceeds": 5227486, "entry_price": 110900, "pnl": -429262, "pnl_pct": -7.39, "hold_from": "2026-07-10T09:28:02.628175+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "102,716 (현재 102,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 123,176"}, {"label": "추세(20일선)", "ok": true, "detail": "96,940"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -111 · 기 +265"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 113,514"}]}
{"ts": "2026-07-20T09:04:02.886160+09:00", "side": "SELL", "code": "105560", "name": "KB금융", "price": 173000, "qty": 59, "proceeds": 10187096, "entry_price": 188407, "pnl": -930571, "pnl_pct": -8.18, "hold_from": "2026-07-10T09:28:02.628441+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "173,250 (현재 173,200)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 211,142"}, {"label": "추세(20일선)", "ok": true, "detail": "159,270"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -332 · 기 +291"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-20T12:28:02.321513+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 10310, "qty": 356, "proceeds": 3663203, "entry_price": 13320, "pnl": -1079408, "pnl_pct": -22.6, "hold_from": "2026-07-10T09:46:11.481166+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "10,360 (현재 10,310)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 17,760"}, {"label": "추세(20일선)", "ok": false, "detail": "14,755"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -887 · 기 +515"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-20T12:46:02.284611+09:00", "side": "SELL", "code": "086790", "name": "하나금융지주", "price": 131800, "qty": 103, "proceeds": 13548928, "entry_price": 120181, "pnl": 1168471, "pnl_pct": 9.67, "hold_from": "2026-07-01T09:46:03.094624+09:00", "reason": "트레일링 익절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "131,911 (현재 131,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "118,840"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +0 · 기 +424"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-21T10:08:04.179068+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 133100, "qty": 42, "cost": 5591039, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 123458, "target": 147564, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "133,000 vs 118,895"}, {"label": "정배열(5>20)", "ok": true, "detail": "123,200 / 118,895"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "123,200 / 118,615"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+38.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +137 · 기 +185 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+22%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.57% (환산) vs 평균 0.37% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 130,700"}, {"label": "거래량 급증", "ok": true, "detail": "1,575,915 (환산) vs 평균 1,026,357"}, {"label": "회전율 급증", "ok": true, "detail": "0.57% (환산) vs 평균 0.37%"}, {"label": "RSI", "ok": true, "detail": "63"}]}
{"ts": "2026-07-21T12:06:01.175731+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 344500, "qty": 14, "cost": 4823723, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 313808, "target": 390538, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "344,500 vs 296,350"}, {"label": "정배열(5>20)", "ok": true, "detail": "315,100 / 296,350"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "315,100 / 305,492"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+39.7%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -7 · 기 +1 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+43%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.38% (환산) vs 평균 0.93% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 334,500"}, {"label": "거래량 급증", "ok": true, "detail": "247,158 (환산) vs 평균 96,436"}, {"label": "회전율 급증", "ok": true, "detail": "2.38% (환산) vs 평균 0.93%"}, {"label": "RSI", "ok": true, "detail": "65"}]}
{"ts": "2026-07-22T11:56:00.832893+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 159800, "qty": 35, "cost": 5593839, "path": "pullback", "reason": "눌림목 지정가 159,932 도달", "stop": 158000, "target": 162500, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "159,700 vs 149,775"}, {"label": "정배열(5>20)", "ok": true, "detail": "169,580 / 149,775"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "169,580 / 113,220"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+75.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -408 · 기 +146 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+12%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "4.73% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": true, "detail": "1,371,014 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": true, "detail": "4.73% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "55"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 159,932 (현재 159,700)"}]}
{"ts": "2026-07-22T12:12:00.744641+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 157300, "qty": 35, "proceeds": 5494764, "entry_price": 159800, "pnl": -99075, "pnl_pct": -1.56, "hold_from": "2026-07-22T11:56:00.832892+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "158,000 (현재 157,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 162,500"}, {"label": "추세(20일선)", "ok": true, "detail": "149,655"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -407 · 기 +141"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 169,305"}]}
{"ts": "2026-07-23T09:00:23.070728+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 160100, "qty": 35, "cost": 5604341, "path": "pullback", "reason": "눌림목 지정가 159,493 도달", "stop": 158000, "target": 163250, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "158,100 vs 149,695"}, {"label": "정배열(5>20)", "ok": true, "detail": "169,260 / 149,695"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "169,260 / 113,193"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+76.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -162 · 기 +37 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+13%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.05% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": false, "detail": "303,687 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": false, "detail": "1.05% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "55"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 159,493 (현재 158,100)"}]}
{"ts": "2026-07-23T09:32:04.417538+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 157800, "qty": 35, "proceeds": 5512230, "entry_price": 160100, "pnl": -92110, "pnl_pct": -1.44, "hold_from": "2026-07-23T09:00:23.070721+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "158,000 (현재 157,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "149,685"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -162 · 기 +37"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-23T09:44:04.292322+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 18850, "qty": 302, "cost": 5693554, "path": "pullback", "reason": "눌림목 지정가 19,627 도달", "stop": 17760, "target": 20485, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "18,850 vs 18,847"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,556 / 18,847"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,556 / 19,356"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+13.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -25 · 기 +6 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+34%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.34% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "388,767 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.34% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "48"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,627 (현재 18,850)"}]}
{"ts": "2026-07-23T09:46:06.366618+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 88400, "qty": 57, "cost": 5039556, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 80433, "target": 100350, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "88,300 vs 75,075"}, {"label": "정배열(5>20)", "ok": true, "detail": "83,020 / 75,075"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "83,020 / 75,060"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+47.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -150 · 기 +299 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+17%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.80% (환산) vs 평균 0.42% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 87,600"}, {"label": "거래량 급증", "ok": true, "detail": "743,133 (환산) vs 평균 392,182"}, {"label": "회전율 급증", "ok": true, "detail": "0.80% (환산) vs 평균 0.42%"}, {"label": "RSI", "ok": true, "detail": "67"}]}
{"ts": "2026-07-23T10:30:02.490114+09:00", "side": "BUY", "code": "024060", "name": "흥구석유", "price": 14140, "qty": 250, "cost": 3535530, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 12315, "target": 16878, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "14,180 vs 10,944"}, {"label": "정배열(5>20)", "ok": true, "detail": "13,154 / 10,944"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "13,154 / 12,687"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+55.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +109 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "84.26% (환산) vs 평균 31.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 13,990"}, {"label": "거래량 급증", "ok": true, "detail": "12,639,979 (환산) vs 평균 4,720,532"}, {"label": "회전율 급증", "ok": true, "detail": "84.26% (환산) vs 평균 31.47%"}, {"label": "RSI", "ok": true, "detail": "66"}]}
{"ts": "2026-07-23T10:50:06.634622+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 110600, "qty": 31, "proceeds": 3421914, "entry_price": 140435, "pnl": -932239, "pnl_pct": -21.24, "hold_from": "2026-07-15T09:02:02.654015+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "111,052 (현재 110,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 184,511"}, {"label": "추세(20일선)", "ok": false, "detail": "119,375"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -847 · 기 +78"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-23T12:22:02.600930+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 356000, "qty": 14, "cost": 4984748, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 313808, "target": 390538, "signals": [{"label": "손절선", "ok": true, "detail": "313,808 (현재 356,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 390,538"}, {"label": "추세(20일선)", "ok": true, "detail": "296,925"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +6 · 기 +26"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 355,034"}]}
{"ts": "2026-07-23T13:06:04.443405+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 91400, "qty": 55, "cost": 5027754, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 80433, "target": 100350, "signals": [{"label": "손절선", "ok": true, "detail": "80,433 (현재 91,400)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 100,350"}, {"label": "추세(20일선)", "ok": true, "detail": "75,230"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -169 · 기 +311"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 91,159"}]}
{"ts": "2026-07-24T09:00:06.251306+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18730, "qty": 302, "proceeds": 5645430, "entry_price": 18850, "pnl": -48124, "pnl_pct": -0.64, "hold_from": "2026-07-23T09:44:04.292321+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 18,730)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 20,485"}, {"label": "추세(20일선)", "ok": false, "detail": "18,841"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -5 · 기 -5"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,219"}]}
{"ts": "2026-07-24T09:02:04.048541+09:00", "side": "BUY", "code": "024060", "name": "흥구석유", "price": 15060, "qty": 235, "cost": 3539631, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 12315, "target": 16878, "signals": [{"label": "손절선", "ok": true, "detail": "12,315 (현재 15,020)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 16,878"}, {"label": "추세(20일선)", "ok": true, "detail": "10,986"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +208 · 기 -2"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 14,766"}]}
{"ts": "2026-07-27T09:02:06.237127+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 139000, "qty": 15, "cost": 2085313, "path": "pullback", "reason": "눌림목 지정가 146,775 도달", "stop": 108775, "target": 184337, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "138,700 vs 135,350"}, {"label": "정배열(5>20)", "ok": true, "detail": "168,380 / 135,350"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "168,380 / 99,428"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+28.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +238 · 기 -568 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+41%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.72% (환산) vs 평균 3.06% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 202,500"}, {"label": "거래량 급증", "ok": false, "detail": "526,333 (환산) vs 평균 591,925"}, {"label": "회전율 급증", "ok": false, "detail": "2.72% (환산) vs 평균 3.06%"}, {"label": "RSI", "ok": true, "detail": "53"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 146,775 (현재 138,700)"}]}
{"ts": "2026-07-27T09:02:06.237379+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19100, "qty": 301, "cost": 5749962, "path": "pullback", "reason": "눌림목 지정가 19,673 도달", "stop": 18023, "target": 20715, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "19,070 vs 18,858"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,600 / 18,858"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,600 / 19,360"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+16.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +101 · 기 -3 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.13% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "146,760 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.13% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,673 (현재 19,070)"}]}
{"ts": "2026-07-27T09:02:06.237561+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 7470, "qty": 556, "cost": 4153943, "path": "pullback", "reason": "눌림목 지정가 7,635 도달", "stop": 6645, "target": 8707, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "7,470 vs 4,876"}, {"label": "정배열(5>20)", "ok": true, "detail": "6,452 / 4,876"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,452 / 4,889"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+82.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +49 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.79% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "49,327 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "0.79% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "74"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,635 (현재 7,470)"}]}
{"ts": "2026-07-27T09:04:05.321093+09:00", "side": "SELL", "code": "010950", "name": "S-Oil", "price": 143200, "qty": 79, "proceeds": 11290740, "entry_price": 134571, "pnl": 658045, "pnl_pct": 6.41, "hold_from": "2026-07-09T09:10:01.832067+09:00", "reason": "트레일링 익절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "143,490 (현재 143,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "109,490"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +123 · 기 +226"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-27T09:04:05.321248+09:00", "side": "SELL", "code": "024060", "name": "흥구석유", "price": 12200, "qty": 485, "proceeds": 5905462, "entry_price": 14586, "pnl": -1169699, "pnl_pct": -16.36, "hold_from": "2026-07-23T10:30:02.490113+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "12,708 (현재 12,250)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 17,403"}, {"label": "추세(20일선)", "ok": true, "detail": "10,847"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -85 · 기 +2"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-27T09:08:02.092888+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 7910, "qty": 525, "cost": 4153373, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 6645, "target": 8707, "signals": [{"label": "손절선", "ok": true, "detail": "6,645 (현재 7,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 8,707"}, {"label": "추세(20일선)", "ok": true, "detail": "4,897"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +49 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 7,747"}]}
{"ts": "2026-07-27T09:12:01.521838+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 13150, "qty": 195, "cost": 2564635, "path": "pullback", "reason": "눌림목 지정가 13,180 도달", "stop": 10830, "target": 16630, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "13,150 vs 12,732"}, {"label": "정배열(5>20)", "ok": true, "detail": "14,378 / 12,732"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "14,378 / 13,268"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+1.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +27 · 기 +15 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.46% (환산) vs 평균 1.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 15,870"}, {"label": "거래량 급증", "ok": false, "detail": "274,967 (환산) vs 평균 882,736"}, {"label": "회전율 급증", "ok": false, "detail": "0.46% (환산) vs 평균 1.47%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 13,180 (현재 13,150)"}]}
{"ts": "2026-07-27T09:18:01.995424+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 127700, "qty": 44, "cost": 5619643, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 120030, "target": 139205, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "127,400 vs 113,925"}, {"label": "정배열(5>20)", "ok": true, "detail": "118,940 / 113,925"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "118,940 / 110,142"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+46.7%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +106 · 기 +291 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+16%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.26% (환산) vs 평균 0.17% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 123,300"}, {"label": "거래량 급증", "ok": true, "detail": "439,847 (환산) vs 평균 289,522"}, {"label": "회전율 급증", "ok": true, "detail": "0.26% (환산) vs 평균 0.17%"}, {"label": "RSI", "ok": true, "detail": "71"}]}
{"ts": "2026-07-27T13:40:01.101351+09:00", "side": "SELL", "code": "003680", "name": "한성기업", "price": 6780, "qty": 1081, "proceeds": 7314888, "entry_price": 7684, "pnl": -992428, "pnl_pct": -11.76, "hold_from": "2026-07-27T09:02:06.237559+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "6,854 (현재 6,770)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 8,929"}, {"label": "추세(20일선)", "ok": true, "detail": "4,841"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +50 · 기 +0"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-28T09:00:16.475661+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6780, "qty": 515, "cost": 3492224, "path": "pullback", "reason": "눌림목 지정가 7,596 도달", "stop": 5916, "target": 8077, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "7,050 vs 4,855"}, {"label": "정배열(5>20)", "ok": true, "detail": "6,368 / 4,855"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,368 / 4,882"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+73.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +86 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.01% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "813 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "0.01% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "69"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,596 (현재 7,050)"}]}
{"ts": "2026-07-28T09:10:01.748861+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 7100, "qty": 492, "cost": 3493724, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 5916, "target": 8077, "signals": [{"label": "손절선", "ok": true, "detail": "5,916 (현재 7,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 8,077"}, {"label": "추세(20일선)", "ok": true, "detail": "4,857"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +86 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 7,079"}]}
{"ts": "2026-07-28T09:40:00.880577+09:00", "side": "SELL", "code": "138040", "name": "메리츠금융지주", "price": 119100, "qty": 44, "proceeds": 5230181, "entry_price": 127700, "pnl": -389462, "pnl_pct": -6.73, "hold_from": "2026-07-27T09:18:01.995423+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "120,030 (현재 119,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 139,205"}, {"label": "추세(20일선)", "ok": true, "detail": "113,530"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +77 · 기 +325"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 130,300"}]}
{"ts": "2026-07-28T11:04:03.768405+09:00", "side": "SELL", "code": "252990", "name": "샘씨엔에스", "price": 10790, "qty": 195, "proceeds": 2099947, "entry_price": 13150, "pnl": -464688, "pnl_pct": -17.95, "hold_from": "2026-07-27T09:12:01.521836+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "10,830 (현재 10,810)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 16,630"}, {"label": "추세(20일선)", "ok": false, "detail": "12,616"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +156 · 기 -156"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 14,003"}]}
{"ts": "2026-07-28T13:24:01.025963+09:00", "side": "SELL", "code": "086790", "name": "하나금융지주", "price": 123300, "qty": 42, "proceeds": 5168502, "entry_price": 133100, "pnl": -422537, "pnl_pct": -7.36, "hold_from": "2026-07-21T10:08:04.179066+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "123,458 (현재 123,400)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 147,564"}, {"label": "추세(20일선)", "ok": true, "detail": "118,415"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +122 · 기 -106"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 136,361"}]}
{"ts": "2026-07-29T09:24:09.997467+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 122600, "qty": 17, "cost": 2084513, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 108775, "target": 184337, "signals": [{"label": "손절선", "ok": true, "detail": "108,775 (현재 177,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 184,337"}, {"label": "추세(20일선)", "ok": true, "detail": "134,320"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +453 · 기 -688"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 148,242"}]}
{"ts": "2026-07-29T09:26:01.906646+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18940, "qty": 301, "proceeds": 5689823, "entry_price": 19100, "pnl": -60139, "pnl_pct": -0.84, "hold_from": "2026-07-27T09:02:06.237378+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "19,645 (현재 18,950)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "18,852"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +99 · 기 +138"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T09:26:01.906834+09:00", "side": "SELL", "code": "003680", "name": "한성기업", "price": 6610, "qty": 1007, "proceeds": 6643290, "entry_price": 6936, "pnl": -342657, "pnl_pct": -4.7, "hold_from": "2026-07-28T09:00:16.475655+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "7,526 (현재 6,610)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "4,833"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +188 · 기 +0"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T09:28:01.389679+09:00", "side": "BUY", "code": "090850", "name": "현대이지웰", "price": 6390, "qty": 851, "cost": 5438706, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 5998, "target": 6978, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "6,380 vs 5,358"}, {"label": "정배열(5>20)", "ok": true, "detail": "5,742 / 5,358"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "5,742 / 5,622"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+43.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +73 · 기 -3 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.62% (환산) vs 평균 0.22% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 5,700"}, {"label": "거래량 급증", "ok": true, "detail": "134,413 (환산) vs 평균 49,512"}, {"label": "회전율 급증", "ok": true, "detail": "0.62% (환산) vs 평균 0.22%"}, {"label": "RSI", "ok": true, "detail": "73"}]}
{"ts": "2026-07-29T09:52:02.378118+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 131400, "qty": 38, "cost": 4993949, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 120086, "target": 148371, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "131,100 vs 108,880"}, {"label": "정배열(5>20)", "ok": true, "detail": "115,400 / 108,880"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "115,400 / 113,215"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+46.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +43 · 기 +245 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.9/5"}, {"label": "상승여력", "ok": true, "detail": "+21%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.50% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 116,900"}, {"label": "거래량 급증", "ok": true, "detail": "567,993 (환산) vs 평균 359,705"}, {"label": "회전율 급증", "ok": true, "detail": "0.50% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "68"}]}
{"ts": "2026-07-29T10:24:01.448639+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 123400, "qty": 44, "cost": 5430414, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 115612, "target": 135082, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "123,400 vs 113,725"}, {"label": "정배열(5>20)", "ok": true, "detail": "118,140 / 113,725"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "118,140 / 110,075"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+51.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +47 · 기 +310 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+20%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.38% (환산) vs 평균 0.17% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 123,300"}, {"label": "거래량 급증", "ok": true, "detail": "644,676 (환산) vs 평균 289,522"}, {"label": "회전율 급증", "ok": true, "detail": "0.38% (환산) vs 평균 0.17%"}, {"label": "RSI", "ok": true, "detail": "67"}]}
{"ts": "2026-07-29T10:42:05.418375+09:00", "side": "SELL", "code": "090850", "name": "현대이지웰", "price": 5980, "qty": 851, "proceeds": 5079056, "entry_price": 6390, "pnl": -359649, "pnl_pct": -6.42, "hold_from": "2026-07-29T09:28:01.389677+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,998 (현재 5,980)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 6,978"}, {"label": "추세(20일선)", "ok": true, "detail": "5,338"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +77 · 기 -3"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,521"}]}
{"ts": "2026-07-29T12:50:05.475589+09:00", "side": "SELL", "code": "095610", "name": "테스", "price": 108000, "qty": 32, "proceeds": 3449261, "entry_price": 130288, "pnl": -720565, "pnl_pct": -17.11, "hold_from": "2026-07-27T09:02:06.237125+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "108,775 (현재 108,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 171,878"}, {"label": "추세(20일선)", "ok": false, "detail": "133,815"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +449 · 기 -685"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T14:20:01.512752+09:00", "side": "SELL", "code": "138040", "name": "메리츠금융지주", "price": 115500, "qty": 44, "proceeds": 5072090, "entry_price": 123400, "pnl": -358324, "pnl_pct": -6.4, "hold_from": "2026-07-29T10:24:01.448638+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "115,612 (현재 115,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 135,082"}, {"label": "추세(20일선)", "ok": true, "detail": "113,330"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +44 · 기 +333"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 126,053"}]}
{"ts": "2026-07-30T09:04:07.489079+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19090, "qty": 282, "cost": 5384188, "path": "pullback", "reason": "눌림목 지정가 19,653 도달", "stop": 17993, "target": 20736, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "19,100 vs 18,860"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,606 / 18,860"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,606 / 19,360"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+29.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +2 · 기 +327 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+32%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.14% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "160,727 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.14% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,653 (현재 19,100)"}]}
{"ts": "2026-07-30T09:04:07.489612+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6130, "qty": 429, "cost": 2630164, "path": "pullback", "reason": "눌림목 지정가 7,457 도달", "stop": 5127, "target": 7634, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "6,120 vs 4,808"}, {"label": "정배열(5>20)", "ok": true, "detail": "6,182 / 4,808"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,182 / 4,866"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+65.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +234 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "4.31% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "267,687 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "4.31% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,457 (현재 6,120)"}]}
{"ts": "2026-07-30T09:16:11.939702+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 124100, "qty": 43, "cost": 5337100, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 116280, "target": 135830, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "124,000 vs 113,755"}, {"label": "정배열(5>20)", "ok": true, "detail": "118,260 / 113,755"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "118,260 / 110,085"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+54.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +9 · 기 +389 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+20%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.31% (환산) vs 평균 0.17% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 123,300"}, {"label": "거래량 급증", "ok": true, "detail": "518,220 (환산) vs 평균 289,522"}, {"label": "회전율 급증", "ok": true, "detail": "0.31% (환산) vs 평균 0.17%"}, {"label": "RSI", "ok": true, "detail": "68"}]}
{"ts": "2026-07-30T09:18:10.176757+09:00", "side": "BUY", "code": "090850", "name": "현대이지웰", "price": 6310, "qty": 862, "cost": 5440036, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 5927, "target": 6885, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "6,300 vs 5,354"}, {"label": "정배열(5>20)", "ok": true, "detail": "5,726 / 5,354"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "5,726 / 5,621"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+46.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +87 · 기 +6 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.41% (환산) vs 평균 0.22% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 5,700"}, {"label": "거래량 급증", "ok": true, "detail": "87,813 (환산) vs 평균 49,512"}, {"label": "회전율 급증", "ok": true, "detail": "0.41% (환산) vs 평균 0.22%"}, {"label": "RSI", "ok": true, "detail": "72"}]}
{"ts": "2026-07-30T10:10:07.436089+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 127700, "qty": 42, "cost": 5364205, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 116280, "target": 135830, "signals": [{"label": "손절선", "ok": true, "detail": "116,280 (현재 127,600)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 135,830"}, {"label": "추세(20일선)", "ok": true, "detail": "113,935"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +35 · 기 +392"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 126,835"}]}
{"ts": "2026-07-31T09:04:07.898708+09:00", "side": "SELL", "code": "078930", "name": "GS", "price": 69100, "qty": 112, "proceeds": 7724109, "entry_price": 89873, "pnl": -2343201, "pnl_pct": -23.11, "hold_from": "2026-07-23T09:46:06.366617+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "81,596 (현재 79,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 102,289"}, {"label": "추세(20일선)", "ok": true, "detail": "74,655"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -179 · 기 +325"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-31T09:06:07.027654+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6550, "qty": 402, "cost": 2633495, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 5127, "target": 7634, "signals": [{"label": "손절선", "ok": true, "detail": "5,127 (현재 6,640)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 7,634"}, {"label": "추세(20일선)", "ok": true, "detail": "4,834"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +355 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,453"}]}
{"ts": "2026-08-03T09:36:12.040975+09:00", "side": "SELL", "code": "010950", "name": "S-Oil", "price": 119700, "qty": 38, "proceeds": 4539730, "entry_price": 131400, "pnl": -454219, "pnl_pct": -8.9, "hold_from": "2026-07-29T09:52:02.378116+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "120,086 (현재 119,800)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 148,371"}, {"label": "추세(20일선)", "ok": true, "detail": "108,315"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -35 · 기 +48"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 134,911"}]}
{"ts": "2026-08-03T12:00:11.819206+09:00", "side": "BUY", "code": "194370", "name": "제이에스코퍼레이션", "price": 12910, "qty": 347, "cost": 4480442, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 11713, "target": 14706, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "12,930 vs 11,922"}, {"label": "정배열(5>20)", "ok": true, "detail": "12,138 / 11,922"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "12,138 / 11,924"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+27.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +7 · 기 +10 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+74%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.72% (환산) vs 평균 0.34% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 12,870"}, {"label": "거래량 급증", "ok": true, "detail": "208,994 (환산) vs 평균 99,303"}, {"label": "회전율 급증", "ok": true, "detail": "0.72% (환산) vs 평균 0.34%"}, {"label": "RSI", "ok": true, "detail": "63"}]}
{"ts": "2026-08-03T12:02:09.764716+09:00", "side": "BUY", "code": "194370", "name": "제이에스코퍼레이션", "price": 13420, "qty": 334, "cost": 4482952, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 11713, "target": 14706, "signals": [{"label": "손절선", "ok": true, "detail": "11,713 (현재 13,450)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 14,706"}, {"label": "추세(20일선)", "ok": true, "detail": "11,948"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +7 · 기 +10"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,339"}]}
{"ts": "2026-08-04T09:04:09.472087+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 135900, "qty": 13, "cost": 1766965, "path": "pullback", "reason": "눌림목 지정가 145,918 도달", "stop": 104818, "target": 182523, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "135,700 vs 135,200"}, {"label": "정배열(5>20)", "ok": true, "detail": "167,780 / 135,200"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "167,780 / 99,378"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+24.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +23 · 기 +54 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+45%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "6.62% (환산) vs 평균 3.06% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 202,500"}, {"label": "거래량 급증", "ok": true, "detail": "1,281,140 (환산) vs 평균 591,925"}, {"label": "회전율 급증", "ok": true, "detail": "6.62% (환산) vs 평균 3.06%"}, {"label": "RSI", "ok": true, "detail": "52"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 145,918 (현재 135,700)"}]}
{"ts": "2026-08-04T09:34:09.331557+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 90000, "qty": 50, "cost": 4500675, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 81851, "target": 102223, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "89,800 vs 75,150"}, {"label": "정배열(5>20)", "ok": true, "detail": "83,320 / 75,150"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "83,320 / 75,085"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+55.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +68 · 기 +117 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+15%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.64% (환산) vs 평균 0.42% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 87,600"}, {"label": "거래량 급증", "ok": true, "detail": "595,733 (환산) vs 평균 392,182"}, {"label": "회전율 급증", "ok": true, "detail": "0.64% (환산) vs 평균 0.42%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-08-04T09:48:09.794132+09:00", "side": "SELL", "code": "090850", "name": "현대이지웰", "price": 5920, "qty": 862, "proceeds": 5093089, "entry_price": 6310, "pnl": -346947, "pnl_pct": -6.18, "hold_from": "2026-07-30T09:18:10.176753+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,927 (현재 5,925)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 6,885"}, {"label": "추세(20일선)", "ok": true, "detail": "5,336"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +34 · 기 +9"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,429"}]}
{"ts": "2026-08-04T10:32:12.790021+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 93500, "qty": 48, "cost": 4488673, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 81851, "target": 102223, "signals": [{"label": "손절선", "ok": true, "detail": "81,851 (현재 93,400)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 102,223"}, {"label": "추세(20일선)", "ok": true, "detail": "75,330"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +57 · 기 +117"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 92,841"}]}
{"ts": "2026-08-04T11:00:12.174925+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 12800, "qty": 168, "cost": 2150723, "path": "pullback", "reason": "눌림목 지정가 13,033 도달", "stop": 10340, "target": 16490, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "12,800 vs 12,715"}, {"label": "정배열(5>20)", "ok": true, "detail": "14,308 / 12,715"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "14,308 / 13,263"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-4.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -35 · 기 +49 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.75% (환산) vs 평균 1.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 15,870"}, {"label": "거래량 급증", "ok": true, "detail": "1,655,930 (환산) vs 평균 882,736"}, {"label": "회전율 급증", "ok": true, "detail": "2.75% (환산) vs 평균 1.47%"}, {"label": "RSI", "ok": true, "detail": "49"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 13,033 (현재 12,800)"}]}
{"ts": "2026-08-04T13:26:12.846870+09:00", "side": "SELL", "code": "138040", "name": "메리츠금융지주", "price": 117200, "qty": 85, "proceeds": 9942574, "entry_price": 125879, "pnl": -758731, "pnl_pct": -6.89, "hold_from": "2026-07-30T09:16:11.939699+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "117,673 (현재 117,200)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 138,187"}, {"label": "추세(20일선)", "ok": true, "detail": "113,415"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -24 · 기 +268"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-08-05T09:00:15.244636+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 147600, "qty": 12, "cost": 1771466, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 104818, "target": 182523, "signals": [{"label": "손절선", "ok": true, "detail": "104,818 (현재 147,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 182,523"}, {"label": "추세(20일선)", "ok": true, "detail": "135,790"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -256 · 기 +200"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 145,836"}]}
{"ts": "2026-08-05T09:02:13.249699+09:00", "side": "BUY", "code": "090850", "name": "현대이지웰", "price": 5710, "qty": 912, "cost": 5208301, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 5372, "target": 6218, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "5,730 vs 5,326"}, {"label": "정배열(5>20)", "ok": true, "detail": "5,612 / 5,326"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "5,612 / 5,611"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+11.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +14 · 기 -2 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.46% (환산) vs 평균 0.22% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 5,700"}, {"label": "거래량 급증", "ok": true, "detail": "99,627 (환산) vs 평균 49,512"}, {"label": "회전율 급증", "ok": true, "detail": "0.46% (환산) vs 평균 0.22%"}, {"label": "RSI", "ok": true, "detail": "61"}]}
{"ts": "2026-08-05T09:20:12.630535+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 13640, "qty": 157, "cost": 2141801, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 10340, "target": 16490, "signals": [{"label": "손절선", "ok": true, "detail": "10,340 (현재 13,630)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 16,490"}, {"label": "추세(20일선)", "ok": true, "detail": "12,756"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -72 · 기 +134"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,577"}]}
{"ts": "2026-08-06T09:00:19.453536+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18730, "qty": 282, "proceeds": 5271560, "entry_price": 19090, "pnl": -112627, "pnl_pct": -1.89, "hold_from": "2026-07-30T09:04:07.489076+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "17,993 (현재 18,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 20,736"}, {"label": "추세(20일선)", "ok": false, "detail": "18,842"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -203 · 기 -147"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,459"}]}
{"ts": "2026-08-06T09:14:10.570387+09:00", "side": "BUY", "code": "068270", "name": "셀트리온", "price": 193600, "qty": 26, "cost": 5034355, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 181108, "target": 212338, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "193,500 vs 177,765"}, {"label": "정배열(5>20)", "ok": true, "detail": "186,480 / 177,765"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "186,480 / 176,699"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+20.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +255 · 기 -319 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+42%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.49% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 191,700"}, {"label": "거래량 급증", "ok": true, "detail": "1,163,480 (환산) vs 평균 738,783"}, {"label": "회전율 급증", "ok": true, "detail": "0.49% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "64"}]}
{"ts": "2026-08-06T09:34:15.899562+09:00", "side": "SELL", "code": "090850", "name": "현대이지웰", "price": 5350, "qty": 912, "proceeds": 4869686, "entry_price": 5710, "pnl": -338616, "pnl_pct": -6.3, "hold_from": "2026-08-05T09:02:13.249696+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,372 (현재 5,370)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 6,218"}, {"label": "추세(20일선)", "ok": true, "detail": "5,308"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -30 · 기 -23"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 5,829"}]}
{"ts": "2026-08-06T09:34:15.935447+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 124100, "qty": 41, "cost": 5088863, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 116569, "target": 135396, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "123,900 vs 113,750"}, {"label": "정배열(5>20)", "ok": true, "detail": "118,240 / 113,750"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "118,240 / 110,083"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+34.7%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -53 · 기 +87 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+20%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.27% (환산) vs 평균 0.17% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 123,300"}, {"label": "거래량 급증", "ok": true, "detail": "456,007 (환산) vs 평균 289,522"}, {"label": "회전율 급증", "ok": true, "detail": "0.27% (환산) vs 평균 0.17%"}, {"label": "RSI", "ok": true, "detail": "67"}]}
{"ts": "2026-08-07T09:34:08.773359+09:00", "side": "BUY", "code": "068270", "name": "셀트리온", "price": 198600, "qty": 26, "cost": 5164375, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 181108, "target": 212338, "signals": [{"label": "손절선", "ok": true, "detail": "181,108 (현재 198,600)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 212,338"}, {"label": "추세(20일선)", "ok": true, "detail": "178,020"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +338 · 기 +73"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 197,939"}]}
{"ts": "2026-08-07T11:24:16.050581+09:00", "side": "SELL", "code": "214450", "name": "파마리서치", "price": 356000, "qty": 28, "proceeds": 9948562, "entry_price": 350250, "pnl": 140091, "pnl_pct": 1.64, "hold_from": "2026-07-21T12:06:01.175730+09:00", "reason": "트레일링 익절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "372,486 (현재 354,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "296,825"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +101 · 기 +31"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-08-07T11:26:13.309493+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19170, "qty": 267, "cost": 5119158, "path": "pullback", "reason": "눌림목 지정가 19,668 도달", "stop": 18088, "target": 20793, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "19,160 vs 18,862"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,618 / 18,862"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,618 / 19,362"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+12.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +80 · 기 -80 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+31%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.46% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "535,067 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.46% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,668 (현재 19,160)"}]}
@@ -0,0 +1,203 @@
{
"cash": 22765174.96499997,
"initial": 100000000,
"positions": {
"214450": {
"code": "214450",
"name": "파마리서치",
"sources": [
"auto"
],
"qty": 28,
"entry_price": 350250.0,
"entry_at": "2026-07-21T12:06:01.177446+09:00",
"stop": 318647,
"target": 445059,
"peak": 411500,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 409000,
"tranches": 2,
"tranche_value": 4992940.599795671,
"last_add_price": 356000
},
"003680": {
"code": "003680",
"name": "한성기업",
"sources": [
"auto"
],
"qty": 778,
"entry_price": 6332.982005141388,
"entry_at": "2026-07-30T09:04:07.493859+09:00",
"stop": 5363,
"target": 9244,
"peak": 6840,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 7,457 도달",
"cur_price": 6220,
"tranches": 2,
"tranche_value": 2465159.461256131,
"last_add_price": 6550
},
"194370": {
"code": "194370",
"name": "제이에스코퍼레이션",
"sources": [
"auto"
],
"qty": 636,
"entry_price": 13160.188679245282,
"entry_at": "2026-08-03T12:00:11.823815+09:00",
"stop": 11874,
"target": 17019,
"peak": 14120,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 13370,
"tranches": 2,
"tranche_value": 4188989.7646745183,
"last_add_price": 13420
},
"095610": {
"code": "095610",
"name": "테스",
"sources": [
"auto"
],
"qty": 23,
"entry_price": 141495.65217391305,
"entry_at": "2026-08-04T09:04:09.476523+09:00",
"stop": 111689,
"target": 230917,
"peak": 148000,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 145,918 도달",
"cur_price": 143700,
"tranches": 2,
"tranche_value": 1689991.4917291994,
"last_add_price": 147600
},
"078930": {
"code": "078930",
"name": "GS",
"sources": [
"auto"
],
"qty": 92,
"entry_price": 91711.95652173914,
"entry_at": "2026-08-04T09:34:09.335258+09:00",
"stop": 83188,
"target": 117283,
"peak": 101600,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 97700,
"tranches": 2,
"tranche_value": 4268719.0892993,
"last_add_price": 93500
},
"252990": {
"code": "252990",
"name": "샘씨엔에스",
"sources": [
"auto"
],
"qty": 303,
"entry_price": 13207.524752475247,
"entry_at": "2026-08-04T11:00:12.182010+09:00",
"stop": 10878,
"target": 20196,
"peak": 15670,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 13,033 도달",
"cur_price": 15670,
"tranches": 2,
"tranche_value": 2008681.3553691048,
"last_add_price": 13640
},
"068270": {
"code": "068270",
"name": "셀트리온",
"sources": [
"interest"
],
"qty": 49,
"entry_price": 196048.97959183675,
"entry_at": "2026-08-06T09:14:10.574454+09:00",
"stop": 183032,
"target": 235100,
"peak": 201000,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 201000,
"tranches": 2,
"tranche_value": 4855136.307499998,
"last_add_price": 198600
},
"138040": {
"code": "138040",
"name": "메리츠금융지주",
"sources": [
"auto"
],
"qty": 38,
"entry_price": 124100,
"entry_at": "2026-08-06T09:34:15.941137+09:00",
"stop": 116569,
"target": 146692,
"peak": 126400,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 123200,
"tranches": 1,
"tranche_value": 4829053.580937498,
"last_add_price": 124100
}
},
"realized_pnl": -24106937.047000036,
"closed_trades": 42,
"wins": 1,
"peak_equity": 100161893.89500001,
"max_drawdown": 0.24469424425713165,
"last_exit": {
"086790": "2026-07-29",
"030000": "2026-08-06",
"005930": "2026-06-23",
"403870": "2026-07-02",
"003490": "2026-07-07",
"240810": "2026-07-23",
"093370": "2026-07-20",
"214450": "2026-07-06",
"055550": "2026-07-20",
"034730": "2026-07-08",
"319660": "2026-07-23",
"105560": "2026-07-20",
"095610": "2026-07-29",
"024060": "2026-07-27",
"003680": "2026-07-29",
"252990": "2026-07-28",
"010950": "2026-08-03",
"090850": "2026-08-06",
"138040": "2026-08-04",
"078930": "2026-07-31"
},
"created_at": "2026-06-15T14:55:00.582864+09:00",
"updated_at": "2026-08-10T15:28:14.962415+09:00"
}
@@ -0,0 +1,119 @@
{"ts": "2026-06-17T11:15:02.376852+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 130900, "qty": 47, "cost": 6153223, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 121254, "target": 159837, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "129,300 vs 118,195"}, {"label": "정배열(5>20)", "ok": true, "detail": "120,400 / 118,195"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "120,400 / 118,307"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-13.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +371 · 기 +158 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+22%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.12% (환산) vs 평균 0.38% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 126,500"}, {"label": "거래량 급증", "ok": true, "detail": "3,094,534 (환산) vs 평균 1,031,725"}, {"label": "회전율 급증", "ok": true, "detail": "1.12% (환산) vs 평균 0.38%"}, {"label": "RSI", "ok": true, "detail": "60"}]}
{"ts": "2026-06-19T09:02:06.423491+09:00", "side": "BUY", "code": "005930", "name": "삼성전자", "price": 373500, "qty": 15, "cost": 5603340, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 341819, "target": 468542, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "373,000 vs 325,400"}, {"label": "정배열(5>20)", "ok": true, "detail": "352,400 / 325,400"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "352,400 / 258,005"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+6.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,427 · 기 +4,448 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+19%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.04% (환산) vs 평균 0.53% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 370,000"}, {"label": "거래량 급증", "ok": true, "detail": "60,950,213 (환산) vs 평균 31,088,390"}, {"label": "회전율 급증", "ok": true, "detail": "1.04% (환산) vs 평균 0.53%"}, {"label": "RSI", "ok": true, "detail": "67"}]}
{"ts": "2026-06-19T09:02:06.423877+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19160, "qty": 325, "cost": 6227934, "path": "pullback", "reason": "눌림목 지정가 19,690 도달", "stop": 18100, "target": 22339, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "19,150 vs 18,862"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,616 / 18,862"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,616 / 19,361"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-31.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,162 · 기 +2,080 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.03% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "37,673 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.03% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,690 (현재 19,150)"}]}
{"ts": "2026-06-19T13:32:02.866530+09:00", "side": "SELL", "code": "086790", "name": "하나금융지주", "price": 121100, "qty": 47, "proceeds": 5680601, "entry_price": 130900, "pnl": -472622, "pnl_pct": -7.49, "hold_from": "2026-06-17T11:15:02.376851+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "121,254 (현재 121,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 159,837"}, {"label": "추세(20일선)", "ok": true, "detail": "118,300"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +531 · 기 -129"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 134,178"}]}
{"ts": "2026-06-23T09:00:11.509794+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18820, "qty": 325, "proceeds": 6104573, "entry_price": 19160, "pnl": -123361, "pnl_pct": -1.77, "hold_from": "2026-06-19T09:02:06.423876+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "18,100 (현재 18,710)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,339"}, {"label": "추세(20일선)", "ok": false, "detail": "18,840"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -318 · 기 -227"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,528"}]}
{"ts": "2026-06-23T09:26:03.176769+09:00", "side": "SELL", "code": "005930", "name": "삼성전자", "price": 339500, "qty": 15, "proceeds": 5082570, "entry_price": 373500, "pnl": -520771, "pnl_pct": -9.1, "hold_from": "2026-06-19T09:02:06.423490+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "341,819 (현재 340,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 468,542"}, {"label": "추세(20일선)", "ok": true, "detail": "329,525"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -3,330 · 기 +1,369"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 384,493"}]}
{"ts": "2026-06-24T09:02:02.386492+09:00", "side": "BUY", "code": "403870", "name": "HPSP", "price": 53200, "qty": 49, "cost": 2607191, "path": "pullback", "reason": "눌림목 지정가 60,114 도달", "stop": 43200, "target": 83200, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "53,200 vs 52,378"}, {"label": "정배열(5>20)", "ok": true, "detail": "57,960 / 52,378"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "57,960 / 49,671"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+20.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +711 · 기 -2,060 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+29%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.34% (환산) vs 평균 5.97% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 71,500"}, {"label": "거래량 급증", "ok": false, "detail": "1,102,733 (환산) vs 평균 4,912,598"}, {"label": "회전율 급증", "ok": false, "detail": "1.34% (환산) vs 평균 5.97%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 60,114 (현재 53,200)"}]}
{"ts": "2026-06-24T09:08:00.998362+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 155400, "qty": 18, "cost": 2797620, "path": "pullback", "reason": "눌림목 지정가 155,963 도달", "stop": 128063, "target": 237411, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "155,400 vs 121,610"}, {"label": "정배열(5>20)", "ok": true, "detail": "143,100 / 121,610"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "143,100 / 121,690"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+45.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +210 · 기 +143 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+6%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "6.50% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": true, "detail": "3,192,593 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": true, "detail": "6.50% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 155,963 (현재 155,400)"}]}
{"ts": "2026-06-25T09:04:05.757280+09:00", "side": "BUY", "code": "003490", "name": "대한항공", "price": 28900, "qty": 213, "cost": 6156623, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 26911, "target": 34866, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "28,850 vs 25,948"}, {"label": "정배열(5>20)", "ok": true, "detail": "26,110 / 25,948"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "26,110 / 25,216"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-2.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +1,577 · 기 -7 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.9/5"}, {"label": "상승여력", "ok": true, "detail": "+15%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.54% (환산) vs 평균 0.58% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 28,400"}, {"label": "거래량 급증", "ok": true, "detail": "5,629,873 (환산) vs 평균 2,146,231"}, {"label": "회전율 급증", "ok": true, "detail": "1.54% (환산) vs 평균 0.58%"}, {"label": "RSI", "ok": true, "detail": "64"}]}
{"ts": "2026-06-26T09:00:08.123515+09:00", "side": "SELL", "code": "403870", "name": "HPSP", "price": 50000, "qty": 49, "proceeds": 2445222, "entry_price": 53200, "pnl": -161969, "pnl_pct": -6.02, "hold_from": "2026-06-24T09:02:02.386490+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "43,200 (현재 51,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 83,200"}, {"label": "추세(20일선)", "ok": false, "detail": "52,268"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -311 · 기 -267"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 57,056"}]}
{"ts": "2026-06-26T09:04:03.908239+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 164900, "qty": 17, "cost": 2803720, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 128063, "target": 237411, "signals": [{"label": "손절선", "ok": true, "detail": "128,063 (현재 164,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 237,411"}, {"label": "추세(20일선)", "ok": true, "detail": "122,075"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -140 · 기 +323"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 164,359"}]}
{"ts": "2026-06-30T09:00:09.173965+09:00", "side": "BUY", "code": "403870", "name": "HPSP", "price": 55300, "qty": 43, "cost": 2378257, "path": "pullback", "reason": "눌림목 지정가 60,222 도달", "stop": 44022, "target": 89135, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "53,700 vs 52,402"}, {"label": "정배열(5>20)", "ok": true, "detail": "58,060 / 52,402"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "58,060 / 49,679"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+12.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +222 · 기 -821 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+28%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.00% (환산) vs 평균 5.97% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 71,500"}, {"label": "거래량 급증", "ok": false, "detail": "827 (환산) vs 평균 4,912,598"}, {"label": "회전율 급증", "ok": false, "detail": "0.00% (환산) vs 평균 5.97%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 60,222 (현재 53,700)"}]}
{"ts": "2026-06-30T09:02:03.199964+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 347500, "qty": 15, "cost": 5213282, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 316272, "target": 441184, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "347,000 vs 296,475"}, {"label": "정배열(5>20)", "ok": true, "detail": "315,600 / 296,475"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "315,600 / 305,533"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+29.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -19 · 기 +146 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+39%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.55% (환산) vs 평균 0.93% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 334,500"}, {"label": "거래량 급증", "ok": true, "detail": "160,800 (환산) vs 평균 96,436"}, {"label": "회전율 급증", "ok": true, "detail": "1.55% (환산) vs 평균 0.93%"}, {"label": "RSI", "ok": true, "detail": "66"}]}
{"ts": "2026-06-30T09:06:03.692333+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 360000, "qty": 15, "cost": 5400810, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 316272, "target": 441184, "signals": [{"label": "손절선", "ok": true, "detail": "316,272 (현재 360,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 441,184"}, {"label": "추세(20일선)", "ok": true, "detail": "297,125"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -19 · 기 +146"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 358,070"}]}
{"ts": "2026-07-01T09:46:03.099483+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 118200, "qty": 52, "cost": 6147322, "path": "pullback", "reason": "눌림목 지정가 118,779 도달", "stop": 111000, "target": 139800, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "118,200 vs 118,155"}, {"label": "정배열(5>20)", "ok": true, "detail": "120,240 / 118,155"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "120,240 / 118,368"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+3.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +55 · 기 -166 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.35% (환산) vs 평균 0.37% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 130,700"}, {"label": "거래량 급증", "ok": false, "detail": "969,420 (환산) vs 평균 1,026,357"}, {"label": "회전율 급증", "ok": false, "detail": "0.35% (환산) vs 평균 0.37%"}, {"label": "RSI", "ok": true, "detail": "49"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 118,779 (현재 118,200)"}]}
{"ts": "2026-07-02T09:00:23.031465+09:00", "side": "BUY", "code": "034730", "name": "SK", "price": 707000, "qty": 4, "cost": 2828424, "path": "pullback", "reason": "눌림목 지정가 714,693 도달", "stop": 606693, "target": 1007921, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "714,000 vs 675,150"}, {"label": "정배열(5>20)", "ok": true, "detail": "760,800 / 675,150"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "760,800 / 530,100"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+11.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -198 · 기 +92 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+17%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.32% (환산) vs 평균 0.45% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 883,000"}, {"label": "거래량 급증", "ok": false, "detail": "230,413 (환산) vs 평균 329,863"}, {"label": "회전율 급증", "ok": false, "detail": "0.32% (환산) vs 평균 0.45%"}, {"label": "RSI", "ok": true, "detail": "55"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 714,693 (현재 714,000)"}]}
{"ts": "2026-07-02T09:08:01.929631+09:00", "side": "SELL", "code": "003490", "name": "대한항공", "price": 26900, "qty": 213, "proceeds": 5718527, "entry_price": 28900, "pnl": -438096, "pnl_pct": -6.92, "hold_from": "2026-06-25T09:04:05.757278+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "26,911 (현재 26,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 34,866"}, {"label": "추세(20일선)", "ok": true, "detail": "25,850"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -249 · 기 +991"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 29,517"}]}
{"ts": "2026-07-02T10:18:03.855071+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 15980, "qty": 184, "cost": 2940761, "path": "pullback", "reason": "눌림목 지정가 16,358 도달", "stop": 13328, "target": 23935, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "15,980 vs 12,848"}, {"label": "정배열(5>20)", "ok": true, "detail": "16,104 / 12,848"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "16,104 / 11,478"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+25.7%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,833 · 기 +437 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+25%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "9.98% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": true, "detail": "10,701,165 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": true, "detail": "9.98% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "60"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 16,358 (현재 15,980)"}]}
{"ts": "2026-07-02T10:18:03.855399+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 122200, "qty": 51, "cost": 6233135, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 111000, "target": 139800, "signals": [{"label": "손절선", "ok": true, "detail": "111,000 (현재 122,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 139,800"}, {"label": "추세(20일선)", "ok": true, "detail": "118,345"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +22 · 기 -44"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 121,743"}]}
{"ts": "2026-07-02T10:34:04.131823+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 18860, "qty": 325, "cost": 6130419, "path": "pullback", "reason": "눌림목 지정가 19,580 도달", "stop": 17760, "target": 22160, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "18,860 vs 18,848"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,558 / 18,848"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,558 / 19,356"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+3.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -339 · 기 +110 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+35%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.80% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "924,985 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.80% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "48"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,580 (현재 18,860)"}]}
{"ts": "2026-07-02T11:20:02.067977+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 22550, "qty": 272, "cost": 6134520, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 17760, "target": 22160, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 19,350)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,160"}, {"label": "추세(20일선)", "ok": true, "detail": "18,872"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -339 · 기 +110"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,250"}]}
{"ts": "2026-07-02T11:22:01.976821+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 19000, "qty": 597, "proceeds": 11320881, "entry_price": 20541, "pnl": -944058, "pnl_pct": -7.5, "hold_from": "2026-07-02T10:34:04.131822+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "19,371 (현재 19,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 24,051"}, {"label": "추세(20일선)", "ok": true, "detail": "18,860"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -339 · 기 +110"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-02T14:48:03.085176+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 133000, "qty": 35, "proceeds": 4645923, "entry_price": 160014, "pnl": -955417, "pnl_pct": -16.88, "hold_from": "2026-06-24T09:08:00.998361+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "133,138 (현재 133,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 240,643"}, {"label": "추세(20일선)", "ok": true, "detail": "120,490"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +395 · 기 -1,516"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-02T15:04:06.197615+09:00", "side": "SELL", "code": "403870", "name": "HPSP", "price": 43900, "qty": 43, "proceeds": 1884019, "entry_price": 55300, "pnl": -494238, "pnl_pct": -20.61, "hold_from": "2026-06-30T09:00:09.173958+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "44,022 (현재 43,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 89,135"}, {"label": "추세(20일선)", "ok": false, "detail": "51,912"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +2,379 · 기 -6,625"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 59,411"}]}
{"ts": "2026-07-03T09:02:04.934571+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 133400, "qty": 16, "cost": 2134720, "path": "pullback", "reason": "눌림목 지정가 154,163 도달", "stop": 104263, "target": 220811, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "133,300 vs 120,505"}, {"label": "정배열(5>20)", "ok": true, "detail": "138,680 / 120,505"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "138,680 / 121,322"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+18.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +674 · 기 -2,170 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+31%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.16% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": false, "detail": "571,607 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": false, "detail": "1.16% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "52"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 154,163 (현재 133,300)"}]}
{"ts": "2026-07-03T09:56:06.780331+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 13310, "qty": 184, "proceeds": 2444264, "entry_price": 15980, "pnl": -496497, "pnl_pct": -16.71, "hold_from": "2026-07-02T10:18:03.855070+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "13,328 (현재 13,320)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 23,935"}, {"label": "추세(20일선)", "ok": true, "detail": "12,716"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -1,591 · 기 +253"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 16,944"}]}
{"ts": "2026-07-03T10:24:02.784406+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19040, "qty": 313, "cost": 5960414, "path": "pullback", "reason": "눌림목 지정가 19,631 도달", "stop": 17921, "target": 22396, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "19,030 vs 18,856"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,592 / 18,856"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,592 / 19,359"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+2.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -35 · 기 +168 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+34%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.54% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "619,193 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.54% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "49"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,631 (현재 19,030)"}]}
{"ts": "2026-07-03T12:00:02.660215+09:00", "side": "BUY", "code": "003490", "name": "대한항공", "price": 28800, "qty": 207, "cost": 5962494, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 26795, "target": 34815, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "28,750 vs 25,942"}, {"label": "정배열(5>20)", "ok": true, "detail": "26,090 / 25,942"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "26,090 / 25,214"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+8.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +55 · 기 +1,952 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.9/5"}, {"label": "상승여력", "ok": true, "detail": "+20%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.38% (환산) vs 평균 0.58% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 28,400"}, {"label": "거래량 급증", "ok": true, "detail": "5,054,442 (환산) vs 평균 2,146,231"}, {"label": "회전율 급증", "ok": true, "detail": "1.38% (환산) vs 평균 0.58%"}, {"label": "RSI", "ok": true, "detail": "64"}]}
{"ts": "2026-07-06T09:00:10.818917+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 14510, "qty": 172, "cost": 2496094, "path": "pullback", "reason": "눌림목 지정가 16,248 도달", "stop": 11748, "target": 22796, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "14,490 vs 12,774"}, {"label": "정배열(5>20)", "ok": true, "detail": "15,806 / 12,774"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "15,806 / 11,453"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+7.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,226 · 기 +134 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+38%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.02% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": false, "detail": "20,667 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": false, "detail": "0.02% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "54"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 16,248 (현재 14,490)"}]}
{"ts": "2026-07-06T09:18:01.680155+09:00", "side": "BUY", "code": "003490", "name": "대한항공", "price": 29500, "qty": 202, "cost": 5959894, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 26795, "target": 34815, "signals": [{"label": "손절선", "ok": true, "detail": "26,795 (현재 29,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 34,815"}, {"label": "추세(20일선)", "ok": true, "detail": "25,980"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -142 · 기 +2,052"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 29,483"}]}
{"ts": "2026-07-06T09:32:06.689403+09:00", "side": "SELL", "code": "214450", "name": "파마리서치", "price": 322000, "qty": 30, "proceeds": 9641163, "entry_price": 353750, "pnl": -972929, "pnl_pct": -8.98, "hold_from": "2026-06-30T09:02:03.199963+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "322,040 (현재 322,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 448,880"}, {"label": "추세(20일선)", "ok": true, "detail": "295,225"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -111 · 기 +227"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-06T09:34:02.074888+09:00", "side": "BUY", "code": "055550", "name": "신한지주", "price": 110000, "qty": 53, "cost": 5830875, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 101901, "target": 134296, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "110,300 vs 97,320"}, {"label": "정배열(5>20)", "ok": true, "detail": "101,240 / 97,320"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "101,240 / 96,630"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+3.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -717 · 기 +1,343 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+17%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.55% (환산) vs 평균 0.35% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 109,800"}, {"label": "거래량 급증", "ok": true, "detail": "2,617,853 (환산) vs 평균 1,653,581"}, {"label": "회전율 급증", "ok": true, "detail": "0.55% (환산) vs 평균 0.35%"}, {"label": "RSI", "ok": true, "detail": "64"}]}
{"ts": "2026-07-07T10:06:07.256793+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 147500, "qty": 16, "cost": 2360354, "path": "pullback", "reason": "눌림목 지정가 148,050 도달", "stop": 118550, "target": 234350, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "147,400 vs 135,785"}, {"label": "정배열(5>20)", "ok": true, "detail": "170,120 / 135,785"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "170,120 / 99,573"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+37.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +96 · 기 -196 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+20%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "7.06% (환산) vs 평균 3.06% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 202,500"}, {"label": "거래량 급증", "ok": true, "detail": "1,366,200 (환산) vs 평균 591,925"}, {"label": "회전율 급증", "ok": true, "detail": "7.06% (환산) vs 평균 3.06%"}, {"label": "RSI", "ok": true, "detail": "56"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 148,050 (현재 147,400)"}]}
{"ts": "2026-07-07T12:02:08.245077+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 12230, "qty": 172, "proceeds": 2099458, "entry_price": 14510, "pnl": -396636, "pnl_pct": -15.71, "hold_from": "2026-07-06T09:00:10.818908+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "11,748 (현재 12,230)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,796"}, {"label": "추세(20일선)", "ok": false, "detail": "12,661"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -1,558 · 기 -4"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 15,512"}]}
{"ts": "2026-07-07T14:09:15.947172+09:00", "side": "SELL", "code": "003490", "name": "대한항공", "price": 26600, "qty": 409, "proceeds": 10858185, "entry_price": 29146, "pnl": -1064203, "pnl_pct": -8.73, "hold_from": "2026-07-03T12:00:02.660214+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "27,098 (현재 26,600)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 35,289"}, {"label": "추세(20일선)", "ok": true, "detail": "25,870"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -532 · 기 +3,040"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-07T14:09:18.521517+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 183300, "qty": 12, "cost": 2199930, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 104263, "target": 220811, "signals": [{"label": "손절선", "ok": true, "detail": "104,263 (현재 183,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 220,811"}, {"label": "추세(20일선)", "ok": true, "detail": "120,210"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +263 · 기 -1,543"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 141,825"}]}
{"ts": "2026-07-07T14:09:18.522523+09:00", "side": "SELL", "code": "055550", "name": "신한지주", "price": 99600, "qty": 53, "proceeds": 5268506, "entry_price": 110000, "pnl": -562368, "pnl_pct": -9.45, "hold_from": "2026-07-06T09:34:02.074886+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "101,901 (현재 99,600)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 134,296"}, {"label": "추세(20일선)", "ok": true, "detail": "96,645"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -733 · 기 +1,535"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 112,480"}]}
{"ts": "2026-07-07T14:09:18.522957+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 177000, "qty": 13, "cost": 2301345, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 118550, "target": 234350, "signals": [{"label": "손절선", "ok": true, "detail": "118,550 (현재 177,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 234,350"}, {"label": "추세(20일선)", "ok": true, "detail": "134,320"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +152 · 기 -281"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 156,742"}]}
{"ts": "2026-07-07T14:09:21.260290+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 20750, "qty": 287, "cost": 5956143, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 17921, "target": 22396, "signals": [{"label": "손절선", "ok": true, "detail": "17,921 (현재 20,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,396"}, {"label": "추세(20일선)", "ok": true, "detail": "18,884"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +156 · 기 +113"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,358"}]}
{"ts": "2026-07-07T14:09:21.261209+09:00", "side": "BUY", "code": "034730", "name": "SK", "price": 815000, "qty": 4, "cost": 3260489, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 606693, "target": 1007921, "signals": [{"label": "손절선", "ok": true, "detail": "606,693 (현재 815,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 1,007,921"}, {"label": "추세(20일선)", "ok": true, "detail": "673,250"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -44 · 기 +3"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 738,777"}]}
{"ts": "2026-07-08T09:00:18.745728+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 108300, "qty": 28, "proceeds": 3026487, "entry_price": 154786, "pnl": -1308163, "pnl_pct": -30.03, "hold_from": "2026-07-03T09:02:04.934570+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "129,511 (현재 112,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 230,609"}, {"label": "추세(20일선)", "ok": false, "detail": "119,475"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +243 · 기 -857"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-08T09:00:18.747313+09:00", "side": "SELL", "code": "034730", "name": "SK", "price": 602000, "qty": 8, "proceeds": 4806609, "entry_price": 761000, "pnl": -1282304, "pnl_pct": -20.89, "hold_from": "2026-07-02T09:00:23.031459+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "665,669 (현재 602,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 1,046,992"}, {"label": "추세(20일선)", "ok": false, "detail": "669,550"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +49 · 기 -19"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-08T09:12:05.975704+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18900, "qty": 600, "proceeds": 11317887, "entry_price": 19858, "pnl": -598670, "pnl_pct": -4.82, "hold_from": "2026-07-03T10:24:02.784405+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "18,904 (현재 18,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,721"}, {"label": "추세(20일선)", "ok": true, "detail": "18,850"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +193 · 기 +193"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-09T09:02:04.473413+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19110, "qty": 290, "cost": 5542731, "path": "pullback", "reason": "눌림목 지정가 19,657 도달", "stop": 18017, "target": 22388, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "19,070 vs 18,858"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,600 / 18,858"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,600 / 19,360"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+0.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -10 · 기 +164 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.08% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "93,540 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.08% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,657 (현재 19,070)"}]}
{"ts": "2026-07-09T09:02:04.473531+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 158300, "qty": 35, "cost": 5541331, "path": "pullback", "reason": "눌림목 지정가 158,582 도달", "stop": 158000, "target": 159200, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "158,200 vs 149,700"}, {"label": "정배열(5>20)", "ok": true, "detail": "169,280 / 149,700"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "169,280 / 113,195"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+81.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +296 · 기 -306 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+13%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.72% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": false, "detail": "499,233 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": false, "detail": "1.72% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "55"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 158,582 (현재 158,200)"}]}
{"ts": "2026-07-09T09:10:01.833875+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 132300, "qty": 40, "cost": 5292794, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 121211, "target": 165566, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "132,100 vs 108,930"}, {"label": "정배열(5>20)", "ok": true, "detail": "115,600 / 108,930"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "115,600 / 113,232"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+22.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -184 · 기 +964 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+12%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.51% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 116,900"}, {"label": "거래량 급증", "ok": true, "detail": "572,860 (환산) vs 평균 359,705"}, {"label": "회전율 급증", "ok": true, "detail": "0.51% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-07-09T09:12:02.516283+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 156900, "qty": 35, "proceeds": 5480792, "entry_price": 158300, "pnl": -60540, "pnl_pct": -0.88, "hold_from": "2026-07-09T09:02:04.473529+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "158,000 (현재 156,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "149,635"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +296 · 기 -306"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-10T09:24:02.112068+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 158900, "qty": 35, "cost": 5562334, "path": "pullback", "reason": "눌림목 지정가 159,557 도달", "stop": 158000, "target": 161600, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "158,800 vs 149,730"}, {"label": "정배열(5>20)", "ok": true, "detail": "169,400 / 149,730"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "169,400 / 113,205"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+82.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +225 · 기 -178 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+13%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "5.62% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": true, "detail": "1,627,273 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": true, "detail": "5.62% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "55"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 159,557 (현재 158,800)"}]}
{"ts": "2026-07-10T09:28:02.630374+09:00", "side": "BUY", "code": "055550", "name": "신한지주", "price": 110900, "qty": 50, "cost": 5545832, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 102716, "target": 135453, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "110,700 vs 97,340"}, {"label": "정배열(5>20)", "ok": true, "detail": "101,320 / 97,340"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "101,320 / 96,637"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+22.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -756 · 기 +893 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+17%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.54% (환산) vs 평균 0.35% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 109,800"}, {"label": "거래량 급증", "ok": true, "detail": "2,541,113 (환산) vs 평균 1,653,581"}, {"label": "회전율 급증", "ok": true, "detail": "0.54% (환산) vs 평균 0.35%"}, {"label": "RSI", "ok": true, "detail": "65"}]}
{"ts": "2026-07-10T09:28:02.630605+09:00", "side": "BUY", "code": "105560", "name": "KB금융", "price": 185900, "qty": 30, "cost": 5577837, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 171311, "target": 229666, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "185,600 vs 159,890"}, {"label": "정배열(5>20)", "ok": true, "detail": "159,900 / 159,890"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "159,900 / 157,368"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+26.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,310 · 기 +1,527 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+16%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.06% (환산) vs 평균 0.46% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 182,700"}, {"label": "거래량 급증", "ok": true, "detail": "3,715,113 (환산) vs 평균 1,640,325"}, {"label": "회전율 급증", "ok": true, "detail": "1.06% (환산) vs 평균 0.46%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-07-10T09:46:11.483050+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 12830, "qty": 181, "cost": 2322578, "path": "pullback", "reason": "눌림목 지정가 15,971 도달", "stop": 10360, "target": 20240, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "12,820 vs 12,690"}, {"label": "정배열(5>20)", "ok": true, "detail": "15,472 / 12,690"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "15,472 / 11,425"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+1.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +228 · 기 +229 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+56%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "9.75% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": true, "detail": "10,460,473 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": true, "detail": "9.75% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 15,971 (현재 12,820)"}]}
{"ts": "2026-07-10T11:16:02.483909+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 13850, "qty": 168, "cost": 2327149, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 10360, "target": 20240, "signals": [{"label": "손절선", "ok": true, "detail": "10,360 (현재 13,850)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 20,240"}, {"label": "추세(20일선)", "ok": true, "detail": "12,742"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +210 · 기 +239"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,843"}]}
{"ts": "2026-07-13T09:00:11.568255+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 136900, "qty": 38, "cost": 5202980, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 121211, "target": 165566, "signals": [{"label": "손절선", "ok": true, "detail": "121,211 (현재 136,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 165,566"}, {"label": "추세(20일선)", "ok": true, "detail": "109,140"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -64 · 기 +919"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 136,164"}]}
{"ts": "2026-07-13T09:36:02.281862+09:00", "side": "BUY", "code": "105560", "name": "KB금융", "price": 191000, "qty": 29, "cost": 5539831, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 171311, "target": 229666, "signals": [{"label": "손절선", "ok": true, "detail": "171,311 (현재 191,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 229,666"}, {"label": "추세(20일선)", "ok": true, "detail": "160,160"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -867 · 기 +1,393"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 190,952"}]}
{"ts": "2026-07-13T12:44:04.362715+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 187900, "qty": 35, "proceeds": 6563676, "entry_price": 158900, "pnl": 1001342, "pnl_pct": 18.25, "hold_from": "2026-07-10T09:24:02.112067+09:00", "reason": "트레일링 익절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "189,133 (현재 187,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "151,185"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -254 · 기 +457"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-15T09:02:02.656005+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 135500, "qty": 15, "cost": 2032805, "path": "pullback", "reason": "눌림목 지정가 154,441 도달", "stop": 106641, "target": 222076, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "134,900 vs 120,585"}, {"label": "정배열(5>20)", "ok": true, "detail": "139,000 / 120,585"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "139,000 / 121,348"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+27.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,752 · 기 +1,989 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+31%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.30% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": false, "detail": "636,187 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": false, "detail": "1.30% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "53"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 154,441 (현재 134,900)"}]}
{"ts": "2026-07-16T09:00:09.907774+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18580, "qty": 290, "proceeds": 5377693, "entry_price": 19110, "pnl": -165038, "pnl_pct": -2.77, "hold_from": "2026-07-09T09:02:04.473411+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "18,017 (현재 18,560)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,388"}, {"label": "추세(20일선)", "ok": false, "detail": "18,832"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -120 · 기 -150"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,486"}]}
{"ts": "2026-07-16T14:16:02.489161+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 145700, "qty": 14, "cost": 2040106, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 106641, "target": 222076, "signals": [{"label": "손절선", "ok": true, "detail": "106,641 (현재 145,800)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 222,076"}, {"label": "추세(20일선)", "ok": true, "detail": "121,130"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -1,717 · 기 +2,299"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 145,295"}]}
{"ts": "2026-07-20T09:04:02.888178+09:00", "side": "SELL", "code": "055550", "name": "신한지주", "price": 102700, "qty": 50, "proceeds": 5124987, "entry_price": 110900, "pnl": -420845, "pnl_pct": -7.39, "hold_from": "2026-07-10T09:28:02.630373+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "102,716 (현재 102,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 135,453"}, {"label": "추세(20일선)", "ok": true, "detail": "96,940"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -111 · 기 +265"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 113,514"}]}
{"ts": "2026-07-20T09:04:02.888496+09:00", "side": "SELL", "code": "105560", "name": "KB금융", "price": 173000, "qty": 59, "proceeds": 10187096, "entry_price": 188407, "pnl": -930571, "pnl_pct": -8.18, "hold_from": "2026-07-10T09:28:02.630604+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "173,250 (현재 173,200)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 233,877"}, {"label": "추세(20일선)", "ok": true, "detail": "159,270"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -332 · 기 +291"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-20T12:28:02.323325+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 10310, "qty": 349, "proceeds": 3591174, "entry_price": 13321, "pnl": -1058554, "pnl_pct": -22.6, "hold_from": "2026-07-10T09:46:11.483048+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "10,360 (현재 10,310)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,204"}, {"label": "추세(20일선)", "ok": false, "detail": "14,755"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -887 · 기 +515"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-21T12:06:01.177447+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 344500, "qty": 14, "cost": 4823723, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 313808, "target": 436576, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "344,500 vs 296,350"}, {"label": "정배열(5>20)", "ok": true, "detail": "315,100 / 296,350"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "315,100 / 305,492"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+39.7%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -7 · 기 +1 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+43%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.38% (환산) vs 평균 0.93% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 334,500"}, {"label": "거래량 급증", "ok": true, "detail": "247,158 (환산) vs 평균 96,436"}, {"label": "회전율 급증", "ok": true, "detail": "2.38% (환산) vs 평균 0.93%"}, {"label": "RSI", "ok": true, "detail": "65"}]}
{"ts": "2026-07-22T11:56:00.834652+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 159800, "qty": 34, "cost": 5434015, "path": "pullback", "reason": "눌림목 지정가 159,932 도달", "stop": 158000, "target": 165200, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "159,700 vs 149,775"}, {"label": "정배열(5>20)", "ok": true, "detail": "169,580 / 149,775"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "169,580 / 113,220"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+75.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -408 · 기 +146 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+12%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "4.73% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": true, "detail": "1,371,014 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": true, "detail": "4.73% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "55"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 159,932 (현재 159,700)"}]}
{"ts": "2026-07-22T12:12:00.746301+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 157300, "qty": 34, "proceeds": 5337771, "entry_price": 159800, "pnl": -96244, "pnl_pct": -1.56, "hold_from": "2026-07-22T11:56:00.834651+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "158,000 (현재 157,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 165,200"}, {"label": "추세(20일선)", "ok": true, "detail": "149,655"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -407 · 기 +141"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 169,305"}]}
{"ts": "2026-07-23T09:00:23.169012+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 160100, "qty": 34, "cost": 5444217, "path": "pullback", "reason": "눌림목 지정가 159,493 도달", "stop": 158000, "target": 166400, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "158,100 vs 149,695"}, {"label": "정배열(5>20)", "ok": true, "detail": "169,260 / 149,695"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "169,260 / 113,193"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+76.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -162 · 기 +37 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+13%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.05% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": false, "detail": "303,687 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": false, "detail": "1.05% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "55"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 159,493 (현재 158,100)"}]}
{"ts": "2026-07-23T09:32:04.419219+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 157800, "qty": 34, "proceeds": 5354738, "entry_price": 160100, "pnl": -89479, "pnl_pct": -1.44, "hold_from": "2026-07-23T09:00:23.169005+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "158,000 (현재 157,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 166,400"}, {"label": "추세(20일선)", "ok": true, "detail": "149,685"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -162 · 기 +37"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 169,669"}]}
{"ts": "2026-07-23T09:44:04.294384+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 18850, "qty": 293, "cost": 5523878, "path": "pullback", "reason": "눌림목 지정가 19,627 도달", "stop": 17760, "target": 22120, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "18,850 vs 18,847"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,556 / 18,847"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,556 / 19,356"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+13.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -25 · 기 +6 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+34%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.34% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "388,767 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.34% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "48"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,627 (현재 18,850)"}]}
{"ts": "2026-07-23T09:46:06.368359+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 88400, "qty": 55, "cost": 4862729, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 80433, "target": 112300, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "88,300 vs 75,075"}, {"label": "정배열(5>20)", "ok": true, "detail": "83,020 / 75,075"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "83,020 / 75,060"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+47.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -150 · 기 +299 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+17%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.80% (환산) vs 평균 0.42% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 87,600"}, {"label": "거래량 급증", "ok": true, "detail": "743,133 (환산) vs 평균 392,182"}, {"label": "회전율 급증", "ok": true, "detail": "0.80% (환산) vs 평균 0.42%"}, {"label": "RSI", "ok": true, "detail": "67"}]}
{"ts": "2026-07-23T10:30:02.492004+09:00", "side": "BUY", "code": "024060", "name": "흥구석유", "price": 14140, "qty": 242, "cost": 3422393, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 12315, "target": 19616, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "14,180 vs 10,944"}, {"label": "정배열(5>20)", "ok": true, "detail": "13,154 / 10,944"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "13,154 / 12,687"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+55.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +109 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "84.26% (환산) vs 평균 31.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 13,990"}, {"label": "거래량 급증", "ok": true, "detail": "12,639,979 (환산) vs 평균 4,720,532"}, {"label": "회전율 급증", "ok": true, "detail": "84.26% (환산) vs 평균 31.47%"}, {"label": "RSI", "ok": true, "detail": "66"}]}
{"ts": "2026-07-23T10:50:06.642810+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 110600, "qty": 29, "proceeds": 3201146, "entry_price": 140424, "pnl": -871765, "pnl_pct": -21.24, "hold_from": "2026-07-15T09:02:02.656003+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "111,041 (현재 110,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 228,575"}, {"label": "추세(20일선)", "ok": false, "detail": "119,375"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -847 · 기 +78"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-23T12:22:02.602685+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 356000, "qty": 14, "cost": 4984748, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 313808, "target": 436576, "signals": [{"label": "손절선", "ok": true, "detail": "313,808 (현재 356,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 436,576"}, {"label": "추세(20일선)", "ok": true, "detail": "296,925"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +6 · 기 +26"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 355,034"}]}
{"ts": "2026-07-23T13:06:04.445125+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 91400, "qty": 53, "cost": 4844927, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 80433, "target": 112300, "signals": [{"label": "손절선", "ok": true, "detail": "80,433 (현재 91,400)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 112,300"}, {"label": "추세(20일선)", "ok": true, "detail": "75,230"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -169 · 기 +311"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 91,159"}]}
{"ts": "2026-07-24T09:00:06.353007+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18730, "qty": 293, "proceeds": 5477189, "entry_price": 18850, "pnl": -46690, "pnl_pct": -0.64, "hold_from": "2026-07-23T09:44:04.294383+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 18,730)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,120"}, {"label": "추세(20일선)", "ok": false, "detail": "18,841"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -5 · 기 -5"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,219"}]}
{"ts": "2026-07-24T09:02:04.050237+09:00", "side": "BUY", "code": "024060", "name": "흥구석유", "price": 15060, "qty": 227, "cost": 3419133, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 12315, "target": 19616, "signals": [{"label": "손절선", "ok": true, "detail": "12,315 (현재 15,020)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 19,616"}, {"label": "추세(20일선)", "ok": true, "detail": "10,986"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +208 · 기 -2"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 14,766"}]}
{"ts": "2026-07-24T12:58:01.269380+09:00", "side": "SELL", "code": "095610", "name": "테스", "price": 132500, "qty": 29, "proceeds": 3835007, "entry_price": 160724, "pnl": -826692, "pnl_pct": -17.56, "hold_from": "2026-07-07T10:06:07.256791+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "132,997 (현재 132,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 243,905"}, {"label": "추세(20일선)", "ok": false, "detail": "135,040"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +177 · 기 -465"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-27T09:02:06.239541+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 139000, "qty": 14, "cost": 1946292, "path": "pullback", "reason": "눌림목 지정가 146,775 도달", "stop": 108775, "target": 229675, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "138,700 vs 135,350"}, {"label": "정배열(5>20)", "ok": true, "detail": "168,380 / 135,350"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "168,380 / 99,428"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+28.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +238 · 기 -568 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+41%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.72% (환산) vs 평균 3.06% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 202,500"}, {"label": "거래량 급증", "ok": false, "detail": "526,333 (환산) vs 평균 591,925"}, {"label": "회전율 급증", "ok": false, "detail": "2.72% (환산) vs 평균 3.06%"}, {"label": "RSI", "ok": true, "detail": "53"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 146,775 (현재 138,700)"}]}
{"ts": "2026-07-27T09:02:06.239758+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19100, "qty": 289, "cost": 5520728, "path": "pullback", "reason": "눌림목 지정가 19,673 도달", "stop": 18023, "target": 22330, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "19,070 vs 18,858"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,600 / 18,858"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,600 / 19,360"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+16.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +101 · 기 -3 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.13% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "146,760 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.13% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,673 (현재 19,070)"}]}
{"ts": "2026-07-27T09:02:06.239937+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 7470, "qty": 533, "cost": 3982107, "path": "pullback", "reason": "눌림목 지정가 7,635 도달", "stop": 6645, "target": 9944, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "7,470 vs 4,876"}, {"label": "정배열(5>20)", "ok": true, "detail": "6,452 / 4,876"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,452 / 4,889"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+82.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +49 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.79% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "49,327 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "0.79% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "74"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,635 (현재 7,470)"}]}
{"ts": "2026-07-27T09:04:05.323408+09:00", "side": "SELL", "code": "024060", "name": "흥구석유", "price": 12200, "qty": 469, "proceeds": 5710642, "entry_price": 14585, "pnl": -1130884, "pnl_pct": -16.35, "hold_from": "2026-07-23T10:30:02.492003+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "12,707 (현재 12,250)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 20,219"}, {"label": "추세(20일선)", "ok": true, "detail": "10,847"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -85 · 기 +2"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-27T09:08:02.094585+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 7910, "qty": 503, "cost": 3979327, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 6645, "target": 9944, "signals": [{"label": "손절선", "ok": true, "detail": "6,645 (현재 7,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 9,944"}, {"label": "추세(20일선)", "ok": true, "detail": "4,897"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +49 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 7,747"}]}
{"ts": "2026-07-27T09:12:01.524339+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 13150, "qty": 188, "cost": 2472571, "path": "pullback", "reason": "눌림목 지정가 13,180 도달", "stop": 10830, "target": 20110, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "13,150 vs 12,732"}, {"label": "정배열(5>20)", "ok": true, "detail": "14,378 / 12,732"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "14,378 / 13,268"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+1.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +27 · 기 +15 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.46% (환산) vs 평균 1.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 15,870"}, {"label": "거래량 급증", "ok": false, "detail": "274,967 (환산) vs 평균 882,736"}, {"label": "회전율 급증", "ok": false, "detail": "0.46% (환산) vs 평균 1.47%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 13,180 (현재 13,150)"}]}
{"ts": "2026-07-27T13:40:01.103071+09:00", "side": "SELL", "code": "003680", "name": "한성기업", "price": 6780, "qty": 1036, "proceeds": 7010383, "entry_price": 7684, "pnl": -951051, "pnl_pct": -11.76, "hold_from": "2026-07-27T09:02:06.239936+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "6,854 (현재 6,770)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 10,174"}, {"label": "추세(20일선)", "ok": true, "detail": "4,841"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +50 · 기 +0"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-28T09:00:16.577503+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6780, "qty": 490, "cost": 3322698, "path": "pullback", "reason": "눌림목 지정가 7,596 도달", "stop": 5916, "target": 9373, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "7,050 vs 4,855"}, {"label": "정배열(5>20)", "ok": true, "detail": "6,368 / 4,855"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,368 / 4,882"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+73.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +86 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.01% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "813 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "0.01% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "69"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,596 (현재 7,050)"}]}
{"ts": "2026-07-28T09:10:01.750562+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 7100, "qty": 468, "cost": 3323298, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 5916, "target": 9373, "signals": [{"label": "손절선", "ok": true, "detail": "5,916 (현재 7,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 9,373"}, {"label": "추세(20일선)", "ok": true, "detail": "4,857"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +86 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 7,079"}]}
{"ts": "2026-07-28T11:04:03.770897+09:00", "side": "SELL", "code": "252990", "name": "샘씨엔에스", "price": 10790, "qty": 188, "proceeds": 2024564, "entry_price": 13150, "pnl": -448006, "pnl_pct": -17.95, "hold_from": "2026-07-27T09:12:01.524338+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "10,830 (현재 10,810)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 20,110"}, {"label": "추세(20일선)", "ok": false, "detail": "12,616"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +156 · 기 -156"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 14,003"}]}
{"ts": "2026-07-29T09:24:10.002211+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 122600, "qty": 16, "cost": 1961894, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 108775, "target": 229675, "signals": [{"label": "손절선", "ok": true, "detail": "108,775 (현재 177,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 229,675"}, {"label": "추세(20일선)", "ok": true, "detail": "134,320"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +453 · 기 -688"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 148,242"}]}
{"ts": "2026-07-29T09:24:10.002379+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 18950, "qty": 291, "cost": 5515277, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 18023, "target": 22330, "signals": [{"label": "손절선", "ok": true, "detail": "18,023 (현재 20,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,330"}, {"label": "추세(20일선)", "ok": true, "detail": "18,884"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +99 · 기 +138"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,418"}]}
{"ts": "2026-07-29T09:24:10.002708+09:00", "side": "SELL", "code": "010950", "name": "S-Oil", "price": 128600, "qty": 78, "proceeds": 10011240, "entry_price": 134541, "pnl": -484534, "pnl_pct": -4.42, "hold_from": "2026-07-09T09:10:01.833874+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "122,949 (현재 116,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 169,318"}, {"label": "추세(20일선)", "ok": true, "detail": "107,870"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +43 · 기 +245"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T09:28:01.391374+09:00", "side": "BUY", "code": "090850", "name": "현대이지웰", "price": 6390, "qty": 808, "cost": 5163894, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 5998, "target": 7566, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "6,380 vs 5,358"}, {"label": "정배열(5>20)", "ok": true, "detail": "5,742 / 5,358"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "5,742 / 5,622"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+43.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +73 · 기 -3 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.62% (환산) vs 평균 0.22% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 5,700"}, {"label": "거래량 급증", "ok": true, "detail": "134,413 (환산) vs 평균 49,512"}, {"label": "회전율 급증", "ok": true, "detail": "0.62% (환산) vs 평균 0.22%"}, {"label": "RSI", "ok": true, "detail": "73"}]}
{"ts": "2026-07-29T10:24:01.450516+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 123400, "qty": 42, "cost": 5183577, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 115612, "target": 146764, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "123,400 vs 113,725"}, {"label": "정배열(5>20)", "ok": true, "detail": "118,140 / 113,725"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "118,140 / 110,075"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+51.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +47 · 기 +310 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+20%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.38% (환산) vs 평균 0.17% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 123,300"}, {"label": "거래량 급증", "ok": true, "detail": "644,676 (환산) vs 평균 289,522"}, {"label": "회전율 급증", "ok": true, "detail": "0.38% (환산) vs 평균 0.17%"}, {"label": "RSI", "ok": true, "detail": "67"}]}
{"ts": "2026-07-29T10:42:05.420086+09:00", "side": "SELL", "code": "090850", "name": "현대이지웰", "price": 5980, "qty": 808, "proceeds": 4822418, "entry_price": 6390, "pnl": -341477, "pnl_pct": -6.42, "hold_from": "2026-07-29T09:28:01.391373+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,998 (현재 5,980)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 7,566"}, {"label": "추세(20일선)", "ok": true, "detail": "5,338"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +77 · 기 -3"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,521"}]}
{"ts": "2026-07-29T11:18:04.431976+09:00", "side": "SELL", "code": "003680", "name": "한성기업", "price": 6000, "qty": 958, "proceeds": 5736791, "entry_price": 6936, "pnl": -909205, "pnl_pct": -13.5, "hold_from": "2026-07-28T09:00:16.577498+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "6,040 (현재 6,020)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 9,626"}, {"label": "추세(20일선)", "ok": true, "detail": "4,803"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +185 · 기 +0"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T12:50:05.477470+09:00", "side": "SELL", "code": "095610", "name": "테스", "price": 108000, "qty": 30, "proceeds": 3233682, "entry_price": 130253, "pnl": -674504, "pnl_pct": -17.08, "hold_from": "2026-07-27T09:02:06.239540+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "108,775 (현재 108,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 213,434"}, {"label": "추세(20일선)", "ok": false, "detail": "133,815"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +449 · 기 -685"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T13:30:01.454446+09:00", "side": "SELL", "code": "086790", "name": "하나금융지주", "price": 118000, "qty": 103, "proceeds": 12130300, "entry_price": 120181, "pnl": -250157, "pnl_pct": -1.81, "hold_from": "2026-07-01T09:46:03.099480+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "111,000 (현재 118,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 147,722"}, {"label": "추세(20일선)", "ok": false, "detail": "118,145"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -11 · 기 -51"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T14:20:01.514442+09:00", "side": "SELL", "code": "138040", "name": "메리츠금융지주", "price": 115500, "qty": 42, "proceeds": 4841541, "entry_price": 123400, "pnl": -342037, "pnl_pct": -6.4, "hold_from": "2026-07-29T10:24:01.450515+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "115,612 (현재 115,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 146,764"}, {"label": "추세(20일선)", "ok": true, "detail": "113,330"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +44 · 기 +333"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 126,053"}]}
{"ts": "2026-07-30T09:04:07.493862+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6130, "qty": 402, "cost": 2464630, "path": "pullback", "reason": "눌림목 지정가 7,457 도달", "stop": 5127, "target": 9138, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "6,120 vs 4,808"}, {"label": "정배열(5>20)", "ok": true, "detail": "6,182 / 4,808"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,182 / 4,866"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+65.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +234 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "4.31% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "267,687 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "4.31% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,457 (현재 6,120)"}]}
{"ts": "2026-07-30T09:16:11.943258+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 130900, "qty": 36, "cost": 4713107, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 119833, "target": 164102, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "130,900 vs 108,870"}, {"label": "정배열(5>20)", "ok": true, "detail": "115,360 / 108,870"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "115,360 / 113,212"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+49.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -6 · 기 +178 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+21%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.51% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 116,900"}, {"label": "거래량 급증", "ok": true, "detail": "571,193 (환산) vs 평균 359,705"}, {"label": "회전율 급증", "ok": true, "detail": "0.51% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "68"}]}
{"ts": "2026-07-30T09:16:11.943676+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 124100, "qty": 41, "cost": 5088863, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 116280, "target": 147560, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "124,000 vs 113,755"}, {"label": "정배열(5>20)", "ok": true, "detail": "118,260 / 113,755"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "118,260 / 110,085"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+54.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +9 · 기 +389 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+20%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.31% (환산) vs 평균 0.17% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 123,300"}, {"label": "거래량 급증", "ok": true, "detail": "518,220 (환산) vs 평균 289,522"}, {"label": "회전율 급증", "ok": true, "detail": "0.31% (환산) vs 평균 0.17%"}, {"label": "RSI", "ok": true, "detail": "68"}]}
{"ts": "2026-07-30T09:18:10.181133+09:00", "side": "BUY", "code": "090850", "name": "현대이지웰", "price": 6310, "qty": 806, "cost": 5086623, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 5927, "target": 7460, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "6,300 vs 5,354"}, {"label": "정배열(5>20)", "ok": true, "detail": "5,726 / 5,354"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "5,726 / 5,621"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+46.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +87 · 기 +6 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.41% (환산) vs 평균 0.22% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 5,700"}, {"label": "거래량 급증", "ok": true, "detail": "87,813 (환산) vs 평균 49,512"}, {"label": "회전율 급증", "ok": true, "detail": "0.41% (환산) vs 평균 0.22%"}, {"label": "RSI", "ok": true, "detail": "72"}]}
{"ts": "2026-07-30T10:10:07.440123+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 127700, "qty": 39, "cost": 4981047, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 116280, "target": 147560, "signals": [{"label": "손절선", "ok": true, "detail": "116,280 (현재 127,600)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 147,560"}, {"label": "추세(20일선)", "ok": true, "detail": "113,935"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +35 · 기 +392"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 126,835"}]}
{"ts": "2026-07-31T09:04:07.903300+09:00", "side": "SELL", "code": "078930", "name": "GS", "price": 69100, "qty": 108, "proceeds": 7448248, "entry_price": 89872, "pnl": -2259408, "pnl_pct": -23.11, "hold_from": "2026-07-23T09:46:06.368358+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "81,595 (현재 79,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 114,704"}, {"label": "추세(20일선)", "ok": true, "detail": "74,655"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -179 · 기 +325"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-31T09:06:07.031863+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6550, "qty": 376, "cost": 2463169, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 5127, "target": 9138, "signals": [{"label": "손절선", "ok": true, "detail": "5,127 (현재 6,640)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 9,138"}, {"label": "추세(20일선)", "ok": true, "detail": "4,834"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +355 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,453"}]}
{"ts": "2026-08-03T09:36:12.045515+09:00", "side": "SELL", "code": "010950", "name": "S-Oil", "price": 119700, "qty": 36, "proceeds": 4300797, "entry_price": 130900, "pnl": -412310, "pnl_pct": -8.56, "hold_from": "2026-07-30T09:16:11.943255+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "119,833 (현재 119,800)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 164,102"}, {"label": "추세(20일선)", "ok": true, "detail": "108,315"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -35 · 기 +48"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 134,411"}]}
{"ts": "2026-08-03T12:00:11.823818+09:00", "side": "BUY", "code": "194370", "name": "제이에스코퍼레이션", "price": 12910, "qty": 324, "cost": 4183467, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 11713, "target": 16502, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "12,930 vs 11,922"}, {"label": "정배열(5>20)", "ok": true, "detail": "12,138 / 11,922"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "12,138 / 11,924"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+27.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +7 · 기 +10 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+74%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.72% (환산) vs 평균 0.34% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 12,870"}, {"label": "거래량 급증", "ok": true, "detail": "208,994 (환산) vs 평균 99,303"}, {"label": "회전율 급증", "ok": true, "detail": "0.72% (환산) vs 평균 0.34%"}, {"label": "RSI", "ok": true, "detail": "63"}]}
{"ts": "2026-08-03T12:02:09.768951+09:00", "side": "BUY", "code": "194370", "name": "제이에스코퍼레이션", "price": 13420, "qty": 312, "cost": 4187668, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 11713, "target": 16502, "signals": [{"label": "손절선", "ok": true, "detail": "11,713 (현재 13,450)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 16,502"}, {"label": "추세(20일선)", "ok": true, "detail": "11,948"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +7 · 기 +10"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,339"}]}
{"ts": "2026-08-04T09:04:09.476526+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 135900, "qty": 12, "cost": 1631045, "path": "pullback", "reason": "눌림목 지정가 145,918 도달", "stop": 104818, "target": 229146, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "135,700 vs 135,200"}, {"label": "정배열(5>20)", "ok": true, "detail": "167,780 / 135,200"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "167,780 / 99,378"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+24.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +23 · 기 +54 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+45%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "6.62% (환산) vs 평균 3.06% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 202,500"}, {"label": "거래량 급증", "ok": true, "detail": "1,281,140 (환산) vs 평균 591,925"}, {"label": "회전율 급증", "ok": true, "detail": "6.62% (환산) vs 평균 3.06%"}, {"label": "RSI", "ok": true, "detail": "52"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 145,918 (현재 135,700)"}]}
{"ts": "2026-08-04T09:34:09.335260+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 90000, "qty": 47, "cost": 4230634, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 81851, "target": 114446, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "89,800 vs 75,150"}, {"label": "정배열(5>20)", "ok": true, "detail": "83,320 / 75,150"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "83,320 / 75,085"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+55.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +68 · 기 +117 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+15%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.64% (환산) vs 평균 0.42% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 87,600"}, {"label": "거래량 급증", "ok": true, "detail": "595,733 (환산) vs 평균 392,182"}, {"label": "회전율 급증", "ok": true, "detail": "0.64% (환산) vs 평균 0.42%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-08-04T09:48:09.800491+09:00", "side": "SELL", "code": "090850", "name": "현대이지웰", "price": 5920, "qty": 806, "proceeds": 4762216, "entry_price": 6310, "pnl": -324407, "pnl_pct": -6.18, "hold_from": "2026-07-30T09:18:10.181130+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,927 (현재 5,925)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 7,460"}, {"label": "추세(20일선)", "ok": true, "detail": "5,336"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +34 · 기 +9"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,429"}]}
{"ts": "2026-08-04T10:32:12.794318+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 93500, "qty": 45, "cost": 4208131, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 81851, "target": 114446, "signals": [{"label": "손절선", "ok": true, "detail": "81,851 (현재 93,400)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 114,446"}, {"label": "추세(20일선)", "ok": true, "detail": "75,330"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +57 · 기 +117"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 92,841"}]}
{"ts": "2026-08-04T11:00:12.182013+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 12800, "qty": 156, "cost": 1997100, "path": "pullback", "reason": "눌림목 지정가 13,033 도달", "stop": 10340, "target": 20180, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "12,800 vs 12,715"}, {"label": "정배열(5>20)", "ok": true, "detail": "14,308 / 12,715"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "14,308 / 13,263"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-4.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -35 · 기 +49 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.75% (환산) vs 평균 1.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 15,870"}, {"label": "거래량 급증", "ok": true, "detail": "1,655,930 (환산) vs 평균 882,736"}, {"label": "회전율 급증", "ok": true, "detail": "2.75% (환산) vs 평균 1.47%"}, {"label": "RSI", "ok": true, "detail": "49"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 13,033 (현재 12,800)"}]}
{"ts": "2026-08-04T13:26:12.859117+09:00", "side": "SELL", "code": "138040", "name": "메리츠금융지주", "price": 117200, "qty": 80, "proceeds": 9357717, "entry_price": 125855, "pnl": -712193, "pnl_pct": -6.88, "hold_from": "2026-07-30T09:16:11.943674+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "117,649 (현재 117,200)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 150,472"}, {"label": "추세(20일선)", "ok": true, "detail": "113,415"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -24 · 기 +268"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-08-05T09:00:16.277701+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 147600, "qty": 11, "cost": 1623844, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 104818, "target": 229146, "signals": [{"label": "손절선", "ok": true, "detail": "104,818 (현재 147,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 229,146"}, {"label": "추세(20일선)", "ok": true, "detail": "135,790"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -256 · 기 +200"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 145,836"}]}
{"ts": "2026-08-05T09:02:13.253926+09:00", "side": "BUY", "code": "090850", "name": "현대이지웰", "price": 5710, "qty": 850, "cost": 4854228, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 5372, "target": 6725, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "5,730 vs 5,326"}, {"label": "정배열(5>20)", "ok": true, "detail": "5,612 / 5,326"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "5,612 / 5,611"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+11.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +14 · 기 -2 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.46% (환산) vs 평균 0.22% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 5,700"}, {"label": "거래량 급증", "ok": true, "detail": "99,627 (환산) vs 평균 49,512"}, {"label": "회전율 급증", "ok": true, "detail": "0.46% (환산) vs 평균 0.22%"}, {"label": "RSI", "ok": true, "detail": "61"}]}
{"ts": "2026-08-05T09:20:12.636650+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 13640, "qty": 147, "cost": 2005381, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 10340, "target": 20180, "signals": [{"label": "손절선", "ok": true, "detail": "10,340 (현재 13,630)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 20,180"}, {"label": "추세(20일선)", "ok": true, "detail": "12,756"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -72 · 기 +134"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,577"}]}
{"ts": "2026-08-06T09:00:19.554834+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18730, "qty": 580, "proceeds": 10842216, "entry_price": 19025, "pnl": -193789, "pnl_pct": -1.55, "hold_from": "2026-07-27T09:02:06.239756+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "18,071 (현재 18,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,887"}, {"label": "추세(20일선)", "ok": false, "detail": "18,842"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -203 · 기 -147"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-08-06T09:14:10.574456+09:00", "side": "BUY", "code": "068270", "name": "셀트리온", "price": 193600, "qty": 25, "cost": 4840726, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 181108, "target": 231076, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "193,500 vs 177,765"}, {"label": "정배열(5>20)", "ok": true, "detail": "186,480 / 177,765"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "186,480 / 176,699"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+20.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +255 · 기 -319 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+42%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.49% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 191,700"}, {"label": "거래량 급증", "ok": true, "detail": "1,163,480 (환산) vs 평균 738,783"}, {"label": "회전율 급증", "ok": true, "detail": "0.49% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "64"}]}
{"ts": "2026-08-06T09:34:15.940820+09:00", "side": "SELL", "code": "090850", "name": "현대이지웰", "price": 5350, "qty": 850, "proceeds": 4538632, "entry_price": 5710, "pnl": -315596, "pnl_pct": -6.3, "hold_from": "2026-08-05T09:02:13.253924+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,372 (현재 5,370)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 6,725"}, {"label": "추세(20일선)", "ok": true, "detail": "5,308"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -30 · 기 -23"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 5,829"}]}
{"ts": "2026-08-06T09:34:15.941140+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 124100, "qty": 38, "cost": 4716507, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 116569, "target": 146692, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "123,900 vs 113,750"}, {"label": "정배열(5>20)", "ok": true, "detail": "118,240 / 113,750"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "118,240 / 110,083"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+34.7%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -53 · 기 +87 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+20%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.27% (환산) vs 평균 0.17% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 123,300"}, {"label": "거래량 급증", "ok": true, "detail": "456,007 (환산) vs 평균 289,522"}, {"label": "회전율 급증", "ok": true, "detail": "0.27% (환산) vs 평균 0.17%"}, {"label": "RSI", "ok": true, "detail": "67"}]}
{"ts": "2026-08-07T09:34:08.778095+09:00", "side": "BUY", "code": "068270", "name": "셀트리온", "price": 198600, "qty": 24, "cost": 4767115, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 181108, "target": 231076, "signals": [{"label": "손절선", "ok": true, "detail": "181,108 (현재 198,600)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 231,076"}, {"label": "추세(20일선)", "ok": true, "detail": "178,020"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +338 · 기 +73"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 197,939"}]}
@@ -0,0 +1,200 @@
{
"cash": 26692924.320500042,
"initial": 100000000,
"positions": {
"214450": {
"code": "214450",
"name": "파마리서치",
"sources": [
"auto"
],
"qty": 21,
"entry_price": 343976.1904761905,
"entry_at": "2026-07-13T09:06:07.906813+09:00",
"stop": 302625,
"target": 468030,
"peak": 411500,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 409000,
"tranches": 2,
"tranche_value": 3813943.0504600187,
"last_add_price": 350000
},
"138040": {
"code": "138040",
"name": "메리츠금융지주",
"sources": [
"auto"
],
"qty": 81,
"entry_price": 124881.48148148147,
"entry_at": "2026-07-29T10:24:01.452555+09:00",
"stop": 114155,
"target": 157062,
"peak": 127600,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 123200,
"tranches": 2,
"tranche_value": 5142605.848996199,
"last_add_price": 126400
},
"003680": {
"code": "003680",
"name": "한성기업",
"sources": [
"auto"
],
"qty": 608,
"entry_price": 6333.0921052631575,
"entry_at": "2026-07-30T09:04:07.497844+09:00",
"stop": 5039,
"target": 10215,
"peak": 6840,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 7,457 도달",
"cur_price": 6220,
"tranches": 2,
"tranche_value": 1927621.6063135946,
"last_add_price": 6550
},
"010950": {
"code": "010950",
"name": "S-Oil",
"sources": [
"auto"
],
"qty": 55,
"entry_price": 133403.63636363635,
"entry_at": "2026-07-30T09:16:11.947135+09:00",
"stop": 117747,
"target": 180373,
"peak": 139900,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 139600,
"tranches": 2,
"tranche_value": 3759463.8630866953,
"last_add_price": 136000
},
"194370": {
"code": "194370",
"name": "제이에스코퍼레이션",
"sources": [
"auto"
],
"qty": 506,
"entry_price": 13159.9604743083,
"entry_at": "2026-08-03T12:00:12.417020+09:00",
"stop": 11445,
"target": 18305,
"peak": 14120,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 13370,
"tranches": 2,
"tranche_value": 3342042.065213833,
"last_add_price": 13420
},
"078930": {
"code": "078930",
"name": "GS",
"sources": [
"auto"
],
"qty": 73,
"entry_price": 91726.02739726027,
"entry_at": "2026-08-04T09:34:09.921371+09:00",
"stop": 80361,
"target": 125821,
"peak": 101600,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 97700,
"tranches": 2,
"tranche_value": 3414906.320549933,
"last_add_price": 93500
},
"252990": {
"code": "252990",
"name": "샘씨엔에스",
"sources": [
"auto"
],
"qty": 297,
"entry_price": 13423.030303030304,
"entry_at": "2026-08-05T09:02:14.724353+09:00",
"stop": 10340,
"target": 22672,
"peak": 15670,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 13,170 도달",
"cur_price": 15670,
"tranches": 2,
"tranche_value": 1996058.5440871862,
"last_add_price": 13830
},
"068270": {
"code": "068270",
"name": "셀트리온",
"sources": [
"interest"
],
"qty": 48,
"entry_price": 196100.0,
"entry_at": "2026-08-06T09:14:11.164447+09:00",
"stop": 178744,
"target": 248168,
"peak": 201000,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 201000,
"tranches": 2,
"tranche_value": 4827704.554226948,
"last_add_price": 198600
}
},
"realized_pnl": -18017783.52950002,
"closed_trades": 27,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.1859662521949996,
"last_exit": {
"030000": "2026-08-06",
"086790": "2026-07-29",
"005930": "2026-06-23",
"403870": "2026-07-07",
"240810": "2026-07-24",
"214450": "2026-07-06",
"093370": "2026-07-20",
"003490": "2026-07-09",
"055550": "2026-07-20",
"105560": "2026-07-20",
"024060": "2026-07-27",
"003680": "2026-07-29",
"138040": "2026-07-28",
"010950": "2026-07-29",
"252990": "2026-07-29",
"090850": "2026-08-05",
"078930": "2026-07-31"
},
"created_at": "2026-06-15T14:55:00.582879+09:00",
"updated_at": "2026-08-10T15:28:16.141744+09:00"
}
@@ -0,0 +1,87 @@
{"ts": "2026-06-17T11:15:02.380225+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 130900, "qty": 38, "cost": 4974946, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 118039, "target": 169483, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "129,300 vs 118,950"}, {"label": "정배열(5>10)", "ok": true, "detail": "120,400 / 118,950"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "120,400 / 118,307"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-13.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +371 · 기 +158 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+22%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.12% (환산) vs 평균 0.38% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 126,500"}, {"label": "거래량 급증", "ok": true, "detail": "3,094,534 (환산) vs 평균 1,031,725"}, {"label": "회전율 급증", "ok": true, "detail": "1.12% (환산) vs 평균 0.38%"}, {"label": "RSI", "ok": true, "detail": "60"}]}
{"ts": "2026-06-19T09:02:06.427084+09:00", "side": "BUY", "code": "005930", "name": "삼성전자", "price": 373500, "qty": 11, "cost": 4109116, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 331259, "target": 500222, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "373,000 vs 330,350"}, {"label": "정배열(5>10)", "ok": true, "detail": "352,400 / 330,350"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "352,400 / 258,005"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+6.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,427 · 기 +4,448 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+19%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.04% (환산) vs 평균 0.53% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 370,000"}, {"label": "거래량 급증", "ok": true, "detail": "60,950,213 (환산) vs 평균 31,088,390"}, {"label": "회전율 급증", "ok": true, "detail": "1.04% (환산) vs 평균 0.53%"}, {"label": "RSI", "ok": true, "detail": "67"}]}
{"ts": "2026-06-19T09:02:06.427459+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19160, "qty": 325, "cost": 6227934, "path": "pullback", "reason": "눌림목 지정가 19,690 도달", "stop": 17760, "target": 23360, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "19,150 vs 18,963"}, {"label": "정배열(5>10)", "ok": true, "detail": "19,616 / 18,963"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,616 / 19,361"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-31.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,162 · 기 +2,080 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.03% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "37,673 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.03% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,690 (현재 19,150)"}]}
{"ts": "2026-06-23T09:00:12.660949+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18820, "qty": 325, "proceeds": 6104573, "entry_price": 19160, "pnl": -123361, "pnl_pct": -1.77, "hold_from": "2026-06-19T09:02:06.427458+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 18,710)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 23,360"}, {"label": "추세(10일선)", "ok": false, "detail": "18,919"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -318 · 기 -227"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,528"}]}
{"ts": "2026-06-23T12:04:04.245488+09:00", "side": "SELL", "code": "086790", "name": "하나금융지주", "price": 117700, "qty": 38, "proceeds": 4463878, "entry_price": 130900, "pnl": -511068, "pnl_pct": -10.08, "hold_from": "2026-06-17T11:15:02.380224+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "118,039 (현재 117,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 169,483"}, {"label": "추세(10일선)", "ok": false, "detail": "119,330"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +332 · 기 -364"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 134,300"}]}
{"ts": "2026-06-23T12:32:04.197305+09:00", "side": "SELL", "code": "005930", "name": "삼성전자", "price": 330000, "qty": 11, "proceeds": 3622922, "entry_price": 373500, "pnl": -486195, "pnl_pct": -11.65, "hold_from": "2026-06-19T09:02:06.427083+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "331,259 (현재 330,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 500,222"}, {"label": "추세(10일선)", "ok": false, "detail": "335,050"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -3,792 · 기 +1,417"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 384,779"}]}
{"ts": "2026-06-24T09:02:02.388434+09:00", "side": "BUY", "code": "403870", "name": "HPSP", "price": 53200, "qty": 49, "cost": 2607191, "path": "pullback", "reason": "눌림목 지정가 60,114 도달", "stop": 43200, "target": 83200, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "53,200 vs 52,550"}, {"label": "정배열(5>10)", "ok": true, "detail": "57,960 / 52,550"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "57,960 / 49,671"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+20.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +711 · 기 -2,060 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+29%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.34% (환산) vs 평균 5.97% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 71,500"}, {"label": "거래량 급증", "ok": false, "detail": "1,102,733 (환산) vs 평균 4,912,598"}, {"label": "회전율 급증", "ok": false, "detail": "1.34% (환산) vs 평균 5.97%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 60,114 (현재 53,200)"}]}
{"ts": "2026-06-24T09:08:01.000377+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 155400, "qty": 13, "cost": 2020503, "path": "pullback", "reason": "눌림목 지정가 155,963 도달", "stop": 118951, "target": 264748, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "155,400 vs 128,090"}, {"label": "정배열(5>10)", "ok": true, "detail": "143,100 / 128,090"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "143,100 / 121,690"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+45.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +210 · 기 +143 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+6%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "6.50% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": true, "detail": "3,192,593 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": true, "detail": "6.50% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 155,963 (현재 155,400)"}]}
{"ts": "2026-06-25T09:04:05.759148+09:00", "side": "BUY", "code": "003490", "name": "대한항공", "price": 28900, "qty": 186, "cost": 5376206, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 26248, "target": 36855, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "28,850 vs 25,540"}, {"label": "정배열(5>10)", "ok": true, "detail": "26,110 / 25,540"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "26,110 / 25,216"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-2.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +1,577 · 기 -7 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.9/5"}, {"label": "상승여력", "ok": true, "detail": "+15%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.54% (환산) vs 평균 0.58% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 28,400"}, {"label": "거래량 급증", "ok": true, "detail": "5,629,873 (환산) vs 평균 2,146,231"}, {"label": "회전율 급증", "ok": true, "detail": "1.54% (환산) vs 평균 0.58%"}, {"label": "RSI", "ok": true, "detail": "64"}]}
{"ts": "2026-06-26T09:00:08.223657+09:00", "side": "SELL", "code": "403870", "name": "HPSP", "price": 50000, "qty": 49, "proceeds": 2445222, "entry_price": 53200, "pnl": -161969, "pnl_pct": -6.02, "hold_from": "2026-06-24T09:02:02.388433+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "43,200 (현재 51,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 83,200"}, {"label": "추세(10일선)", "ok": false, "detail": "52,330"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -311 · 기 -267"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 57,056"}]}
{"ts": "2026-06-26T09:04:03.909836+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 164900, "qty": 12, "cost": 1979097, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 118951, "target": 264748, "signals": [{"label": "손절선", "ok": true, "detail": "118,951 (현재 164,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 264,748"}, {"label": "추세(10일선)", "ok": true, "detail": "129,020"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -140 · 기 +323"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 164,359"}]}
{"ts": "2026-06-30T09:00:10.176412+09:00", "side": "BUY", "code": "403870", "name": "HPSP", "price": 55300, "qty": 40, "cost": 2212332, "path": "pullback", "reason": "눌림목 지정가 60,222 도달", "stop": 43200, "target": 91600, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "53,700 vs 52,600"}, {"label": "정배열(5>10)", "ok": true, "detail": "58,060 / 52,600"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "58,060 / 49,679"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+12.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +222 · 기 -821 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+28%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.00% (환산) vs 평균 5.97% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 71,500"}, {"label": "거래량 급증", "ok": false, "detail": "827 (환산) vs 평균 4,912,598"}, {"label": "회전율 급증", "ok": false, "detail": "0.00% (환산) vs 평균 5.97%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 60,222 (현재 53,700)"}]}
{"ts": "2026-06-30T09:02:03.201756+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 347500, "qty": 11, "cost": 3823073, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 305863, "target": 472411, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "347,000 vs 306,050"}, {"label": "정배열(5>10)", "ok": true, "detail": "315,600 / 306,050"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "315,600 / 305,533"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+29.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -19 · 기 +146 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+39%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.55% (환산) vs 평균 0.93% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 334,500"}, {"label": "거래량 급증", "ok": true, "detail": "160,800 (환산) vs 평균 96,436"}, {"label": "회전율 급증", "ok": true, "detail": "1.55% (환산) vs 평균 0.93%"}, {"label": "RSI", "ok": true, "detail": "66"}]}
{"ts": "2026-06-30T09:06:03.693908+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 360000, "qty": 11, "cost": 3960594, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 305863, "target": 472411, "signals": [{"label": "손절선", "ok": true, "detail": "305,863 (현재 360,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 472,411"}, {"label": "추세(10일선)", "ok": true, "detail": "307,350"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -19 · 기 +146"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 358,070"}]}
{"ts": "2026-07-02T10:18:03.858031+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 15980, "qty": 139, "cost": 2221553, "path": "pullback", "reason": "눌림목 지정가 16,358 도달", "stop": 12444, "target": 26587, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "15,980 vs 13,620"}, {"label": "정배열(5>10)", "ok": true, "detail": "16,104 / 13,620"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "16,104 / 11,478"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+25.7%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,833 · 기 +437 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+25%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "9.98% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": true, "detail": "10,701,165 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": true, "detail": "9.98% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "60"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 16,358 (현재 15,980)"}]}
{"ts": "2026-07-02T10:40:02.965855+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 18960, "qty": 324, "cost": 6143961, "path": "pullback", "reason": "눌림목 지정가 19,580 도달", "stop": 17760, "target": 22560, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "18,960 vs 18,944"}, {"label": "정배열(5>10)", "ok": true, "detail": "19,578 / 18,944"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,578 / 19,358"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+3.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -339 · 기 +110 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+34%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.86% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": true, "detail": "986,112 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.86% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "49"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,580 (현재 18,960)"}]}
{"ts": "2026-07-02T11:04:07.646365+09:00", "side": "BUY", "code": "003490", "name": "대한항공", "price": 29600, "qty": 182, "cost": 5388008, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 26248, "target": 36855, "signals": [{"label": "손절선", "ok": true, "detail": "26,248 (현재 29,600)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 36,855"}, {"label": "추세(10일선)", "ok": true, "detail": "25,615"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -206 · 기 +1,008"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 29,586"}]}
{"ts": "2026-07-02T11:20:02.070046+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 22550, "qty": 272, "cost": 6134520, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 17760, "target": 22560, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 19,350)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,560"}, {"label": "추세(10일선)", "ok": true, "detail": "18,983"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -339 · 기 +110"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,350"}]}
{"ts": "2026-07-02T11:24:06.159937+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18860, "qty": 596, "proceeds": 11218641, "entry_price": 20598, "pnl": -1059841, "pnl_pct": -8.44, "hold_from": "2026-07-02T10:40:02.965854+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "19,038 (현재 18,890)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 25,278"}, {"label": "추세(10일선)", "ok": false, "detail": "18,937"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -339 · 기 +110"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-03T09:44:02.621986+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 123600, "qty": 25, "proceeds": 3083974, "entry_price": 159960, "pnl": -915625, "pnl_pct": -22.73, "hold_from": "2026-06-24T09:08:01.000376+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "124,125 (현재 123,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 267,466"}, {"label": "추세(10일선)", "ok": false, "detail": "124,920"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +674 · 기 -2,170"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-03T10:24:02.786276+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19040, "qty": 314, "cost": 5979457, "path": "pullback", "reason": "눌림목 지정가 19,631 도달", "stop": 17760, "target": 22880, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "19,030 vs 18,951"}, {"label": "정배열(5>10)", "ok": true, "detail": "19,592 / 18,951"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,592 / 19,359"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+2.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -35 · 기 +168 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+34%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.54% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "619,193 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.54% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "49"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,631 (현재 19,030)"}]}
{"ts": "2026-07-06T09:00:10.919264+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 130600, "qty": 13, "cost": 1698055, "path": "pullback", "reason": "눌림목 지정가 154,452 도달", "stop": 96000, "target": 234400, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "133,100 vs 125,860"}, {"label": "정배열(5>10)", "ok": true, "detail": "138,640 / 125,860"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "138,640 / 121,318"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+17.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +782 · 기 -1,979 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+31%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.01% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": false, "detail": "4,080 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": false, "detail": "0.01% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "52"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 154,452 (현재 133,100)"}]}
{"ts": "2026-07-06T09:34:02.077206+09:00", "side": "BUY", "code": "055550", "name": "신한지주", "price": 110000, "qty": 44, "cost": 4840726, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 99202, "target": 142394, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "110,300 vs 99,990"}, {"label": "정배열(5>10)", "ok": true, "detail": "101,240 / 99,990"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "101,240 / 96,630"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+3.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -717 · 기 +1,343 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+17%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.55% (환산) vs 평균 0.35% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 109,800"}, {"label": "거래량 급증", "ok": true, "detail": "2,617,853 (환산) vs 평균 1,653,581"}, {"label": "회전율 급증", "ok": true, "detail": "0.55% (환산) vs 평균 0.35%"}, {"label": "RSI", "ok": true, "detail": "64"}]}
{"ts": "2026-07-06T10:20:01.612833+09:00", "side": "SELL", "code": "214450", "name": "파마리서치", "price": 311000, "qty": 22, "proceeds": 6828658, "entry_price": 353750, "pnl": -955009, "pnl_pct": -12.08, "hold_from": "2026-06-30T09:02:03.201755+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "311,470 (현재 311,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 480,590"}, {"label": "추세(10일선)", "ok": true, "detail": "302,450"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -108 · 기 +225"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-07T09:48:07.758619+09:00", "side": "SELL", "code": "403870", "name": "HPSP", "price": 43000, "qty": 40, "proceeds": 1716646, "entry_price": 55300, "pnl": -495686, "pnl_pct": -22.24, "hold_from": "2026-06-30T09:00:10.176402+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "43,200 (현재 43,050)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 91,600"}, {"label": "추세(10일선)", "ok": false, "detail": "51,535"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +1,424 · 기 -5,706"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 59,449"}]}
{"ts": "2026-07-07T10:28:06.473655+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 12410, "qty": 139, "proceeds": 1721626, "entry_price": 15980, "pnl": -499927, "pnl_pct": -22.34, "hold_from": "2026-07-02T10:18:03.858030+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "12,444 (현재 12,430)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 26,587"}, {"label": "추세(10일선)", "ok": false, "detail": "13,265"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -1,543 · 기 +15"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 16,975"}]}
{"ts": "2026-07-07T14:09:24.011447+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 183300, "qty": 9, "cost": 1649947, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 96000, "target": 234400, "signals": [{"label": "손절선", "ok": true, "detail": "96,000 (현재 183,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 234,400"}, {"label": "추세(10일선)", "ok": true, "detail": "123,150"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +263 · 기 -1,543"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 139,025"}]}
{"ts": "2026-07-07T14:09:24.013722+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 20750, "qty": 288, "cost": 5976896, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 17760, "target": 22880, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 20,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,880"}, {"label": "추세(10일선)", "ok": true, "detail": "18,901"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +156 · 기 +113"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,358"}]}
{"ts": "2026-07-08T09:00:18.851710+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 108300, "qty": 22, "proceeds": 2377954, "entry_price": 152159, "pnl": -970048, "pnl_pct": -28.82, "hold_from": "2026-07-06T09:00:10.919257+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "118,460 (현재 112,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 253,257"}, {"label": "추세(10일선)", "ok": false, "detail": "123,820"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +243 · 기 -857"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-09T09:10:01.835828+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 132300, "qty": 31, "cost": 4101915, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 117515, "target": 176655, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "132,100 vs 108,680"}, {"label": "정배열(5>10)", "ok": true, "detail": "115,600 / 108,680"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "115,600 / 113,232"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+22.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -184 · 기 +964 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+12%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.51% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 116,900"}, {"label": "거래량 급증", "ok": true, "detail": "572,860 (환산) vs 평균 359,705"}, {"label": "회전율 급증", "ok": true, "detail": "0.51% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-07-09T12:12:04.867096+09:00", "side": "SELL", "code": "003490", "name": "대한항공", "price": 26500, "qty": 368, "proceeds": 9732984, "entry_price": 29246, "pnl": -1031231, "pnl_pct": -9.39, "hold_from": "2026-06-25T09:04:05.759146+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "26,502 (현재 26,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 37,480"}, {"label": "추세(10일선)", "ok": true, "detail": "25,305"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -1,444 · 기 +2,767"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-10T09:18:05.236326+09:00", "side": "BUY", "code": "105560", "name": "KB금융", "price": 183700, "qty": 24, "cost": 4409461, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 164505, "target": 241284, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "183,600 vs 158,140"}, {"label": "정배열(5>10)", "ok": true, "detail": "159,500 / 158,140"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "159,500 / 157,335"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+25.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,310 · 기 +1,527 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+17%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.73% (환산) vs 평균 0.46% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 182,700"}, {"label": "거래량 급증", "ok": true, "detail": "2,553,373 (환산) vs 평균 1,640,325"}, {"label": "회전율 급증", "ok": true, "detail": "0.73% (환산) vs 평균 0.46%"}, {"label": "RSI", "ok": true, "detail": "68"}]}
{"ts": "2026-07-10T09:26:06.450600+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 130900, "qty": 34, "cost": 4451268, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 117686, "target": 170541, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "130,800 vs 120,640"}, {"label": "정배열(5>10)", "ok": true, "detail": "122,760 / 120,640"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "122,760 / 118,578"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+18.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -427 · 기 +555 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+23%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.60% (환산) vs 평균 0.37% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 130,700"}, {"label": "거래량 급증", "ok": true, "detail": "1,646,513 (환산) vs 평균 1,026,357"}, {"label": "회전율 급증", "ok": true, "detail": "0.60% (환산) vs 평균 0.37%"}, {"label": "RSI", "ok": true, "detail": "61"}]}
{"ts": "2026-07-10T11:06:06.480577+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 13660, "qty": 139, "cost": 1899025, "path": "pullback", "reason": "눌림목 지정가 15,971 도달", "stop": 10360, "target": 23560, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "13,630 vs 13,385"}, {"label": "정배열(5>10)", "ok": true, "detail": "15,634 / 13,385"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "15,634 / 11,439"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+6.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +210 · 기 +239 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+47%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "14.23% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": true, "detail": "15,267,605 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": true, "detail": "14.23% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "52"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 15,971 (현재 13,630)"}]}
{"ts": "2026-07-10T12:14:02.681313+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 126200, "qty": 15, "cost": 1893284, "path": "pullback", "reason": "눌림목 지정가 151,752 도달", "stop": 96000, "target": 216800, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "126,200 vs 125,170"}, {"label": "정배열(5>10)", "ok": true, "detail": "137,260 / 125,170"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "137,260 / 121,203"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+17.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +483 · 기 -241 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+38%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "7.53% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": true, "detail": "3,695,762 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": true, "detail": "7.53% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 151,752 (현재 126,200)"}]}
{"ts": "2026-07-10T12:36:02.509050+09:00", "side": "BUY", "code": "105560", "name": "KB금융", "price": 188900, "qty": 23, "cost": 4345352, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 164505, "target": 241284, "signals": [{"label": "손절선", "ok": true, "detail": "164,505 (현재 188,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 241,284"}, {"label": "추세(10일선)", "ok": true, "detail": "158,670"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -1,220 · 기 +1,654"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 188,670"}]}
{"ts": "2026-07-13T09:00:11.671524+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 136900, "qty": 30, "cost": 4107616, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 117515, "target": 176655, "signals": [{"label": "손절선", "ok": true, "detail": "117,515 (현재 136,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 176,655"}, {"label": "추세(10일선)", "ok": true, "detail": "109,100"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -64 · 기 +919"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 136,164"}]}
{"ts": "2026-07-13T09:06:07.906612+09:00", "side": "BUY", "code": "055550", "name": "신한지주", "price": 112800, "qty": 42, "cost": 4738311, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 99202, "target": 142394, "signals": [{"label": "손절선", "ok": true, "detail": "99,202 (현재 112,800)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 142,394"}, {"label": "추세(10일선)", "ok": true, "detail": "100,240"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -358 · 기 +991"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 112,792"}]}
{"ts": "2026-07-13T09:06:07.906815+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 338500, "qty": 11, "cost": 3724059, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 297363, "target": 461911, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "338,500 vs 305,200"}, {"label": "정배열(5>10)", "ok": true, "detail": "313,900 / 305,200"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "313,900 / 305,392"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+32.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -63 · 기 +144 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+42%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.45% (환산) vs 평균 0.93% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 334,500"}, {"label": "거래량 급증", "ok": true, "detail": "150,147 (환산) vs 평균 96,436"}, {"label": "회전율 급증", "ok": true, "detail": "1.45% (환산) vs 평균 0.93%"}, {"label": "RSI", "ok": true, "detail": "64"}]}
{"ts": "2026-07-13T09:08:05.361952+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 134300, "qty": 34, "cost": 4566885, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 117686, "target": 170541, "signals": [{"label": "손절선", "ok": true, "detail": "117,686 (현재 134,200)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 170,541"}, {"label": "추세(10일선)", "ok": true, "detail": "120,980"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -277 · 기 +460"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 134,118"}]}
{"ts": "2026-07-13T09:26:03.420105+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 139100, "qty": 13, "cost": 1808571, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 96000, "target": 216800, "signals": [{"label": "손절선", "ok": true, "detail": "96,000 (현재 139,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 216,800"}, {"label": "추세(10일선)", "ok": true, "detail": "126,460"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -213 · 기 +772"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 136,162"}]}
{"ts": "2026-07-15T14:32:01.893743+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18570, "qty": 602, "proceeds": 11157341, "entry_price": 19858, "pnl": -799013, "pnl_pct": -6.49, "hold_from": "2026-07-03T10:24:02.786275+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "18,586 (현재 18,570)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 23,675"}, {"label": "추세(10일선)", "ok": false, "detail": "18,905"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -214 · 기 +240"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-16T09:22:02.314943+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 350000, "qty": 10, "cost": 3500525, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 297363, "target": 461911, "signals": [{"label": "손절선", "ok": true, "detail": "297,363 (현재 350,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 461,911"}, {"label": "추세(10일선)", "ok": true, "detail": "306,350"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -33 · 기 +28"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 348,838"}]}
{"ts": "2026-07-20T12:28:02.325141+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 10310, "qty": 139, "proceeds": 1430295, "entry_price": 13660, "pnl": -468729, "pnl_pct": -24.52, "hold_from": "2026-07-10T11:06:06.480575+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "10,360 (현재 10,310)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 23,560"}, {"label": "추세(10일선)", "ok": false, "detail": "12,013"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -887 · 기 +515"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 14,626"}]}
{"ts": "2026-07-20T14:12:02.385143+09:00", "side": "SELL", "code": "055550", "name": "신한지주", "price": 100100, "qty": 86, "proceeds": 8591813, "entry_price": 111367, "pnl": -987223, "pnl_pct": -10.12, "hold_from": "2026-07-06T09:34:02.077204+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "100,198 (현재 100,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 144,876"}, {"label": "추세(10일선)", "ok": true, "detail": "98,970"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -168 · 기 +257"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-20T14:12:02.740945+09:00", "side": "SELL", "code": "105560", "name": "KB금융", "price": 166000, "qty": 47, "proceeds": 7786786, "entry_price": 186245, "pnl": -968027, "pnl_pct": -10.87, "hold_from": "2026-07-10T09:18:05.236324+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "166,364 (현재 166,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 245,885"}, {"label": "추세(10일선)", "ok": true, "detail": "156,380"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -440 · 기 +299"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-23T09:46:06.370395+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 88400, "qty": 42, "cost": 3713357, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 77778, "target": 120266, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "88,300 vs 80,910"}, {"label": "정배열(5>10)", "ok": true, "detail": "83,020 / 80,910"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "83,020 / 75,060"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+47.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -150 · 기 +299 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+17%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.80% (환산) vs 평균 0.42% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 87,600"}, {"label": "거래량 급증", "ok": true, "detail": "743,133 (환산) vs 평균 392,182"}, {"label": "회전율 급증", "ok": true, "detail": "0.80% (환산) vs 평균 0.42%"}, {"label": "RSI", "ok": true, "detail": "67"}]}
{"ts": "2026-07-23T10:30:02.494344+09:00", "side": "BUY", "code": "024060", "name": "흥구석유", "price": 14140, "qty": 184, "cost": 2602150, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 11706, "target": 21442, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "14,180 vs 12,429"}, {"label": "정배열(5>10)", "ok": true, "detail": "13,154 / 12,429"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "13,154 / 12,687"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+55.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +109 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "84.26% (환산) vs 평균 31.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 13,990"}, {"label": "거래량 급증", "ok": true, "detail": "12,639,979 (환산) vs 평균 4,720,532"}, {"label": "회전율 급증", "ok": true, "detail": "84.26% (환산) vs 평균 31.47%"}, {"label": "RSI", "ok": true, "detail": "66"}]}
{"ts": "2026-07-23T13:06:04.447130+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 91400, "qty": 40, "cost": 3656548, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 77778, "target": 120266, "signals": [{"label": "손절선", "ok": true, "detail": "77,778 (현재 91,400)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 120,266"}, {"label": "추세(10일선)", "ok": true, "detail": "81,220"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -169 · 기 +311"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 91,159"}]}
{"ts": "2026-07-24T09:00:07.363723+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 111800, "qty": 28, "proceeds": 3124296, "entry_price": 132189, "pnl": -577559, "pnl_pct": -15.42, "hold_from": "2026-07-10T12:14:02.681312+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "96,000 (현재 113,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 240,757"}, {"label": "추세(10일선)", "ok": false, "detail": "123,880"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -480 · 기 -206"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-24T09:02:04.052216+09:00", "side": "BUY", "code": "024060", "name": "흥구석유", "price": 15060, "qty": 172, "cost": 2590709, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 11706, "target": 21442, "signals": [{"label": "손절선", "ok": true, "detail": "11,706 (현재 15,020)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,442"}, {"label": "추세(10일선)", "ok": true, "detail": "12,513"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +208 · 기 -2"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 14,766"}]}
{"ts": "2026-07-24T10:02:04.447376+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 18950, "qty": 299, "cost": 5666900, "path": "pullback", "reason": "눌림목 지정가 19,643 도달", "stop": 17760, "target": 22520, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "18,950 vs 18,943"}, {"label": "정배열(5>10)", "ok": true, "detail": "19,576 / 18,943"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,576 / 19,358"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+19.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +2 · 기 -5 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.39% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "454,069 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.39% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "49"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,643 (현재 18,950)"}]}
{"ts": "2026-07-27T09:02:06.242175+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 7470, "qty": 409, "cost": 3055688, "path": "pullback", "reason": "눌림목 지정가 7,635 도달", "stop": 6370, "target": 10769, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "7,470 vs 5,392"}, {"label": "정배열(5>10)", "ok": true, "detail": "6,452 / 5,392"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,452 / 4,889"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+82.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +49 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.79% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "49,327 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "0.79% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "74"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,635 (현재 7,470)"}]}
{"ts": "2026-07-27T09:08:02.096604+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 7910, "qty": 386, "cost": 3053718, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 6370, "target": 10769, "signals": [{"label": "손절선", "ok": true, "detail": "6,370 (현재 7,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 10,769"}, {"label": "추세(10일선)", "ok": true, "detail": "5,434"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +49 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 7,747"}]}
{"ts": "2026-07-27T09:10:01.050818+09:00", "side": "SELL", "code": "024060", "name": "흥구석유", "price": 12030, "qty": 356, "proceeds": 4274329, "entry_price": 14584, "pnl": -918530, "pnl_pct": -17.52, "hold_from": "2026-07-23T10:30:02.494343+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "12,081 (현재 12,030)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,096"}, {"label": "추세(10일선)", "ok": false, "detail": "12,214"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -85 · 기 +2"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-27T09:12:01.527099+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 13150, "qty": 159, "cost": 2091164, "path": "pullback", "reason": "눌림목 지정가 13,180 도달", "stop": 10340, "target": 21580, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "13,150 vs 12,888"}, {"label": "정배열(5>10)", "ok": true, "detail": "14,378 / 12,888"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "14,378 / 13,268"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+1.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +27 · 기 +15 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.46% (환산) vs 평균 1.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 15,870"}, {"label": "거래량 급증", "ok": false, "detail": "274,967 (환산) vs 평균 882,736"}, {"label": "회전율 급증", "ok": false, "detail": "0.46% (환산) vs 평균 1.47%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 13,180 (현재 13,150)"}]}
{"ts": "2026-07-27T09:18:01.999209+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 127700, "qty": 43, "cost": 5491924, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 117473, "target": 158380, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "127,400 vs 117,350"}, {"label": "정배열(5>10)", "ok": true, "detail": "118,940 / 117,350"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "118,940 / 110,142"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+46.7%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +106 · 기 +291 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+16%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.26% (환산) vs 평균 0.17% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 123,300"}, {"label": "거래량 급증", "ok": true, "detail": "439,847 (환산) vs 평균 289,522"}, {"label": "회전율 급증", "ok": true, "detail": "0.26% (환산) vs 평균 0.17%"}, {"label": "RSI", "ok": true, "detail": "71"}]}
{"ts": "2026-07-28T11:22:00.757711+09:00", "side": "SELL", "code": "003680", "name": "한성기업", "price": 6630, "qty": 795, "proceeds": 5260572, "entry_price": 7684, "pnl": -848834, "pnl_pct": -13.71, "hold_from": "2026-07-27T09:02:06.242173+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "6,577 (현재 6,380)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 11,004"}, {"label": "추세(10일선)", "ok": true, "detail": "5,282"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +96 · 기 +0"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-28T13:02:00.826309+09:00", "side": "SELL", "code": "138040", "name": "메리츠금융지주", "price": 117400, "qty": 43, "proceeds": 5038356, "entry_price": 127700, "pnl": -453568, "pnl_pct": -8.07, "hold_from": "2026-07-27T09:18:01.999208+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "117,473 (현재 117,400)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 158,380"}, {"label": "추세(10일선)", "ok": true, "detail": "116,350"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +84 · 기 +324"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 130,353"}]}
{"ts": "2026-07-29T09:02:02.242655+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6540, "qty": 344, "cost": 2250097, "path": "pullback", "reason": "눌림목 지정가 7,526 도달", "stop": 5295, "target": 10276, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "6,540 vs 5,298"}, {"label": "정배열(5>10)", "ok": true, "detail": "6,266 / 5,298"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,266 / 4,873"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+70.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +188 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.87% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "116,047 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "1.87% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "63"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,526 (현재 6,540)"}]}
{"ts": "2026-07-29T09:24:10.006738+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 18950, "qty": 299, "cost": 5666900, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 17760, "target": 22520, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 20,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,520"}, {"label": "추세(10일선)", "ok": true, "detail": "18,901"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +99 · 기 +138"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,268"}]}
{"ts": "2026-07-29T09:24:10.007015+09:00", "side": "SELL", "code": "010950", "name": "S-Oil", "price": 128600, "qty": 61, "proceeds": 7829303, "entry_price": 134562, "pnl": -380228, "pnl_pct": -4.43, "hold_from": "2026-07-09T09:10:01.835827+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "119,106 (현재 116,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 180,931"}, {"label": "추세(10일선)", "ok": true, "detail": "105,620"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +43 · 기 +245"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T09:24:10.007158+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6710, "qty": 335, "cost": 2248187, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 5295, "target": 10276, "signals": [{"label": "손절선", "ok": true, "detail": "5,295 (현재 8,460)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 10,276"}, {"label": "추세(10일선)", "ok": true, "detail": "5,064"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +188 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,796"}]}
{"ts": "2026-07-29T09:24:10.007360+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 11310, "qty": 185, "cost": 2092664, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 10340, "target": 21580, "signals": [{"label": "손절선", "ok": true, "detail": "10,340 (현재 15,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,580"}, {"label": "추세(10일선)", "ok": true, "detail": "12,768"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +242 · 기 -182"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,887"}]}
{"ts": "2026-07-29T09:28:01.393233+09:00", "side": "BUY", "code": "090850", "name": "현대이지웰", "price": 6390, "qty": 820, "cost": 5240586, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 5867, "target": 7958, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "6,380 vs 5,591"}, {"label": "정배열(5>10)", "ok": true, "detail": "5,742 / 5,591"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "5,742 / 5,622"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+43.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +73 · 기 -3 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.62% (환산) vs 평균 0.22% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 5,700"}, {"label": "거래량 급증", "ok": true, "detail": "134,413 (환산) vs 평균 49,512"}, {"label": "회전율 급증", "ok": true, "detail": "0.62% (환산) vs 평균 0.22%"}, {"label": "RSI", "ok": true, "detail": "73"}]}
{"ts": "2026-07-29T10:24:01.452556+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 123400, "qty": 41, "cost": 5060159, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 113016, "target": 154552, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "123,400 vs 116,950"}, {"label": "정배열(5>10)", "ok": true, "detail": "118,140 / 116,950"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "118,140 / 110,075"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+51.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +47 · 기 +310 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+20%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.38% (환산) vs 평균 0.17% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 123,300"}, {"label": "거래량 급증", "ok": true, "detail": "644,676 (환산) vs 평균 289,522"}, {"label": "회전율 급증", "ok": true, "detail": "0.38% (환산) vs 평균 0.17%"}, {"label": "RSI", "ok": true, "detail": "67"}]}
{"ts": "2026-07-29T10:52:02.359379+09:00", "side": "SELL", "code": "252990", "name": "샘씨엔에스", "price": 10340, "qty": 344, "proceeds": 3550024, "entry_price": 12160, "pnl": -633804, "pnl_pct": -14.97, "hold_from": "2026-07-27T09:12:01.527098+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "10,340 (현재 10,340)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 17,622"}, {"label": "추세(10일선)", "ok": false, "detail": "12,607"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +239 · 기 -181"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T12:04:01.697397+09:00", "side": "SELL", "code": "086790", "name": "하나금융지주", "price": 119200, "qty": 68, "proceeds": 8089794, "entry_price": 132600, "pnl": -928358, "pnl_pct": -10.11, "hold_from": "2026-07-10T09:26:06.450599+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "119,729 (현재 119,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 171,213"}, {"label": "추세(10일선)", "ok": false, "detail": "119,490"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -11 · 기 -51"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T13:14:05.449804+09:00", "side": "SELL", "code": "003680", "name": "한성기업", "price": 5580, "qty": 679, "proceeds": 3781432, "entry_price": 6624, "pnl": -716853, "pnl_pct": -15.76, "hold_from": "2026-07-29T09:02:02.242654+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,600 (현재 5,590)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 9,697"}, {"label": "추세(10일선)", "ok": true, "detail": "5,204"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +185 · 기 +0"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T13:34:03.598735+09:00", "side": "SELL", "code": "090850", "name": "현대이지웰", "price": 5860, "qty": 820, "proceeds": 4795830, "entry_price": 6390, "pnl": -444756, "pnl_pct": -8.29, "hold_from": "2026-07-29T09:28:01.393232+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,867 (현재 5,860)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 7,958"}, {"label": "추세(10일선)", "ok": true, "detail": "5,539"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +73 · 기 -3"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,525"}]}
{"ts": "2026-07-30T09:04:07.497847+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6130, "qty": 314, "cost": 1925109, "path": "pullback", "reason": "눌림목 지정가 7,457 도달", "stop": 4793, "target": 10140, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "6,120 vs 5,256"}, {"label": "정배열(5>10)", "ok": true, "detail": "6,182 / 5,256"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,182 / 4,866"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+65.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +234 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "4.31% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "267,687 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "4.31% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,457 (현재 6,120)"}]}
{"ts": "2026-07-30T09:16:11.947137+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 130900, "qty": 28, "cost": 3665750, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 116144, "target": 175169, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "130,900 vs 108,560"}, {"label": "정배열(5>10)", "ok": true, "detail": "115,360 / 108,560"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "115,360 / 113,212"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+49.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -6 · 기 +178 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+21%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.51% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 116,900"}, {"label": "거래량 급증", "ok": true, "detail": "571,193 (환산) vs 평균 359,705"}, {"label": "회전율 급증", "ok": true, "detail": "0.51% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "68"}]}
{"ts": "2026-07-30T09:18:10.185462+09:00", "side": "BUY", "code": "090850", "name": "현대이지웰", "price": 6310, "qty": 830, "cost": 5238086, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 5799, "target": 7843, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "6,300 vs 5,583"}, {"label": "정배열(5>10)", "ok": true, "detail": "5,726 / 5,583"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "5,726 / 5,621"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+46.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +87 · 기 +6 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.41% (환산) vs 평균 0.22% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 5,700"}, {"label": "거래량 급증", "ok": true, "detail": "87,813 (환산) vs 평균 49,512"}, {"label": "회전율 급증", "ok": true, "detail": "0.41% (환산) vs 평균 0.22%"}, {"label": "RSI", "ok": true, "detail": "72"}]}
{"ts": "2026-07-30T09:50:07.301109+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 126400, "qty": 40, "cost": 5056758, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 113016, "target": 154552, "signals": [{"label": "손절선", "ok": true, "detail": "113,016 (현재 126,200)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 154,552"}, {"label": "추세(10일선)", "ok": true, "detail": "117,230"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +9 · 기 +389"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 126,082"}]}
{"ts": "2026-07-31T09:06:07.629713+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6550, "qty": 294, "cost": 1925989, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 4793, "target": 10140, "signals": [{"label": "손절선", "ok": true, "detail": "4,793 (현재 6,640)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 10,140"}, {"label": "추세(10일선)", "ok": true, "detail": "5,308"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +355 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,453"}]}
{"ts": "2026-07-31T09:06:07.631046+09:00", "side": "SELL", "code": "078930", "name": "GS", "price": 77700, "qty": 82, "proceeds": 6358976, "entry_price": 89863, "pnl": -1010930, "pnl_pct": -13.54, "hold_from": "2026-07-23T09:46:06.370394+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "78,827 (현재 78,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 122,973"}, {"label": "추세(10일선)", "ok": false, "detail": "79,880"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -179 · 기 +325"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-08-03T12:00:12.417029+09:00", "side": "BUY", "code": "194370", "name": "제이에스코퍼레이션", "price": 12910, "qty": 258, "cost": 3331280, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 11314, "target": 17699, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "12,930 vs 12,003"}, {"label": "정배열(5>10)", "ok": true, "detail": "12,138 / 12,003"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "12,138 / 11,924"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+27.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +7 · 기 +10 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+74%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.72% (환산) vs 평균 0.34% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 12,870"}, {"label": "거래량 급증", "ok": true, "detail": "208,994 (환산) vs 평균 99,303"}, {"label": "회전율 급증", "ok": true, "detail": "0.72% (환산) vs 평균 0.34%"}, {"label": "RSI", "ok": true, "detail": "63"}]}
{"ts": "2026-08-03T12:02:10.358546+09:00", "side": "BUY", "code": "194370", "name": "제이에스코퍼레이션", "price": 13420, "qty": 248, "cost": 3328659, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 11314, "target": 17699, "signals": [{"label": "손절선", "ok": true, "detail": "11,314 (현재 13,450)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 17,699"}, {"label": "추세(10일선)", "ok": true, "detail": "12,055"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +7 · 기 +10"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,339"}]}
{"ts": "2026-08-04T09:34:09.921381+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 90000, "qty": 37, "cost": 3330500, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 79135, "target": 122595, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "89,800 vs 81,060"}, {"label": "정배열(5>10)", "ok": true, "detail": "83,320 / 81,060"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "83,320 / 75,085"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+55.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +68 · 기 +117 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+15%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.64% (환산) vs 평균 0.42% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 87,600"}, {"label": "거래량 급증", "ok": true, "detail": "595,733 (환산) vs 평균 392,182"}, {"label": "회전율 급증", "ok": true, "detail": "0.64% (환산) vs 평균 0.42%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-08-04T10:32:13.380611+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 93500, "qty": 36, "cost": 3366505, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 79135, "target": 122595, "signals": [{"label": "손절선", "ok": true, "detail": "79,135 (현재 93,400)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 122,595"}, {"label": "추세(10일선)", "ok": true, "detail": "81,420"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +57 · 기 +117"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 92,841"}]}
{"ts": "2026-08-05T09:02:14.722976+09:00", "side": "SELL", "code": "090850", "name": "현대이지웰", "price": 5700, "qty": 830, "proceeds": 4721775, "entry_price": 6310, "pnl": -516311, "pnl_pct": -9.67, "hold_from": "2026-07-30T09:18:10.185459+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,799 (현재 5,730)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 7,843"}, {"label": "추세(10일선)", "ok": true, "detail": "5,526"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +14 · 기 -2"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,423"}]}
{"ts": "2026-08-05T09:02:14.724365+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 13040, "qty": 153, "cost": 1995419, "path": "pullback", "reason": "눌림목 지정가 13,170 도달", "stop": 10340, "target": 21140, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "13,040 vs 12,877"}, {"label": "정배열(5>10)", "ok": true, "detail": "14,356 / 12,877"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "14,356 / 13,267"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-6.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -72 · 기 +134 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.13% (환산) vs 평균 1.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 15,870"}, {"label": "거래량 급증", "ok": false, "detail": "78,333 (환산) vs 평균 882,736"}, {"label": "회전율 급증", "ok": false, "detail": "0.13% (환산) vs 평균 1.47%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 13,170 (현재 13,040)"}]}
{"ts": "2026-08-05T09:38:12.648974+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 13830, "qty": 144, "cost": 1991819, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 10340, "target": 21140, "signals": [{"label": "손절선", "ok": true, "detail": "10,340 (현재 13,860)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,140"}, {"label": "추세(10일선)", "ok": true, "detail": "12,959"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -72 · 기 +134"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,817"}]}
{"ts": "2026-08-06T09:00:20.679765+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18730, "qty": 598, "proceeds": 11178699, "entry_price": 18950, "pnl": -155101, "pnl_pct": -1.16, "hold_from": "2026-07-24T10:02:04.447374+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 18,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,520"}, {"label": "추세(10일선)", "ok": false, "detail": "18,923"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -203 · 기 -147"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-08-06T09:14:11.164457+09:00", "side": "BUY", "code": "068270", "name": "셀트리온", "price": 193600, "qty": 24, "cost": 4647097, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 176944, "target": 243568, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "193,500 vs 180,840"}, {"label": "정배열(5>10)", "ok": true, "detail": "186,480 / 180,840"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "186,480 / 176,699"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+20.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +255 · 기 -319 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+42%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.49% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 191,700"}, {"label": "거래량 급증", "ok": true, "detail": "1,163,480 (환산) vs 평균 738,783"}, {"label": "회전율 급증", "ok": true, "detail": "0.49% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "64"}]}
{"ts": "2026-08-07T09:34:09.368713+09:00", "side": "BUY", "code": "068270", "name": "셀트리온", "price": 198600, "qty": 24, "cost": 4767115, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 176944, "target": 243568, "signals": [{"label": "손절선", "ok": true, "detail": "176,944 (현재 198,600)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 243,568"}, {"label": "추세(10일선)", "ok": true, "detail": "181,350"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +338 · 기 +73"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 197,939"}]}
{"ts": "2026-08-10T09:00:18.496804+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 136000, "qty": 27, "cost": 3672551, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 116144, "target": 175169, "signals": [{"label": "손절선", "ok": true, "detail": "116,144 (현재 137,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 175,169"}, {"label": "추세(10일선)", "ok": true, "detail": "109,170"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -253 · 기 +225"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 134,814"}]}
@@ -0,0 +1,200 @@
{
"cash": 26692924.320500042,
"initial": 100000000,
"positions": {
"214450": {
"code": "214450",
"name": "파마리서치",
"sources": [
"auto"
],
"qty": 21,
"entry_price": 343976.1904761905,
"entry_at": "2026-07-13T09:06:07.909051+09:00",
"stop": 302625,
"target": 426679,
"peak": 411500,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 409000,
"tranches": 2,
"tranche_value": 3813943.0504600187,
"last_add_price": 350000
},
"138040": {
"code": "138040",
"name": "메리츠금융지주",
"sources": [
"auto"
],
"qty": 81,
"entry_price": 124881.48148148147,
"entry_at": "2026-07-29T10:24:01.454311+09:00",
"stop": 114155,
"target": 146335,
"peak": 127600,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 123200,
"tranches": 2,
"tranche_value": 5142605.848996199,
"last_add_price": 126400
},
"003680": {
"code": "003680",
"name": "한성기업",
"sources": [
"auto"
],
"qty": 608,
"entry_price": 6333.0921052631575,
"entry_at": "2026-07-30T09:04:07.501481+09:00",
"stop": 5039,
"target": 8921,
"peak": 6840,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 7,457 도달",
"cur_price": 6220,
"tranches": 2,
"tranche_value": 1927621.6063135946,
"last_add_price": 6550
},
"010950": {
"code": "010950",
"name": "S-Oil",
"sources": [
"auto"
],
"qty": 55,
"entry_price": 133403.63636363635,
"entry_at": "2026-07-30T09:16:11.950700+09:00",
"stop": 117747,
"target": 164716,
"peak": 139900,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 139600,
"tranches": 2,
"tranche_value": 3759463.8630866953,
"last_add_price": 136000
},
"194370": {
"code": "194370",
"name": "제이에스코퍼레이션",
"sources": [
"auto"
],
"qty": 506,
"entry_price": 13159.9604743083,
"entry_at": "2026-08-03T12:00:12.428946+09:00",
"stop": 11445,
"target": 16590,
"peak": 14120,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 13370,
"tranches": 2,
"tranche_value": 3342042.065213833,
"last_add_price": 13420
},
"078930": {
"code": "078930",
"name": "GS",
"sources": [
"auto"
],
"qty": 73,
"entry_price": 91726.02739726027,
"entry_at": "2026-08-04T09:34:09.933331+09:00",
"stop": 80361,
"target": 114456,
"peak": 101600,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 97700,
"tranches": 2,
"tranche_value": 3414906.320549933,
"last_add_price": 93500
},
"252990": {
"code": "252990",
"name": "샘씨엔에스",
"sources": [
"auto"
],
"qty": 297,
"entry_price": 13423.030303030304,
"entry_at": "2026-08-05T09:02:14.737713+09:00",
"stop": 10340,
"target": 19589,
"peak": 15670,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 13,170 도달",
"cur_price": 15670,
"tranches": 2,
"tranche_value": 1996058.5440871862,
"last_add_price": 13830
},
"068270": {
"code": "068270",
"name": "셀트리온",
"sources": [
"interest"
],
"qty": 48,
"entry_price": 196100.0,
"entry_at": "2026-08-06T09:14:12.331155+09:00",
"stop": 178744,
"target": 230812,
"peak": 201000,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 201000,
"tranches": 2,
"tranche_value": 4827704.554226948,
"last_add_price": 198600
}
},
"realized_pnl": -18017783.52950002,
"closed_trades": 27,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.1859662521949996,
"last_exit": {
"030000": "2026-08-06",
"086790": "2026-07-29",
"005930": "2026-06-23",
"403870": "2026-07-07",
"240810": "2026-07-24",
"214450": "2026-07-06",
"093370": "2026-07-20",
"003490": "2026-07-09",
"055550": "2026-07-20",
"105560": "2026-07-20",
"024060": "2026-07-27",
"003680": "2026-07-29",
"138040": "2026-07-28",
"010950": "2026-07-29",
"252990": "2026-07-29",
"090850": "2026-08-05",
"078930": "2026-07-31"
},
"created_at": "2026-06-15T14:55:00.582910+09:00",
"updated_at": "2026-08-10T15:28:16.154115+09:00"
}
@@ -0,0 +1,87 @@
{"ts": "2026-06-17T11:15:02.386716+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 130900, "qty": 38, "cost": 4974946, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 118039, "target": 156622, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "129,300 vs 118,950"}, {"label": "정배열(5>10)", "ok": true, "detail": "120,400 / 118,950"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "120,400 / 118,307"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-13.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +371 · 기 +158 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+22%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.12% (환산) vs 평균 0.38% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 126,500"}, {"label": "거래량 급증", "ok": true, "detail": "3,094,534 (환산) vs 평균 1,031,725"}, {"label": "회전율 급증", "ok": true, "detail": "1.12% (환산) vs 평균 0.38%"}, {"label": "RSI", "ok": true, "detail": "60"}]}
{"ts": "2026-06-19T09:02:06.434317+09:00", "side": "BUY", "code": "005930", "name": "삼성전자", "price": 373500, "qty": 11, "cost": 4109116, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 331259, "target": 457982, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "373,000 vs 330,350"}, {"label": "정배열(5>10)", "ok": true, "detail": "352,400 / 330,350"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "352,400 / 258,005"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+6.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,427 · 기 +4,448 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+19%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.04% (환산) vs 평균 0.53% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 370,000"}, {"label": "거래량 급증", "ok": true, "detail": "60,950,213 (환산) vs 평균 31,088,390"}, {"label": "회전율 급증", "ok": true, "detail": "1.04% (환산) vs 평균 0.53%"}, {"label": "RSI", "ok": true, "detail": "67"}]}
{"ts": "2026-06-19T09:02:06.434691+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19160, "qty": 325, "cost": 6227934, "path": "pullback", "reason": "눌림목 지정가 19,690 도달", "stop": 17760, "target": 21960, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "19,150 vs 18,963"}, {"label": "정배열(5>10)", "ok": true, "detail": "19,616 / 18,963"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,616 / 19,361"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-31.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,162 · 기 +2,080 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.03% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "37,673 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.03% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,690 (현재 19,150)"}]}
{"ts": "2026-06-23T09:00:12.773335+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18820, "qty": 325, "proceeds": 6104573, "entry_price": 19160, "pnl": -123361, "pnl_pct": -1.77, "hold_from": "2026-06-19T09:02:06.434690+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 18,710)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,960"}, {"label": "추세(10일선)", "ok": false, "detail": "18,919"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -318 · 기 -227"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,528"}]}
{"ts": "2026-06-23T12:04:04.249227+09:00", "side": "SELL", "code": "086790", "name": "하나금융지주", "price": 117700, "qty": 38, "proceeds": 4463878, "entry_price": 130900, "pnl": -511068, "pnl_pct": -10.08, "hold_from": "2026-06-17T11:15:02.386715+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "118,039 (현재 117,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 156,622"}, {"label": "추세(10일선)", "ok": false, "detail": "119,330"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +332 · 기 -364"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 134,300"}]}
{"ts": "2026-06-23T12:32:04.199318+09:00", "side": "SELL", "code": "005930", "name": "삼성전자", "price": 330000, "qty": 11, "proceeds": 3622922, "entry_price": 373500, "pnl": -486195, "pnl_pct": -11.65, "hold_from": "2026-06-19T09:02:06.434316+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "331,259 (현재 330,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 457,982"}, {"label": "추세(10일선)", "ok": false, "detail": "335,050"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -3,792 · 기 +1,417"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 384,779"}]}
{"ts": "2026-06-24T09:02:02.390135+09:00", "side": "BUY", "code": "403870", "name": "HPSP", "price": 53200, "qty": 49, "cost": 2607191, "path": "pullback", "reason": "눌림목 지정가 60,114 도달", "stop": 43200, "target": 73200, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "53,200 vs 52,550"}, {"label": "정배열(5>10)", "ok": true, "detail": "57,960 / 52,550"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "57,960 / 49,671"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+20.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +711 · 기 -2,060 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+29%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.34% (환산) vs 평균 5.97% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 71,500"}, {"label": "거래량 급증", "ok": false, "detail": "1,102,733 (환산) vs 평균 4,912,598"}, {"label": "회전율 급증", "ok": false, "detail": "1.34% (환산) vs 평균 5.97%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 60,114 (현재 53,200)"}]}
{"ts": "2026-06-24T09:08:01.002080+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 155400, "qty": 13, "cost": 2020503, "path": "pullback", "reason": "눌림목 지정가 155,963 도달", "stop": 118951, "target": 228299, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "155,400 vs 128,090"}, {"label": "정배열(5>10)", "ok": true, "detail": "143,100 / 128,090"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "143,100 / 121,690"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+45.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +210 · 기 +143 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+6%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "6.50% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": true, "detail": "3,192,593 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": true, "detail": "6.50% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 155,963 (현재 155,400)"}]}
{"ts": "2026-06-25T09:04:05.760993+09:00", "side": "BUY", "code": "003490", "name": "대한항공", "price": 28900, "qty": 186, "cost": 5376206, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 26248, "target": 34203, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "28,850 vs 25,540"}, {"label": "정배열(5>10)", "ok": true, "detail": "26,110 / 25,540"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "26,110 / 25,216"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-2.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +1,577 · 기 -7 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.9/5"}, {"label": "상승여력", "ok": true, "detail": "+15%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.54% (환산) vs 평균 0.58% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 28,400"}, {"label": "거래량 급증", "ok": true, "detail": "5,629,873 (환산) vs 평균 2,146,231"}, {"label": "회전율 급증", "ok": true, "detail": "1.54% (환산) vs 평균 0.58%"}, {"label": "RSI", "ok": true, "detail": "64"}]}
{"ts": "2026-06-26T09:00:08.320457+09:00", "side": "SELL", "code": "403870", "name": "HPSP", "price": 50000, "qty": 49, "proceeds": 2445222, "entry_price": 53200, "pnl": -161969, "pnl_pct": -6.02, "hold_from": "2026-06-24T09:02:02.390134+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "43,200 (현재 51,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 73,200"}, {"label": "추세(10일선)", "ok": false, "detail": "52,330"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -311 · 기 -267"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 57,056"}]}
{"ts": "2026-06-26T09:04:03.911409+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 164900, "qty": 12, "cost": 1979097, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 118951, "target": 228299, "signals": [{"label": "손절선", "ok": true, "detail": "118,951 (현재 164,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 228,299"}, {"label": "추세(10일선)", "ok": true, "detail": "129,020"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -140 · 기 +323"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 164,359"}]}
{"ts": "2026-06-30T09:00:10.286868+09:00", "side": "BUY", "code": "403870", "name": "HPSP", "price": 55300, "qty": 40, "cost": 2212332, "path": "pullback", "reason": "눌림목 지정가 60,222 도달", "stop": 43200, "target": 79500, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "53,700 vs 52,600"}, {"label": "정배열(5>10)", "ok": true, "detail": "58,060 / 52,600"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "58,060 / 49,679"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+12.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +222 · 기 -821 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+28%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.00% (환산) vs 평균 5.97% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 71,500"}, {"label": "거래량 급증", "ok": false, "detail": "827 (환산) vs 평균 4,912,598"}, {"label": "회전율 급증", "ok": false, "detail": "0.00% (환산) vs 평균 5.97%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 60,222 (현재 53,700)"}]}
{"ts": "2026-06-30T09:02:03.203506+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 347500, "qty": 11, "cost": 3823073, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 305863, "target": 430774, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "347,000 vs 306,050"}, {"label": "정배열(5>10)", "ok": true, "detail": "315,600 / 306,050"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "315,600 / 305,533"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+29.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -19 · 기 +146 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+39%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.55% (환산) vs 평균 0.93% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 334,500"}, {"label": "거래량 급증", "ok": true, "detail": "160,800 (환산) vs 평균 96,436"}, {"label": "회전율 급증", "ok": true, "detail": "1.55% (환산) vs 평균 0.93%"}, {"label": "RSI", "ok": true, "detail": "66"}]}
{"ts": "2026-06-30T09:06:03.695446+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 360000, "qty": 11, "cost": 3960594, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 305863, "target": 430774, "signals": [{"label": "손절선", "ok": true, "detail": "305,863 (현재 360,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 430,774"}, {"label": "추세(10일선)", "ok": true, "detail": "307,350"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -19 · 기 +146"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 358,070"}]}
{"ts": "2026-07-02T10:18:03.860524+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 15980, "qty": 139, "cost": 2221553, "path": "pullback", "reason": "눌림목 지정가 16,358 도달", "stop": 12444, "target": 23051, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "15,980 vs 13,620"}, {"label": "정배열(5>10)", "ok": true, "detail": "16,104 / 13,620"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "16,104 / 11,478"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+25.7%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,833 · 기 +437 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+25%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "9.98% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": true, "detail": "10,701,165 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": true, "detail": "9.98% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "60"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 16,358 (현재 15,980)"}]}
{"ts": "2026-07-02T10:40:02.967580+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 18960, "qty": 324, "cost": 6143961, "path": "pullback", "reason": "눌림목 지정가 19,580 도달", "stop": 17760, "target": 21360, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "18,960 vs 18,944"}, {"label": "정배열(5>10)", "ok": true, "detail": "19,578 / 18,944"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,578 / 19,358"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+3.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -339 · 기 +110 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+34%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.86% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": true, "detail": "986,112 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.86% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "49"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,580 (현재 18,960)"}]}
{"ts": "2026-07-02T11:04:07.649962+09:00", "side": "BUY", "code": "003490", "name": "대한항공", "price": 29600, "qty": 182, "cost": 5388008, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 26248, "target": 34203, "signals": [{"label": "손절선", "ok": true, "detail": "26,248 (현재 29,600)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 34,203"}, {"label": "추세(10일선)", "ok": true, "detail": "25,615"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -206 · 기 +1,008"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 29,586"}]}
{"ts": "2026-07-02T11:20:02.071911+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 22550, "qty": 272, "cost": 6134520, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 17760, "target": 21360, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 19,350)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,360"}, {"label": "추세(10일선)", "ok": true, "detail": "18,983"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -339 · 기 +110"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,350"}]}
{"ts": "2026-07-02T11:24:06.161794+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18860, "qty": 596, "proceeds": 11218641, "entry_price": 20598, "pnl": -1059841, "pnl_pct": -8.44, "hold_from": "2026-07-02T10:40:02.967579+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "19,038 (현재 18,890)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 23,718"}, {"label": "추세(10일선)", "ok": false, "detail": "18,937"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -339 · 기 +110"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-03T09:44:02.623817+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 123600, "qty": 25, "proceeds": 3083974, "entry_price": 159960, "pnl": -915625, "pnl_pct": -22.73, "hold_from": "2026-06-24T09:08:01.002079+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "124,125 (현재 123,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 231,630"}, {"label": "추세(10일선)", "ok": false, "detail": "124,920"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +674 · 기 -2,170"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-03T10:24:02.787961+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19040, "qty": 314, "cost": 5979457, "path": "pullback", "reason": "눌림목 지정가 19,631 도달", "stop": 17760, "target": 21600, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "19,030 vs 18,951"}, {"label": "정배열(5>10)", "ok": true, "detail": "19,592 / 18,951"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,592 / 19,359"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+2.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -35 · 기 +168 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+34%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.54% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "619,193 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.54% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "49"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,631 (현재 19,030)"}]}
{"ts": "2026-07-06T09:00:11.019084+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 130600, "qty": 13, "cost": 1698055, "path": "pullback", "reason": "눌림목 지정가 154,452 도달", "stop": 96000, "target": 199800, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "133,100 vs 125,860"}, {"label": "정배열(5>10)", "ok": true, "detail": "138,640 / 125,860"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "138,640 / 121,318"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+17.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +782 · 기 -1,979 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+31%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.01% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": false, "detail": "4,080 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": false, "detail": "0.01% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "52"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 154,452 (현재 133,100)"}]}
{"ts": "2026-07-06T09:34:02.079679+09:00", "side": "BUY", "code": "055550", "name": "신한지주", "price": 110000, "qty": 44, "cost": 4840726, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 99202, "target": 131596, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "110,300 vs 99,990"}, {"label": "정배열(5>10)", "ok": true, "detail": "101,240 / 99,990"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "101,240 / 96,630"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+3.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -717 · 기 +1,343 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+17%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.55% (환산) vs 평균 0.35% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 109,800"}, {"label": "거래량 급증", "ok": true, "detail": "2,617,853 (환산) vs 평균 1,653,581"}, {"label": "회전율 급증", "ok": true, "detail": "0.55% (환산) vs 평균 0.35%"}, {"label": "RSI", "ok": true, "detail": "64"}]}
{"ts": "2026-07-06T10:20:01.614813+09:00", "side": "SELL", "code": "214450", "name": "파마리서치", "price": 311000, "qty": 22, "proceeds": 6828658, "entry_price": 353750, "pnl": -955009, "pnl_pct": -12.08, "hold_from": "2026-06-30T09:02:03.203505+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "311,470 (현재 311,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 438,310"}, {"label": "추세(10일선)", "ok": true, "detail": "302,450"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -108 · 기 +225"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-07T09:48:07.763662+09:00", "side": "SELL", "code": "403870", "name": "HPSP", "price": 43000, "qty": 40, "proceeds": 1716646, "entry_price": 55300, "pnl": -495686, "pnl_pct": -22.24, "hold_from": "2026-06-30T09:00:10.286858+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "43,200 (현재 43,050)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 79,500"}, {"label": "추세(10일선)", "ok": false, "detail": "51,535"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +1,424 · 기 -5,706"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 59,449"}]}
{"ts": "2026-07-07T10:28:06.475455+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 12410, "qty": 139, "proceeds": 1721626, "entry_price": 15980, "pnl": -499927, "pnl_pct": -22.34, "hold_from": "2026-07-02T10:18:03.860522+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "12,444 (현재 12,430)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 23,051"}, {"label": "추세(10일선)", "ok": false, "detail": "13,265"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -1,543 · 기 +15"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 16,975"}]}
{"ts": "2026-07-07T14:09:30.150362+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 183300, "qty": 9, "cost": 1649947, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 96000, "target": 199800, "signals": [{"label": "손절선", "ok": true, "detail": "96,000 (현재 183,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 199,800"}, {"label": "추세(10일선)", "ok": true, "detail": "123,150"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +263 · 기 -1,543"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 139,025"}]}
{"ts": "2026-07-07T14:09:30.152519+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 20750, "qty": 288, "cost": 5976896, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 17760, "target": 21600, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 20,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,600"}, {"label": "추세(10일선)", "ok": true, "detail": "18,901"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +156 · 기 +113"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,358"}]}
{"ts": "2026-07-08T09:00:19.833472+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 108300, "qty": 22, "proceeds": 2377954, "entry_price": 152159, "pnl": -970048, "pnl_pct": -28.82, "hold_from": "2026-07-06T09:00:11.019074+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "118,460 (현재 112,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 219,558"}, {"label": "추세(10일선)", "ok": false, "detail": "123,820"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +243 · 기 -857"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-09T09:10:01.837490+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 132300, "qty": 31, "cost": 4101915, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 117515, "target": 161870, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "132,100 vs 108,680"}, {"label": "정배열(5>10)", "ok": true, "detail": "115,600 / 108,680"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "115,600 / 113,232"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+22.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -184 · 기 +964 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+12%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.51% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 116,900"}, {"label": "거래량 급증", "ok": true, "detail": "572,860 (환산) vs 평균 359,705"}, {"label": "회전율 급증", "ok": true, "detail": "0.51% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-07-09T12:12:04.868938+09:00", "side": "SELL", "code": "003490", "name": "대한항공", "price": 26500, "qty": 368, "proceeds": 9732984, "entry_price": 29246, "pnl": -1031231, "pnl_pct": -9.39, "hold_from": "2026-06-25T09:04:05.760992+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "26,502 (현재 26,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 34,735"}, {"label": "추세(10일선)", "ok": true, "detail": "25,305"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -1,444 · 기 +2,767"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-10T09:18:05.238378+09:00", "side": "BUY", "code": "105560", "name": "KB금융", "price": 183700, "qty": 24, "cost": 4409461, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 164505, "target": 222089, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "183,600 vs 158,140"}, {"label": "정배열(5>10)", "ok": true, "detail": "159,500 / 158,140"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "159,500 / 157,335"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+25.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,310 · 기 +1,527 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+17%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.73% (환산) vs 평균 0.46% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 182,700"}, {"label": "거래량 급증", "ok": true, "detail": "2,553,373 (환산) vs 평균 1,640,325"}, {"label": "회전율 급증", "ok": true, "detail": "0.73% (환산) vs 평균 0.46%"}, {"label": "RSI", "ok": true, "detail": "68"}]}
{"ts": "2026-07-10T09:26:06.452586+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 130900, "qty": 34, "cost": 4451268, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 117686, "target": 157327, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "130,800 vs 120,640"}, {"label": "정배열(5>10)", "ok": true, "detail": "122,760 / 120,640"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "122,760 / 118,578"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+18.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -427 · 기 +555 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+23%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.60% (환산) vs 평균 0.37% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 130,700"}, {"label": "거래량 급증", "ok": true, "detail": "1,646,513 (환산) vs 평균 1,026,357"}, {"label": "회전율 급증", "ok": true, "detail": "0.60% (환산) vs 평균 0.37%"}, {"label": "RSI", "ok": true, "detail": "61"}]}
{"ts": "2026-07-10T11:06:06.482328+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 13660, "qty": 139, "cost": 1899025, "path": "pullback", "reason": "눌림목 지정가 15,971 도달", "stop": 10360, "target": 20260, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "13,630 vs 13,385"}, {"label": "정배열(5>10)", "ok": true, "detail": "15,634 / 13,385"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "15,634 / 11,439"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+6.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +210 · 기 +239 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+47%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "14.23% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": true, "detail": "15,267,605 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": true, "detail": "14.23% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "52"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 15,971 (현재 13,630)"}]}
{"ts": "2026-07-10T12:14:02.683072+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 126200, "qty": 15, "cost": 1893284, "path": "pullback", "reason": "눌림목 지정가 151,752 도달", "stop": 96000, "target": 186600, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "126,200 vs 125,170"}, {"label": "정배열(5>10)", "ok": true, "detail": "137,260 / 125,170"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "137,260 / 121,203"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+17.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +483 · 기 -241 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+38%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "7.53% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": true, "detail": "3,695,762 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": true, "detail": "7.53% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 151,752 (현재 126,200)"}]}
{"ts": "2026-07-10T12:36:02.511186+09:00", "side": "BUY", "code": "105560", "name": "KB금융", "price": 188900, "qty": 23, "cost": 4345352, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 164505, "target": 222089, "signals": [{"label": "손절선", "ok": true, "detail": "164,505 (현재 188,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 222,089"}, {"label": "추세(10일선)", "ok": true, "detail": "158,670"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -1,220 · 기 +1,654"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 188,670"}]}
{"ts": "2026-07-13T09:00:11.775509+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 136900, "qty": 30, "cost": 4107616, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 117515, "target": 161870, "signals": [{"label": "손절선", "ok": true, "detail": "117,515 (현재 136,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 161,870"}, {"label": "추세(10일선)", "ok": true, "detail": "109,100"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -64 · 기 +919"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 136,164"}]}
{"ts": "2026-07-13T09:06:07.908857+09:00", "side": "BUY", "code": "055550", "name": "신한지주", "price": 112800, "qty": 42, "cost": 4738311, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 99202, "target": 131596, "signals": [{"label": "손절선", "ok": true, "detail": "99,202 (현재 112,800)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 131,596"}, {"label": "추세(10일선)", "ok": true, "detail": "100,240"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -358 · 기 +991"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 112,792"}]}
{"ts": "2026-07-13T09:06:07.909053+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 338500, "qty": 11, "cost": 3724059, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 297363, "target": 420774, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "338,500 vs 305,200"}, {"label": "정배열(5>10)", "ok": true, "detail": "313,900 / 305,200"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "313,900 / 305,392"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+32.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -63 · 기 +144 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+42%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.45% (환산) vs 평균 0.93% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 334,500"}, {"label": "거래량 급증", "ok": true, "detail": "150,147 (환산) vs 평균 96,436"}, {"label": "회전율 급증", "ok": true, "detail": "1.45% (환산) vs 평균 0.93%"}, {"label": "RSI", "ok": true, "detail": "64"}]}
{"ts": "2026-07-13T09:08:05.363738+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 134300, "qty": 34, "cost": 4566885, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 117686, "target": 157327, "signals": [{"label": "손절선", "ok": true, "detail": "117,686 (현재 134,200)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 157,327"}, {"label": "추세(10일선)", "ok": true, "detail": "120,980"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -277 · 기 +460"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 134,118"}]}
{"ts": "2026-07-13T09:26:03.421829+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 139100, "qty": 13, "cost": 1808571, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 96000, "target": 186600, "signals": [{"label": "손절선", "ok": true, "detail": "96,000 (현재 139,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 186,600"}, {"label": "추세(10일선)", "ok": true, "detail": "126,460"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -213 · 기 +772"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 136,162"}]}
{"ts": "2026-07-15T14:32:01.895515+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18570, "qty": 602, "proceeds": 11157341, "entry_price": 19858, "pnl": -799013, "pnl_pct": -6.49, "hold_from": "2026-07-03T10:24:02.787960+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "18,586 (현재 18,570)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,403"}, {"label": "추세(10일선)", "ok": false, "detail": "18,905"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -214 · 기 +240"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-16T09:22:02.316697+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 350000, "qty": 10, "cost": 3500525, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 297363, "target": 420774, "signals": [{"label": "손절선", "ok": true, "detail": "297,363 (현재 350,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 420,774"}, {"label": "추세(10일선)", "ok": true, "detail": "306,350"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -33 · 기 +28"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 348,838"}]}
{"ts": "2026-07-20T12:28:02.326967+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 10310, "qty": 139, "proceeds": 1430295, "entry_price": 13660, "pnl": -468729, "pnl_pct": -24.52, "hold_from": "2026-07-10T11:06:06.482327+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "10,360 (현재 10,310)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 20,260"}, {"label": "추세(10일선)", "ok": false, "detail": "12,013"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -887 · 기 +515"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 14,626"}]}
{"ts": "2026-07-20T14:12:02.751263+09:00", "side": "SELL", "code": "055550", "name": "신한지주", "price": 100100, "qty": 86, "proceeds": 8591813, "entry_price": 111367, "pnl": -987223, "pnl_pct": -10.12, "hold_from": "2026-07-06T09:34:02.079678+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "100,198 (현재 100,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 133,706"}, {"label": "추세(10일선)", "ok": true, "detail": "98,970"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -168 · 기 +257"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-20T14:12:02.752134+09:00", "side": "SELL", "code": "105560", "name": "KB금융", "price": 166000, "qty": 47, "proceeds": 7786786, "entry_price": 186245, "pnl": -968027, "pnl_pct": -10.87, "hold_from": "2026-07-10T09:18:05.238376+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "166,364 (현재 166,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 226,005"}, {"label": "추세(10일선)", "ok": true, "detail": "156,380"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -440 · 기 +299"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-23T09:46:06.372104+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 88400, "qty": 42, "cost": 3713357, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 77778, "target": 109644, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "88,300 vs 80,910"}, {"label": "정배열(5>10)", "ok": true, "detail": "83,020 / 80,910"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "83,020 / 75,060"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+47.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -150 · 기 +299 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+17%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.80% (환산) vs 평균 0.42% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 87,600"}, {"label": "거래량 급증", "ok": true, "detail": "743,133 (환산) vs 평균 392,182"}, {"label": "회전율 급증", "ok": true, "detail": "0.80% (환산) vs 평균 0.42%"}, {"label": "RSI", "ok": true, "detail": "67"}]}
{"ts": "2026-07-23T10:30:02.496091+09:00", "side": "BUY", "code": "024060", "name": "흥구석유", "price": 14140, "qty": 184, "cost": 2602150, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 11706, "target": 19008, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "14,180 vs 12,429"}, {"label": "정배열(5>10)", "ok": true, "detail": "13,154 / 12,429"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "13,154 / 12,687"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+55.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +109 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "84.26% (환산) vs 평균 31.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 13,990"}, {"label": "거래량 급증", "ok": true, "detail": "12,639,979 (환산) vs 평균 4,720,532"}, {"label": "회전율 급증", "ok": true, "detail": "84.26% (환산) vs 평균 31.47%"}, {"label": "RSI", "ok": true, "detail": "66"}]}
{"ts": "2026-07-23T13:06:04.448860+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 91400, "qty": 40, "cost": 3656548, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 77778, "target": 109644, "signals": [{"label": "손절선", "ok": true, "detail": "77,778 (현재 91,400)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 109,644"}, {"label": "추세(10일선)", "ok": true, "detail": "81,220"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -169 · 기 +311"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 91,159"}]}
{"ts": "2026-07-24T09:00:08.379451+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 111800, "qty": 28, "proceeds": 3124296, "entry_price": 132189, "pnl": -577559, "pnl_pct": -15.42, "hold_from": "2026-07-10T12:14:02.683071+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "96,000 (현재 113,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 204,568"}, {"label": "추세(10일선)", "ok": false, "detail": "123,880"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -480 · 기 -206"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-24T09:02:04.053909+09:00", "side": "BUY", "code": "024060", "name": "흥구석유", "price": 15060, "qty": 172, "cost": 2590709, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 11706, "target": 19008, "signals": [{"label": "손절선", "ok": true, "detail": "11,706 (현재 15,020)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 19,008"}, {"label": "추세(10일선)", "ok": true, "detail": "12,513"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +208 · 기 -2"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 14,766"}]}
{"ts": "2026-07-24T10:02:04.449500+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 18950, "qty": 299, "cost": 5666900, "path": "pullback", "reason": "눌림목 지정가 19,643 도달", "stop": 17760, "target": 21330, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "18,950 vs 18,943"}, {"label": "정배열(5>10)", "ok": true, "detail": "19,576 / 18,943"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,576 / 19,358"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+19.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +2 · 기 -5 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.39% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "454,069 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.39% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "49"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,643 (현재 18,950)"}]}
{"ts": "2026-07-27T09:02:06.244231+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 7470, "qty": 409, "cost": 3055688, "path": "pullback", "reason": "눌림목 지정가 7,635 도달", "stop": 6370, "target": 9669, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "7,470 vs 5,392"}, {"label": "정배열(5>10)", "ok": true, "detail": "6,452 / 5,392"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,452 / 4,889"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+82.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +49 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.79% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "49,327 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "0.79% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "74"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,635 (현재 7,470)"}]}
{"ts": "2026-07-27T09:08:02.098345+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 7910, "qty": 386, "cost": 3053718, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 6370, "target": 9669, "signals": [{"label": "손절선", "ok": true, "detail": "6,370 (현재 7,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 9,669"}, {"label": "추세(10일선)", "ok": true, "detail": "5,434"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +49 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 7,747"}]}
{"ts": "2026-07-27T09:10:01.052569+09:00", "side": "SELL", "code": "024060", "name": "흥구석유", "price": 12030, "qty": 356, "proceeds": 4274329, "entry_price": 14584, "pnl": -918530, "pnl_pct": -17.52, "hold_from": "2026-07-23T10:30:02.496090+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "12,081 (현재 12,030)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 19,592"}, {"label": "추세(10일선)", "ok": false, "detail": "12,214"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -85 · 기 +2"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-27T09:12:01.529454+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 13150, "qty": 159, "cost": 2091164, "path": "pullback", "reason": "눌림목 지정가 13,180 도달", "stop": 10340, "target": 18770, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "13,150 vs 12,888"}, {"label": "정배열(5>10)", "ok": true, "detail": "14,378 / 12,888"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "14,378 / 13,268"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+1.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +27 · 기 +15 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.46% (환산) vs 평균 1.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 15,870"}, {"label": "거래량 급증", "ok": false, "detail": "274,967 (환산) vs 평균 882,736"}, {"label": "회전율 급증", "ok": false, "detail": "0.46% (환산) vs 평균 1.47%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 13,180 (현재 13,150)"}]}
{"ts": "2026-07-27T09:18:02.000974+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 127700, "qty": 43, "cost": 5491924, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 117473, "target": 148153, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "127,400 vs 117,350"}, {"label": "정배열(5>10)", "ok": true, "detail": "118,940 / 117,350"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "118,940 / 110,142"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+46.7%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +106 · 기 +291 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+16%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.26% (환산) vs 평균 0.17% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 123,300"}, {"label": "거래량 급증", "ok": true, "detail": "439,847 (환산) vs 평균 289,522"}, {"label": "회전율 급증", "ok": true, "detail": "0.26% (환산) vs 평균 0.17%"}, {"label": "RSI", "ok": true, "detail": "71"}]}
{"ts": "2026-07-28T11:22:00.759696+09:00", "side": "SELL", "code": "003680", "name": "한성기업", "price": 6630, "qty": 795, "proceeds": 5260572, "entry_price": 7684, "pnl": -848834, "pnl_pct": -13.71, "hold_from": "2026-07-27T09:02:06.244230+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "6,577 (현재 6,380)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 9,897"}, {"label": "추세(10일선)", "ok": true, "detail": "5,282"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +96 · 기 +0"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-28T13:02:00.828310+09:00", "side": "SELL", "code": "138040", "name": "메리츠금융지주", "price": 117400, "qty": 43, "proceeds": 5038356, "entry_price": 127700, "pnl": -453568, "pnl_pct": -8.07, "hold_from": "2026-07-27T09:18:02.000973+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "117,473 (현재 117,400)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 148,153"}, {"label": "추세(10일선)", "ok": true, "detail": "116,350"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +84 · 기 +324"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 130,353"}]}
{"ts": "2026-07-29T09:02:02.245060+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6540, "qty": 344, "cost": 2250097, "path": "pullback", "reason": "눌림목 지정가 7,526 도달", "stop": 5295, "target": 9031, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "6,540 vs 5,298"}, {"label": "정배열(5>10)", "ok": true, "detail": "6,266 / 5,298"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,266 / 4,873"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+70.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +188 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.87% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "116,047 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "1.87% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "63"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,526 (현재 6,540)"}]}
{"ts": "2026-07-29T09:24:10.010772+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 18950, "qty": 299, "cost": 5666900, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 17760, "target": 21330, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 20,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,330"}, {"label": "추세(10일선)", "ok": true, "detail": "18,901"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +99 · 기 +138"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,268"}]}
{"ts": "2026-07-29T09:24:10.011056+09:00", "side": "SELL", "code": "010950", "name": "S-Oil", "price": 128600, "qty": 61, "proceeds": 7829303, "entry_price": 134562, "pnl": -380228, "pnl_pct": -4.43, "hold_from": "2026-07-09T09:10:01.837488+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "119,106 (현재 116,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 165,475"}, {"label": "추세(10일선)", "ok": true, "detail": "105,620"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +43 · 기 +245"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T09:24:10.011197+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6710, "qty": 335, "cost": 2248187, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 5295, "target": 9031, "signals": [{"label": "손절선", "ok": true, "detail": "5,295 (현재 8,460)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 9,031"}, {"label": "추세(10일선)", "ok": true, "detail": "5,064"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +188 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,796"}]}
{"ts": "2026-07-29T09:24:10.011401+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 11310, "qty": 185, "cost": 2092664, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 10340, "target": 18770, "signals": [{"label": "손절선", "ok": true, "detail": "10,340 (현재 15,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 18,770"}, {"label": "추세(10일선)", "ok": true, "detail": "12,768"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +242 · 기 -182"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,887"}]}
{"ts": "2026-07-29T09:28:01.394949+09:00", "side": "BUY", "code": "090850", "name": "현대이지웰", "price": 6390, "qty": 820, "cost": 5240586, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 5867, "target": 7435, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "6,380 vs 5,591"}, {"label": "정배열(5>10)", "ok": true, "detail": "5,742 / 5,591"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "5,742 / 5,622"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+43.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +73 · 기 -3 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.62% (환산) vs 평균 0.22% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 5,700"}, {"label": "거래량 급증", "ok": true, "detail": "134,413 (환산) vs 평균 49,512"}, {"label": "회전율 급증", "ok": true, "detail": "0.62% (환산) vs 평균 0.22%"}, {"label": "RSI", "ok": true, "detail": "73"}]}
{"ts": "2026-07-29T10:24:01.454312+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 123400, "qty": 41, "cost": 5060159, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 113016, "target": 144168, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "123,400 vs 116,950"}, {"label": "정배열(5>10)", "ok": true, "detail": "118,140 / 116,950"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "118,140 / 110,075"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+51.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +47 · 기 +310 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+20%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.38% (환산) vs 평균 0.17% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 123,300"}, {"label": "거래량 급증", "ok": true, "detail": "644,676 (환산) vs 평균 289,522"}, {"label": "회전율 급증", "ok": true, "detail": "0.38% (환산) vs 평균 0.17%"}, {"label": "RSI", "ok": true, "detail": "67"}]}
{"ts": "2026-07-29T10:52:02.361082+09:00", "side": "SELL", "code": "252990", "name": "샘씨엔에스", "price": 10340, "qty": 344, "proceeds": 3550024, "entry_price": 12160, "pnl": -633804, "pnl_pct": -14.97, "hold_from": "2026-07-27T09:12:01.529452+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "10,340 (현재 10,340)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 15,801"}, {"label": "추세(10일선)", "ok": false, "detail": "12,607"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +239 · 기 -181"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T12:04:01.699059+09:00", "side": "SELL", "code": "086790", "name": "하나금융지주", "price": 119200, "qty": 68, "proceeds": 8089794, "entry_price": 132600, "pnl": -928358, "pnl_pct": -10.11, "hold_from": "2026-07-10T09:26:06.452585+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "119,729 (현재 119,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 158,342"}, {"label": "추세(10일선)", "ok": false, "detail": "119,490"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -11 · 기 -51"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T13:14:05.451456+09:00", "side": "SELL", "code": "003680", "name": "한성기업", "price": 5580, "qty": 679, "proceeds": 3781432, "entry_price": 6624, "pnl": -716853, "pnl_pct": -15.76, "hold_from": "2026-07-29T09:02:02.245058+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,600 (현재 5,590)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 8,672"}, {"label": "추세(10일선)", "ok": true, "detail": "5,204"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +185 · 기 +0"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T13:34:03.600416+09:00", "side": "SELL", "code": "090850", "name": "현대이지웰", "price": 5860, "qty": 820, "proceeds": 4795830, "entry_price": 6390, "pnl": -444756, "pnl_pct": -8.29, "hold_from": "2026-07-29T09:28:01.394948+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,867 (현재 5,860)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 7,435"}, {"label": "추세(10일선)", "ok": true, "detail": "5,539"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +73 · 기 -3"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,525"}]}
{"ts": "2026-07-30T09:04:07.501484+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6130, "qty": 314, "cost": 1925109, "path": "pullback", "reason": "눌림목 지정가 7,457 도달", "stop": 4793, "target": 8804, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "6,120 vs 5,256"}, {"label": "정배열(5>10)", "ok": true, "detail": "6,182 / 5,256"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,182 / 4,866"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+65.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +234 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "4.31% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "267,687 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "4.31% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,457 (현재 6,120)"}]}
{"ts": "2026-07-30T09:16:11.950702+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 130900, "qty": 28, "cost": 3665750, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 116144, "target": 160413, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "130,900 vs 108,560"}, {"label": "정배열(5>10)", "ok": true, "detail": "115,360 / 108,560"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "115,360 / 113,212"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+49.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -6 · 기 +178 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+21%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.51% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 116,900"}, {"label": "거래량 급증", "ok": true, "detail": "571,193 (환산) vs 평균 359,705"}, {"label": "회전율 급증", "ok": true, "detail": "0.51% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "68"}]}
{"ts": "2026-07-30T09:18:10.189166+09:00", "side": "BUY", "code": "090850", "name": "현대이지웰", "price": 6310, "qty": 830, "cost": 5238086, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 5799, "target": 7332, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "6,300 vs 5,583"}, {"label": "정배열(5>10)", "ok": true, "detail": "5,726 / 5,583"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "5,726 / 5,621"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+46.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +87 · 기 +6 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.41% (환산) vs 평균 0.22% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 5,700"}, {"label": "거래량 급증", "ok": true, "detail": "87,813 (환산) vs 평균 49,512"}, {"label": "회전율 급증", "ok": true, "detail": "0.41% (환산) vs 평균 0.22%"}, {"label": "RSI", "ok": true, "detail": "72"}]}
{"ts": "2026-07-30T09:50:07.304413+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 126400, "qty": 40, "cost": 5056758, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 113016, "target": 144168, "signals": [{"label": "손절선", "ok": true, "detail": "113,016 (현재 126,200)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 144,168"}, {"label": "추세(10일선)", "ok": true, "detail": "117,230"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +9 · 기 +389"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 126,082"}]}
{"ts": "2026-07-31T09:06:07.639526+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6550, "qty": 294, "cost": 1925989, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 4793, "target": 8804, "signals": [{"label": "손절선", "ok": true, "detail": "4,793 (현재 6,640)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 8,804"}, {"label": "추세(10일선)", "ok": true, "detail": "5,308"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +355 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,453"}]}
{"ts": "2026-07-31T09:06:07.640655+09:00", "side": "SELL", "code": "078930", "name": "GS", "price": 77700, "qty": 82, "proceeds": 6358976, "entry_price": 89863, "pnl": -1010930, "pnl_pct": -13.54, "hold_from": "2026-07-23T09:46:06.372102+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "78,827 (현재 78,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 111,936"}, {"label": "추세(10일선)", "ok": false, "detail": "79,880"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -179 · 기 +325"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-08-03T12:00:12.428952+09:00", "side": "BUY", "code": "194370", "name": "제이에스코퍼레이션", "price": 12910, "qty": 258, "cost": 3331280, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 11314, "target": 16103, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "12,930 vs 12,003"}, {"label": "정배열(5>10)", "ok": true, "detail": "12,138 / 12,003"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "12,138 / 11,924"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+27.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +7 · 기 +10 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+74%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.72% (환산) vs 평균 0.34% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 12,870"}, {"label": "거래량 급증", "ok": true, "detail": "208,994 (환산) vs 평균 99,303"}, {"label": "회전율 급증", "ok": true, "detail": "0.72% (환산) vs 평균 0.34%"}, {"label": "RSI", "ok": true, "detail": "63"}]}
{"ts": "2026-08-03T12:02:10.370265+09:00", "side": "BUY", "code": "194370", "name": "제이에스코퍼레이션", "price": 13420, "qty": 248, "cost": 3328659, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 11314, "target": 16103, "signals": [{"label": "손절선", "ok": true, "detail": "11,314 (현재 13,450)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 16,103"}, {"label": "추세(10일선)", "ok": true, "detail": "12,055"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +7 · 기 +10"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,339"}]}
{"ts": "2026-08-04T09:34:09.933337+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 90000, "qty": 37, "cost": 3330500, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 79135, "target": 111730, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "89,800 vs 81,060"}, {"label": "정배열(5>10)", "ok": true, "detail": "83,320 / 81,060"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "83,320 / 75,085"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+55.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +68 · 기 +117 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+15%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.64% (환산) vs 평균 0.42% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 87,600"}, {"label": "거래량 급증", "ok": true, "detail": "595,733 (환산) vs 평균 392,182"}, {"label": "회전율 급증", "ok": true, "detail": "0.64% (환산) vs 평균 0.42%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-08-04T10:32:13.392266+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 93500, "qty": 36, "cost": 3366505, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 79135, "target": 111730, "signals": [{"label": "손절선", "ok": true, "detail": "79,135 (현재 93,400)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 111,730"}, {"label": "추세(10일선)", "ok": true, "detail": "81,420"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +57 · 기 +117"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 92,841"}]}
{"ts": "2026-08-05T09:02:14.736714+09:00", "side": "SELL", "code": "090850", "name": "현대이지웰", "price": 5700, "qty": 830, "proceeds": 4721775, "entry_price": 6310, "pnl": -516311, "pnl_pct": -9.67, "hold_from": "2026-07-30T09:18:10.189164+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,799 (현재 5,730)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 7,332"}, {"label": "추세(10일선)", "ok": true, "detail": "5,526"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +14 · 기 -2"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,423"}]}
{"ts": "2026-08-05T09:02:14.737719+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 13040, "qty": 153, "cost": 1995419, "path": "pullback", "reason": "눌림목 지정가 13,170 도달", "stop": 10340, "target": 18440, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "13,040 vs 12,877"}, {"label": "정배열(5>10)", "ok": true, "detail": "14,356 / 12,877"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "14,356 / 13,267"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-6.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -72 · 기 +134 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.13% (환산) vs 평균 1.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 15,870"}, {"label": "거래량 급증", "ok": false, "detail": "78,333 (환산) vs 평균 882,736"}, {"label": "회전율 급증", "ok": false, "detail": "0.13% (환산) vs 평균 1.47%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 13,170 (현재 13,040)"}]}
{"ts": "2026-08-05T09:38:13.237529+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 13830, "qty": 144, "cost": 1991819, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 10340, "target": 18440, "signals": [{"label": "손절선", "ok": true, "detail": "10,340 (현재 13,860)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 18,440"}, {"label": "추세(10일선)", "ok": true, "detail": "12,959"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -72 · 기 +134"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,817"}]}
{"ts": "2026-08-06T09:00:21.666182+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18730, "qty": 598, "proceeds": 11178699, "entry_price": 18950, "pnl": -155101, "pnl_pct": -1.16, "hold_from": "2026-07-24T10:02:04.449498+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 18,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,330"}, {"label": "추세(10일선)", "ok": false, "detail": "18,923"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -203 · 기 -147"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-08-06T09:14:12.331161+09:00", "side": "BUY", "code": "068270", "name": "셀트리온", "price": 193600, "qty": 24, "cost": 4647097, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 176944, "target": 226912, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "193,500 vs 180,840"}, {"label": "정배열(5>10)", "ok": true, "detail": "186,480 / 180,840"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "186,480 / 176,699"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+20.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +255 · 기 -319 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+42%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.49% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 191,700"}, {"label": "거래량 급증", "ok": true, "detail": "1,163,480 (환산) vs 평균 738,783"}, {"label": "회전율 급증", "ok": true, "detail": "0.49% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "64"}]}
{"ts": "2026-08-07T09:34:11.057722+09:00", "side": "BUY", "code": "068270", "name": "셀트리온", "price": 198600, "qty": 24, "cost": 4767115, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 176944, "target": 226912, "signals": [{"label": "손절선", "ok": true, "detail": "176,944 (현재 198,600)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 226,912"}, {"label": "추세(10일선)", "ok": true, "detail": "181,350"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +338 · 기 +73"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 197,939"}]}
{"ts": "2026-08-10T09:00:20.440298+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 136000, "qty": 27, "cost": 3672551, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 116144, "target": 160413, "signals": [{"label": "손절선", "ok": true, "detail": "116,144 (현재 137,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 160,413"}, {"label": "추세(10일선)", "ok": true, "detail": "109,170"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -253 · 기 +225"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 134,814"}]}
@@ -0,0 +1,200 @@
{
"cash": 29414084.747000005,
"initial": 100000000,
"positions": {
"138040": {
"code": "138040",
"name": "메리츠금융지주",
"sources": [
"auto"
],
"qty": 81,
"entry_price": 124881.48148148147,
"entry_at": "2026-07-29T10:24:01.456083+09:00",
"stop": 114155,
"target": 140972,
"peak": 127600,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 123200,
"tranches": 2,
"tranche_value": 5164071.483514108,
"last_add_price": 126400
},
"003680": {
"code": "003680",
"name": "한성기업",
"sources": [
"auto"
],
"qty": 617,
"entry_price": 6332.852512155591,
"entry_at": "2026-07-30T09:04:07.505690+09:00",
"stop": 5039,
"target": 8274,
"peak": 6840,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 7,457 도달",
"cur_price": 6220,
"tranches": 2,
"tranche_value": 1956462.6546955872,
"last_add_price": 6550
},
"010950": {
"code": "010950",
"name": "S-Oil",
"sources": [
"auto"
],
"qty": 57,
"entry_price": 133405.26315789475,
"entry_at": "2026-07-30T09:16:11.953984+09:00",
"stop": 117749,
"target": 156890,
"peak": 139900,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 139600,
"tranches": 2,
"tranche_value": 3812991.5556229833,
"last_add_price": 136000
},
"194370": {
"code": "194370",
"name": "제이에스코퍼레이션",
"sources": [
"auto"
],
"qty": 514,
"entry_price": 13160.038910505837,
"entry_at": "2026-08-03T12:00:12.437989+09:00",
"stop": 11445,
"target": 15732,
"peak": 14120,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 13370,
"tranches": 2,
"tranche_value": 3393650.506937234,
"last_add_price": 13420
},
"078930": {
"code": "078930",
"name": "GS",
"sources": [
"auto"
],
"qty": 75,
"entry_price": 91726.66666666667,
"entry_at": "2026-08-04T09:34:09.942366+09:00",
"stop": 80362,
"target": 108774,
"peak": 101600,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 97700,
"tranches": 2,
"tranche_value": 3469610.992924529,
"last_add_price": 93500
},
"252990": {
"code": "252990",
"name": "샘씨엔에스",
"sources": [
"auto"
],
"qty": 301,
"entry_price": 13423.189368770763,
"entry_at": "2026-08-05T09:02:14.746818+09:00",
"stop": 10340,
"target": 18048,
"peak": 15670,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 13,170 도달",
"cur_price": 15670,
"tranches": 2,
"tranche_value": 2028402.8880774078,
"last_add_price": 13830
},
"068270": {
"code": "068270",
"name": "셀트리온",
"sources": [
"interest"
],
"qty": 49,
"entry_price": 196048.97959183675,
"entry_at": "2026-08-06T09:14:12.340235+09:00",
"stop": 178693,
"target": 222083,
"peak": 201000,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 201000,
"tranches": 2,
"tranche_value": 4907695.663916428,
"last_add_price": 198600
},
"030000": {
"code": "030000",
"name": "제일기획",
"sources": [
"auto"
],
"qty": 274,
"entry_price": 19170,
"entry_at": "2026-08-07T11:26:15.615754+09:00",
"stop": 17760,
"target": 21285,
"peak": 19270,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 19,668 도달",
"cur_price": 18970,
"tranches": 1,
"tranche_value": 5272247.114625,
"last_add_price": 19170
}
},
"realized_pnl": -16407799.75450002,
"closed_trades": 29,
"wins": 2,
"peak_equity": 100000000,
"max_drawdown": 0.1727808549849999,
"last_exit": {
"030000": "2026-08-06",
"086790": "2026-07-29",
"005930": "2026-06-23",
"403870": "2026-07-07",
"240810": "2026-07-24",
"214450": "2026-08-07",
"093370": "2026-07-20",
"003490": "2026-07-09",
"055550": "2026-07-20",
"105560": "2026-07-20",
"024060": "2026-07-27",
"003680": "2026-07-29",
"138040": "2026-07-28",
"010950": "2026-07-29",
"252990": "2026-07-29",
"090850": "2026-08-05",
"078930": "2026-07-31"
},
"created_at": "2026-06-15T14:55:00.582926+09:00",
"updated_at": "2026-08-10T15:28:16.161829+09:00"
}
@@ -0,0 +1,88 @@
{"ts": "2026-06-17T11:15:02.389906+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 130900, "qty": 38, "cost": 4974946, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 118039, "target": 150191, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "129,300 vs 118,950"}, {"label": "정배열(5>10)", "ok": true, "detail": "120,400 / 118,950"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "120,400 / 118,307"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-13.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +371 · 기 +158 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+22%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.12% (환산) vs 평균 0.38% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 126,500"}, {"label": "거래량 급증", "ok": true, "detail": "3,094,534 (환산) vs 평균 1,031,725"}, {"label": "회전율 급증", "ok": true, "detail": "1.12% (환산) vs 평균 0.38%"}, {"label": "RSI", "ok": true, "detail": "60"}]}
{"ts": "2026-06-19T09:02:06.437860+09:00", "side": "BUY", "code": "005930", "name": "삼성전자", "price": 373500, "qty": 11, "cost": 4109116, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 331259, "target": 436861, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "373,000 vs 330,350"}, {"label": "정배열(5>10)", "ok": true, "detail": "352,400 / 330,350"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "352,400 / 258,005"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+6.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,427 · 기 +4,448 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+19%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.04% (환산) vs 평균 0.53% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 370,000"}, {"label": "거래량 급증", "ok": true, "detail": "60,950,213 (환산) vs 평균 31,088,390"}, {"label": "회전율 급증", "ok": true, "detail": "1.04% (환산) vs 평균 0.53%"}, {"label": "RSI", "ok": true, "detail": "67"}]}
{"ts": "2026-06-19T09:02:06.438237+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19160, "qty": 325, "cost": 6227934, "path": "pullback", "reason": "눌림목 지정가 19,690 도달", "stop": 17760, "target": 21260, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "19,150 vs 18,963"}, {"label": "정배열(5>10)", "ok": true, "detail": "19,616 / 18,963"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,616 / 19,361"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-31.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,162 · 기 +2,080 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.03% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "37,673 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.03% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,690 (현재 19,150)"}]}
{"ts": "2026-06-23T09:00:12.876230+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18820, "qty": 325, "proceeds": 6104573, "entry_price": 19160, "pnl": -123361, "pnl_pct": -1.77, "hold_from": "2026-06-19T09:02:06.438236+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 18,710)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,260"}, {"label": "추세(10일선)", "ok": false, "detail": "18,919"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -318 · 기 -227"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,528"}]}
{"ts": "2026-06-23T12:04:04.253070+09:00", "side": "SELL", "code": "086790", "name": "하나금융지주", "price": 117700, "qty": 38, "proceeds": 4463878, "entry_price": 130900, "pnl": -511068, "pnl_pct": -10.08, "hold_from": "2026-06-17T11:15:02.389905+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "118,039 (현재 117,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 150,191"}, {"label": "추세(10일선)", "ok": false, "detail": "119,330"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +332 · 기 -364"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 134,300"}]}
{"ts": "2026-06-23T12:32:04.201139+09:00", "side": "SELL", "code": "005930", "name": "삼성전자", "price": 330000, "qty": 11, "proceeds": 3622922, "entry_price": 373500, "pnl": -486195, "pnl_pct": -11.65, "hold_from": "2026-06-19T09:02:06.437859+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "331,259 (현재 330,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 436,861"}, {"label": "추세(10일선)", "ok": false, "detail": "335,050"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -3,792 · 기 +1,417"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 384,779"}]}
{"ts": "2026-06-24T09:02:02.391817+09:00", "side": "BUY", "code": "403870", "name": "HPSP", "price": 53200, "qty": 49, "cost": 2607191, "path": "pullback", "reason": "눌림목 지정가 60,114 도달", "stop": 43200, "target": 68200, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "53,200 vs 52,550"}, {"label": "정배열(5>10)", "ok": true, "detail": "57,960 / 52,550"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "57,960 / 49,671"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+20.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +711 · 기 -2,060 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+29%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.34% (환산) vs 평균 5.97% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 71,500"}, {"label": "거래량 급증", "ok": false, "detail": "1,102,733 (환산) vs 평균 4,912,598"}, {"label": "회전율 급증", "ok": false, "detail": "1.34% (환산) vs 평균 5.97%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 60,114 (현재 53,200)"}]}
{"ts": "2026-06-24T09:08:01.003785+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 155400, "qty": 13, "cost": 2020503, "path": "pullback", "reason": "눌림목 지정가 155,963 도달", "stop": 118951, "target": 210074, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "155,400 vs 128,090"}, {"label": "정배열(5>10)", "ok": true, "detail": "143,100 / 128,090"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "143,100 / 121,690"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+45.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +210 · 기 +143 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+6%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "6.50% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": true, "detail": "3,192,593 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": true, "detail": "6.50% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 155,963 (현재 155,400)"}]}
{"ts": "2026-06-25T09:04:05.762805+09:00", "side": "BUY", "code": "003490", "name": "대한항공", "price": 28900, "qty": 186, "cost": 5376206, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 26248, "target": 32878, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "28,850 vs 25,540"}, {"label": "정배열(5>10)", "ok": true, "detail": "26,110 / 25,540"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "26,110 / 25,216"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-2.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +1,577 · 기 -7 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.9/5"}, {"label": "상승여력", "ok": true, "detail": "+15%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.54% (환산) vs 평균 0.58% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 28,400"}, {"label": "거래량 급증", "ok": true, "detail": "5,629,873 (환산) vs 평균 2,146,231"}, {"label": "회전율 급증", "ok": true, "detail": "1.54% (환산) vs 평균 0.58%"}, {"label": "RSI", "ok": true, "detail": "64"}]}
{"ts": "2026-06-26T09:00:08.420849+09:00", "side": "SELL", "code": "403870", "name": "HPSP", "price": 50000, "qty": 49, "proceeds": 2445222, "entry_price": 53200, "pnl": -161969, "pnl_pct": -6.02, "hold_from": "2026-06-24T09:02:02.391816+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "43,200 (현재 51,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 68,200"}, {"label": "추세(10일선)", "ok": false, "detail": "52,330"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -311 · 기 -267"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 57,056"}]}
{"ts": "2026-06-26T09:04:03.912962+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 164900, "qty": 12, "cost": 1979097, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 118951, "target": 210074, "signals": [{"label": "손절선", "ok": true, "detail": "118,951 (현재 164,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 210,074"}, {"label": "추세(10일선)", "ok": true, "detail": "129,020"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -140 · 기 +323"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 164,359"}]}
{"ts": "2026-06-30T09:00:10.386988+09:00", "side": "BUY", "code": "403870", "name": "HPSP", "price": 55300, "qty": 40, "cost": 2212332, "path": "pullback", "reason": "눌림목 지정가 60,222 도달", "stop": 43200, "target": 73450, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "53,700 vs 52,600"}, {"label": "정배열(5>10)", "ok": true, "detail": "58,060 / 52,600"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "58,060 / 49,679"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+12.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +222 · 기 -821 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+28%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.00% (환산) vs 평균 5.97% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 71,500"}, {"label": "거래량 급증", "ok": false, "detail": "827 (환산) vs 평균 4,912,598"}, {"label": "회전율 급증", "ok": false, "detail": "0.00% (환산) vs 평균 5.97%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 60,222 (현재 53,700)"}]}
{"ts": "2026-06-30T09:02:03.205236+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 347500, "qty": 11, "cost": 3823073, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 305863, "target": 409956, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "347,000 vs 306,050"}, {"label": "정배열(5>10)", "ok": true, "detail": "315,600 / 306,050"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "315,600 / 305,533"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+29.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -19 · 기 +146 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+39%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.55% (환산) vs 평균 0.93% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 334,500"}, {"label": "거래량 급증", "ok": true, "detail": "160,800 (환산) vs 평균 96,436"}, {"label": "회전율 급증", "ok": true, "detail": "1.55% (환산) vs 평균 0.93%"}, {"label": "RSI", "ok": true, "detail": "66"}]}
{"ts": "2026-06-30T09:06:03.696979+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 360000, "qty": 11, "cost": 3960594, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 305863, "target": 409956, "signals": [{"label": "손절선", "ok": true, "detail": "305,863 (현재 360,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 409,956"}, {"label": "추세(10일선)", "ok": true, "detail": "307,350"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -19 · 기 +146"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 358,070"}]}
{"ts": "2026-07-02T10:18:03.863005+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 15980, "qty": 139, "cost": 2221553, "path": "pullback", "reason": "눌림목 지정가 16,358 도달", "stop": 12444, "target": 21284, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "15,980 vs 13,620"}, {"label": "정배열(5>10)", "ok": true, "detail": "16,104 / 13,620"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "16,104 / 11,478"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+25.7%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,833 · 기 +437 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+25%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "9.98% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": true, "detail": "10,701,165 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": true, "detail": "9.98% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "60"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 16,358 (현재 15,980)"}]}
{"ts": "2026-07-02T10:40:02.969307+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 18960, "qty": 324, "cost": 6143961, "path": "pullback", "reason": "눌림목 지정가 19,580 도달", "stop": 17760, "target": 20760, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "18,960 vs 18,944"}, {"label": "정배열(5>10)", "ok": true, "detail": "19,578 / 18,944"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,578 / 19,358"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+3.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -339 · 기 +110 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+34%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.86% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": true, "detail": "986,112 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.86% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "49"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,580 (현재 18,960)"}]}
{"ts": "2026-07-02T11:04:07.652692+09:00", "side": "BUY", "code": "003490", "name": "대한항공", "price": 29600, "qty": 182, "cost": 5388008, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 26248, "target": 32878, "signals": [{"label": "손절선", "ok": true, "detail": "26,248 (현재 29,600)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 32,878"}, {"label": "추세(10일선)", "ok": true, "detail": "25,615"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -206 · 기 +1,008"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 29,586"}]}
{"ts": "2026-07-02T11:20:02.073753+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 22550, "qty": 272, "cost": 6134520, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 17760, "target": 20760, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 19,350)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 20,760"}, {"label": "추세(10일선)", "ok": true, "detail": "18,983"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -339 · 기 +110"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,350"}]}
{"ts": "2026-07-02T11:24:06.163503+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18860, "qty": 596, "proceeds": 11218641, "entry_price": 20598, "pnl": -1059841, "pnl_pct": -8.44, "hold_from": "2026-07-02T10:40:02.969306+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "19,038 (현재 18,890)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,938"}, {"label": "추세(10일선)", "ok": false, "detail": "18,937"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -339 · 기 +110"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-03T09:44:02.625487+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 123600, "qty": 25, "proceeds": 3083974, "entry_price": 159960, "pnl": -915625, "pnl_pct": -22.73, "hold_from": "2026-06-24T09:08:01.003784+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "124,125 (현재 123,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 213,713"}, {"label": "추세(10일선)", "ok": false, "detail": "124,920"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +674 · 기 -2,170"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-03T10:24:02.789633+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19040, "qty": 314, "cost": 5979457, "path": "pullback", "reason": "눌림목 지정가 19,631 도달", "stop": 17760, "target": 20960, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "19,030 vs 18,951"}, {"label": "정배열(5>10)", "ok": true, "detail": "19,592 / 18,951"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,592 / 19,359"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+2.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -35 · 기 +168 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+34%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.54% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "619,193 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.54% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "49"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,631 (현재 19,030)"}]}
{"ts": "2026-07-06T09:00:11.119619+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 130600, "qty": 13, "cost": 1698055, "path": "pullback", "reason": "눌림목 지정가 154,452 도달", "stop": 96000, "target": 182500, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "133,100 vs 125,860"}, {"label": "정배열(5>10)", "ok": true, "detail": "138,640 / 125,860"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "138,640 / 121,318"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+17.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +782 · 기 -1,979 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+31%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.01% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": false, "detail": "4,080 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": false, "detail": "0.01% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "52"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 154,452 (현재 133,100)"}]}
{"ts": "2026-07-06T09:34:02.081926+09:00", "side": "BUY", "code": "055550", "name": "신한지주", "price": 110000, "qty": 44, "cost": 4840726, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 99202, "target": 126197, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "110,300 vs 99,990"}, {"label": "정배열(5>10)", "ok": true, "detail": "101,240 / 99,990"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "101,240 / 96,630"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+3.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -717 · 기 +1,343 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+17%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.55% (환산) vs 평균 0.35% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 109,800"}, {"label": "거래량 급증", "ok": true, "detail": "2,617,853 (환산) vs 평균 1,653,581"}, {"label": "회전율 급증", "ok": true, "detail": "0.55% (환산) vs 평균 0.35%"}, {"label": "RSI", "ok": true, "detail": "64"}]}
{"ts": "2026-07-06T10:20:01.616549+09:00", "side": "SELL", "code": "214450", "name": "파마리서치", "price": 311000, "qty": 22, "proceeds": 6828658, "entry_price": 353750, "pnl": -955009, "pnl_pct": -12.08, "hold_from": "2026-06-30T09:02:03.205234+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "311,470 (현재 311,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 417,170"}, {"label": "추세(10일선)", "ok": true, "detail": "302,450"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -108 · 기 +225"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-07T09:48:07.767853+09:00", "side": "SELL", "code": "403870", "name": "HPSP", "price": 43000, "qty": 40, "proceeds": 1716646, "entry_price": 55300, "pnl": -495686, "pnl_pct": -22.24, "hold_from": "2026-06-30T09:00:10.386979+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "43,200 (현재 43,050)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 73,450"}, {"label": "추세(10일선)", "ok": false, "detail": "51,535"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +1,424 · 기 -5,706"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 59,449"}]}
{"ts": "2026-07-07T10:28:06.477069+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 12410, "qty": 139, "proceeds": 1721626, "entry_price": 15980, "pnl": -499927, "pnl_pct": -22.34, "hold_from": "2026-07-02T10:18:03.863004+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "12,444 (현재 12,430)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,284"}, {"label": "추세(10일선)", "ok": false, "detail": "13,265"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -1,543 · 기 +15"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 16,975"}]}
{"ts": "2026-07-07T14:09:35.510986+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 20750, "qty": 288, "cost": 5976896, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 17760, "target": 20960, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 20,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 20,960"}, {"label": "추세(10일선)", "ok": true, "detail": "18,901"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +156 · 기 +113"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,358"}]}
{"ts": "2026-07-08T09:00:19.930868+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 108300, "qty": 13, "proceeds": 1405155, "entry_price": 130600, "pnl": -292900, "pnl_pct": -17.08, "hold_from": "2026-07-06T09:00:11.119610+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "166,450 (현재 112,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(10일선)", "ok": false, "detail": "123,820"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +243 · 기 -857"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-09T09:10:01.839169+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 132300, "qty": 31, "cost": 4101915, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 117515, "target": 154477, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "132,100 vs 108,680"}, {"label": "정배열(5>10)", "ok": true, "detail": "115,600 / 108,680"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "115,600 / 113,232"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+22.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -184 · 기 +964 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+12%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.51% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 116,900"}, {"label": "거래량 급증", "ok": true, "detail": "572,860 (환산) vs 평균 359,705"}, {"label": "회전율 급증", "ok": true, "detail": "0.51% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-07-09T12:12:04.870803+09:00", "side": "SELL", "code": "003490", "name": "대한항공", "price": 26500, "qty": 368, "proceeds": 9732984, "entry_price": 29246, "pnl": -1031231, "pnl_pct": -9.39, "hold_from": "2026-06-25T09:04:05.762803+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "26,502 (현재 26,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 33,363"}, {"label": "추세(10일선)", "ok": true, "detail": "25,305"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -1,444 · 기 +2,767"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-10T09:18:05.240333+09:00", "side": "BUY", "code": "105560", "name": "KB금융", "price": 183700, "qty": 24, "cost": 4409461, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 164505, "target": 212492, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "183,600 vs 158,140"}, {"label": "정배열(5>10)", "ok": true, "detail": "159,500 / 158,140"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "159,500 / 157,335"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+25.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,310 · 기 +1,527 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+17%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.73% (환산) vs 평균 0.46% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 182,700"}, {"label": "거래량 급증", "ok": true, "detail": "2,553,373 (환산) vs 평균 1,640,325"}, {"label": "회전율 급증", "ok": true, "detail": "0.73% (환산) vs 평균 0.46%"}, {"label": "RSI", "ok": true, "detail": "68"}]}
{"ts": "2026-07-10T09:26:06.454295+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 130900, "qty": 35, "cost": 4582187, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 117686, "target": 150721, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "130,800 vs 120,640"}, {"label": "정배열(5>10)", "ok": true, "detail": "122,760 / 120,640"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "122,760 / 118,578"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+18.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -427 · 기 +555 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+23%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.60% (환산) vs 평균 0.37% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 130,700"}, {"label": "거래량 급증", "ok": true, "detail": "1,646,513 (환산) vs 평균 1,026,357"}, {"label": "회전율 급증", "ok": true, "detail": "0.60% (환산) vs 평균 0.37%"}, {"label": "RSI", "ok": true, "detail": "61"}]}
{"ts": "2026-07-10T11:06:06.484073+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 13660, "qty": 140, "cost": 1912687, "path": "pullback", "reason": "눌림목 지정가 15,971 도달", "stop": 10360, "target": 18610, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "13,630 vs 13,385"}, {"label": "정배열(5>10)", "ok": true, "detail": "15,634 / 13,385"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "15,634 / 11,439"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+6.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +210 · 기 +239 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+47%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "14.23% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": true, "detail": "15,267,605 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": true, "detail": "14.23% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "52"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 15,971 (현재 13,630)"}]}
{"ts": "2026-07-10T12:14:02.684804+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 126200, "qty": 15, "cost": 1893284, "path": "pullback", "reason": "눌림목 지정가 151,752 도달", "stop": 96000, "target": 171500, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "126,200 vs 125,170"}, {"label": "정배열(5>10)", "ok": true, "detail": "137,260 / 125,170"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "137,260 / 121,203"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+17.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +483 · 기 -241 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+38%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "7.53% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": true, "detail": "3,695,762 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": true, "detail": "7.53% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 151,752 (현재 126,200)"}]}
{"ts": "2026-07-10T12:36:02.513268+09:00", "side": "BUY", "code": "105560", "name": "KB금융", "price": 188900, "qty": 23, "cost": 4345352, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 164505, "target": 212492, "signals": [{"label": "손절선", "ok": true, "detail": "164,505 (현재 188,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 212,492"}, {"label": "추세(10일선)", "ok": true, "detail": "158,670"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -1,220 · 기 +1,654"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 188,670"}]}
{"ts": "2026-07-13T09:00:11.877348+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 136900, "qty": 30, "cost": 4107616, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 117515, "target": 154477, "signals": [{"label": "손절선", "ok": true, "detail": "117,515 (현재 136,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 154,477"}, {"label": "추세(10일선)", "ok": true, "detail": "109,100"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -64 · 기 +919"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 136,164"}]}
{"ts": "2026-07-13T09:06:07.911089+09:00", "side": "BUY", "code": "055550", "name": "신한지주", "price": 112800, "qty": 42, "cost": 4738311, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 99202, "target": 126197, "signals": [{"label": "손절선", "ok": true, "detail": "99,202 (현재 112,800)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 126,197"}, {"label": "추세(10일선)", "ok": true, "detail": "100,240"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -358 · 기 +991"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 112,792"}]}
{"ts": "2026-07-13T09:06:07.911276+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 338500, "qty": 11, "cost": 3724059, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 297363, "target": 400206, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "338,500 vs 305,200"}, {"label": "정배열(5>10)", "ok": true, "detail": "313,900 / 305,200"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "313,900 / 305,392"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+32.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -63 · 기 +144 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+42%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.45% (환산) vs 평균 0.93% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 334,500"}, {"label": "거래량 급증", "ok": true, "detail": "150,147 (환산) vs 평균 96,436"}, {"label": "회전율 급증", "ok": true, "detail": "1.45% (환산) vs 평균 0.93%"}, {"label": "RSI", "ok": true, "detail": "64"}]}
{"ts": "2026-07-13T09:08:05.365455+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 134300, "qty": 34, "cost": 4566885, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 117686, "target": 150721, "signals": [{"label": "손절선", "ok": true, "detail": "117,686 (현재 134,200)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 150,721"}, {"label": "추세(10일선)", "ok": true, "detail": "120,980"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -277 · 기 +460"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 134,118"}]}
{"ts": "2026-07-13T09:26:03.423477+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 139100, "qty": 13, "cost": 1808571, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 96000, "target": 171500, "signals": [{"label": "손절선", "ok": true, "detail": "96,000 (현재 139,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 171,500"}, {"label": "추세(10일선)", "ok": true, "detail": "126,460"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -213 · 기 +772"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 136,162"}]}
{"ts": "2026-07-15T14:32:01.897265+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18570, "qty": 602, "proceeds": 11157341, "entry_price": 19858, "pnl": -799013, "pnl_pct": -6.49, "hold_from": "2026-07-03T10:24:02.789631+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "18,586 (현재 18,570)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,766"}, {"label": "추세(10일선)", "ok": false, "detail": "18,905"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -214 · 기 +240"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-16T09:22:02.318451+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 350000, "qty": 10, "cost": 3500525, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 297363, "target": 400206, "signals": [{"label": "손절선", "ok": true, "detail": "297,363 (현재 350,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 400,206"}, {"label": "추세(10일선)", "ok": true, "detail": "306,350"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -33 · 기 +28"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 348,838"}]}
{"ts": "2026-07-20T12:28:02.328809+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 10310, "qty": 140, "proceeds": 1440585, "entry_price": 13660, "pnl": -472101, "pnl_pct": -24.52, "hold_from": "2026-07-10T11:06:06.484072+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "10,360 (현재 10,310)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 18,610"}, {"label": "추세(10일선)", "ok": false, "detail": "12,013"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -887 · 기 +515"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 14,626"}]}
{"ts": "2026-07-20T14:12:02.757886+09:00", "side": "SELL", "code": "055550", "name": "신한지주", "price": 100100, "qty": 86, "proceeds": 8591813, "entry_price": 111367, "pnl": -987223, "pnl_pct": -10.12, "hold_from": "2026-07-06T09:34:02.081925+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "100,198 (현재 100,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 128,122"}, {"label": "추세(10일선)", "ok": true, "detail": "98,970"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -168 · 기 +257"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-20T14:12:02.758626+09:00", "side": "SELL", "code": "105560", "name": "KB금융", "price": 166000, "qty": 47, "proceeds": 7786786, "entry_price": 186245, "pnl": -968027, "pnl_pct": -10.87, "hold_from": "2026-07-10T09:18:05.240331+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "166,364 (현재 166,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 216,065"}, {"label": "추세(10일선)", "ok": true, "detail": "156,380"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -440 · 기 +299"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-23T09:46:06.373869+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 88400, "qty": 42, "cost": 3713357, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 77778, "target": 104333, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "88,300 vs 80,910"}, {"label": "정배열(5>10)", "ok": true, "detail": "83,020 / 80,910"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "83,020 / 75,060"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+47.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -150 · 기 +299 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+17%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.80% (환산) vs 평균 0.42% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 87,600"}, {"label": "거래량 급증", "ok": true, "detail": "743,133 (환산) vs 평균 392,182"}, {"label": "회전율 급증", "ok": true, "detail": "0.80% (환산) vs 평균 0.42%"}, {"label": "RSI", "ok": true, "detail": "67"}]}
{"ts": "2026-07-23T10:30:02.497821+09:00", "side": "BUY", "code": "024060", "name": "흥구석유", "price": 14140, "qty": 185, "cost": 2616292, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 11706, "target": 17791, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "14,180 vs 12,429"}, {"label": "정배열(5>10)", "ok": true, "detail": "13,154 / 12,429"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "13,154 / 12,687"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+55.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +109 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "84.26% (환산) vs 평균 31.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 13,990"}, {"label": "거래량 급증", "ok": true, "detail": "12,639,979 (환산) vs 평균 4,720,532"}, {"label": "회전율 급증", "ok": true, "detail": "84.26% (환산) vs 평균 31.47%"}, {"label": "RSI", "ok": true, "detail": "66"}]}
{"ts": "2026-07-23T13:06:04.450612+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 91400, "qty": 41, "cost": 3747962, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 77778, "target": 104333, "signals": [{"label": "손절선", "ok": true, "detail": "77,778 (현재 91,400)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 104,333"}, {"label": "추세(10일선)", "ok": true, "detail": "81,220"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -169 · 기 +311"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 91,159"}]}
{"ts": "2026-07-24T09:00:08.483241+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 111800, "qty": 28, "proceeds": 3124296, "entry_price": 132189, "pnl": -577559, "pnl_pct": -15.42, "hold_from": "2026-07-10T12:14:02.684802+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "96,000 (현재 113,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 186,473"}, {"label": "추세(10일선)", "ok": false, "detail": "123,880"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -480 · 기 -206"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-24T09:02:04.055579+09:00", "side": "BUY", "code": "024060", "name": "흥구석유", "price": 15060, "qty": 174, "cost": 2620833, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 11706, "target": 17791, "signals": [{"label": "손절선", "ok": true, "detail": "11,706 (현재 15,020)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 17,791"}, {"label": "추세(10일선)", "ok": true, "detail": "12,513"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +208 · 기 -2"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 14,766"}]}
{"ts": "2026-07-24T10:02:04.451572+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 18950, "qty": 302, "cost": 5723758, "path": "pullback", "reason": "눌림목 지정가 19,643 도달", "stop": 17760, "target": 20735, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "18,950 vs 18,943"}, {"label": "정배열(5>10)", "ok": true, "detail": "19,576 / 18,943"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,576 / 19,358"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+19.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +2 · 기 -5 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.39% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "454,069 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.39% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "49"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,643 (현재 18,950)"}]}
{"ts": "2026-07-27T09:02:06.246349+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 7470, "qty": 412, "cost": 3078102, "path": "pullback", "reason": "눌림목 지정가 7,635 도달", "stop": 6370, "target": 9119, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "7,470 vs 5,392"}, {"label": "정배열(5>10)", "ok": true, "detail": "6,452 / 5,392"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,452 / 4,889"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+82.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +49 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.79% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "49,327 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "0.79% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "74"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,635 (현재 7,470)"}]}
{"ts": "2026-07-27T09:08:02.100105+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 7910, "qty": 389, "cost": 3077452, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 6370, "target": 9119, "signals": [{"label": "손절선", "ok": true, "detail": "6,370 (현재 7,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 9,119"}, {"label": "추세(10일선)", "ok": true, "detail": "5,434"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +49 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 7,747"}]}
{"ts": "2026-07-27T09:10:01.054297+09:00", "side": "SELL", "code": "024060", "name": "흥구석유", "price": 12030, "qty": 359, "proceeds": 4310348, "entry_price": 14586, "pnl": -926777, "pnl_pct": -17.52, "hold_from": "2026-07-23T10:30:02.497819+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "12,082 (현재 12,030)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 18,342"}, {"label": "추세(10일선)", "ok": false, "detail": "12,214"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -85 · 기 +2"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-27T09:12:01.531681+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 13150, "qty": 160, "cost": 2104316, "path": "pullback", "reason": "눌림목 지정가 13,180 도달", "stop": 10340, "target": 17365, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "13,150 vs 12,888"}, {"label": "정배열(5>10)", "ok": true, "detail": "14,378 / 12,888"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "14,378 / 13,268"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+1.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +27 · 기 +15 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.46% (환산) vs 평균 1.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 15,870"}, {"label": "거래량 급증", "ok": false, "detail": "274,967 (환산) vs 평균 882,736"}, {"label": "회전율 급증", "ok": false, "detail": "0.46% (환산) vs 평균 1.47%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 13,180 (현재 13,150)"}]}
{"ts": "2026-07-27T09:18:02.002747+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 127700, "qty": 44, "cost": 5619643, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 117473, "target": 143040, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "127,400 vs 117,350"}, {"label": "정배열(5>10)", "ok": true, "detail": "118,940 / 117,350"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "118,940 / 110,142"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+46.7%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +106 · 기 +291 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+16%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.26% (환산) vs 평균 0.17% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 123,300"}, {"label": "거래량 급증", "ok": true, "detail": "439,847 (환산) vs 평균 289,522"}, {"label": "회전율 급증", "ok": true, "detail": "0.26% (환산) vs 평균 0.17%"}, {"label": "RSI", "ok": true, "detail": "71"}]}
{"ts": "2026-07-28T11:22:00.761394+09:00", "side": "SELL", "code": "003680", "name": "한성기업", "price": 6630, "qty": 801, "proceeds": 5300274, "entry_price": 7684, "pnl": -855279, "pnl_pct": -13.71, "hold_from": "2026-07-27T09:02:06.246347+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "6,577 (현재 6,380)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 9,344"}, {"label": "추세(10일선)", "ok": true, "detail": "5,282"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +96 · 기 +0"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-28T13:02:00.830227+09:00", "side": "SELL", "code": "138040", "name": "메리츠금융지주", "price": 117400, "qty": 44, "proceeds": 5155527, "entry_price": 127700, "pnl": -464116, "pnl_pct": -8.07, "hold_from": "2026-07-27T09:18:02.002746+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "117,473 (현재 117,400)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 143,040"}, {"label": "추세(10일선)", "ok": true, "detail": "116,350"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +84 · 기 +324"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 130,353"}]}
{"ts": "2026-07-29T09:02:02.247306+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6540, "qty": 347, "cost": 2269720, "path": "pullback", "reason": "눌림목 지정가 7,526 도달", "stop": 5295, "target": 8408, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "6,540 vs 5,298"}, {"label": "정배열(5>10)", "ok": true, "detail": "6,266 / 5,298"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,266 / 4,873"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+70.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +188 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.87% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "116,047 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "1.87% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "63"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,526 (현재 6,540)"}]}
{"ts": "2026-07-29T09:24:10.014921+09:00", "side": "SELL", "code": "010950", "name": "S-Oil", "price": 128600, "qty": 61, "proceeds": 7829303, "entry_price": 134562, "pnl": -380228, "pnl_pct": -4.43, "hold_from": "2026-07-09T09:10:01.839168+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "119,106 (현재 116,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 157,747"}, {"label": "추세(10일선)", "ok": true, "detail": "105,620"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +43 · 기 +245"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T09:24:10.015166+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 11310, "qty": 186, "cost": 2103976, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 10340, "target": 17365, "signals": [{"label": "손절선", "ok": true, "detail": "10,340 (현재 15,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 17,365"}, {"label": "추세(10일선)", "ok": true, "detail": "12,768"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +242 · 기 -182"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,887"}]}
{"ts": "2026-07-29T09:26:01.914698+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18940, "qty": 302, "proceeds": 5708726, "entry_price": 18950, "pnl": -15032, "pnl_pct": -0.05, "hold_from": "2026-07-24T10:02:04.451570+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "19,645 (현재 18,950)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(10일선)", "ok": true, "detail": "18,943"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +99 · 기 +138"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T09:26:01.914854+09:00", "side": "SELL", "code": "003680", "name": "한성기업", "price": 6610, "qty": 347, "proceeds": 2289197, "entry_price": 6540, "pnl": 19477, "pnl_pct": 1.07, "hold_from": "2026-07-29T09:02:02.247304+09:00", "reason": "트레일링 익절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "7,526 (현재 6,610)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(10일선)", "ok": true, "detail": "5,306"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +188 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T09:28:01.396683+09:00", "side": "BUY", "code": "090850", "name": "현대이지웰", "price": 6390, "qty": 826, "cost": 5278932, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 5867, "target": 7174, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "6,380 vs 5,591"}, {"label": "정배열(5>10)", "ok": true, "detail": "5,742 / 5,591"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "5,742 / 5,622"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+43.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +73 · 기 -3 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.62% (환산) vs 평균 0.22% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 5,700"}, {"label": "거래량 급증", "ok": true, "detail": "134,413 (환산) vs 평균 49,512"}, {"label": "회전율 급증", "ok": true, "detail": "0.62% (환산) vs 평균 0.22%"}, {"label": "RSI", "ok": true, "detail": "73"}]}
{"ts": "2026-07-29T10:24:01.456084+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 123400, "qty": 41, "cost": 5060159, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 113016, "target": 138976, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "123,400 vs 116,950"}, {"label": "정배열(5>10)", "ok": true, "detail": "118,140 / 116,950"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "118,140 / 110,075"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+51.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +47 · 기 +310 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+20%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.38% (환산) vs 평균 0.17% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 123,300"}, {"label": "거래량 급증", "ok": true, "detail": "644,676 (환산) vs 평균 289,522"}, {"label": "회전율 급증", "ok": true, "detail": "0.38% (환산) vs 평균 0.17%"}, {"label": "RSI", "ok": true, "detail": "67"}]}
{"ts": "2026-07-29T10:52:02.362763+09:00", "side": "SELL", "code": "252990", "name": "샘씨엔에스", "price": 10340, "qty": 346, "proceeds": 3570664, "entry_price": 12161, "pnl": -637628, "pnl_pct": -14.97, "hold_from": "2026-07-27T09:12:01.531679+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "10,340 (현재 10,340)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 14,892"}, {"label": "추세(10일선)", "ok": false, "detail": "12,607"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +239 · 기 -181"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T12:04:01.700752+09:00", "side": "SELL", "code": "086790", "name": "하나금융지주", "price": 119200, "qty": 69, "proceeds": 8208762, "entry_price": 132575, "pnl": -940311, "pnl_pct": -10.09, "hold_from": "2026-07-10T09:26:06.454294+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "119,704 (현재 119,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 151,882"}, {"label": "추세(10일선)", "ok": false, "detail": "119,490"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -11 · 기 -51"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T13:34:03.602105+09:00", "side": "SELL", "code": "090850", "name": "현대이지웰", "price": 5860, "qty": 826, "proceeds": 4830921, "entry_price": 6390, "pnl": -448010, "pnl_pct": -8.29, "hold_from": "2026-07-29T09:28:01.396682+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,867 (현재 5,860)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 7,174"}, {"label": "추세(10일선)", "ok": true, "detail": "5,539"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +73 · 기 -3"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,525"}]}
{"ts": "2026-07-30T09:04:07.505212+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19090, "qty": 279, "cost": 5326909, "path": "pullback", "reason": "눌림목 지정가 19,653 도달", "stop": 17760, "target": 21085, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "19,100 vs 18,958"}, {"label": "정배열(5>10)", "ok": true, "detail": "19,606 / 18,958"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,606 / 19,360"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+29.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +2 · 기 +327 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+32%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.14% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "160,727 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.14% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,653 (현재 19,100)"}]}
{"ts": "2026-07-30T09:04:07.505693+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6130, "qty": 319, "cost": 1955763, "path": "pullback", "reason": "눌림목 지정가 7,457 도달", "stop": 4793, "target": 8135, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "6,120 vs 5,256"}, {"label": "정배열(5>10)", "ok": true, "detail": "6,182 / 5,256"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,182 / 4,866"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+65.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +234 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "4.31% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "267,687 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "4.31% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,457 (현재 6,120)"}]}
{"ts": "2026-07-30T09:16:11.953986+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 130900, "qty": 29, "cost": 3796669, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 116144, "target": 153035, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "130,900 vs 108,560"}, {"label": "정배열(5>10)", "ok": true, "detail": "115,360 / 108,560"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "115,360 / 113,212"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+49.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -6 · 기 +178 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+21%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.51% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 116,900"}, {"label": "거래량 급증", "ok": true, "detail": "571,193 (환산) vs 평균 359,705"}, {"label": "회전율 급증", "ok": true, "detail": "0.51% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "68"}]}
{"ts": "2026-07-30T09:18:10.192454+09:00", "side": "BUY", "code": "090850", "name": "현대이지웰", "price": 6310, "qty": 842, "cost": 5313817, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 5799, "target": 7077, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "6,300 vs 5,583"}, {"label": "정배열(5>10)", "ok": true, "detail": "5,726 / 5,583"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "5,726 / 5,621"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+46.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +87 · 기 +6 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.41% (환산) vs 평균 0.22% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 5,700"}, {"label": "거래량 급증", "ok": true, "detail": "87,813 (환산) vs 평균 49,512"}, {"label": "회전율 급증", "ok": true, "detail": "0.41% (환산) vs 평균 0.22%"}, {"label": "RSI", "ok": true, "detail": "72"}]}
{"ts": "2026-07-30T09:50:07.307619+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 126400, "qty": 40, "cost": 5056758, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 113016, "target": 138976, "signals": [{"label": "손절선", "ok": true, "detail": "113,016 (현재 126,200)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 138,976"}, {"label": "추세(10일선)", "ok": true, "detail": "117,230"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +9 · 기 +389"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 126,082"}]}
{"ts": "2026-07-31T09:06:07.648347+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6550, "qty": 298, "cost": 1952193, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 4793, "target": 8135, "signals": [{"label": "손절선", "ok": true, "detail": "4,793 (현재 6,640)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 8,135"}, {"label": "추세(10일선)", "ok": true, "detail": "5,308"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +355 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,453"}]}
{"ts": "2026-07-31T09:06:07.648789+09:00", "side": "SELL", "code": "078930", "name": "GS", "price": 77700, "qty": 83, "proceeds": 6436524, "entry_price": 89882, "pnl": -1024795, "pnl_pct": -13.55, "hold_from": "2026-07-23T09:46:06.373868+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "78,845 (현재 78,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 106,437"}, {"label": "추세(10일선)", "ok": false, "detail": "79,880"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -179 · 기 +325"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-08-03T12:00:12.437993+09:00", "side": "BUY", "code": "194370", "name": "제이에스코퍼레이션", "price": 12910, "qty": 262, "cost": 3382927, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 11314, "target": 15304, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "12,930 vs 12,003"}, {"label": "정배열(5>10)", "ok": true, "detail": "12,138 / 12,003"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "12,138 / 11,924"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+27.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +7 · 기 +10 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+74%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.72% (환산) vs 평균 0.34% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 12,870"}, {"label": "거래량 급증", "ok": true, "detail": "208,994 (환산) vs 평균 99,303"}, {"label": "회전율 급증", "ok": true, "detail": "0.72% (환산) vs 평균 0.34%"}, {"label": "RSI", "ok": true, "detail": "63"}]}
{"ts": "2026-08-03T12:02:10.377561+09:00", "side": "BUY", "code": "194370", "name": "제이에스코퍼레이션", "price": 13420, "qty": 252, "cost": 3382347, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 11314, "target": 15304, "signals": [{"label": "손절선", "ok": true, "detail": "11,314 (현재 13,450)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 15,304"}, {"label": "추세(10일선)", "ok": true, "detail": "12,055"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +7 · 기 +10"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,339"}]}
{"ts": "2026-08-04T09:34:09.942370+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 90000, "qty": 38, "cost": 3420513, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 79135, "target": 106298, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "89,800 vs 81,060"}, {"label": "정배열(5>10)", "ok": true, "detail": "83,320 / 81,060"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "83,320 / 75,085"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+55.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +68 · 기 +117 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+15%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.64% (환산) vs 평균 0.42% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 87,600"}, {"label": "거래량 급증", "ok": true, "detail": "595,733 (환산) vs 평균 392,182"}, {"label": "회전율 급증", "ok": true, "detail": "0.64% (환산) vs 평균 0.42%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-08-04T10:32:13.399942+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 93500, "qty": 37, "cost": 3460019, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 79135, "target": 106298, "signals": [{"label": "손절선", "ok": true, "detail": "79,135 (현재 93,400)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 106,298"}, {"label": "추세(10일선)", "ok": true, "detail": "81,420"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +57 · 기 +117"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 92,841"}]}
{"ts": "2026-08-05T09:02:14.746101+09:00", "side": "SELL", "code": "090850", "name": "현대이지웰", "price": 5700, "qty": 842, "proceeds": 4790041, "entry_price": 6310, "pnl": -523776, "pnl_pct": -9.67, "hold_from": "2026-07-30T09:18:10.192452+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,799 (현재 5,730)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 7,077"}, {"label": "추세(10일선)", "ok": true, "detail": "5,526"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +14 · 기 -2"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,423"}]}
{"ts": "2026-08-05T09:02:14.746847+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 13040, "qty": 155, "cost": 2021503, "path": "pullback", "reason": "눌림목 지정가 13,170 도달", "stop": 10340, "target": 17090, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "13,040 vs 12,877"}, {"label": "정배열(5>10)", "ok": true, "detail": "14,356 / 12,877"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "14,356 / 13,267"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-6.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -72 · 기 +134 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.13% (환산) vs 평균 1.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 15,870"}, {"label": "거래량 급증", "ok": false, "detail": "78,333 (환산) vs 평균 882,736"}, {"label": "회전율 급증", "ok": false, "detail": "0.13% (환산) vs 평균 1.47%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 13,170 (현재 13,040)"}]}
{"ts": "2026-08-05T09:38:13.245715+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 13830, "qty": 146, "cost": 2019483, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 10340, "target": 17090, "signals": [{"label": "손절선", "ok": true, "detail": "10,340 (현재 13,860)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 17,090"}, {"label": "추세(10일선)", "ok": true, "detail": "12,959"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -72 · 기 +134"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,817"}]}
{"ts": "2026-08-06T09:00:21.768781+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18730, "qty": 279, "proceeds": 5215480, "entry_price": 19090, "pnl": -111429, "pnl_pct": -1.89, "hold_from": "2026-07-30T09:04:07.505210+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 18,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,085"}, {"label": "추세(10일선)", "ok": false, "detail": "18,923"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -203 · 기 -147"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,459"}]}
{"ts": "2026-08-06T09:14:12.340240+09:00", "side": "BUY", "code": "068270", "name": "셀트리온", "price": 193600, "qty": 25, "cost": 4840726, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 176944, "target": 218584, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "193,500 vs 180,840"}, {"label": "정배열(5>10)", "ok": true, "detail": "186,480 / 180,840"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "186,480 / 176,699"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+20.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +255 · 기 -319 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+42%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.49% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 191,700"}, {"label": "거래량 급증", "ok": true, "detail": "1,163,480 (환산) vs 평균 738,783"}, {"label": "회전율 급증", "ok": true, "detail": "0.49% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "64"}]}
{"ts": "2026-08-07T09:34:11.068466+09:00", "side": "BUY", "code": "068270", "name": "셀트리온", "price": 198600, "qty": 24, "cost": 4767115, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 176944, "target": 218584, "signals": [{"label": "손절선", "ok": true, "detail": "176,944 (현재 198,600)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 218,584"}, {"label": "추세(10일선)", "ok": true, "detail": "181,350"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +338 · 기 +73"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 197,939"}]}
{"ts": "2026-08-07T11:24:18.191138+09:00", "side": "SELL", "code": "214450", "name": "파마리서치", "price": 356000, "qty": 21, "proceeds": 7461422, "entry_price": 343976, "pnl": 236838, "pnl_pct": 3.5, "hold_from": "2026-07-13T09:06:07.911275+09:00", "reason": "트레일링 익절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "372,486 (현재 354,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(10일선)", "ok": true, "detail": "306,750"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +101 · 기 +31"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-08-07T11:26:15.615759+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19170, "qty": 274, "cost": 5253368, "path": "pullback", "reason": "눌림목 지정가 19,668 도달", "stop": 17760, "target": 21285, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "19,160 vs 18,964"}, {"label": "정배열(5>10)", "ok": true, "detail": "19,618 / 18,964"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,618 / 19,362"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+12.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +80 · 기 -80 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+31%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.46% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "535,067 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.46% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,668 (현재 19,160)"}]}
{"ts": "2026-08-10T09:00:20.545375+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 136000, "qty": 28, "cost": 3808571, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 116144, "target": 153035, "signals": [{"label": "손절선", "ok": true, "detail": "116,144 (현재 137,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 153,035"}, {"label": "추세(10일선)", "ok": true, "detail": "109,170"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -253 · 기 +225"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 134,814"}]}
@@ -0,0 +1,201 @@
{
"cash": 23212628.033999994,
"initial": 100000000,
"positions": {
"214450": {
"code": "214450",
"name": "파마리서치",
"sources": [
"auto"
],
"qty": 28,
"entry_price": 350250.0,
"entry_at": "2026-07-21T12:06:01.185929+09:00",
"stop": 318647,
"target": 445059,
"peak": 411500,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 409000,
"tranches": 2,
"tranche_value": 5085796.90859035,
"last_add_price": 356000
},
"003680": {
"code": "003680",
"name": "한성기업",
"sources": [
"auto"
],
"qty": 793,
"entry_price": 6332.849936948298,
"entry_at": "2026-07-30T09:04:07.509224+09:00",
"stop": 5362,
"target": 9244,
"peak": 6840,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 7,457 도달",
"cur_price": 6220,
"tranches": 2,
"tranche_value": 2514428.437642747,
"last_add_price": 6550
},
"194370": {
"code": "194370",
"name": "제이에스코퍼레이션",
"sources": [
"auto"
],
"qty": 648,
"entry_price": 13160.277777777777,
"entry_at": "2026-08-03T12:00:12.444885+09:00",
"stop": 11874,
"target": 17019,
"peak": 14120,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 13370,
"tranches": 2,
"tranche_value": 4271897.688361821,
"last_add_price": 13420
},
"095610": {
"code": "095610",
"name": "테스",
"sources": [
"auto"
],
"qty": 23,
"entry_price": 141495.65217391305,
"entry_at": "2026-08-04T09:04:10.089202+09:00",
"stop": 111689,
"target": 230917,
"peak": 148000,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 145,918 도달",
"cur_price": 143700,
"tranches": 2,
"tranche_value": 1723507.428441815,
"last_add_price": 147600
},
"078930": {
"code": "078930",
"name": "GS",
"sources": [
"auto"
],
"qty": 93,
"entry_price": 91933.33333333333,
"entry_at": "2026-08-04T09:50:10.213035+09:00",
"stop": 83410,
"target": 117505,
"peak": 101600,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 97700,
"tranches": 2,
"tranche_value": 4327959.889890211,
"last_add_price": 93500
},
"252990": {
"code": "252990",
"name": "샘씨엔에스",
"sources": [
"auto"
],
"qty": 330,
"entry_price": 13423.030303030304,
"entry_at": "2026-08-05T09:02:14.754658+09:00",
"stop": 11094,
"target": 20412,
"peak": 15670,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 13,170 도달",
"cur_price": 15670,
"tranches": 2,
"tranche_value": 2219137.008862232,
"last_add_price": 13830
},
"068270": {
"code": "068270",
"name": "셀트리온",
"sources": [
"interest"
],
"qty": 50,
"entry_price": 194200.0,
"entry_at": "2026-08-06T09:34:17.058691+09:00",
"stop": 181408,
"target": 232576,
"peak": 201000,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 201000,
"tranches": 2,
"tranche_value": 4934881.2159687495,
"last_add_price": 196400
},
"030000": {
"code": "030000",
"name": "제일기획",
"sources": [
"auto"
],
"qty": 258,
"entry_price": 19120,
"entry_at": "2026-08-07T09:00:20.292023+09:00",
"stop": 18038,
"target": 22366,
"peak": 19330,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 19,668 도달",
"cur_price": 18970,
"tranches": 1,
"tranche_value": 4952128.404875,
"last_add_price": 19120
}
},
"realized_pnl": -22545666.930500023,
"closed_trades": 39,
"wins": 1,
"peak_equity": 100344662.275,
"max_drawdown": 0.23080444655370694,
"last_exit": {
"086790": "2026-07-29",
"030000": "2026-08-06",
"403870": "2026-07-02",
"003490": "2026-07-07",
"240810": "2026-07-24",
"214450": "2026-07-03",
"093370": "2026-07-20",
"034730": "2026-07-08",
"319660": "2026-07-23",
"105560": "2026-07-20",
"095610": "2026-07-29",
"024060": "2026-07-27",
"003680": "2026-07-29",
"252990": "2026-07-28",
"010950": "2026-08-03",
"090850": "2026-08-06",
"138040": "2026-08-04",
"078930": "2026-07-31"
},
"created_at": "2026-06-15T14:55:00.583136+09:00",
"updated_at": "2026-08-10T15:28:16.167447+09:00"
}
@@ -0,0 +1,113 @@
{"ts": "2026-06-17T11:15:02.393160+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 130900, "qty": 47, "cost": 6153223, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 121254, "target": 159837, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "129,300 vs 118,195"}, {"label": "정배열(5>20)", "ok": true, "detail": "120,400 / 118,195"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "120,400 / 118,307"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-13.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +371 · 기 +158 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+22%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.12% (환산) vs 평균 0.38% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 126,500"}, {"label": "거래량 급증", "ok": true, "detail": "3,094,534 (환산) vs 평균 1,031,725"}, {"label": "회전율 급증", "ok": true, "detail": "1.12% (환산) vs 평균 0.38%"}, {"label": "RSI", "ok": true, "detail": "60"}]}
{"ts": "2026-06-19T09:02:06.441745+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19160, "qty": 325, "cost": 6227934, "path": "pullback", "reason": "눌림목 지정가 19,690 도달", "stop": 18100, "target": 22339, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "19,150 vs 18,862"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,616 / 18,862"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,616 / 19,361"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-31.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,162 · 기 +2,080 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.03% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "37,673 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.03% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,690 (현재 19,150)"}]}
{"ts": "2026-06-19T13:32:02.883332+09:00", "side": "SELL", "code": "086790", "name": "하나금융지주", "price": 121100, "qty": 47, "proceeds": 5680601, "entry_price": 130900, "pnl": -472622, "pnl_pct": -7.49, "hold_from": "2026-06-17T11:15:02.393158+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "121,254 (현재 121,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 159,837"}, {"label": "추세(20일선)", "ok": true, "detail": "118,300"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +531 · 기 -129"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 134,178"}]}
{"ts": "2026-06-23T09:00:12.986591+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18820, "qty": 325, "proceeds": 6104573, "entry_price": 19160, "pnl": -123361, "pnl_pct": -1.77, "hold_from": "2026-06-19T09:02:06.441744+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "18,100 (현재 18,710)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,339"}, {"label": "추세(20일선)", "ok": false, "detail": "18,840"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -318 · 기 -227"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,528"}]}
{"ts": "2026-06-24T09:02:02.393486+09:00", "side": "BUY", "code": "403870", "name": "HPSP", "price": 53200, "qty": 49, "cost": 2607191, "path": "pullback", "reason": "눌림목 지정가 60,114 도달", "stop": 43200, "target": 83200, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "53,200 vs 52,378"}, {"label": "정배열(5>20)", "ok": true, "detail": "57,960 / 52,378"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "57,960 / 49,671"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+20.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +711 · 기 -2,060 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+29%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.34% (환산) vs 평균 5.97% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 71,500"}, {"label": "거래량 급증", "ok": false, "detail": "1,102,733 (환산) vs 평균 4,912,598"}, {"label": "회전율 급증", "ok": false, "detail": "1.34% (환산) vs 평균 5.97%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 60,114 (현재 53,200)"}]}
{"ts": "2026-06-24T09:08:01.005474+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 155400, "qty": 18, "cost": 2797620, "path": "pullback", "reason": "눌림목 지정가 155,963 도달", "stop": 128063, "target": 237411, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "155,400 vs 121,610"}, {"label": "정배열(5>20)", "ok": true, "detail": "143,100 / 121,610"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "143,100 / 121,690"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+45.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +210 · 기 +143 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+6%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "6.50% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": true, "detail": "3,192,593 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": true, "detail": "6.50% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 155,963 (현재 155,400)"}]}
{"ts": "2026-06-25T09:04:05.764598+09:00", "side": "BUY", "code": "003490", "name": "대한항공", "price": 28900, "qty": 215, "cost": 6214432, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 26911, "target": 34866, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "28,850 vs 25,948"}, {"label": "정배열(5>20)", "ok": true, "detail": "26,110 / 25,948"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "26,110 / 25,216"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-2.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +1,577 · 기 -7 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.9/5"}, {"label": "상승여력", "ok": true, "detail": "+15%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.54% (환산) vs 평균 0.58% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 28,400"}, {"label": "거래량 급증", "ok": true, "detail": "5,629,873 (환산) vs 평균 2,146,231"}, {"label": "회전율 급증", "ok": true, "detail": "1.54% (환산) vs 평균 0.58%"}, {"label": "RSI", "ok": true, "detail": "64"}]}
{"ts": "2026-06-26T09:00:08.516061+09:00", "side": "SELL", "code": "403870", "name": "HPSP", "price": 50000, "qty": 49, "proceeds": 2445222, "entry_price": 53200, "pnl": -161969, "pnl_pct": -6.02, "hold_from": "2026-06-24T09:02:02.393485+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "43,200 (현재 51,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 83,200"}, {"label": "추세(20일선)", "ok": false, "detail": "52,268"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -311 · 기 -267"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 57,056"}]}
{"ts": "2026-06-26T09:04:03.914528+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 164900, "qty": 17, "cost": 2803720, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 128063, "target": 237411, "signals": [{"label": "손절선", "ok": true, "detail": "128,063 (현재 164,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 237,411"}, {"label": "추세(20일선)", "ok": true, "detail": "122,075"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -140 · 기 +323"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 164,359"}]}
{"ts": "2026-06-30T09:00:10.486269+09:00", "side": "BUY", "code": "403870", "name": "HPSP", "price": 55300, "qty": 43, "cost": 2378257, "path": "pullback", "reason": "눌림목 지정가 60,222 도달", "stop": 44022, "target": 89135, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "53,700 vs 52,402"}, {"label": "정배열(5>20)", "ok": true, "detail": "58,060 / 52,402"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "58,060 / 49,679"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+12.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +222 · 기 -821 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+28%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.00% (환산) vs 평균 5.97% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 71,500"}, {"label": "거래량 급증", "ok": false, "detail": "827 (환산) vs 평균 4,912,598"}, {"label": "회전율 급증", "ok": false, "detail": "0.00% (환산) vs 평균 5.97%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 60,222 (현재 53,700)"}]}
{"ts": "2026-07-01T09:06:03.231747+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 357500, "qty": 15, "cost": 5363304, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 325040, "target": 454880, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "357,000 vs 296,975"}, {"label": "정배열(5>20)", "ok": true, "detail": "317,600 / 296,975"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "317,600 / 305,700"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+32.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -75 · 기 +221 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+35%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.89% (환산) vs 평균 0.93% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 334,500"}, {"label": "거래량 급증", "ok": true, "detail": "196,247 (환산) vs 평균 96,436"}, {"label": "회전율 급증", "ok": true, "detail": "1.89% (환산) vs 평균 0.93%"}, {"label": "RSI", "ok": true, "detail": "68"}]}
{"ts": "2026-07-01T09:24:02.331468+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 372000, "qty": 14, "cost": 5208781, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 325040, "target": 454880, "signals": [{"label": "손절선", "ok": true, "detail": "325,040 (현재 372,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 454,880"}, {"label": "추세(20일선)", "ok": true, "detail": "297,725"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -75 · 기 +221"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 368,499"}]}
{"ts": "2026-07-01T09:46:03.114409+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 118200, "qty": 52, "cost": 6147322, "path": "pullback", "reason": "눌림목 지정가 118,779 도달", "stop": 111000, "target": 139800, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "118,200 vs 118,155"}, {"label": "정배열(5>20)", "ok": true, "detail": "120,240 / 118,155"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "120,240 / 118,368"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+3.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +55 · 기 -166 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.35% (환산) vs 평균 0.37% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 130,700"}, {"label": "거래량 급증", "ok": false, "detail": "969,420 (환산) vs 평균 1,026,357"}, {"label": "회전율 급증", "ok": false, "detail": "0.35% (환산) vs 평균 0.37%"}, {"label": "RSI", "ok": true, "detail": "49"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 118,779 (현재 118,200)"}]}
{"ts": "2026-07-02T09:00:24.308786+09:00", "side": "BUY", "code": "034730", "name": "SK", "price": 707000, "qty": 4, "cost": 2828424, "path": "pullback", "reason": "눌림목 지정가 714,693 도달", "stop": 606693, "target": 1007921, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "714,000 vs 675,150"}, {"label": "정배열(5>20)", "ok": true, "detail": "760,800 / 675,150"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "760,800 / 530,100"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+11.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -198 · 기 +92 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+17%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.32% (환산) vs 평균 0.45% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 883,000"}, {"label": "거래량 급증", "ok": false, "detail": "230,413 (환산) vs 평균 329,863"}, {"label": "회전율 급증", "ok": false, "detail": "0.32% (환산) vs 평균 0.45%"}, {"label": "RSI", "ok": true, "detail": "55"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 714,693 (현재 714,000)"}]}
{"ts": "2026-07-02T09:08:01.937356+09:00", "side": "SELL", "code": "003490", "name": "대한항공", "price": 26900, "qty": 215, "proceeds": 5772222, "entry_price": 28900, "pnl": -442210, "pnl_pct": -6.92, "hold_from": "2026-06-25T09:04:05.764597+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "26,911 (현재 26,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 34,866"}, {"label": "추세(20일선)", "ok": true, "detail": "25,850"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -249 · 기 +991"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 29,517"}]}
{"ts": "2026-07-02T10:18:03.865687+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 15980, "qty": 185, "cost": 2956743, "path": "pullback", "reason": "눌림목 지정가 16,358 도달", "stop": 13328, "target": 23935, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "15,980 vs 12,848"}, {"label": "정배열(5>20)", "ok": true, "detail": "16,104 / 12,848"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "16,104 / 11,478"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+25.7%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,833 · 기 +437 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+25%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "9.98% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": true, "detail": "10,701,165 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": true, "detail": "9.98% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "60"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 16,358 (현재 15,980)"}]}
{"ts": "2026-07-02T10:18:03.865992+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 122200, "qty": 51, "cost": 6233135, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 111000, "target": 139800, "signals": [{"label": "손절선", "ok": true, "detail": "111,000 (현재 122,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 139,800"}, {"label": "추세(20일선)", "ok": true, "detail": "118,345"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +22 · 기 -44"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 121,743"}]}
{"ts": "2026-07-02T10:34:04.139128+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 18860, "qty": 326, "cost": 6149282, "path": "pullback", "reason": "눌림목 지정가 19,580 도달", "stop": 17760, "target": 22160, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "18,860 vs 18,848"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,558 / 18,848"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,558 / 19,356"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+3.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -339 · 기 +110 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+35%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.80% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "924,985 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.80% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "48"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,580 (현재 18,860)"}]}
{"ts": "2026-07-02T11:20:02.075672+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 22550, "qty": 272, "cost": 6134520, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 17760, "target": 22160, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 19,350)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,160"}, {"label": "추세(20일선)", "ok": true, "detail": "18,872"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -339 · 기 +110"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,250"}]}
{"ts": "2026-07-02T11:22:01.984048+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 19000, "qty": 598, "proceeds": 11339844, "entry_price": 20538, "pnl": -943958, "pnl_pct": -7.49, "hold_from": "2026-07-02T10:34:04.139126+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "19,368 (현재 19,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 24,048"}, {"label": "추세(20일선)", "ok": true, "detail": "18,860"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -339 · 기 +110"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-02T14:48:03.092195+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 133000, "qty": 35, "proceeds": 4645923, "entry_price": 160014, "pnl": -955417, "pnl_pct": -16.88, "hold_from": "2026-06-24T09:08:01.005473+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "133,138 (현재 133,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 240,643"}, {"label": "추세(20일선)", "ok": true, "detail": "120,490"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +395 · 기 -1,516"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-02T15:04:06.204656+09:00", "side": "SELL", "code": "403870", "name": "HPSP", "price": 43900, "qty": 43, "proceeds": 1884019, "entry_price": 55300, "pnl": -494238, "pnl_pct": -20.61, "hold_from": "2026-06-30T09:00:10.486263+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "44,022 (현재 43,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 89,135"}, {"label": "추세(20일선)", "ok": false, "detail": "51,912"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +2,379 · 기 -6,625"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 59,411"}]}
{"ts": "2026-07-03T09:02:04.942585+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 133400, "qty": 16, "cost": 2134720, "path": "pullback", "reason": "눌림목 지정가 154,163 도달", "stop": 104263, "target": 220811, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "133,300 vs 120,505"}, {"label": "정배열(5>20)", "ok": true, "detail": "138,680 / 120,505"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "138,680 / 121,322"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+18.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +674 · 기 -2,170 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+31%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.16% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": false, "detail": "571,607 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": false, "detail": "1.16% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "52"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 154,163 (현재 133,300)"}]}
{"ts": "2026-07-03T09:50:01.686836+09:00", "side": "SELL", "code": "214450", "name": "파마리서치", "price": 328500, "qty": 29, "proceeds": 9507923, "entry_price": 364500, "pnl": -1064162, "pnl_pct": -9.88, "hold_from": "2026-07-01T09:06:03.231746+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "331,504 (현재 331,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 463,487"}, {"label": "추세(20일선)", "ok": true, "detail": "295,675"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -127 · 기 +294"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-03T09:56:06.788151+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 13310, "qty": 185, "proceeds": 2457548, "entry_price": 15980, "pnl": -499195, "pnl_pct": -16.71, "hold_from": "2026-07-02T10:18:03.865686+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "13,328 (현재 13,320)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 23,935"}, {"label": "추세(20일선)", "ok": true, "detail": "12,716"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -1,591 · 기 +253"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 16,944"}]}
{"ts": "2026-07-03T10:24:02.791324+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19040, "qty": 312, "cost": 5941371, "path": "pullback", "reason": "눌림목 지정가 19,631 도달", "stop": 17921, "target": 22396, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "19,030 vs 18,856"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,592 / 18,856"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,592 / 19,359"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+2.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -35 · 기 +168 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+34%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.54% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "619,193 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.54% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "49"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,631 (현재 19,030)"}]}
{"ts": "2026-07-03T12:00:02.668056+09:00", "side": "BUY", "code": "003490", "name": "대한항공", "price": 28800, "qty": 206, "cost": 5933690, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 26795, "target": 34815, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "28,750 vs 25,942"}, {"label": "정배열(5>20)", "ok": true, "detail": "26,090 / 25,942"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "26,090 / 25,214"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+8.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +55 · 기 +1,952 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.9/5"}, {"label": "상승여력", "ok": true, "detail": "+20%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.38% (환산) vs 평균 0.58% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 28,400"}, {"label": "거래량 급증", "ok": true, "detail": "5,054,442 (환산) vs 평균 2,146,231"}, {"label": "회전율 급증", "ok": true, "detail": "1.38% (환산) vs 평균 0.58%"}, {"label": "RSI", "ok": true, "detail": "64"}]}
{"ts": "2026-07-06T09:00:11.226791+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 14510, "qty": 172, "cost": 2496094, "path": "pullback", "reason": "눌림목 지정가 16,248 도달", "stop": 11748, "target": 22796, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "14,490 vs 12,774"}, {"label": "정배열(5>20)", "ok": true, "detail": "15,806 / 12,774"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "15,806 / 11,453"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+7.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,226 · 기 +134 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+38%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.02% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": false, "detail": "20,667 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": false, "detail": "0.02% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "54"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 16,248 (현재 14,490)"}]}
{"ts": "2026-07-06T09:18:01.687101+09:00", "side": "BUY", "code": "003490", "name": "대한항공", "price": 29500, "qty": 201, "cost": 5930389, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 26795, "target": 34815, "signals": [{"label": "손절선", "ok": true, "detail": "26,795 (현재 29,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 34,815"}, {"label": "추세(20일선)", "ok": true, "detail": "25,980"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -142 · 기 +2,052"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 29,483"}]}
{"ts": "2026-07-07T10:06:07.263963+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 147500, "qty": 16, "cost": 2360354, "path": "pullback", "reason": "눌림목 지정가 148,050 도달", "stop": 118550, "target": 234350, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "147,400 vs 135,785"}, {"label": "정배열(5>20)", "ok": true, "detail": "170,120 / 135,785"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "170,120 / 99,573"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+37.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +96 · 기 -196 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+20%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "7.06% (환산) vs 평균 3.06% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 202,500"}, {"label": "거래량 급증", "ok": true, "detail": "1,366,200 (환산) vs 평균 591,925"}, {"label": "회전율 급증", "ok": true, "detail": "7.06% (환산) vs 평균 3.06%"}, {"label": "RSI", "ok": true, "detail": "56"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 148,050 (현재 147,400)"}]}
{"ts": "2026-07-07T12:02:08.254233+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 12230, "qty": 172, "proceeds": 2099458, "entry_price": 14510, "pnl": -396636, "pnl_pct": -15.71, "hold_from": "2026-07-06T09:00:11.226782+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "11,748 (현재 12,230)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,796"}, {"label": "추세(20일선)", "ok": false, "detail": "12,661"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -1,558 · 기 -4"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 15,512"}]}
{"ts": "2026-07-07T14:09:40.831175+09:00", "side": "SELL", "code": "003490", "name": "대한항공", "price": 26600, "qty": 407, "proceeds": 10805089, "entry_price": 29146, "pnl": -1058990, "pnl_pct": -8.73, "hold_from": "2026-07-03T12:00:02.668055+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "27,098 (현재 26,600)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 35,289"}, {"label": "추세(20일선)", "ok": true, "detail": "25,870"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -532 · 기 +3,040"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-07T14:09:43.495607+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 183300, "qty": 12, "cost": 2199930, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 104263, "target": 220811, "signals": [{"label": "손절선", "ok": true, "detail": "104,263 (현재 183,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 220,811"}, {"label": "추세(20일선)", "ok": true, "detail": "120,210"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +263 · 기 -1,543"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 141,825"}]}
{"ts": "2026-07-07T14:09:43.496883+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 177000, "qty": 13, "cost": 2301345, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 118550, "target": 234350, "signals": [{"label": "손절선", "ok": true, "detail": "118,550 (현재 177,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 234,350"}, {"label": "추세(20일선)", "ok": true, "detail": "134,320"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +152 · 기 -281"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 156,742"}]}
{"ts": "2026-07-07T14:09:46.099690+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 20750, "qty": 286, "cost": 5935390, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 17921, "target": 22396, "signals": [{"label": "손절선", "ok": true, "detail": "17,921 (현재 20,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,396"}, {"label": "추세(20일선)", "ok": true, "detail": "18,884"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +156 · 기 +113"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,358"}]}
{"ts": "2026-07-07T14:09:46.100799+09:00", "side": "BUY", "code": "034730", "name": "SK", "price": 815000, "qty": 4, "cost": 3260489, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 606693, "target": 1007921, "signals": [{"label": "손절선", "ok": true, "detail": "606,693 (현재 815,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 1,007,921"}, {"label": "추세(20일선)", "ok": true, "detail": "673,250"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -44 · 기 +3"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 738,777"}]}
{"ts": "2026-07-08T09:00:20.034480+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 108300, "qty": 28, "proceeds": 3026487, "entry_price": 154786, "pnl": -1308163, "pnl_pct": -30.03, "hold_from": "2026-07-03T09:02:04.942583+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "129,511 (현재 112,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 230,609"}, {"label": "추세(20일선)", "ok": false, "detail": "119,475"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +243 · 기 -857"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-08T09:00:20.036912+09:00", "side": "SELL", "code": "034730", "name": "SK", "price": 602000, "qty": 8, "proceeds": 4806609, "entry_price": 761000, "pnl": -1282304, "pnl_pct": -20.89, "hold_from": "2026-07-02T09:00:24.308779+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "665,669 (현재 602,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 1,046,992"}, {"label": "추세(20일선)", "ok": false, "detail": "669,550"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +49 · 기 -19"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-08T09:12:05.982854+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18900, "qty": 598, "proceeds": 11280161, "entry_price": 19858, "pnl": -596601, "pnl_pct": -4.82, "hold_from": "2026-07-03T10:24:02.791323+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "18,904 (현재 18,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,720"}, {"label": "추세(20일선)", "ok": true, "detail": "18,850"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +193 · 기 +193"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-09T09:02:04.480986+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19110, "qty": 293, "cost": 5600070, "path": "pullback", "reason": "눌림목 지정가 19,657 도달", "stop": 18017, "target": 22388, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "19,070 vs 18,858"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,600 / 18,858"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,600 / 19,360"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+0.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -10 · 기 +164 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.08% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "93,540 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.08% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,657 (현재 19,070)"}]}
{"ts": "2026-07-09T09:02:04.481104+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 158300, "qty": 35, "cost": 5541331, "path": "pullback", "reason": "눌림목 지정가 158,582 도달", "stop": 158000, "target": 159200, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "158,200 vs 149,700"}, {"label": "정배열(5>20)", "ok": true, "detail": "169,280 / 149,700"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "169,280 / 113,195"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+81.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +296 · 기 -306 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+13%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.72% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": false, "detail": "499,233 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": false, "detail": "1.72% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "55"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 158,582 (현재 158,200)"}]}
{"ts": "2026-07-09T09:12:02.523061+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 156900, "qty": 35, "proceeds": 5480792, "entry_price": 158300, "pnl": -60540, "pnl_pct": -0.88, "hold_from": "2026-07-09T09:02:04.481103+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "158,000 (현재 156,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "149,635"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +296 · 기 -306"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-09T09:36:03.473481+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 132000, "qty": 39, "cost": 5148772, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 120761, "target": 165716, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "131,900 vs 108,920"}, {"label": "정배열(5>20)", "ok": true, "detail": "115,560 / 108,920"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "115,560 / 113,228"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+22.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -184 · 기 +964 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+13%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.91% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 116,900"}, {"label": "거래량 급증", "ok": true, "detail": "1,026,867 (환산) vs 평균 359,705"}, {"label": "회전율 급증", "ok": true, "detail": "0.91% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-07-10T09:24:02.119172+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 158900, "qty": 35, "cost": 5562334, "path": "pullback", "reason": "눌림목 지정가 159,557 도달", "stop": 158000, "target": 161600, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "158,800 vs 149,730"}, {"label": "정배열(5>20)", "ok": true, "detail": "169,400 / 149,730"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "169,400 / 113,205"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+82.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +225 · 기 -178 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+13%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "5.62% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": true, "detail": "1,627,273 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": true, "detail": "5.62% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "55"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 159,557 (현재 158,800)"}]}
{"ts": "2026-07-10T09:28:02.638256+09:00", "side": "BUY", "code": "105560", "name": "KB금융", "price": 185900, "qty": 30, "cost": 5577837, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 171311, "target": 229666, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "185,600 vs 159,890"}, {"label": "정배열(5>20)", "ok": true, "detail": "159,900 / 159,890"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "159,900 / 157,368"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+26.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,310 · 기 +1,527 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+16%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.06% (환산) vs 평균 0.46% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 182,700"}, {"label": "거래량 급증", "ok": true, "detail": "3,715,113 (환산) vs 평균 1,640,325"}, {"label": "회전율 급증", "ok": true, "detail": "1.06% (환산) vs 평균 0.46%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-07-10T09:46:11.489940+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 12830, "qty": 184, "cost": 2361074, "path": "pullback", "reason": "눌림목 지정가 15,971 도달", "stop": 10360, "target": 20240, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "12,820 vs 12,690"}, {"label": "정배열(5>20)", "ok": true, "detail": "15,472 / 12,690"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "15,472 / 11,425"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+1.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +228 · 기 +229 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+56%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "9.75% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": true, "detail": "10,460,473 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": true, "detail": "9.75% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 15,971 (현재 12,820)"}]}
{"ts": "2026-07-10T11:16:02.490846+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 13850, "qty": 170, "cost": 2354853, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 10360, "target": 20240, "signals": [{"label": "손절선", "ok": true, "detail": "10,360 (현재 13,850)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 20,240"}, {"label": "추세(20일선)", "ok": true, "detail": "12,742"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +210 · 기 +239"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,843"}]}
{"ts": "2026-07-10T12:14:02.686539+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 126200, "qty": 15, "cost": 1893284, "path": "pullback", "reason": "눌림목 지정가 151,752 도달", "stop": 96000, "target": 216800, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "126,200 vs 120,150"}, {"label": "정배열(5>20)", "ok": true, "detail": "137,260 / 120,150"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "137,260 / 121,203"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+17.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +483 · 기 -241 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+38%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "7.53% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": true, "detail": "3,695,762 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": true, "detail": "7.53% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 151,752 (현재 126,200)"}]}
{"ts": "2026-07-13T09:00:11.979434+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 136900, "qty": 38, "cost": 5202980, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 120761, "target": 165716, "signals": [{"label": "손절선", "ok": true, "detail": "120,761 (현재 136,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 165,716"}, {"label": "추세(20일선)", "ok": true, "detail": "109,140"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -64 · 기 +919"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 135,864"}]}
{"ts": "2026-07-13T09:26:03.425107+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 139100, "qty": 13, "cost": 1808571, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 96000, "target": 216800, "signals": [{"label": "손절선", "ok": true, "detail": "96,000 (현재 139,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 216,800"}, {"label": "추세(20일선)", "ok": true, "detail": "120,795"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -213 · 기 +772"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 136,162"}]}
{"ts": "2026-07-13T09:36:02.288771+09:00", "side": "BUY", "code": "105560", "name": "KB금융", "price": 191000, "qty": 29, "cost": 5539831, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 171311, "target": 229666, "signals": [{"label": "손절선", "ok": true, "detail": "171,311 (현재 191,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 229,666"}, {"label": "추세(20일선)", "ok": true, "detail": "160,160"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -867 · 기 +1,393"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 190,952"}]}
{"ts": "2026-07-13T12:44:04.369603+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 187900, "qty": 35, "proceeds": 6563676, "entry_price": 158900, "pnl": 1001342, "pnl_pct": 18.25, "hold_from": "2026-07-10T09:24:02.119171+09:00", "reason": "트레일링 익절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "189,133 (현재 187,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "151,185"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -254 · 기 +457"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-16T09:00:12.110669+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18580, "qty": 293, "proceeds": 5433324, "entry_price": 19110, "pnl": -166746, "pnl_pct": -2.77, "hold_from": "2026-07-09T09:02:04.480985+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "18,017 (현재 18,560)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,388"}, {"label": "추세(20일선)", "ok": false, "detail": "18,832"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -120 · 기 -150"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,486"}]}
{"ts": "2026-07-20T09:04:02.896610+09:00", "side": "SELL", "code": "105560", "name": "KB금융", "price": 173000, "qty": 59, "proceeds": 10187096, "entry_price": 188407, "pnl": -930571, "pnl_pct": -8.18, "hold_from": "2026-07-10T09:28:02.638255+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "173,250 (현재 173,200)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 233,877"}, {"label": "추세(20일선)", "ok": true, "detail": "159,270"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -332 · 기 +291"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-20T12:28:02.330892+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 10310, "qty": 354, "proceeds": 3642623, "entry_price": 13320, "pnl": -1073304, "pnl_pct": -22.6, "hold_from": "2026-07-10T09:46:11.489938+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "10,360 (현재 10,310)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,199"}, {"label": "추세(20일선)", "ok": false, "detail": "14,755"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -887 · 기 +515"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-21T12:06:01.185931+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 344500, "qty": 14, "cost": 4823723, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 313808, "target": 436576, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "344,500 vs 296,350"}, {"label": "정배열(5>20)", "ok": true, "detail": "315,100 / 296,350"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "315,100 / 305,492"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+39.7%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -7 · 기 +1 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+43%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.38% (환산) vs 평균 0.93% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 334,500"}, {"label": "거래량 급증", "ok": true, "detail": "247,158 (환산) vs 평균 96,436"}, {"label": "회전율 급증", "ok": true, "detail": "2.38% (환산) vs 평균 0.93%"}, {"label": "RSI", "ok": true, "detail": "65"}]}
{"ts": "2026-07-22T11:56:00.841667+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 159800, "qty": 35, "cost": 5593839, "path": "pullback", "reason": "눌림목 지정가 159,932 도달", "stop": 158000, "target": 165200, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "159,700 vs 149,775"}, {"label": "정배열(5>20)", "ok": true, "detail": "169,580 / 149,775"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "169,580 / 113,220"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+75.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -408 · 기 +146 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+12%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "4.73% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": false, "detail": "1,371,014 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": true, "detail": "4.73% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "55"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 159,932 (현재 159,700)"}]}
{"ts": "2026-07-22T12:12:00.753196+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 157300, "qty": 35, "proceeds": 5494764, "entry_price": 159800, "pnl": -99075, "pnl_pct": -1.56, "hold_from": "2026-07-22T11:56:00.841665+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "158,000 (현재 157,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 165,200"}, {"label": "추세(20일선)", "ok": true, "detail": "149,655"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -407 · 기 +141"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 169,305"}]}
{"ts": "2026-07-23T09:00:24.496838+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 160100, "qty": 34, "cost": 5444217, "path": "pullback", "reason": "눌림목 지정가 159,493 도달", "stop": 158000, "target": 166400, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "158,100 vs 149,695"}, {"label": "정배열(5>20)", "ok": true, "detail": "169,260 / 149,695"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "169,260 / 113,193"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+76.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -162 · 기 +37 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+13%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.05% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": false, "detail": "303,687 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": false, "detail": "1.05% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "55"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 159,493 (현재 158,100)"}]}
{"ts": "2026-07-23T09:32:04.426166+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 157800, "qty": 34, "proceeds": 5354738, "entry_price": 160100, "pnl": -89479, "pnl_pct": -1.44, "hold_from": "2026-07-23T09:00:24.496830+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "158,000 (현재 157,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 166,400"}, {"label": "추세(20일선)", "ok": true, "detail": "149,685"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -162 · 기 +37"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 169,669"}]}
{"ts": "2026-07-23T09:44:04.302592+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 18850, "qty": 298, "cost": 5618143, "path": "pullback", "reason": "눌림목 지정가 19,627 도달", "stop": 17760, "target": 22120, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "18,850 vs 18,847"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,556 / 18,847"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,556 / 19,356"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+13.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -25 · 기 +6 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+34%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.34% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "388,767 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.34% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "48"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,627 (현재 18,850)"}]}
{"ts": "2026-07-23T09:50:01.528643+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 88200, "qty": 56, "cost": 4939941, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 80223, "target": 112132, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "88,200 vs 75,070"}, {"label": "정배열(5>20)", "ok": true, "detail": "83,000 / 75,070"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "83,000 / 75,058"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+47.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -150 · 기 +299 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+17%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.85% (환산) vs 평균 0.42% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 87,600"}, {"label": "거래량 급증", "ok": true, "detail": "785,587 (환산) vs 평균 392,182"}, {"label": "회전율 급증", "ok": true, "detail": "0.85% (환산) vs 평균 0.42%"}, {"label": "RSI", "ok": true, "detail": "67"}]}
{"ts": "2026-07-23T10:30:02.499551+09:00", "side": "BUY", "code": "024060", "name": "흥구석유", "price": 14140, "qty": 246, "cost": 3478962, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 12315, "target": 19616, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "14,180 vs 10,944"}, {"label": "정배열(5>20)", "ok": true, "detail": "13,154 / 10,944"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "13,154 / 12,687"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+55.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +109 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "84.26% (환산) vs 평균 31.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 13,990"}, {"label": "거래량 급증", "ok": true, "detail": "12,639,979 (환산) vs 평균 4,720,532"}, {"label": "회전율 급증", "ok": true, "detail": "84.26% (환산) vs 평균 31.47%"}, {"label": "RSI", "ok": true, "detail": "66"}]}
{"ts": "2026-07-23T12:22:02.609780+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 356000, "qty": 14, "cost": 4984748, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 313808, "target": 436576, "signals": [{"label": "손절선", "ok": true, "detail": "313,808 (현재 356,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 436,576"}, {"label": "추세(20일선)", "ok": true, "detail": "296,925"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +6 · 기 +26"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 355,034"}]}
{"ts": "2026-07-23T12:54:04.510618+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 90900, "qty": 54, "cost": 4909336, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 80223, "target": 112132, "signals": [{"label": "손절선", "ok": true, "detail": "80,223 (현재 91,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 112,132"}, {"label": "추세(20일선)", "ok": true, "detail": "75,210"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -169 · 기 +311"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 90,945"}]}
{"ts": "2026-07-24T09:00:08.588367+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 111800, "qty": 28, "proceeds": 3124296, "entry_price": 132189, "pnl": -577559, "pnl_pct": -15.42, "hold_from": "2026-07-10T12:14:02.686538+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "102,302 (현재 113,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 221,851"}, {"label": "추세(20일선)", "ok": false, "detail": "119,505"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -480 · 기 -206"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-24T09:00:08.589602+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18730, "qty": 298, "proceeds": 5570656, "entry_price": 18850, "pnl": -47487, "pnl_pct": -0.64, "hold_from": "2026-07-23T09:44:04.302591+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 18,730)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,120"}, {"label": "추세(20일선)", "ok": false, "detail": "18,841"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -5 · 기 -5"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,219"}]}
{"ts": "2026-07-24T09:02:04.057288+09:00", "side": "BUY", "code": "024060", "name": "흥구석유", "price": 15060, "qty": 231, "cost": 3479382, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 12315, "target": 19616, "signals": [{"label": "손절선", "ok": true, "detail": "12,315 (현재 15,020)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 19,616"}, {"label": "추세(20일선)", "ok": true, "detail": "10,986"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +208 · 기 -2"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 14,766"}]}
{"ts": "2026-07-24T12:58:01.275864+09:00", "side": "SELL", "code": "095610", "name": "테스", "price": 132500, "qty": 29, "proceeds": 3835007, "entry_price": 160724, "pnl": -826692, "pnl_pct": -17.56, "hold_from": "2026-07-07T10:06:07.263962+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "132,997 (현재 132,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 243,905"}, {"label": "추세(20일선)", "ok": false, "detail": "135,040"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +177 · 기 -465"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-27T09:02:06.248330+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 139000, "qty": 15, "cost": 2085313, "path": "pullback", "reason": "눌림목 지정가 146,775 도달", "stop": 108775, "target": 229675, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "138,700 vs 135,350"}, {"label": "정배열(5>20)", "ok": true, "detail": "168,380 / 135,350"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "168,380 / 99,428"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+28.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +238 · 기 -568 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+41%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.72% (환산) vs 평균 3.06% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 202,500"}, {"label": "거래량 급증", "ok": false, "detail": "526,333 (환산) vs 평균 591,925"}, {"label": "회전율 급증", "ok": false, "detail": "2.72% (환산) vs 평균 3.06%"}, {"label": "RSI", "ok": true, "detail": "53"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 146,775 (현재 138,700)"}]}
{"ts": "2026-07-27T09:02:06.248457+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19100, "qty": 295, "cost": 5635345, "path": "pullback", "reason": "눌림목 지정가 19,673 도달", "stop": 18023, "target": 22330, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "19,070 vs 18,858"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,600 / 18,858"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,600 / 19,360"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+16.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +101 · 기 -3 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.13% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "146,760 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.13% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,673 (현재 19,070)"}]}
{"ts": "2026-07-27T09:02:06.248634+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 7470, "qty": 543, "cost": 4056818, "path": "pullback", "reason": "눌림목 지정가 7,635 도달", "stop": 6645, "target": 9944, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "7,470 vs 4,876"}, {"label": "정배열(5>20)", "ok": true, "detail": "6,452 / 4,876"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,452 / 4,889"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+82.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +49 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.79% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "49,327 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "0.79% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "74"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,635 (현재 7,470)"}]}
{"ts": "2026-07-27T09:04:05.331893+09:00", "side": "SELL", "code": "024060", "name": "흥구석유", "price": 12200, "qty": 477, "proceeds": 5808052, "entry_price": 14586, "pnl": -1150291, "pnl_pct": -16.36, "hold_from": "2026-07-23T10:30:02.499550+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "12,708 (현재 12,250)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 20,219"}, {"label": "추세(20일선)", "ok": true, "detail": "10,847"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -85 · 기 +2"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-27T09:08:02.101845+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 7910, "qty": 513, "cost": 4058439, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 6645, "target": 9944, "signals": [{"label": "손절선", "ok": true, "detail": "6,645 (현재 7,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 9,944"}, {"label": "추세(20일선)", "ok": true, "detail": "4,897"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +49 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 7,747"}]}
{"ts": "2026-07-27T09:12:01.533928+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 13150, "qty": 191, "cost": 2512027, "path": "pullback", "reason": "눌림목 지정가 13,180 도달", "stop": 10830, "target": 20110, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "13,150 vs 12,732"}, {"label": "정배열(5>20)", "ok": true, "detail": "14,378 / 12,732"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "14,378 / 13,268"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+1.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +27 · 기 +15 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.46% (환산) vs 평균 1.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 15,870"}, {"label": "거래량 급증", "ok": false, "detail": "274,967 (환산) vs 평균 882,736"}, {"label": "회전율 급증", "ok": false, "detail": "0.46% (환산) vs 평균 1.47%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 13,180 (현재 13,150)"}]}
{"ts": "2026-07-27T13:40:01.110173+09:00", "side": "SELL", "code": "003680", "name": "한성기업", "price": 6780, "qty": 1056, "proceeds": 7145719, "entry_price": 7684, "pnl": -969538, "pnl_pct": -11.76, "hold_from": "2026-07-27T09:02:06.248633+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "6,854 (현재 6,770)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 10,174"}, {"label": "추세(20일선)", "ok": true, "detail": "4,841"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +50 · 기 +0"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-28T09:00:17.897091+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6780, "qty": 500, "cost": 3390509, "path": "pullback", "reason": "눌림목 지정가 7,596 도달", "stop": 5916, "target": 9373, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "7,050 vs 4,855"}, {"label": "정배열(5>20)", "ok": true, "detail": "6,368 / 4,855"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,368 / 4,882"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+73.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +86 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.01% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "813 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "0.01% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "69"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,596 (현재 7,050)"}]}
{"ts": "2026-07-28T09:10:01.757637+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 7100, "qty": 478, "cost": 3394309, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 5916, "target": 9373, "signals": [{"label": "손절선", "ok": true, "detail": "5,916 (현재 7,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 9,373"}, {"label": "추세(20일선)", "ok": true, "detail": "4,857"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +86 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 7,079"}]}
{"ts": "2026-07-28T11:04:03.862281+09:00", "side": "SELL", "code": "252990", "name": "샘씨엔에스", "price": 10790, "qty": 191, "proceeds": 2056871, "entry_price": 13150, "pnl": -455155, "pnl_pct": -17.95, "hold_from": "2026-07-27T09:12:01.533927+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "10,830 (현재 10,810)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 20,110"}, {"label": "추세(20일선)", "ok": false, "detail": "12,616"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +156 · 기 -156"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 14,003"}]}
{"ts": "2026-07-29T09:24:10.018164+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 122600, "qty": 17, "cost": 2084513, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 108775, "target": 229675, "signals": [{"label": "손절선", "ok": true, "detail": "108,775 (현재 177,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 229,675"}, {"label": "추세(20일선)", "ok": true, "detail": "134,320"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +453 · 기 -688"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 148,242"}]}
{"ts": "2026-07-29T09:24:10.018323+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 18950, "qty": 297, "cost": 5628994, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 18023, "target": 22330, "signals": [{"label": "손절선", "ok": true, "detail": "18,023 (현재 20,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,330"}, {"label": "추세(20일선)", "ok": true, "detail": "18,884"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +99 · 기 +138"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,418"}]}
{"ts": "2026-07-29T09:24:10.018592+09:00", "side": "SELL", "code": "010950", "name": "S-Oil", "price": 128600, "qty": 77, "proceeds": 9882891, "entry_price": 134418, "pnl": -468862, "pnl_pct": -4.33, "hold_from": "2026-07-09T09:36:03.473480+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "122,826 (현재 116,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 169,195"}, {"label": "추세(20일선)", "ok": true, "detail": "107,870"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +43 · 기 +245"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T09:28:01.398381+09:00", "side": "BUY", "code": "090850", "name": "현대이지웰", "price": 6390, "qty": 824, "cost": 5266150, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 5998, "target": 7566, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "6,380 vs 5,358"}, {"label": "정배열(5>20)", "ok": true, "detail": "5,742 / 5,358"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "5,742 / 5,622"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+43.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +73 · 기 -3 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.62% (환산) vs 평균 0.22% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 5,700"}, {"label": "거래량 급증", "ok": true, "detail": "134,413 (환산) vs 평균 49,512"}, {"label": "회전율 급증", "ok": true, "detail": "0.62% (환산) vs 평균 0.22%"}, {"label": "RSI", "ok": true, "detail": "73"}]}
{"ts": "2026-07-29T10:24:01.457804+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 123400, "qty": 43, "cost": 5306996, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 115612, "target": 146764, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "123,400 vs 113,725"}, {"label": "정배열(5>20)", "ok": true, "detail": "118,140 / 113,725"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "118,140 / 110,075"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+51.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +47 · 기 +310 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+20%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.38% (환산) vs 평균 0.17% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 123,300"}, {"label": "거래량 급증", "ok": true, "detail": "644,676 (환산) vs 평균 289,522"}, {"label": "회전율 급증", "ok": true, "detail": "0.38% (환산) vs 평균 0.17%"}, {"label": "RSI", "ok": true, "detail": "67"}]}
{"ts": "2026-07-29T10:42:05.427012+09:00", "side": "SELL", "code": "090850", "name": "현대이지웰", "price": 5980, "qty": 824, "proceeds": 4917911, "entry_price": 6390, "pnl": -348238, "pnl_pct": -6.42, "hold_from": "2026-07-29T09:28:01.398380+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,998 (현재 5,980)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 7,566"}, {"label": "추세(20일선)", "ok": true, "detail": "5,338"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +77 · 기 -3"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,521"}]}
{"ts": "2026-07-29T11:18:04.438536+09:00", "side": "SELL", "code": "003680", "name": "한성기업", "price": 6000, "qty": 978, "proceeds": 5856557, "entry_price": 6936, "pnl": -928260, "pnl_pct": -13.5, "hold_from": "2026-07-28T09:00:17.897086+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "6,040 (현재 6,020)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 9,626"}, {"label": "추세(20일선)", "ok": true, "detail": "4,803"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +185 · 기 +0"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T12:50:05.483924+09:00", "side": "SELL", "code": "095610", "name": "테스", "price": 108000, "qty": 32, "proceeds": 3449261, "entry_price": 130288, "pnl": -720565, "pnl_pct": -17.11, "hold_from": "2026-07-27T09:02:06.248329+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "108,775 (현재 108,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 213,468"}, {"label": "추세(20일선)", "ok": false, "detail": "133,815"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +449 · 기 -685"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T13:30:01.461196+09:00", "side": "SELL", "code": "086790", "name": "하나금융지주", "price": 118000, "qty": 103, "proceeds": 12130300, "entry_price": 120181, "pnl": -250157, "pnl_pct": -1.81, "hold_from": "2026-07-01T09:46:03.114406+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "111,000 (현재 118,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 147,722"}, {"label": "추세(20일선)", "ok": false, "detail": "118,145"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -11 · 기 -51"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T14:20:01.520902+09:00", "side": "SELL", "code": "138040", "name": "메리츠금융지주", "price": 115500, "qty": 43, "proceeds": 4956815, "entry_price": 123400, "pnl": -350181, "pnl_pct": -6.4, "hold_from": "2026-07-29T10:24:01.457803+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "115,612 (현재 115,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 146,764"}, {"label": "추세(20일선)", "ok": true, "detail": "113,330"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +44 · 기 +333"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 126,053"}]}
{"ts": "2026-07-30T09:04:07.509226+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6130, "qty": 410, "cost": 2513677, "path": "pullback", "reason": "눌림목 지정가 7,457 도달", "stop": 5127, "target": 9138, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "6,120 vs 4,808"}, {"label": "정배열(5>20)", "ok": true, "detail": "6,182 / 4,808"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,182 / 4,866"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+65.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +234 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "4.31% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "267,687 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "4.31% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,457 (현재 6,120)"}]}
{"ts": "2026-07-30T09:22:07.824435+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 124400, "qty": 41, "cost": 5101165, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 116537, "target": 147989, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "124,300 vs 113,770"}, {"label": "정배열(5>20)", "ok": true, "detail": "118,320 / 113,770"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "118,320 / 110,090"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+55.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +9 · 기 +389 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+19%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.37% (환산) vs 평균 0.17% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 123,300"}, {"label": "거래량 급증", "ok": true, "detail": "615,133 (환산) vs 평균 289,522"}, {"label": "회전율 급증", "ok": true, "detail": "0.37% (환산) vs 평균 0.17%"}, {"label": "RSI", "ok": true, "detail": "68"}]}
{"ts": "2026-07-30T09:24:07.557100+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 131800, "qty": 37, "cost": 4877331, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 120690, "target": 165130, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "132,000 vs 108,925"}, {"label": "정배열(5>20)", "ok": true, "detail": "115,580 / 108,925"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "115,580 / 113,230"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+51.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -6 · 기 +178 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+20%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.66% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 116,900"}, {"label": "거래량 급증", "ok": true, "detail": "738,813 (환산) vs 평균 359,705"}, {"label": "회전율 급증", "ok": true, "detail": "0.66% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-07-30T09:26:07.504703+09:00", "side": "BUY", "code": "090850", "name": "현대이지웰", "price": 6300, "qty": 820, "cost": 5166775, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 5917, "target": 7450, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "6,280 vs 5,353"}, {"label": "정배열(5>20)", "ok": true, "detail": "5,722 / 5,353"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "5,722 / 5,620"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+46.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +87 · 기 +6 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.51% (환산) vs 평균 0.22% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 5,700"}, {"label": "거래량 급증", "ok": true, "detail": "109,080 (환산) vs 평균 49,512"}, {"label": "회전율 급증", "ok": true, "detail": "0.51% (환산) vs 평균 0.22%"}, {"label": "RSI", "ok": true, "detail": "71"}]}
{"ts": "2026-07-30T10:10:07.453421+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 127700, "qty": 40, "cost": 5108766, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 116537, "target": 147989, "signals": [{"label": "손절선", "ok": true, "detail": "116,537 (현재 127,600)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 147,989"}, {"label": "추세(20일선)", "ok": true, "detail": "113,935"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +35 · 기 +392"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 127,135"}]}
{"ts": "2026-07-31T09:04:08.433229+09:00", "side": "SELL", "code": "078930", "name": "GS", "price": 69100, "qty": 110, "proceeds": 7586178, "entry_price": 89525, "pnl": -2263099, "pnl_pct": -22.82, "hold_from": "2026-07-23T09:50:01.528642+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "81,291 (현재 79,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 114,229"}, {"label": "추세(20일선)", "ok": true, "detail": "74,655"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -179 · 기 +325"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-31T09:06:07.654376+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6550, "qty": 383, "cost": 2509026, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 5127, "target": 9138, "signals": [{"label": "손절선", "ok": true, "detail": "5,127 (현재 6,640)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 9,138"}, {"label": "추세(20일선)", "ok": true, "detail": "4,834"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +355 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,453"}]}
{"ts": "2026-08-03T09:34:09.186164+09:00", "side": "SELL", "code": "010950", "name": "S-Oil", "price": 120300, "qty": 37, "proceeds": 4442420, "entry_price": 131800, "pnl": -434911, "pnl_pct": -8.73, "hold_from": "2026-07-30T09:24:07.557097+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "120,690 (현재 120,400)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 165,130"}, {"label": "추세(20일선)", "ok": true, "detail": "108,345"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -35 · 기 +48"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 135,311"}]}
{"ts": "2026-08-03T12:00:12.444889+09:00", "side": "BUY", "code": "194370", "name": "제이에스코퍼레이션", "price": 12910, "qty": 330, "cost": 4260939, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 11713, "target": 16502, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "12,930 vs 11,922"}, {"label": "정배열(5>20)", "ok": true, "detail": "12,138 / 11,922"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "12,138 / 11,924"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+27.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +7 · 기 +10 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+74%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.72% (환산) vs 평균 0.34% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 12,870"}, {"label": "거래량 급증", "ok": true, "detail": "208,994 (환산) vs 평균 99,303"}, {"label": "회전율 급증", "ok": true, "detail": "0.72% (환산) vs 평균 0.34%"}, {"label": "RSI", "ok": true, "detail": "63"}]}
{"ts": "2026-08-03T12:02:10.384620+09:00", "side": "BUY", "code": "194370", "name": "제이에스코퍼레이션", "price": 13420, "qty": 318, "cost": 4268200, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 11713, "target": 16502, "signals": [{"label": "손절선", "ok": true, "detail": "11,713 (현재 13,450)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 16,502"}, {"label": "추세(20일선)", "ok": true, "detail": "11,948"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +7 · 기 +10"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,339"}]}
{"ts": "2026-08-04T09:04:10.089206+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 135900, "qty": 12, "cost": 1631045, "path": "pullback", "reason": "눌림목 지정가 145,918 도달", "stop": 104818, "target": 229146, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "135,700 vs 135,200"}, {"label": "정배열(5>20)", "ok": true, "detail": "167,780 / 135,200"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "167,780 / 99,378"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+24.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +23 · 기 +54 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+45%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "6.62% (환산) vs 평균 3.06% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 202,500"}, {"label": "거래량 급증", "ok": true, "detail": "1,281,140 (환산) vs 평균 591,925"}, {"label": "회전율 급증", "ok": true, "detail": "6.62% (환산) vs 평균 3.06%"}, {"label": "RSI", "ok": true, "detail": "52"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 145,918 (현재 135,700)"}]}
{"ts": "2026-08-04T09:50:10.213039+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 90400, "qty": 47, "cost": 4249437, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 82166, "target": 115103, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "90,300 vs 75,175"}, {"label": "정배열(5>20)", "ok": true, "detail": "83,420 / 75,175"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "83,420 / 75,093"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+56.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +68 · 기 +117 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+14%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.87% (환산) vs 평균 0.42% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 87,600"}, {"label": "거래량 급증", "ok": true, "detail": "805,693 (환산) vs 평균 392,182"}, {"label": "회전율 급증", "ok": true, "detail": "0.87% (환산) vs 평균 0.42%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-08-04T10:32:13.405182+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 93500, "qty": 46, "cost": 4301645, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 82166, "target": 115103, "signals": [{"label": "손절선", "ok": true, "detail": "82,166 (현재 93,400)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 115,103"}, {"label": "추세(20일선)", "ok": true, "detail": "75,330"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +57 · 기 +117"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 93,241"}]}
{"ts": "2026-08-04T12:16:10.446121+09:00", "side": "SELL", "code": "138040", "name": "메리츠금융지주", "price": 117800, "qty": 81, "proceeds": 9523193, "entry_price": 126030, "pnl": -686738, "pnl_pct": -6.53, "hold_from": "2026-07-30T09:22:07.824432+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "117,824 (현재 117,800)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 150,647"}, {"label": "추세(20일선)", "ok": true, "detail": "113,445"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -24 · 기 +268"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-08-04T13:26:13.440776+09:00", "side": "SELL", "code": "090850", "name": "현대이지웰", "price": 5910, "qty": 820, "proceeds": 4836750, "entry_price": 6300, "pnl": -330025, "pnl_pct": -6.19, "hold_from": "2026-07-30T09:26:07.504700+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,917 (현재 5,910)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 7,450"}, {"label": "추세(20일선)", "ok": true, "detail": "5,335"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +36 · 기 +9"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,419"}]}
{"ts": "2026-08-05T09:00:18.510059+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 147600, "qty": 11, "cost": 1623844, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 104818, "target": 229146, "signals": [{"label": "손절선", "ok": true, "detail": "104,818 (현재 147,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 229,146"}, {"label": "추세(20일선)", "ok": true, "detail": "135,790"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -256 · 기 +200"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 145,836"}]}
{"ts": "2026-08-05T09:02:14.754261+09:00", "side": "BUY", "code": "090850", "name": "현대이지웰", "price": 5710, "qty": 867, "cost": 4951313, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 5372, "target": 6725, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "5,730 vs 5,326"}, {"label": "정배열(5>20)", "ok": true, "detail": "5,612 / 5,326"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "5,612 / 5,611"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+11.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +14 · 기 -2 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.46% (환산) vs 평균 0.22% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 5,700"}, {"label": "거래량 급증", "ok": true, "detail": "99,627 (환산) vs 평균 49,512"}, {"label": "회전율 급증", "ok": true, "detail": "0.46% (환산) vs 평균 0.22%"}, {"label": "RSI", "ok": true, "detail": "61"}]}
{"ts": "2026-08-05T09:02:14.754660+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 13040, "qty": 170, "cost": 2217133, "path": "pullback", "reason": "눌림목 지정가 13,170 도달", "stop": 10710, "target": 20029, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "13,040 vs 12,727"}, {"label": "정배열(5>20)", "ok": true, "detail": "14,356 / 12,727"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "14,356 / 13,267"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-6.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -72 · 기 +134 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.13% (환산) vs 평균 1.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 15,870"}, {"label": "거래량 급증", "ok": false, "detail": "78,333 (환산) vs 평균 882,736"}, {"label": "회전율 급증", "ok": false, "detail": "0.13% (환산) vs 평균 1.47%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 13,170 (현재 13,040)"}]}
{"ts": "2026-08-05T09:38:13.251161+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 13830, "qty": 160, "cost": 2213132, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 10710, "target": 20029, "signals": [{"label": "손절선", "ok": true, "detail": "10,710 (현재 13,860)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 20,029"}, {"label": "추세(20일선)", "ok": true, "detail": "12,768"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -72 · 기 +134"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,817"}]}
{"ts": "2026-08-06T09:00:21.870261+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18730, "qty": 592, "proceeds": 11066538, "entry_price": 19025, "pnl": -197801, "pnl_pct": -1.55, "hold_from": "2026-07-27T09:02:06.248456+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "18,071 (현재 18,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,887"}, {"label": "추세(20일선)", "ok": false, "detail": "18,842"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -203 · 기 -147"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-08-06T09:34:17.058695+09:00", "side": "BUY", "code": "068270", "name": "셀트리온", "price": 192000, "qty": 25, "cost": 4800720, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 179508, "target": 229476, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "191,800 vs 177,680"}, {"label": "정배열(5>20)", "ok": true, "detail": "186,140 / 177,680"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "186,140 / 176,671"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+20.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +255 · 기 -319 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+44%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.67% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 191,700"}, {"label": "거래량 급증", "ok": true, "detail": "1,582,767 (환산) vs 평균 738,783"}, {"label": "회전율 급증", "ok": true, "detail": "0.67% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "63"}]}
{"ts": "2026-08-06T09:34:17.059340+09:00", "side": "SELL", "code": "090850", "name": "현대이지웰", "price": 5350, "qty": 867, "proceeds": 4629405, "entry_price": 5710, "pnl": -321908, "pnl_pct": -6.3, "hold_from": "2026-08-05T09:02:14.754258+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,372 (현재 5,370)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 6,725"}, {"label": "추세(20일선)", "ok": true, "detail": "5,308"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -30 · 기 -23"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 5,829"}]}
{"ts": "2026-08-07T09:00:20.292031+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19120, "qty": 258, "cost": 4933700, "path": "pullback", "reason": "눌림목 지정가 19,668 도달", "stop": 18038, "target": 22366, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "19,060 vs 18,858"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,598 / 18,858"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,598 / 19,360"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+10.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +73 · 기 -81 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+32%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.06% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "64,387 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.06% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,668 (현재 19,060)"}]}
{"ts": "2026-08-07T09:12:17.863894+09:00", "side": "BUY", "code": "068270", "name": "셀트리온", "price": 196400, "qty": 25, "cost": 4910736, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 179508, "target": 229476, "signals": [{"label": "손절선", "ok": true, "detail": "179,508 (현재 196,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 229,476"}, {"label": "추세(20일선)", "ok": true, "detail": "177,905"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +338 · 기 +73"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 196,264"}]}
@@ -0,0 +1,201 @@
{
"cash": 18871261.522500005,
"initial": 100000000,
"positions": {
"214450": {
"code": "214450",
"name": "파마리서치",
"sources": [
"auto"
],
"qty": 22,
"entry_price": 347250.0,
"entry_at": "2026-07-13T09:12:04.319241+09:00",
"stop": 305399,
"target": 472804,
"peak": 411500,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 409000,
"tranches": 2,
"tranche_value": 3889733.683715179,
"last_add_price": 353000
},
"138040": {
"code": "138040",
"name": "메리츠금융지주",
"sources": [
"auto"
],
"qty": 89,
"entry_price": 119185.39325842696,
"entry_at": "2026-07-29T09:02:02.251620+09:00",
"stop": 111200,
"target": 143142,
"peak": 127600,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 118,115 도달",
"cur_price": 123200,
"tranches": 2,
"tranche_value": 5327150.576000001,
"last_add_price": 120500
},
"086790": {
"code": "086790",
"name": "하나금융지주",
"sources": [
"auto"
],
"qty": 79,
"entry_price": 123225.3164556962,
"entry_at": "2026-07-30T09:04:07.512389+09:00",
"stop": 111000,
"target": 159901,
"peak": 134600,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 122,665 도달",
"cur_price": 130600,
"tranches": 2,
"tranche_value": 4940372.790080874,
"last_add_price": 125200
},
"003680": {
"code": "003680",
"name": "한성기업",
"sources": [
"auto"
],
"qty": 606,
"entry_price": 6333.069306930693,
"entry_at": "2026-07-30T09:04:07.512664+09:00",
"stop": 5039,
"target": 10215,
"peak": 6840,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 7,792 도달",
"cur_price": 6220,
"tranches": 2,
"tranche_value": 1924945.6187384445,
"last_add_price": 6550
},
"010950": {
"code": "010950",
"name": "S-Oil",
"sources": [
"auto"
],
"qty": 55,
"entry_price": 133861.81818181818,
"entry_at": "2026-07-30T09:24:07.560095+09:00",
"stop": 118205,
"target": 180831,
"peak": 139900,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 139600,
"tranches": 2,
"tranche_value": 3791237.2526261737,
"last_add_price": 136000
},
"003490": {
"code": "003490",
"name": "대한항공",
"sources": [
"auto"
],
"qty": 395,
"entry_price": 25667.46835443038,
"entry_at": "2026-07-31T09:10:13.075428+09:00",
"stop": 23650,
"target": 31720,
"peak": 27650,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 25,331 도달",
"cur_price": 26850,
"tranches": 2,
"tranche_value": 5089986.002562501,
"last_add_price": 26100
},
"252990": {
"code": "252990",
"name": "샘씨엔에스",
"sources": [
"auto"
],
"qty": 300,
"entry_price": 13424.466666666667,
"entry_at": "2026-08-05T09:02:14.760491+09:00",
"stop": 10340,
"target": 22678,
"peak": 15670,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 13,947 도달",
"cur_price": 15670,
"tranches": 2,
"tranche_value": 2020520.412274148,
"last_add_price": 13830
},
"068270": {
"code": "068270",
"name": "셀트리온",
"sources": [
"interest"
],
"qty": 49,
"entry_price": 194155.10204081633,
"entry_at": "2026-08-06T09:34:17.064741+09:00",
"stop": 177099,
"target": 245323,
"peak": 201000,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 201000,
"tranches": 2,
"tranche_value": 4842897.369596543,
"last_add_price": 196400
}
},
"realized_pnl": -18257679.233000018,
"closed_trades": 30,
"wins": 0,
"peak_equity": 101140808.32700005,
"max_drawdown": 0.1947881632733674,
"last_exit": {
"030000": "2026-08-06",
"086790": "2026-07-29",
"010120": "2026-06-25",
"298040": "2026-06-26",
"403870": "2026-07-07",
"093370": "2026-07-20",
"240810": "2026-07-24",
"214450": "2026-07-06",
"034730": "2026-07-07",
"003490": "2026-07-23",
"105560": "2026-07-20",
"095610": "2026-07-29",
"024060": "2026-07-27",
"003680": "2026-07-29",
"252990": "2026-07-28",
"010950": "2026-07-29",
"090850": "2026-08-05",
"078930": "2026-07-31"
},
"created_at": "2026-06-15T14:55:00.583184+09:00",
"updated_at": "2026-08-10T15:28:16.173289+09:00"
}
@@ -0,0 +1,95 @@
{"ts": "2026-06-17T11:15:02.396449+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 130900, "qty": 38, "cost": 4974946, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 118039, "target": 169483, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "129,300 vs 118,950"}, {"label": "정배열(5>10)", "ok": true, "detail": "120,400 / 118,950"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "120,400 / 118,307"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-13.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +371 · 기 +158 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+22%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.12% (환산) vs 평균 0.38% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 126,500"}, {"label": "거래량 급증", "ok": true, "detail": "3,094,534 (환산) vs 평균 1,031,725"}, {"label": "회전율 급증", "ok": true, "detail": "1.12% (환산) vs 평균 0.38%"}, {"label": "RSI", "ok": true, "detail": "60"}]}
{"ts": "2026-06-17T16:47:31.276360+09:00", "side": "BUY", "code": "403870", "name": "HPSP", "price": 62900, "qty": 35, "cost": 2201830, "path": "pullback", "reason": "눌림목 지정가 64,531 도달", "stop": 48962, "target": 104714, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "62,800 vs 53,510"}, {"label": "정배열(5>10)", "ok": true, "detail": "59,880 / 53,510"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "59,880 / 49,831"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+21.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -4,434 · 기 +5,040 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+9%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "11.31% vs 평균 5.97% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 71,500"}, {"label": "거래량 급증", "ok": false, "detail": "9,309,211 vs 평균 4,912,598"}, {"label": "회전율 급증", "ok": true, "detail": "11.31% vs 평균 5.97%"}, {"label": "RSI", "ok": true, "detail": "58"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 64,531 (현재 62,800)"}]}
{"ts": "2026-06-19T09:02:06.445261+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19160, "qty": 325, "cost": 6227934, "path": "pullback", "reason": "눌림목 지정가 20,044 도달", "stop": 17760, "target": 23360, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "19,150 vs 18,963"}, {"label": "정배열(5>10)", "ok": true, "detail": "19,616 / 18,963"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,616 / 19,361"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-31.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,162 · 기 +2,080 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.03% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "37,673 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.03% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 20,044 (현재 19,150)"}]}
{"ts": "2026-06-23T09:00:13.090770+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18820, "qty": 325, "proceeds": 6104573, "entry_price": 19160, "pnl": -123361, "pnl_pct": -1.77, "hold_from": "2026-06-19T09:02:06.445260+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 18,710)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 23,360"}, {"label": "추세(10일선)", "ok": false, "detail": "18,919"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -318 · 기 -227"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,528"}]}
{"ts": "2026-06-23T12:04:04.259458+09:00", "side": "SELL", "code": "086790", "name": "하나금융지주", "price": 117700, "qty": 38, "proceeds": 4463878, "entry_price": 130900, "pnl": -511068, "pnl_pct": -10.08, "hold_from": "2026-06-17T11:15:02.396448+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "118,039 (현재 117,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 169,483"}, {"label": "추세(10일선)", "ok": false, "detail": "119,330"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +332 · 기 -364"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 134,300"}]}
{"ts": "2026-06-24T09:04:06.140624+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 156700, "qty": 13, "cost": 2037406, "path": "pullback", "reason": "눌림목 지정가 165,075 도달", "stop": 120251, "target": 266048, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "156,200 vs 128,170"}, {"label": "정배열(5>10)", "ok": true, "detail": "143,260 / 128,170"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "143,260 / 121,703"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+46.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +210 · 기 +143 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+6%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "5.83% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": true, "detail": "2,860,073 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": true, "detail": "5.83% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 165,075 (현재 156,200)"}]}
{"ts": "2026-06-24T09:12:05.751477+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 17270, "qty": 150, "cost": 2590889, "path": "pullback", "reason": "눌림목 지정가 17,366 도달", "stop": 13981, "target": 27136, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "17,280 vs 13,750"}, {"label": "정배열(5>10)", "ok": true, "detail": "16,364 / 13,750"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "16,364 / 11,500"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+21.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +1,740 · 기 -508 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+16%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.34% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": false, "detail": "2,509,340 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": false, "detail": "2.34% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "65"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 17,366 (현재 17,280)"}]}
{"ts": "2026-06-24T09:46:05.157527+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 158200, "qty": 13, "cost": 2056908, "path": "pullback", "reason": "눌림목 지정가 158,264 도달", "stop": 120729, "target": 270614, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "158,000 vs 153,380"}, {"label": "정배열(5>10)", "ok": true, "detail": "172,240 / 153,380"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "172,240 / 99,750"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+56.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +41 · 기 +65 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+5%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "4.25% (환산) vs 평균 3.06% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 202,500"}, {"label": "거래량 급증", "ok": false, "detail": "822,940 (환산) vs 평균 591,925"}, {"label": "회전율 급증", "ok": false, "detail": "4.25% (환산) vs 평균 3.06%"}, {"label": "RSI", "ok": true, "detail": "61"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 158,264 (현재 158,000)"}]}
{"ts": "2026-06-24T10:06:01.722188+09:00", "side": "BUY", "code": "298040", "name": "효성중공업", "price": 3474000, "qty": 1, "cost": 3474521, "path": "pullback", "reason": "눌림목 지정가 3,598,344 도달", "stop": 2985000, "target": 4941000, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "3,475,000 vs 3,470,900"}, {"label": "정배열(5>10)", "ok": true, "detail": "3,548,200 / 3,470,900"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "3,548,200 / 3,400,850"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-11.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +18 · 기 +0 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+34%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.75% (환산) vs 평균 0.63% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 4,085,000"}, {"label": "거래량 급증", "ok": true, "detail": "164,440 (환산) vs 평균 58,834"}, {"label": "회전율 급증", "ok": true, "detail": "1.75% (환산) vs 평균 0.63%"}, {"label": "RSI", "ok": true, "detail": "47"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 3,598,344 (현재 3,475,000)"}]}
{"ts": "2026-06-24T11:12:06.249516+09:00", "side": "BUY", "code": "010120", "name": "LS ELECTRIC", "price": 231500, "qty": 14, "cost": 3241486, "path": "pullback", "reason": "눌림목 지정가 232,322 도달", "stop": 197600, "target": 333200, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "231,250 vs 231,225"}, {"label": "정배열(5>10)", "ok": true, "detail": "235,350 / 231,225"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "235,350 / 221,484"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-16.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +29 · 기 -72 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+12%"}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.89% (환산) vs 평균 0.88% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 291,000"}, {"label": "거래량 급증", "ok": true, "detail": "2,836,457 (환산) vs 평균 1,321,579"}, {"label": "회전율 급증", "ok": true, "detail": "1.89% (환산) vs 평균 0.88%"}, {"label": "RSI", "ok": true, "detail": "47"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 232,322 (현재 231,250)"}]}
{"ts": "2026-06-24T11:12:06.251830+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 18260, "qty": 142, "cost": 2593309, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 13981, "target": 27136, "signals": [{"label": "손절선", "ok": true, "detail": "13,981 (현재 18,250)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 27,136"}, {"label": "추세(10일선)", "ok": true, "detail": "13,847"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +1,742 · 기 -508"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 18,094"}]}
{"ts": "2026-06-25T09:00:28.566324+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 179100, "qty": 11, "cost": 1970396, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 120729, "target": 270614, "signals": [{"label": "손절선", "ok": true, "detail": "120,729 (현재 178,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 270,614"}, {"label": "추세(10일선)", "ok": true, "detail": "155,410"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -56 · 기 +134"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 167,275"}]}
{"ts": "2026-06-25T09:04:06.164754+09:00", "side": "SELL", "code": "010120", "name": "LS ELECTRIC", "price": 228500, "qty": 14, "proceeds": 3192762, "entry_price": 231500, "pnl": -48724, "pnl_pct": -1.3, "hold_from": "2026-06-24T11:12:06.249500+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "197,600 (현재 229,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 333,200"}, {"label": "추세(10일선)", "ok": false, "detail": "231,000"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -56 · 기 -20"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 243,750"}]}
{"ts": "2026-06-25T09:04:06.167535+09:00", "side": "BUY", "code": "003490", "name": "대한항공", "price": 28900, "qty": 187, "cost": 5405111, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 26248, "target": 36855, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "28,850 vs 25,540"}, {"label": "정배열(5>10)", "ok": true, "detail": "26,110 / 25,540"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "26,110 / 25,216"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-2.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +1,577 · 기 -7 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.9/5"}, {"label": "상승여력", "ok": true, "detail": "+15%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.54% (환산) vs 평균 0.58% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 28,400"}, {"label": "거래량 급증", "ok": true, "detail": "5,629,873 (환산) vs 평균 2,146,231"}, {"label": "회전율 급증", "ok": true, "detail": "1.54% (환산) vs 평균 0.58%"}, {"label": "RSI", "ok": true, "detail": "64"}]}
{"ts": "2026-06-26T09:00:09.636282+09:00", "side": "SELL", "code": "298040", "name": "효성중공업", "price": 3285000, "qty": 1, "proceeds": 3278594, "entry_price": 3474000, "pnl": -195927, "pnl_pct": -5.44, "hold_from": "2026-06-24T10:06:01.722186+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "2,985,000 (현재 3,290,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 4,941,000"}, {"label": "추세(10일선)", "ok": false, "detail": "3,651,600"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -5 · 기 -14"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 3,613,320"}]}
{"ts": "2026-06-26T09:00:09.637460+09:00", "side": "SELL", "code": "403870", "name": "HPSP", "price": 50000, "qty": 35, "proceeds": 1746588, "entry_price": 62900, "pnl": -455243, "pnl_pct": -20.51, "hold_from": "2026-06-17T16:47:31.276353+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "48,962 (현재 51,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 104,714"}, {"label": "추세(10일선)", "ok": false, "detail": "52,330"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -311 · 기 -267"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 66,756"}]}
{"ts": "2026-06-26T10:14:04.082928+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 166900, "qty": 12, "cost": 2003100, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 120251, "target": 266048, "signals": [{"label": "손절선", "ok": true, "detail": "120,251 (현재 166,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 266,048"}, {"label": "추세(10일선)", "ok": true, "detail": "129,220"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -126 · 기 +320"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 165,659"}]}
{"ts": "2026-06-29T11:36:01.285630+09:00", "side": "BUY", "code": "034730", "name": "SK", "price": 745000, "qty": 3, "cost": 2235335, "path": "pullback", "reason": "눌림목 지정가 748,914 도달", "stop": 612829, "target": 1141514, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "744,000 vs 735,600"}, {"label": "정배열(5>10)", "ok": true, "detail": "766,800 / 735,600"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "766,800 / 530,600"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+12.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -194 · 기 +152 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+8%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.35% (환산) vs 평균 0.45% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 883,000"}, {"label": "거래량 급증", "ok": true, "detail": "977,966 (환산) vs 평균 329,863"}, {"label": "회전율 급증", "ok": true, "detail": "1.35% (환산) vs 평균 0.45%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 748,914 (현재 744,000)"}]}
{"ts": "2026-06-29T14:18:01.506226+09:00", "side": "BUY", "code": "034730", "name": "SK", "price": 778000, "qty": 3, "cost": 2334350, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 612829, "target": 1141514, "signals": [{"label": "손절선", "ok": true, "detail": "612,829 (현재 779,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 1,141,514"}, {"label": "추세(10일선)", "ok": true, "detail": "739,100"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -200 · 기 +143"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 778,043"}]}
{"ts": "2026-06-30T09:00:10.587307+09:00", "side": "BUY", "code": "403870", "name": "HPSP", "price": 55300, "qty": 40, "cost": 2212332, "path": "pullback", "reason": "눌림목 지정가 63,981 도달", "stop": 43200, "target": 91600, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "53,700 vs 52,600"}, {"label": "정배열(5>10)", "ok": true, "detail": "58,060 / 52,600"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "58,060 / 49,679"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+12.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +222 · 기 -821 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+28%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.00% (환산) vs 평균 5.97% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 71,500"}, {"label": "거래량 급증", "ok": false, "detail": "827 (환산) vs 평균 4,912,598"}, {"label": "회전율 급증", "ok": false, "detail": "0.00% (환산) vs 평균 5.97%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 63,981 (현재 53,700)"}]}
{"ts": "2026-07-01T09:06:03.233594+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 357500, "qty": 11, "cost": 3933090, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 314220, "target": 487340, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "357,000 vs 307,050"}, {"label": "정배열(5>10)", "ok": true, "detail": "317,600 / 307,050"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "317,600 / 305,700"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+32.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -75 · 기 +221 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+35%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.89% (환산) vs 평균 0.93% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 334,500"}, {"label": "거래량 급증", "ok": true, "detail": "196,247 (환산) vs 평균 96,436"}, {"label": "회전율 급증", "ok": true, "detail": "1.89% (환산) vs 평균 0.93%"}, {"label": "RSI", "ok": true, "detail": "68"}]}
{"ts": "2026-07-01T09:24:02.333167+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 372000, "qty": 11, "cost": 4092614, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 314220, "target": 487340, "signals": [{"label": "손절선", "ok": true, "detail": "314,220 (현재 372,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 487,340"}, {"label": "추세(10일선)", "ok": true, "detail": "308,550"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -75 · 기 +221"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 368,499"}]}
{"ts": "2026-07-02T10:18:03.868151+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 122200, "qty": 43, "cost": 5255388, "path": "pullback", "reason": "눌림목 지정가 122,215 도달", "stop": 111000, "target": 155800, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "122,000 vs 119,760"}, {"label": "정배열(5>10)", "ok": true, "detail": "121,000 / 119,760"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "121,000 / 118,432"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+10.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +22 · 기 -44 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+29%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.80% (환산) vs 평균 0.37% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 130,700"}, {"label": "거래량 급증", "ok": true, "detail": "2,199,199 (환산) vs 평균 1,026,357"}, {"label": "회전율 급증", "ok": true, "detail": "0.80% (환산) vs 평균 0.37%"}, {"label": "RSI", "ok": true, "detail": "52"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 122,215 (현재 122,000)"}]}
{"ts": "2026-07-02T11:04:07.657762+09:00", "side": "BUY", "code": "003490", "name": "대한항공", "price": 29600, "qty": 183, "cost": 5417613, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 26248, "target": 36855, "signals": [{"label": "손절선", "ok": true, "detail": "26,248 (현재 29,600)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 36,855"}, {"label": "추세(10일선)", "ok": true, "detail": "25,615"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -206 · 기 +1,008"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 29,586"}]}
{"ts": "2026-07-03T09:04:01.691036+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 14370, "qty": 292, "proceeds": 4187858, "entry_price": 17751, "pnl": -996340, "pnl_pct": -19.05, "hold_from": "2026-06-24T09:12:05.751473+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "14,457 (현재 14,390)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 27,634"}, {"label": "추세(10일선)", "ok": true, "detail": "13,461"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -1,591 · 기 +253"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-03T09:28:01.660946+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 125700, "qty": 25, "proceeds": 3136372, "entry_price": 161596, "pnl": -904134, "pnl_pct": -22.21, "hold_from": "2026-06-24T09:04:06.140622+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "125,761 (현재 125,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 269,102"}, {"label": "추세(10일선)", "ok": true, "detail": "125,120"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +674 · 기 -2,170"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-03T10:16:03.263453+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 126200, "qty": 42, "cost": 5301195, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 111000, "target": 155800, "signals": [{"label": "손절선", "ok": true, "detail": "111,000 (현재 126,200)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 155,800"}, {"label": "추세(10일선)", "ok": true, "detail": "120,180"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -140 · 기 +278"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 125,493"}]}
{"ts": "2026-07-03T10:24:02.793046+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19040, "qty": 313, "cost": 5960414, "path": "pullback", "reason": "눌림목 지정가 20,004 도달", "stop": 17760, "target": 22880, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "19,030 vs 18,951"}, {"label": "정배열(5>10)", "ok": true, "detail": "19,592 / 18,951"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,592 / 19,359"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+2.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -35 · 기 +168 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+34%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.54% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "619,193 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.54% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "49"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 20,004 (현재 19,030)"}]}
{"ts": "2026-07-06T09:00:11.332539+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 130600, "qty": 13, "cost": 1698055, "path": "pullback", "reason": "눌림목 지정가 164,068 도달", "stop": 96000, "target": 234400, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "133,100 vs 125,860"}, {"label": "정배열(5>10)", "ok": true, "detail": "138,640 / 125,860"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "138,640 / 121,318"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+17.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +782 · 기 -1,979 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+31%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.01% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": false, "detail": "4,080 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": false, "detail": "0.01% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "52"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 164,068 (현재 133,100)"}]}
{"ts": "2026-07-06T09:46:01.669394+09:00", "side": "SELL", "code": "214450", "name": "파마리서치", "price": 320500, "qty": 22, "proceeds": 7037251, "entry_price": 364750, "pnl": -988453, "pnl_pct": -12.13, "hold_from": "2026-07-01T09:06:03.233593+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "320,756 (현재 320,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 496,733"}, {"label": "추세(10일선)", "ok": true, "detail": "303,400"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -111 · 기 +227"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-06T10:02:05.952893+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 13370, "qty": 157, "cost": 2099405, "path": "pullback", "reason": "눌림목 지정가 17,049 도달", "stop": 10360, "target": 22400, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "13,370 vs 13,359"}, {"label": "정배열(5>10)", "ok": true, "detail": "15,582 / 13,359"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "15,582 / 11,434"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-11.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,199 · 기 +137 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+50%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "12.53% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": true, "detail": "13,437,708 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": true, "detail": "12.53% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 17,049 (현재 13,370)"}]}
{"ts": "2026-07-07T09:48:07.775522+09:00", "side": "SELL", "code": "403870", "name": "HPSP", "price": 43000, "qty": 40, "proceeds": 1716646, "entry_price": 55300, "pnl": -495686, "pnl_pct": -22.24, "hold_from": "2026-06-30T09:00:10.587301+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "43,200 (현재 43,050)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 91,600"}, {"label": "추세(10일선)", "ok": false, "detail": "51,535"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +1,424 · 기 -5,706"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 59,449"}]}
{"ts": "2026-07-07T10:30:07.380594+09:00", "side": "SELL", "code": "034730", "name": "SK", "price": 628000, "qty": 6, "proceeds": 3760652, "entry_price": 761500, "pnl": -809033, "pnl_pct": -17.53, "hold_from": "2026-06-29T11:36:01.285629+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "629,329 (현재 628,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 1,158,014"}, {"label": "추세(10일선)", "ok": false, "detail": "724,000"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -58 · 기 +6"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-07T12:02:08.256643+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 12230, "qty": 157, "proceeds": 1916366, "entry_price": 13370, "pnl": -183039, "pnl_pct": -8.53, "hold_from": "2026-07-06T10:02:05.952891+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "10,360 (현재 12,230)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,400"}, {"label": "추세(10일선)", "ok": false, "detail": "13,245"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -1,558 · 기 -4"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 14,372"}]}
{"ts": "2026-07-07T14:09:48.825695+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 183300, "qty": 9, "cost": 1649947, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 96000, "target": 234400, "signals": [{"label": "손절선", "ok": true, "detail": "96,000 (현재 183,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 234,400"}, {"label": "추세(10일선)", "ok": true, "detail": "123,150"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +263 · 기 -1,543"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 139,025"}]}
{"ts": "2026-07-07T14:09:48.828069+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 20750, "qty": 287, "cost": 5956143, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 17760, "target": 22880, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 20,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,880"}, {"label": "추세(10일선)", "ok": true, "detail": "18,901"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +156 · 기 +113"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,358"}]}
{"ts": "2026-07-08T09:00:20.136302+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 108300, "qty": 22, "proceeds": 2377954, "entry_price": 152159, "pnl": -970048, "pnl_pct": -28.82, "hold_from": "2026-07-06T09:00:11.332530+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "118,460 (현재 112,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 253,257"}, {"label": "추세(10일선)", "ok": false, "detail": "123,820"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +243 · 기 -857"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-09T09:36:03.475228+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 132000, "qty": 30, "cost": 3960594, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 117015, "target": 176955, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "131,900 vs 108,660"}, {"label": "정배열(5>10)", "ok": true, "detail": "115,560 / 108,660"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "115,560 / 113,228"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+22.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -184 · 기 +964 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+13%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.91% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 116,900"}, {"label": "거래량 급증", "ok": true, "detail": "1,026,867 (환산) vs 평균 359,705"}, {"label": "회전율 급증", "ok": true, "detail": "0.91% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-07-09T12:12:04.874341+09:00", "side": "SELL", "code": "003490", "name": "대한항공", "price": 26500, "qty": 370, "proceeds": 9785880, "entry_price": 29246, "pnl": -1036843, "pnl_pct": -9.39, "hold_from": "2026-06-25T09:04:06.167529+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "26,502 (현재 26,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 37,480"}, {"label": "추세(10일선)", "ok": true, "detail": "25,305"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -1,444 · 기 +2,767"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-10T09:24:02.480679+09:00", "side": "BUY", "code": "105560", "name": "KB금융", "price": 184900, "qty": 23, "cost": 4253338, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 165505, "target": 243084, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "184,800 vs 158,260"}, {"label": "정배열(5>10)", "ok": true, "detail": "159,740 / 158,260"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "159,740 / 157,355"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+26.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,310 · 기 +1,527 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+17%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.97% (환산) vs 평균 0.46% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 182,700"}, {"label": "거래량 급증", "ok": true, "detail": "3,410,527 (환산) vs 평균 1,640,325"}, {"label": "회전율 급증", "ok": true, "detail": "0.97% (환산) vs 평균 0.46%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-07-10T11:06:06.487503+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 13660, "qty": 140, "cost": 1912687, "path": "pullback", "reason": "눌림목 지정가 16,984 도달", "stop": 10360, "target": 23560, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "13,630 vs 13,385"}, {"label": "정배열(5>10)", "ok": true, "detail": "15,634 / 13,385"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "15,634 / 11,439"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+6.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +210 · 기 +239 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+47%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "14.23% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": true, "detail": "15,267,605 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": true, "detail": "14.23% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "52"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 16,984 (현재 13,630)"}]}
{"ts": "2026-07-10T12:14:02.688301+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 126200, "qty": 15, "cost": 1893284, "path": "pullback", "reason": "눌림목 지정가 162,268 도달", "stop": 96000, "target": 216800, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "126,200 vs 125,170"}, {"label": "정배열(5>10)", "ok": true, "detail": "137,260 / 125,170"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "137,260 / 121,203"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+17.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +483 · 기 -241 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+38%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "7.53% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": true, "detail": "3,695,762 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": true, "detail": "7.53% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 162,268 (현재 126,200)"}]}
{"ts": "2026-07-13T09:00:12.086006+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 136900, "qty": 29, "cost": 3970696, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 117015, "target": 176955, "signals": [{"label": "손절선", "ok": true, "detail": "117,015 (현재 136,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 176,955"}, {"label": "추세(10일선)", "ok": true, "detail": "109,100"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -64 · 기 +919"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 135,864"}]}
{"ts": "2026-07-13T09:12:04.319243+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 341500, "qty": 11, "cost": 3757063, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 300363, "target": 464911, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "341,000 vs 305,450"}, {"label": "정배열(5>10)", "ok": true, "detail": "314,400 / 305,450"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "314,400 / 305,433"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+32.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -63 · 기 +144 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+41%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.90% (환산) vs 평균 0.93% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 334,500"}, {"label": "거래량 급증", "ok": true, "detail": "197,687 (환산) vs 평균 96,436"}, {"label": "회전율 급증", "ok": true, "detail": "1.90% (환산) vs 평균 0.93%"}, {"label": "RSI", "ok": true, "detail": "64"}]}
{"ts": "2026-07-13T09:24:06.465547+09:00", "side": "BUY", "code": "105560", "name": "KB금융", "price": 190400, "qty": 23, "cost": 4379857, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 165505, "target": 243084, "signals": [{"label": "손절선", "ok": true, "detail": "165,505 (현재 190,400)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 243,084"}, {"label": "추세(10일선)", "ok": true, "detail": "158,820"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -867 · 기 +1,393"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 189,927"}]}
{"ts": "2026-07-13T09:26:03.426797+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 139100, "qty": 13, "cost": 1808571, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 96000, "target": 216800, "signals": [{"label": "손절선", "ok": true, "detail": "96,000 (현재 139,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 216,800"}, {"label": "추세(10일선)", "ok": true, "detail": "126,460"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -213 · 기 +772"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 136,162"}]}
{"ts": "2026-07-15T14:32:01.901012+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18570, "qty": 600, "proceeds": 11120273, "entry_price": 19858, "pnl": -796284, "pnl_pct": -6.49, "hold_from": "2026-07-03T10:24:02.793045+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "18,586 (현재 18,570)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 23,675"}, {"label": "추세(10일선)", "ok": false, "detail": "18,905"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -214 · 기 +240"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-16T09:28:03.497807+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 353000, "qty": 11, "cost": 3883582, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 300363, "target": 464911, "signals": [{"label": "손절선", "ok": true, "detail": "300,363 (현재 352,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 464,911"}, {"label": "추세(10일선)", "ok": true, "detail": "306,600"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -33 · 기 +28"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 351,963"}]}
{"ts": "2026-07-20T12:28:02.332552+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 10310, "qty": 140, "proceeds": 1440585, "entry_price": 13660, "pnl": -472101, "pnl_pct": -24.52, "hold_from": "2026-07-10T11:06:06.487501+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "10,360 (현재 10,310)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 23,560"}, {"label": "추세(10일선)", "ok": false, "detail": "12,013"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -887 · 기 +515"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 14,626"}]}
{"ts": "2026-07-20T12:58:05.500110+09:00", "side": "SELL", "code": "105560", "name": "KB금융", "price": 166600, "qty": 46, "proceeds": 7648656, "entry_price": 187650, "pnl": -984539, "pnl_pct": -11.22, "hold_from": "2026-07-10T09:24:02.480664+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "167,541 (현재 166,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 247,976"}, {"label": "추세(10일선)", "ok": true, "detail": "156,450"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -385 · 기 +288"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-21T14:20:02.200881+09:00", "side": "BUY", "code": "003490", "name": "대한항공", "price": 25350, "qty": 222, "cost": 5628544, "path": "pullback", "reason": "눌림목 지정가 25,328 도달", "stop": 23650, "target": 30450, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "25,300 vs 25,185"}, {"label": "정배열(5>10)", "ok": true, "detail": "25,400 / 25,185"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "25,400 / 25,157"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+18.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +524 · 기 +141 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.9/5"}, {"label": "상승여력", "ok": true, "detail": "+44%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.44% (환산) vs 평균 0.58% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 28,400"}, {"label": "거래량 급증", "ok": false, "detail": "1,611,169 (환산) vs 평균 2,146,231"}, {"label": "회전율 급증", "ok": false, "detail": "0.44% (환산) vs 평균 0.58%"}, {"label": "RSI", "ok": true, "detail": "49"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 25,328 (현재 25,300)"}]}
{"ts": "2026-07-22T14:18:05.440874+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 14030, "qty": 152, "cost": 2132880, "path": "pullback", "reason": "눌림목 지정가 14,023 도달", "stop": 11077, "target": 22889, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "14,020 vs 12,975"}, {"label": "정배열(5>10)", "ok": true, "detail": "14,552 / 12,975"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "14,552 / 13,283"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+10.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,005 · 기 +1,723 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.97% (환산) vs 평균 1.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 15,870"}, {"label": "거래량 급증", "ok": false, "detail": "585,754 (환산) vs 평균 882,736"}, {"label": "회전율 급증", "ok": false, "detail": "0.97% (환산) vs 평균 1.47%"}, {"label": "RSI", "ok": true, "detail": "53"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 14,023 (현재 14,020)"}]}
{"ts": "2026-07-23T09:00:25.487226+09:00", "side": "SELL", "code": "003490", "name": "대한항공", "price": 24900, "qty": 222, "proceeds": 5517021, "entry_price": 25350, "pnl": -111523, "pnl_pct": -1.78, "hold_from": "2026-07-21T14:20:02.200879+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "23,650 (현재 24,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 30,450"}, {"label": "추세(10일선)", "ok": false, "detail": "25,145"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -381 · 기 -427"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 25,990"}]}
{"ts": "2026-07-23T09:50:01.530390+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 88200, "qty": 42, "cost": 3704956, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 77564, "target": 120109, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "88,200 vs 80,900"}, {"label": "정배열(5>10)", "ok": true, "detail": "83,000 / 80,900"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "83,000 / 75,058"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+47.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -150 · 기 +299 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+17%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.85% (환산) vs 평균 0.42% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 87,600"}, {"label": "거래량 급증", "ok": true, "detail": "785,587 (환산) vs 평균 392,182"}, {"label": "회전율 급증", "ok": true, "detail": "0.85% (환산) vs 평균 0.42%"}, {"label": "RSI", "ok": true, "detail": "67"}]}
{"ts": "2026-07-23T10:24:01.519428+09:00", "side": "SELL", "code": "095610", "name": "테스", "price": 152100, "qty": 24, "proceeds": 3643282, "entry_price": 167779, "pnl": -384022, "pnl_pct": -9.35, "hold_from": "2026-06-24T09:46:05.157519+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "131,479 (현재 152,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 276,679"}, {"label": "추세(10일선)", "ok": false, "detail": "152,780"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -101 · 기 -107"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-23T10:30:02.501278+09:00", "side": "BUY", "code": "024060", "name": "흥구석유", "price": 14140, "qty": 185, "cost": 2616292, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 11706, "target": 21442, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "14,180 vs 12,429"}, {"label": "정배열(5>10)", "ok": true, "detail": "13,154 / 12,429"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "13,154 / 12,687"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+55.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +109 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "84.26% (환산) vs 평균 31.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 13,990"}, {"label": "거래량 급증", "ok": true, "detail": "12,639,979 (환산) vs 평균 4,720,532"}, {"label": "회전율 급증", "ok": true, "detail": "84.26% (환산) vs 평균 31.47%"}, {"label": "RSI", "ok": true, "detail": "66"}]}
{"ts": "2026-07-23T12:54:04.512360+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 90900, "qty": 41, "cost": 3727459, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 77564, "target": 120109, "signals": [{"label": "손절선", "ok": true, "detail": "77,564 (현재 91,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 120,109"}, {"label": "추세(10일선)", "ok": true, "detail": "81,180"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -169 · 기 +311"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 90,945"}]}
{"ts": "2026-07-24T09:00:08.690208+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 111800, "qty": 28, "proceeds": 3124296, "entry_price": 132189, "pnl": -577559, "pnl_pct": -15.42, "hold_from": "2026-07-10T12:14:02.688300+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "96,000 (현재 113,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 240,757"}, {"label": "추세(10일선)", "ok": false, "detail": "123,880"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -480 · 기 -206"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-24T09:00:08.691322+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 155500, "qty": 12, "cost": 1866280, "path": "pullback", "reason": "눌림목 지정가 158,093 도달", "stop": 117686, "target": 268942, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "155,000 vs 153,080"}, {"label": "정배열(5>10)", "ok": true, "detail": "171,640 / 153,080"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "171,640 / 99,700"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+44.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +200 · 기 -454 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+27%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "3.77% (환산) vs 평균 3.06% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 202,500"}, {"label": "거래량 급증", "ok": false, "detail": "730,327 (환산) vs 평균 591,925"}, {"label": "회전율 급증", "ok": false, "detail": "3.77% (환산) vs 평균 3.06%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 158,093 (현재 155,000)"}]}
{"ts": "2026-07-24T09:02:04.058979+09:00", "side": "BUY", "code": "024060", "name": "흥구석유", "price": 15060, "qty": 174, "cost": 2620833, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 11706, "target": 21442, "signals": [{"label": "손절선", "ok": true, "detail": "11,706 (현재 15,020)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,442"}, {"label": "추세(10일선)", "ok": true, "detail": "12,513"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +208 · 기 -2"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 14,766"}]}
{"ts": "2026-07-24T09:28:04.964451+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 14510, "qty": 147, "cost": 2133290, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 11077, "target": 22889, "signals": [{"label": "손절선", "ok": true, "detail": "11,077 (현재 15,400)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,889"}, {"label": "추세(10일선)", "ok": true, "detail": "13,113"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -857 · 기 +1,172"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 14,791"}]}
{"ts": "2026-07-24T10:02:04.455466+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 18950, "qty": 300, "cost": 5685853, "path": "pullback", "reason": "눌림목 지정가 20,012 도달", "stop": 17760, "target": 22520, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "18,950 vs 18,943"}, {"label": "정배열(5>10)", "ok": true, "detail": "19,576 / 18,943"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,576 / 19,358"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+19.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +2 · 기 -5 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.39% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "454,069 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.39% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "49"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 20,012 (현재 18,950)"}]}
{"ts": "2026-07-27T09:10:01.057709+09:00", "side": "SELL", "code": "024060", "name": "흥구석유", "price": 12030, "qty": 359, "proceeds": 4310348, "entry_price": 14586, "pnl": -926777, "pnl_pct": -17.52, "hold_from": "2026-07-23T10:30:02.501277+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "12,082 (현재 12,030)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,098"}, {"label": "추세(10일선)", "ok": false, "detail": "12,214"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -85 · 기 +2"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-27T09:12:01.535985+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 7850, "qty": 404, "cost": 3171876, "path": "pullback", "reason": "눌림목 지정가 7,907 도달", "stop": 6743, "target": 11170, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "7,840 vs 5,428"}, {"label": "정배열(5>10)", "ok": true, "detail": "6,526 / 5,428"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,526 / 4,895"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+91.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +49 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "11.17% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "693,433 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": true, "detail": "11.17% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": false, "detail": "80"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,907 (현재 7,840)"}]}
{"ts": "2026-07-27T12:56:04.252088+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 8300, "qty": 382, "cost": 3171076, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 6743, "target": 11170, "signals": [{"label": "손절선", "ok": true, "detail": "6,743 (현재 8,310)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 11,170"}, {"label": "추세(10일선)", "ok": true, "detail": "5,476"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +50 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 8,127"}]}
{"ts": "2026-07-27T13:38:04.248084+09:00", "side": "SELL", "code": "003680", "name": "한성기업", "price": 6880, "qty": 786, "proceeds": 5397135, "entry_price": 8069, "pnl": -945816, "pnl_pct": -14.73, "hold_from": "2026-07-27T09:12:01.535984+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "6,962 (현재 6,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 11,389"}, {"label": "추세(10일선)", "ok": true, "detail": "5,334"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +50 · 기 +0"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-28T09:00:18.003017+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6780, "qty": 379, "cost": 2570005, "path": "pullback", "reason": "눌림목 지정가 7,884 도달", "stop": 5628, "target": 10237, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "7,050 vs 5,350"}, {"label": "정배열(5>10)", "ok": true, "detail": "6,368 / 5,350"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,368 / 4,882"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+73.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +86 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.01% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "813 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "0.01% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "69"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,884 (현재 7,050)"}]}
{"ts": "2026-07-28T09:10:01.759359+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 7100, "qty": 362, "cost": 2570586, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 5628, "target": 10237, "signals": [{"label": "손절선", "ok": true, "detail": "5,628 (현재 7,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 10,237"}, {"label": "추세(10일선)", "ok": true, "detail": "5,354"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +86 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 7,079"}]}
{"ts": "2026-07-28T10:08:02.786746+09:00", "side": "SELL", "code": "252990", "name": "샘씨엔에스", "price": 11170, "qty": 299, "proceeds": 3333317, "entry_price": 14266, "pnl": -932852, "pnl_pct": -21.7, "hold_from": "2026-07-22T14:18:05.440873+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "11,223 (현재 11,220)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 23,395"}, {"label": "추세(10일선)", "ok": false, "detail": "12,695"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +106 · 기 -64"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T09:02:02.251621+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 117900, "qty": 45, "cost": 5306296, "path": "pullback", "reason": "눌림목 지정가 118,115 도달", "stop": 111200, "target": 138000, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "117,800 vs 116,390"}, {"label": "정배열(5>10)", "ok": true, "detail": "117,020 / 116,390"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "117,020 / 109,982"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+45.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +39 · 기 +307 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+26%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.03% (환산) vs 평균 0.17% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 123,300"}, {"label": "거래량 급증", "ok": false, "detail": "44,660 (환산) vs 평균 289,522"}, {"label": "회전율 급증", "ok": false, "detail": "0.03% (환산) vs 평균 0.17%"}, {"label": "RSI", "ok": true, "detail": "57"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 118,115 (현재 117,800)"}]}
{"ts": "2026-07-29T09:16:04.482734+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 120500, "qty": 44, "cost": 5302795, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 111200, "target": 138000, "signals": [{"label": "손절선", "ok": true, "detail": "111,200 (현재 120,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 138,000"}, {"label": "추세(10일선)", "ok": true, "detail": "116,660"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +39 · 기 +307"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 120,492"}]}
{"ts": "2026-07-29T09:24:10.021522+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 122600, "qty": 15, "cost": 1839276, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 117686, "target": 268942, "signals": [{"label": "손절선", "ok": true, "detail": "117,686 (현재 177,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 268,942"}, {"label": "추세(10일선)", "ok": true, "detail": "148,710"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +453 · 기 -688"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 164,742"}]}
{"ts": "2026-07-29T09:24:10.021664+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 18950, "qty": 300, "cost": 5685853, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 17760, "target": 22520, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 20,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,520"}, {"label": "추세(10일선)", "ok": true, "detail": "18,901"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +99 · 기 +138"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,268"}]}
{"ts": "2026-07-29T09:24:10.021870+09:00", "side": "SELL", "code": "010950", "name": "S-Oil", "price": 128600, "qty": 59, "proceeds": 7572605, "entry_price": 134408, "pnl": -358685, "pnl_pct": -4.32, "hold_from": "2026-07-09T09:36:03.475227+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "118,952 (현재 116,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 180,777"}, {"label": "추세(10일선)", "ok": true, "detail": "105,620"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +43 · 기 +245"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T09:28:01.400110+09:00", "side": "BUY", "code": "090850", "name": "현대이지웰", "price": 6390, "qty": 817, "cost": 5221413, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 5867, "target": 7958, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "6,380 vs 5,591"}, {"label": "정배열(5>10)", "ok": true, "detail": "5,742 / 5,591"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "5,742 / 5,622"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+43.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +73 · 기 -3 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.62% (환산) vs 평균 0.22% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 5,700"}, {"label": "거래량 급증", "ok": true, "detail": "134,413 (환산) vs 평균 49,512"}, {"label": "회전율 급증", "ok": true, "detail": "0.62% (환산) vs 평균 0.22%"}, {"label": "RSI", "ok": true, "detail": "73"}]}
{"ts": "2026-07-29T10:18:05.390014+09:00", "side": "SELL", "code": "095610", "name": "테스", "price": 116400, "qty": 27, "proceeds": 3136672, "entry_price": 137222, "pnl": -568884, "pnl_pct": -15.17, "hold_from": "2026-07-24T09:00:08.691316+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "117,686 (현재 115,800)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 246,789"}, {"label": "추세(10일선)", "ok": false, "detail": "149,160"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +445 · 기 -685"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T12:04:01.704033+09:00", "side": "SELL", "code": "086790", "name": "하나금융지주", "price": 119200, "qty": 85, "proceeds": 10112243, "entry_price": 124176, "pnl": -444341, "pnl_pct": -4.01, "hold_from": "2026-07-02T10:18:03.868150+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "111,006 (현재 119,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 163,689"}, {"label": "추세(10일선)", "ok": false, "detail": "119,490"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -11 · 기 -51"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T13:06:06.533240+09:00", "side": "SELL", "code": "003680", "name": "한성기업", "price": 5690, "qty": 741, "proceeds": 4208068, "entry_price": 6936, "pnl": -932523, "pnl_pct": -17.97, "hold_from": "2026-07-28T09:00:18.003009+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,741 (현재 5,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 10,522"}, {"label": "추세(10일선)", "ok": true, "detail": "5,214"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +185 · 기 +0"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T13:34:03.605461+09:00", "side": "SELL", "code": "090850", "name": "현대이지웰", "price": 5860, "qty": 817, "proceeds": 4778284, "entry_price": 6390, "pnl": -443129, "pnl_pct": -8.29, "hold_from": "2026-07-29T09:28:01.400109+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,867 (현재 5,860)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 7,958"}, {"label": "추세(10일선)", "ok": true, "detail": "5,539"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +73 · 기 -3"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,525"}]}
{"ts": "2026-07-30T09:04:07.512391+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 121300, "qty": 40, "cost": 4852728, "path": "pullback", "reason": "눌림목 지정가 122,665 도달", "stop": 111000, "target": 152200, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "121,200 vs 119,680"}, {"label": "정배열(5>10)", "ok": true, "detail": "120,840 / 119,680"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "120,840 / 118,418"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+34.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -214 · 기 +182 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+36%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.18% (환산) vs 평균 0.37% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 130,700"}, {"label": "거래량 급증", "ok": false, "detail": "494,880 (환산) vs 평균 1,026,357"}, {"label": "회전율 급증", "ok": false, "detail": "0.18% (환산) vs 평균 0.37%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 122,665 (현재 121,200)"}]}
{"ts": "2026-07-30T09:04:07.512666+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6130, "qty": 313, "cost": 1918978, "path": "pullback", "reason": "눌림목 지정가 7,792 도달", "stop": 4793, "target": 10140, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "6,120 vs 5,256"}, {"label": "정배열(5>10)", "ok": true, "detail": "6,182 / 5,256"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,182 / 4,866"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+65.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +234 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "4.31% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "267,687 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "4.31% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,792 (현재 6,120)"}]}
{"ts": "2026-07-30T09:16:11.959636+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 125200, "qty": 39, "cost": 4883532, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 111000, "target": 152200, "signals": [{"label": "손절선", "ok": true, "detail": "111,000 (현재 125,400)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 152,200"}, {"label": "추세(10일선)", "ok": true, "detail": "120,100"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -214 · 기 +182"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 124,618"}]}
{"ts": "2026-07-30T09:24:07.560097+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 131800, "qty": 28, "cost": 3690954, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 116987, "target": 176240, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "132,000 vs 108,670"}, {"label": "정배열(5>10)", "ok": true, "detail": "115,580 / 108,670"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "115,580 / 113,230"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+51.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -6 · 기 +178 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+20%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.66% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 116,900"}, {"label": "거래량 급증", "ok": true, "detail": "738,813 (환산) vs 평균 359,705"}, {"label": "회전율 급증", "ok": true, "detail": "0.66% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-07-30T09:26:07.507665+09:00", "side": "BUY", "code": "090850", "name": "현대이지웰", "price": 6300, "qty": 832, "cost": 5242386, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 5789, "target": 7833, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "6,280 vs 5,581"}, {"label": "정배열(5>10)", "ok": true, "detail": "5,722 / 5,581"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "5,722 / 5,620"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+46.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +87 · 기 +6 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.51% (환산) vs 평균 0.22% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 5,700"}, {"label": "거래량 급증", "ok": true, "detail": "109,080 (환산) vs 평균 49,512"}, {"label": "회전율 급증", "ok": true, "detail": "0.51% (환산) vs 평균 0.22%"}, {"label": "RSI", "ok": true, "detail": "71"}]}
{"ts": "2026-07-31T09:06:07.659623+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6550, "qty": 293, "cost": 1919438, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 4793, "target": 10140, "signals": [{"label": "손절선", "ok": true, "detail": "4,793 (현재 6,640)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 10,140"}, {"label": "추세(10일선)", "ok": true, "detail": "5,308"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +355 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,453"}]}
{"ts": "2026-07-31T09:06:07.659937+09:00", "side": "SELL", "code": "078930", "name": "GS", "price": 77700, "qty": 83, "proceeds": 6436524, "entry_price": 89534, "pnl": -995890, "pnl_pct": -13.22, "hold_from": "2026-07-23T09:50:01.530389+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "78,554 (현재 78,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 122,472"}, {"label": "추세(10일선)", "ok": false, "detail": "79,880"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -179 · 기 +325"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-31T09:10:13.075437+09:00", "side": "BUY", "code": "003490", "name": "대한항공", "price": 25250, "qty": 201, "cost": 5076011, "path": "pullback", "reason": "눌림목 지정가 25,331 도달", "stop": 23650, "target": 30050, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "25,200 vs 25,175"}, {"label": "정배열(5>10)", "ok": true, "detail": "25,380 / 25,175"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "25,380 / 25,155"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+10.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -414 · 기 +642 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+45%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.35% (환산) vs 평균 0.58% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 28,400"}, {"label": "거래량 급증", "ok": false, "detail": "1,295,520 (환산) vs 평균 2,146,231"}, {"label": "회전율 급증", "ok": false, "detail": "0.35% (환산) vs 평균 0.58%"}, {"label": "RSI", "ok": true, "detail": "48"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 25,331 (현재 25,200)"}]}
{"ts": "2026-07-31T10:36:07.682246+09:00", "side": "BUY", "code": "003490", "name": "대한항공", "price": 26100, "qty": 194, "cost": 5064160, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 23650, "target": 30050, "signals": [{"label": "손절선", "ok": true, "detail": "23,650 (현재 26,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 30,050"}, {"label": "추세(10일선)", "ok": true, "detail": "25,265"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -410 · 기 +640"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 25,884"}]}
{"ts": "2026-08-05T09:02:14.760249+09:00", "side": "SELL", "code": "090850", "name": "현대이지웰", "price": 5700, "qty": 832, "proceeds": 4733152, "entry_price": 6300, "pnl": -509234, "pnl_pct": -9.52, "hold_from": "2026-07-30T09:26:07.507663+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,789 (현재 5,730)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 7,833"}, {"label": "추세(10일선)", "ok": true, "detail": "5,526"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +14 · 기 -2"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,413"}]}
{"ts": "2026-08-05T09:02:14.760494+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 13040, "qty": 154, "cost": 2008461, "path": "pullback", "reason": "눌림목 지정가 13,947 도달", "stop": 10340, "target": 21140, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "13,040 vs 12,877"}, {"label": "정배열(5>10)", "ok": true, "detail": "14,356 / 12,877"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "14,356 / 13,267"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-6.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -72 · 기 +134 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.13% (환산) vs 평균 1.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 15,870"}, {"label": "거래량 급증", "ok": false, "detail": "78,333 (환산) vs 평균 882,736"}, {"label": "회전율 급증", "ok": false, "detail": "0.13% (환산) vs 평균 1.47%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 13,947 (현재 13,040)"}]}
{"ts": "2026-08-05T09:38:13.256802+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 13830, "qty": 146, "cost": 2019483, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 10340, "target": 21140, "signals": [{"label": "손절선", "ok": true, "detail": "10,340 (현재 13,860)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,140"}, {"label": "추세(10일선)", "ok": true, "detail": "12,959"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -72 · 기 +134"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,817"}]}
{"ts": "2026-08-06T09:00:21.971147+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18730, "qty": 600, "proceeds": 11216086, "entry_price": 18950, "pnl": -155620, "pnl_pct": -1.16, "hold_from": "2026-07-24T10:02:04.455464+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 18,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,520"}, {"label": "추세(10일선)", "ok": false, "detail": "18,923"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -203 · 기 -147"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-08-06T09:34:17.064745+09:00", "side": "BUY", "code": "068270", "name": "셀트리온", "price": 192000, "qty": 25, "cost": 4800720, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 175344, "target": 241968, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "191,800 vs 180,670"}, {"label": "정배열(5>10)", "ok": true, "detail": "186,140 / 180,670"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "186,140 / 176,671"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+20.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +255 · 기 -319 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+44%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.67% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 191,700"}, {"label": "거래량 급증", "ok": true, "detail": "1,582,767 (환산) vs 평균 738,783"}, {"label": "회전율 급증", "ok": true, "detail": "0.67% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "63"}]}
{"ts": "2026-08-07T09:12:17.869983+09:00", "side": "BUY", "code": "068270", "name": "셀트리온", "price": 196400, "qty": 24, "cost": 4714307, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 175344, "target": 241968, "signals": [{"label": "손절선", "ok": true, "detail": "175,344 (현재 196,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 241,968"}, {"label": "추세(10일선)", "ok": true, "detail": "181,120"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +338 · 기 +73"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 196,264"}]}
{"ts": "2026-08-10T09:00:20.754734+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 136000, "qty": 27, "cost": 3672551, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 116987, "target": 176240, "signals": [{"label": "손절선", "ok": true, "detail": "116,987 (현재 137,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 176,240"}, {"label": "추세(10일선)", "ok": true, "detail": "109,170"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -253 · 기 +225"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 135,714"}]}
@@ -0,0 +1,201 @@
{
"cash": 29800724.662999995,
"initial": 100000000,
"positions": {
"214450": {
"code": "214450",
"name": "파마리서치",
"sources": [
"auto"
],
"qty": 21,
"entry_price": 349976.1904761905,
"entry_at": "2026-07-21T12:06:01.189281+09:00",
"stop": 307839,
"target": 434250,
"peak": 411500,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 409000,
"tranches": 2,
"tranche_value": 3891157.6622701483,
"last_add_price": 356000
},
"138040": {
"code": "138040",
"name": "메리츠금융지주",
"sources": [
"auto"
],
"qty": 91,
"entry_price": 119185.71428571429,
"entry_at": "2026-07-29T09:02:02.253867+09:00",
"stop": 111200,
"target": 135157,
"peak": 127600,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 118,115 도달",
"cur_price": 123200,
"tranches": 2,
"tranche_value": 5467080.19828125,
"last_add_price": 120500
},
"086790": {
"code": "086790",
"name": "하나금융지주",
"sources": [
"auto"
],
"qty": 81,
"entry_price": 123225.92592592593,
"entry_at": "2026-07-30T09:04:07.515413+09:00",
"stop": 111000,
"target": 147678,
"peak": 134600,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 122,665 도달",
"cur_price": 130600,
"tranches": 2,
"tranche_value": 5075960.404438956,
"last_add_price": 125200
},
"003680": {
"code": "003680",
"name": "한성기업",
"sources": [
"auto"
],
"qty": 625,
"entry_price": 6332.944,
"entry_at": "2026-07-30T09:04:07.515982+09:00",
"stop": 5039,
"target": 8921,
"peak": 6840,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 7,792 도달",
"cur_price": 6220,
"tranches": 2,
"tranche_value": 1981493.926440071,
"last_add_price": 6550
},
"010950": {
"code": "010950",
"name": "S-Oil",
"sources": [
"auto"
],
"qty": 57,
"entry_price": 133863.15789473685,
"entry_at": "2026-07-30T09:24:07.563027+09:00",
"stop": 118207,
"target": 165176,
"peak": 139900,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 139600,
"tranches": 2,
"tranche_value": 3902843.990735232,
"last_add_price": 136000
},
"194370": {
"code": "194370",
"name": "제이에스코퍼레이션",
"sources": [
"auto"
],
"qty": 520,
"entry_price": 13160.096153846154,
"entry_at": "2026-08-03T12:00:12.455645+09:00",
"stop": 11445,
"target": 16590,
"peak": 14120,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 13370,
"tranches": 2,
"tranche_value": 3433240.983007488,
"last_add_price": 13420
},
"252990": {
"code": "252990",
"name": "샘씨엔에스",
"sources": [
"auto"
],
"qty": 297,
"entry_price": 13512.424242424242,
"entry_at": "2026-08-05T09:08:12.223170+09:00",
"stop": 10406,
"target": 19724,
"peak": 15670,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 13,947 도달",
"cur_price": 15670,
"tranches": 2,
"tranche_value": 2017488.6720390161,
"last_add_price": 13940
},
"095610": {
"code": "095610",
"name": "테스",
"sources": [
"auto"
],
"qty": 22,
"entry_price": 141850.0,
"entry_at": "2026-08-06T09:08:11.870293+09:00",
"stop": 100700,
"target": 224150,
"peak": 147300,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 156,500 도달",
"cur_price": 143700,
"tranches": 2,
"tranche_value": 1618968.8164385513,
"last_add_price": 147100
}
},
"realized_pnl": -16449084.01750002,
"closed_trades": 33,
"wins": 2,
"peak_equity": 101368884.75700004,
"max_drawdown": 0.1781330644140594,
"last_exit": {
"030000": "2026-08-06",
"086790": "2026-07-20",
"403870": "2026-07-07",
"093370": "2026-07-20",
"240810": "2026-07-24",
"214450": "2026-07-06",
"009150": "2026-07-06",
"034730": "2026-07-07",
"319660": "2026-07-23",
"003490": "2026-07-09",
"105560": "2026-07-20",
"095610": "2026-07-28",
"252990": "2026-07-28",
"003680": "2026-07-29",
"010950": "2026-07-29",
"090850": "2026-08-05",
"161890": "2026-07-30",
"078930": "2026-07-31"
},
"created_at": "2026-06-15T14:55:00.583198+09:00",
"updated_at": "2026-08-10T15:28:16.178398+09:00"
}
@@ -0,0 +1,102 @@
{"ts": "2026-06-17T11:15:02.399713+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 130900, "qty": 38, "cost": 4974946, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 118039, "target": 156622, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "129,300 vs 118,195"}, {"label": "정배열(5>20)", "ok": true, "detail": "120,400 / 118,195"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "120,400 / 118,307"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-13.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +371 · 기 +158 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+22%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.12% (환산) vs 평균 0.38% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 126,500"}, {"label": "거래량 급증", "ok": true, "detail": "3,094,534 (환산) vs 평균 1,031,725"}, {"label": "회전율 급증", "ok": true, "detail": "1.12% (환산) vs 평균 0.38%"}, {"label": "RSI", "ok": true, "detail": "60"}]}
{"ts": "2026-06-17T16:47:31.300962+09:00", "side": "BUY", "code": "403870", "name": "HPSP", "price": 62900, "qty": 35, "cost": 2201830, "path": "pullback", "reason": "눌림목 지정가 64,531 도달", "stop": 48962, "target": 90776, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "62,800 vs 52,858"}, {"label": "정배열(5>20)", "ok": true, "detail": "59,880 / 52,858"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "59,880 / 49,831"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+21.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -4,434 · 기 +5,040 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+9%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "11.31% vs 평균 5.97% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 71,500"}, {"label": "거래량 급증", "ok": false, "detail": "9,309,211 vs 평균 4,912,598"}, {"label": "회전율 급증", "ok": true, "detail": "11.31% vs 평균 5.97%"}, {"label": "RSI", "ok": true, "detail": "58"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 64,531 (현재 62,800)"}]}
{"ts": "2026-06-19T09:02:06.448808+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19160, "qty": 325, "cost": 6227934, "path": "pullback", "reason": "눌림목 지정가 20,044 도달", "stop": 17760, "target": 21960, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "19,150 vs 18,862"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,616 / 18,862"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,616 / 19,361"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-31.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,162 · 기 +2,080 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.03% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "37,673 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.03% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 20,044 (현재 19,150)"}]}
{"ts": "2026-06-23T09:00:13.192302+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18820, "qty": 325, "proceeds": 6104573, "entry_price": 19160, "pnl": -123361, "pnl_pct": -1.77, "hold_from": "2026-06-19T09:02:06.448807+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 18,710)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,960"}, {"label": "추세(20일선)", "ok": false, "detail": "18,840"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -318 · 기 -227"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,528"}]}
{"ts": "2026-06-23T12:04:04.262317+09:00", "side": "SELL", "code": "086790", "name": "하나금융지주", "price": 117700, "qty": 38, "proceeds": 4463878, "entry_price": 130900, "pnl": -511068, "pnl_pct": -10.08, "hold_from": "2026-06-17T11:15:02.399712+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "118,039 (현재 117,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 156,622"}, {"label": "추세(20일선)", "ok": false, "detail": "118,130"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +332 · 기 -364"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 134,300"}]}
{"ts": "2026-06-24T09:04:06.142397+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 156700, "qty": 13, "cost": 2037406, "path": "pullback", "reason": "눌림목 지정가 165,075 도달", "stop": 120251, "target": 229599, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "156,200 vs 121,650"}, {"label": "정배열(5>20)", "ok": true, "detail": "143,260 / 121,650"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "143,260 / 121,703"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+46.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +210 · 기 +143 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+6%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "5.83% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": true, "detail": "2,860,073 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": true, "detail": "5.83% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 165,075 (현재 156,200)"}]}
{"ts": "2026-06-24T09:12:05.763435+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 17270, "qty": 150, "cost": 2590889, "path": "pullback", "reason": "눌림목 지정가 17,366 도달", "stop": 13981, "target": 23847, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "17,280 vs 12,914"}, {"label": "정배열(5>20)", "ok": true, "detail": "16,364 / 12,914"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "16,364 / 11,500"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+21.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +1,740 · 기 -508 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+16%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.34% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": false, "detail": "2,509,340 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": false, "detail": "2.34% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "65"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 17,366 (현재 17,280)"}]}
{"ts": "2026-06-24T09:46:05.168479+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 158200, "qty": 13, "cost": 2056908, "path": "pullback", "reason": "눌림목 지정가 158,264 도달", "stop": 120729, "target": 233143, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "158,000 vs 136,315"}, {"label": "정배열(5>20)", "ok": true, "detail": "172,240 / 136,315"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "172,240 / 99,750"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+56.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +41 · 기 +65 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+5%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "4.25% (환산) vs 평균 3.06% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 202,500"}, {"label": "거래량 급증", "ok": false, "detail": "822,940 (환산) vs 평균 591,925"}, {"label": "회전율 급증", "ok": false, "detail": "4.25% (환산) vs 평균 3.06%"}, {"label": "RSI", "ok": true, "detail": "61"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 158,264 (현재 158,000)"}]}
{"ts": "2026-06-24T11:12:06.260065+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 18260, "qty": 142, "cost": 2593309, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 13981, "target": 23847, "signals": [{"label": "손절선", "ok": true, "detail": "13,981 (현재 18,250)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 23,847"}, {"label": "추세(20일선)", "ok": true, "detail": "12,962"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +1,742 · 기 -508"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 18,094"}]}
{"ts": "2026-06-25T09:00:28.674701+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 179100, "qty": 11, "cost": 1970396, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 120729, "target": 233143, "signals": [{"label": "손절선", "ok": true, "detail": "120,729 (현재 178,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 233,143"}, {"label": "추세(20일선)", "ok": true, "detail": "137,330"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -56 · 기 +134"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 167,275"}]}
{"ts": "2026-06-25T09:04:06.175624+09:00", "side": "BUY", "code": "003490", "name": "대한항공", "price": 28900, "qty": 187, "cost": 5405111, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 26248, "target": 34203, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "28,850 vs 25,948"}, {"label": "정배열(5>20)", "ok": true, "detail": "26,110 / 25,948"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "26,110 / 25,216"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-2.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +1,577 · 기 -7 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.9/5"}, {"label": "상승여력", "ok": true, "detail": "+15%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.54% (환산) vs 평균 0.58% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 28,400"}, {"label": "거래량 급증", "ok": true, "detail": "5,629,873 (환산) vs 평균 2,146,231"}, {"label": "회전율 급증", "ok": true, "detail": "1.54% (환산) vs 평균 0.58%"}, {"label": "RSI", "ok": true, "detail": "64"}]}
{"ts": "2026-06-26T09:00:09.738783+09:00", "side": "SELL", "code": "403870", "name": "HPSP", "price": 50000, "qty": 35, "proceeds": 1746588, "entry_price": 62900, "pnl": -455243, "pnl_pct": -20.51, "hold_from": "2026-06-17T16:47:31.300954+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "48,962 (현재 51,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 90,776"}, {"label": "추세(20일선)", "ok": false, "detail": "52,268"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -311 · 기 -267"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 66,756"}]}
{"ts": "2026-06-26T10:14:04.084754+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 166900, "qty": 12, "cost": 2003100, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 120251, "target": 229599, "signals": [{"label": "손절선", "ok": true, "detail": "120,251 (현재 166,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 229,599"}, {"label": "추세(20일선)", "ok": true, "detail": "122,175"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -126 · 기 +320"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 165,659"}]}
{"ts": "2026-06-29T11:36:01.287474+09:00", "side": "BUY", "code": "034730", "name": "SK", "price": 745000, "qty": 3, "cost": 2235335, "path": "pullback", "reason": "눌림목 지정가 748,914 도달", "stop": 612829, "target": 1009343, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "744,000 vs 676,650"}, {"label": "정배열(5>20)", "ok": true, "detail": "766,800 / 676,650"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "766,800 / 530,600"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+12.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -194 · 기 +152 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+8%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.35% (환산) vs 평균 0.45% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 883,000"}, {"label": "거래량 급증", "ok": true, "detail": "977,966 (환산) vs 평균 329,863"}, {"label": "회전율 급증", "ok": true, "detail": "1.35% (환산) vs 평균 0.45%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 748,914 (현재 744,000)"}]}
{"ts": "2026-06-29T14:18:01.507919+09:00", "side": "BUY", "code": "034730", "name": "SK", "price": 778000, "qty": 3, "cost": 2334350, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 612829, "target": 1009343, "signals": [{"label": "손절선", "ok": true, "detail": "612,829 (현재 779,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 1,009,343"}, {"label": "추세(20일선)", "ok": true, "detail": "678,400"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -200 · 기 +143"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 778,043"}]}
{"ts": "2026-06-30T09:00:10.690453+09:00", "side": "BUY", "code": "403870", "name": "HPSP", "price": 55300, "qty": 41, "cost": 2267640, "path": "pullback", "reason": "눌림목 지정가 63,981 도달", "stop": 43200, "target": 79500, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "53,700 vs 52,402"}, {"label": "정배열(5>20)", "ok": true, "detail": "58,060 / 52,402"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "58,060 / 49,679"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+12.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +222 · 기 -821 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+28%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.00% (환산) vs 평균 5.97% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 71,500"}, {"label": "거래량 급증", "ok": false, "detail": "827 (환산) vs 평균 4,912,598"}, {"label": "회전율 급증", "ok": false, "detail": "0.00% (환산) vs 평균 5.97%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 63,981 (현재 53,700)"}]}
{"ts": "2026-07-01T09:06:03.235448+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 357500, "qty": 11, "cost": 3933090, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 314220, "target": 444060, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "357,000 vs 296,975"}, {"label": "정배열(5>20)", "ok": true, "detail": "317,600 / 296,975"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "317,600 / 305,700"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+32.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -75 · 기 +221 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+35%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.89% (환산) vs 평균 0.93% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 334,500"}, {"label": "거래량 급증", "ok": true, "detail": "196,247 (환산) vs 평균 96,436"}, {"label": "회전율 급증", "ok": true, "detail": "1.89% (환산) vs 평균 0.93%"}, {"label": "RSI", "ok": true, "detail": "68"}]}
{"ts": "2026-07-01T09:24:02.334919+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 372000, "qty": 11, "cost": 4092614, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 314220, "target": 444060, "signals": [{"label": "손절선", "ok": true, "detail": "314,220 (현재 372,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 444,060"}, {"label": "추세(20일선)", "ok": true, "detail": "297,725"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -75 · 기 +221"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 368,499"}]}
{"ts": "2026-07-01T09:46:03.120668+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 118200, "qty": 53, "cost": 6265540, "path": "pullback", "reason": "눌림목 지정가 122,286 도달", "stop": 111000, "target": 132600, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "118,200 vs 118,155"}, {"label": "정배열(5>20)", "ok": true, "detail": "120,240 / 118,155"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "120,240 / 118,368"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+3.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +55 · 기 -166 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.35% (환산) vs 평균 0.37% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 130,700"}, {"label": "거래량 급증", "ok": false, "detail": "969,420 (환산) vs 평균 1,026,357"}, {"label": "회전율 급증", "ok": false, "detail": "0.35% (환산) vs 평균 0.37%"}, {"label": "RSI", "ok": true, "detail": "49"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 122,286 (현재 118,200)"}]}
{"ts": "2026-07-02T10:18:03.870508+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 122200, "qty": 51, "cost": 6233135, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 111000, "target": 132600, "signals": [{"label": "손절선", "ok": true, "detail": "111,000 (현재 122,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 132,600"}, {"label": "추세(20일선)", "ok": true, "detail": "118,345"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +22 · 기 -44"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 121,743"}]}
{"ts": "2026-07-02T11:04:07.660273+09:00", "side": "BUY", "code": "003490", "name": "대한항공", "price": 29600, "qty": 183, "cost": 5417613, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 26248, "target": 34203, "signals": [{"label": "손절선", "ok": true, "detail": "26,248 (현재 29,600)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 34,203"}, {"label": "추세(20일선)", "ok": true, "detail": "25,985"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -206 · 기 +1,008"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 29,586"}]}
{"ts": "2026-07-03T09:04:01.692769+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 14370, "qty": 292, "proceeds": 4187858, "entry_price": 17751, "pnl": -996340, "pnl_pct": -19.05, "hold_from": "2026-06-24T09:12:05.763430+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "14,457 (현재 14,390)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 24,340"}, {"label": "추세(20일선)", "ok": true, "detail": "12,769"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -1,591 · 기 +253"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-03T09:28:01.662768+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 125700, "qty": 25, "proceeds": 3136372, "entry_price": 161596, "pnl": -904134, "pnl_pct": -22.21, "hold_from": "2026-06-24T09:04:06.142396+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "125,761 (현재 125,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 233,266"}, {"label": "추세(20일선)", "ok": true, "detail": "120,125"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +674 · 기 -2,170"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-03T10:24:02.794817+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19040, "qty": 315, "cost": 5998500, "path": "pullback", "reason": "눌림목 지정가 20,004 도달", "stop": 17760, "target": 21600, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "19,030 vs 18,856"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,592 / 18,856"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,592 / 19,359"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+2.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -35 · 기 +168 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+34%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.54% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "619,193 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.54% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "49"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 20,004 (현재 19,030)"}]}
{"ts": "2026-07-03T15:10:02.663501+09:00", "side": "BUY", "code": "009150", "name": "삼성전기", "price": 1971000, "qty": 3, "cost": 5913887, "path": "pullback", "reason": "눌림목 지정가 1,978,439 도달", "stop": 1901000, "target": 2111000, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "1,971,000 vs 1,967,250"}, {"label": "정배열(5>20)", "ok": true, "detail": "2,036,600 / 1,967,250"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "2,036,600 / 1,295,300"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+9.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +146 · 기 +126 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+10%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.46% (환산) vs 평균 1.76% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 2,417,000"}, {"label": "거래량 급증", "ok": false, "detail": "1,835,275 (환산) vs 평균 1,312,239"}, {"label": "회전율 급증", "ok": false, "detail": "2.46% (환산) vs 평균 1.76%"}, {"label": "RSI", "ok": true, "detail": "55"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 1,978,439 (현재 1,971,000)"}]}
{"ts": "2026-07-06T09:46:01.671189+09:00", "side": "SELL", "code": "214450", "name": "파마리서치", "price": 320500, "qty": 22, "proceeds": 7037251, "entry_price": 364750, "pnl": -988453, "pnl_pct": -12.13, "hold_from": "2026-07-01T09:06:03.235447+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "320,756 (현재 320,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 452,739"}, {"label": "추세(20일선)", "ok": true, "detail": "295,150"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -111 · 기 +227"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-06T09:48:02.091313+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 124700, "qty": 16, "cost": 1995499, "path": "pullback", "reason": "눌림목 지정가 163,325 도달", "stop": 96000, "target": 182100, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "124,600 vs 120,070"}, {"label": "정배열(5>20)", "ok": true, "detail": "136,940 / 120,070"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "136,940 / 121,177"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+3.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +782 · 기 -1,979 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+40%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "6.99% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": true, "detail": "3,430,353 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": true, "detail": "6.99% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 163,325 (현재 124,600)"}]}
{"ts": "2026-07-06T10:06:02.816817+09:00", "side": "SELL", "code": "009150", "name": "삼성전기", "price": 1900000, "qty": 3, "proceeds": 5688885, "entry_price": 1971000, "pnl": -225002, "pnl_pct": -3.6, "hold_from": "2026-07-03T15:10:02.663499+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "1,901,000 (현재 1,901,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 2,111,000"}, {"label": "추세(20일선)", "ok": false, "detail": "1,963,750"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +135 · 기 +46"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 2,067,780"}]}
{"ts": "2026-07-06T10:06:02.817154+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 13270, "qty": 163, "cost": 2163334, "path": "pullback", "reason": "눌림목 지정가 17,049 도달", "stop": 10360, "target": 19090, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "13,230 vs 12,711"}, {"label": "정배열(5>20)", "ok": true, "detail": "15,554 / 12,711"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "15,554 / 11,432"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-12.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,199 · 기 +137 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+51%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "12.00% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": true, "detail": "12,870,290 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": true, "detail": "12.00% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 17,049 (현재 13,230)"}]}
{"ts": "2026-07-07T09:48:07.779252+09:00", "side": "SELL", "code": "403870", "name": "HPSP", "price": 43000, "qty": 41, "proceeds": 1759562, "entry_price": 55300, "pnl": -508078, "pnl_pct": -22.24, "hold_from": "2026-06-30T09:00:10.690444+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "43,200 (현재 43,050)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 79,500"}, {"label": "추세(20일선)", "ok": false, "detail": "51,870"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +1,424 · 기 -5,706"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 59,449"}]}
{"ts": "2026-07-07T10:30:07.382202+09:00", "side": "SELL", "code": "034730", "name": "SK", "price": 628000, "qty": 6, "proceeds": 3760652, "entry_price": 761500, "pnl": -809033, "pnl_pct": -17.53, "hold_from": "2026-06-29T11:36:01.287473+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "629,329 (현재 628,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 1,025,843"}, {"label": "추세(20일선)", "ok": false, "detail": "670,850"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -58 · 기 +6"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-07T12:02:08.258820+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 12230, "qty": 163, "proceeds": 1989603, "entry_price": 13270, "pnl": -173732, "pnl_pct": -7.84, "hold_from": "2026-07-06T10:06:02.817152+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "10,360 (현재 12,230)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 19,090"}, {"label": "추세(20일선)", "ok": false, "detail": "12,661"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -1,558 · 기 -4"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 14,272"}]}
{"ts": "2026-07-07T14:09:59.571293+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 20750, "qty": 289, "cost": 5997650, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 17760, "target": 21600, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 20,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,600"}, {"label": "추세(20일선)", "ok": true, "detail": "18,884"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +156 · 기 +113"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,358"}]}
{"ts": "2026-07-08T09:00:20.234898+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 108300, "qty": 16, "proceeds": 1729421, "entry_price": 124700, "pnl": -266078, "pnl_pct": -13.15, "hold_from": "2026-07-06T09:48:02.091296+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "166,450 (현재 112,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": false, "detail": "119,475"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +243 · 기 -857"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-08T09:48:01.891322+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 161100, "qty": 36, "cost": 5800470, "path": "pullback", "reason": "눌림목 지정가 168,676 도달", "stop": 158000, "target": 167300, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "161,600 vs 149,870"}, {"label": "정배열(5>20)", "ok": true, "detail": "169,960 / 149,870"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "169,960 / 113,252"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+77.7%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +198 · 기 -309 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+11%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "3.83% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": false, "detail": "1,110,233 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": false, "detail": "3.83% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "56"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 168,676 (현재 161,600)"}]}
{"ts": "2026-07-08T10:26:01.986112+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 157600, "qty": 36, "proceeds": 5662536, "entry_price": 161100, "pnl": -137933, "pnl_pct": -2.17, "hold_from": "2026-07-08T09:48:01.891321+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "158,000 (현재 158,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 167,300"}, {"label": "추세(20일선)", "ok": true, "detail": "149,690"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +198 · 기 -312"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 170,862"}]}
{"ts": "2026-07-09T09:02:04.484896+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 158300, "qty": 36, "cost": 5699655, "path": "pullback", "reason": "눌림목 지정가 168,455 도달", "stop": 158000, "target": 158900, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "158,200 vs 149,700"}, {"label": "정배열(5>20)", "ok": true, "detail": "169,280 / 149,700"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "169,280 / 113,195"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+81.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +296 · 기 -306 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+13%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.72% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": false, "detail": "499,233 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": false, "detail": "1.72% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "55"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 168,455 (현재 158,200)"}]}
{"ts": "2026-07-09T09:12:02.526379+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 156900, "qty": 36, "proceeds": 5637386, "entry_price": 158300, "pnl": -62269, "pnl_pct": -0.88, "hold_from": "2026-07-09T09:02:04.484895+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "158,000 (현재 156,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "149,635"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +296 · 기 -306"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-09T09:36:03.476928+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 132000, "qty": 30, "cost": 3960594, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 117015, "target": 161970, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "131,900 vs 108,920"}, {"label": "정배열(5>20)", "ok": true, "detail": "115,560 / 108,920"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "115,560 / 113,228"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+22.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -184 · 기 +964 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+13%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.91% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 116,900"}, {"label": "거래량 급증", "ok": true, "detail": "1,026,867 (환산) vs 평균 359,705"}, {"label": "회전율 급증", "ok": true, "detail": "0.91% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-07-09T12:12:04.876138+09:00", "side": "SELL", "code": "003490", "name": "대한항공", "price": 26500, "qty": 370, "proceeds": 9785880, "entry_price": 29246, "pnl": -1036843, "pnl_pct": -9.39, "hold_from": "2026-06-25T09:04:06.175619+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "26,502 (현재 26,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 34,735"}, {"label": "추세(20일선)", "ok": true, "detail": "25,830"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -1,444 · 기 +2,767"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-10T09:00:13.958142+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 164000, "qty": 35, "cost": 5740861, "path": "pullback", "reason": "눌림목 지정가 169,105 도달", "stop": 158000, "target": 176000, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "162,200 vs 149,900"}, {"label": "정배열(5>20)", "ok": true, "detail": "170,080 / 149,900"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "170,080 / 113,262"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+85.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +225 · 기 -178 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+10%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.58% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": false, "detail": "746,107 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": false, "detail": "2.58% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "56"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 169,105 (현재 162,200)"}]}
{"ts": "2026-07-10T09:28:02.641879+09:00", "side": "BUY", "code": "105560", "name": "KB금융", "price": 185900, "qty": 23, "cost": 4276341, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 166448, "target": 224803, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "185,600 vs 159,890"}, {"label": "정배열(5>20)", "ok": true, "detail": "159,900 / 159,890"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "159,900 / 157,368"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+26.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,310 · 기 +1,527 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+16%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.06% (환산) vs 평균 0.46% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 182,700"}, {"label": "거래량 급증", "ok": true, "detail": "3,715,113 (환산) vs 평균 1,640,325"}, {"label": "회전율 급증", "ok": true, "detail": "1.06% (환산) vs 평균 0.46%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-07-10T09:46:11.493340+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 12830, "qty": 187, "cost": 2399570, "path": "pullback", "reason": "눌림목 지정가 16,984 도달", "stop": 10360, "target": 17770, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "12,820 vs 12,690"}, {"label": "정배열(5>20)", "ok": true, "detail": "15,472 / 12,690"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "15,472 / 11,425"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+1.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +228 · 기 +229 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+56%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "9.75% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": true, "detail": "10,460,473 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": true, "detail": "9.75% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 16,984 (현재 12,820)"}]}
{"ts": "2026-07-10T10:14:04.456468+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 173600, "qty": 33, "cost": 5729659, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 158000, "target": 176000, "signals": [{"label": "손절선", "ok": true, "detail": "158,000 (현재 173,600)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 176,000"}, {"label": "추세(20일선)", "ok": true, "detail": "150,470"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +205 · 기 -155"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 173,548"}]}
{"ts": "2026-07-10T11:16:02.494297+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 13850, "qty": 174, "cost": 2410261, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 10360, "target": 17770, "signals": [{"label": "손절선", "ok": true, "detail": "10,360 (현재 13,850)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 17,770"}, {"label": "추세(20일선)", "ok": true, "detail": "12,742"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +210 · 기 +239"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,843"}]}
{"ts": "2026-07-10T12:14:02.690035+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 126200, "qty": 15, "cost": 1893284, "path": "pullback", "reason": "눌림목 지정가 162,268 도달", "stop": 96000, "target": 186600, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "126,200 vs 120,150"}, {"label": "정배열(5>20)", "ok": true, "detail": "137,260 / 120,150"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "137,260 / 121,203"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+17.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +483 · 기 -241 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+38%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "7.53% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": true, "detail": "3,695,762 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": true, "detail": "7.53% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 162,268 (현재 126,200)"}]}
{"ts": "2026-07-13T09:00:12.188872+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 136900, "qty": 29, "cost": 3970696, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 117015, "target": 161970, "signals": [{"label": "손절선", "ok": true, "detail": "117,015 (현재 136,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 161,970"}, {"label": "추세(20일선)", "ok": true, "detail": "109,140"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -64 · 기 +919"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 135,864"}]}
{"ts": "2026-07-13T09:26:03.428469+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 139100, "qty": 14, "cost": 1947692, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 96000, "target": 186600, "signals": [{"label": "손절선", "ok": true, "detail": "96,000 (현재 139,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 186,600"}, {"label": "추세(20일선)", "ok": true, "detail": "120,795"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -213 · 기 +772"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 136,162"}]}
{"ts": "2026-07-13T09:36:02.292080+09:00", "side": "BUY", "code": "105560", "name": "KB금융", "price": 191000, "qty": 23, "cost": 4393659, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 166448, "target": 224803, "signals": [{"label": "손절선", "ok": true, "detail": "166,448 (현재 191,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 224,803"}, {"label": "추세(20일선)", "ok": true, "detail": "160,160"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -867 · 기 +1,393"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 190,952"}]}
{"ts": "2026-07-13T12:44:04.372866+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 187900, "qty": 68, "proceeds": 12752284, "entry_price": 168659, "pnl": 1281764, "pnl_pct": 11.41, "hold_from": "2026-07-10T09:00:13.958136+09:00", "reason": "트레일링 익절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "189,133 (현재 187,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "151,185"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -254 · 기 +457"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-15T14:32:01.902737+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18570, "qty": 604, "proceeds": 11194408, "entry_price": 19858, "pnl": -801741, "pnl_pct": -6.49, "hold_from": "2026-07-03T10:24:02.794816+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "18,586 (현재 18,570)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,403"}, {"label": "추세(20일선)", "ok": false, "detail": "18,833"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -214 · 기 +240"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-20T12:28:02.334444+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 10310, "qty": 361, "proceeds": 3714652, "entry_price": 13322, "pnl": -1095179, "pnl_pct": -22.61, "hold_from": "2026-07-10T09:46:11.493339+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "10,360 (현재 10,310)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 19,245"}, {"label": "추세(20일선)", "ok": false, "detail": "14,755"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -887 · 기 +515"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-20T12:46:02.296614+09:00", "side": "SELL", "code": "086790", "name": "하나금융지주", "price": 131800, "qty": 104, "proceeds": 13680471, "entry_price": 120162, "pnl": 1181796, "pnl_pct": 9.69, "hold_from": "2026-07-01T09:46:03.120666+09:00", "reason": "트레일링 익절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "131,911 (현재 131,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "118,840"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +0 · 기 +424"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-20T12:48:03.492422+09:00", "side": "SELL", "code": "105560", "name": "KB금융", "price": 168100, "qty": 46, "proceeds": 7717521, "entry_price": 188450, "pnl": -952479, "pnl_pct": -10.8, "hold_from": "2026-07-10T09:28:02.641878+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "168,241 (현재 168,200)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 228,868"}, {"label": "추세(20일선)", "ok": true, "detail": "159,020"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -385 · 기 +288"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-21T10:12:01.062793+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 167000, "qty": 34, "cost": 5678852, "path": "pullback", "reason": "눌림목 지정가 169,640 도달", "stop": 158000, "target": 185000, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "167,000 vs 150,140"}, {"label": "정배열(5>20)", "ok": true, "detail": "171,040 / 150,140"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "171,040 / 113,342"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+92.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -534 · 기 +316 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+7%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "3.29% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": false, "detail": "951,819 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": false, "detail": "3.29% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "58"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 169,640 (현재 167,000)"}]}
{"ts": "2026-07-21T12:06:01.189282+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 344500, "qty": 11, "cost": 3790068, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 303577, "target": 426346, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "344,500 vs 296,350"}, {"label": "정배열(5>20)", "ok": true, "detail": "315,100 / 296,350"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "315,100 / 305,492"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+39.7%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -7 · 기 +1 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+43%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.38% (환산) vs 평균 0.93% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 334,500"}, {"label": "거래량 급증", "ok": true, "detail": "247,158 (환산) vs 평균 96,436"}, {"label": "회전율 급증", "ok": true, "detail": "2.38% (환산) vs 평균 0.93%"}, {"label": "RSI", "ok": true, "detail": "65"}]}
{"ts": "2026-07-22T09:00:09.765866+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 177600, "qty": 32, "cost": 5684052, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 158000, "target": 185000, "signals": [{"label": "손절선", "ok": true, "detail": "158,000 (현재 178,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 185,000"}, {"label": "추세(20일선)", "ok": true, "detail": "150,715"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -377 · 기 +151"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 175,894"}]}
{"ts": "2026-07-22T09:04:01.835860+09:00", "side": "BUY", "code": "161890", "name": "한국콜마", "price": 99200, "qty": 58, "cost": 5754463, "path": "pullback", "reason": "눌림목 지정가 98,848 도달", "stop": 92100, "target": 113400, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "98,800 vs 98,505"}, {"label": "정배열(5>20)", "ok": true, "detail": "107,060 / 98,505"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "107,060 / 91,913"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+27.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +29 · 기 -34 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.16% (환산) vs 평균 1.76% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 124,600"}, {"label": "거래량 급증", "ok": false, "detail": "272,433 (환산) vs 평균 415,172"}, {"label": "회전율 급증", "ok": false, "detail": "1.16% (환산) vs 평균 1.76%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 98,848 (현재 98,800)"}]}
{"ts": "2026-07-22T12:12:00.756545+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 157300, "qty": 66, "proceeds": 10361555, "entry_price": 172139, "pnl": -1001349, "pnl_pct": -8.62, "hold_from": "2026-07-21T10:12:01.062791+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "158,000 (현재 157,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 200,418"}, {"label": "추세(20일선)", "ok": true, "detail": "149,655"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -407 · 기 +141"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-22T14:18:05.442604+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 14030, "qty": 154, "cost": 2160944, "path": "pullback", "reason": "눌림목 지정가 14,023 도달", "stop": 11077, "target": 19936, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "14,020 vs 12,776"}, {"label": "정배열(5>20)", "ok": true, "detail": "14,552 / 12,776"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "14,552 / 13,283"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+10.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,005 · 기 +1,723 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.97% (환산) vs 평균 1.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 15,870"}, {"label": "거래량 급증", "ok": false, "detail": "585,754 (환산) vs 평균 882,736"}, {"label": "회전율 급증", "ok": false, "detail": "0.97% (환산) vs 평균 1.47%"}, {"label": "RSI", "ok": true, "detail": "53"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 14,023 (현재 14,020)"}]}
{"ts": "2026-07-23T09:00:25.597059+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 160100, "qty": 35, "cost": 5604341, "path": "pullback", "reason": "눌림목 지정가 169,062 도달", "stop": 158000, "target": 164300, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "158,100 vs 149,695"}, {"label": "정배열(5>20)", "ok": true, "detail": "169,260 / 149,695"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "169,260 / 113,193"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+76.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -162 · 기 +37 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+13%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.05% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": false, "detail": "303,687 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": false, "detail": "1.05% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "55"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 169,062 (현재 158,100)"}]}
{"ts": "2026-07-23T09:32:04.429516+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 157800, "qty": 35, "proceeds": 5512230, "entry_price": 160100, "pnl": -92110, "pnl_pct": -1.44, "hold_from": "2026-07-23T09:00:25.597052+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "158,000 (현재 157,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "149,685"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -162 · 기 +37"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-23T09:44:04.306334+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 18850, "qty": 302, "cost": 5693554, "path": "pullback", "reason": "눌림목 지정가 20,001 도달", "stop": 17760, "target": 21030, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "18,850 vs 18,847"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,556 / 18,847"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,556 / 19,356"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+13.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -25 · 기 +6 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+34%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.34% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "388,767 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.34% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "48"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 20,001 (현재 18,850)"}]}
{"ts": "2026-07-23T09:50:01.532132+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 88200, "qty": 42, "cost": 3704956, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 77564, "target": 109473, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "88,200 vs 75,070"}, {"label": "정배열(5>20)", "ok": true, "detail": "83,000 / 75,070"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "83,000 / 75,058"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+47.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -150 · 기 +299 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+17%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.85% (환산) vs 평균 0.42% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 87,600"}, {"label": "거래량 급증", "ok": true, "detail": "785,587 (환산) vs 평균 392,182"}, {"label": "회전율 급증", "ok": true, "detail": "0.85% (환산) vs 평균 0.42%"}, {"label": "RSI", "ok": true, "detail": "67"}]}
{"ts": "2026-07-23T12:18:01.562114+09:00", "side": "BUY", "code": "161890", "name": "한국콜마", "price": 103100, "qty": 56, "cost": 5774466, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 92100, "target": 113400, "signals": [{"label": "손절선", "ok": true, "detail": "92,100 (현재 103,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 113,400"}, {"label": "추세(20일선)", "ok": true, "detail": "98,720"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +222 · 기 -227"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 103,029"}]}
{"ts": "2026-07-23T12:22:02.613218+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 356000, "qty": 10, "cost": 3560534, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 303577, "target": 426346, "signals": [{"label": "손절선", "ok": true, "detail": "303,577 (현재 356,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 426,346"}, {"label": "추세(20일선)", "ok": true, "detail": "296,925"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +6 · 기 +26"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 355,034"}]}
{"ts": "2026-07-23T12:54:04.514100+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 90900, "qty": 41, "cost": 3727459, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 77564, "target": 109473, "signals": [{"label": "손절선", "ok": true, "detail": "77,564 (현재 91,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 109,473"}, {"label": "추세(20일선)", "ok": true, "detail": "75,210"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -169 · 기 +311"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 90,945"}]}
{"ts": "2026-07-24T09:00:08.795744+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 111800, "qty": 29, "proceeds": 3235878, "entry_price": 132428, "pnl": -605098, "pnl_pct": -15.58, "hold_from": "2026-07-10T12:14:02.690034+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "96,000 (현재 113,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 205,283"}, {"label": "추세(20일선)", "ok": false, "detail": "119,505"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -480 · 기 -206"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-24T09:00:08.797642+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18730, "qty": 302, "proceeds": 5645430, "entry_price": 18850, "pnl": -48124, "pnl_pct": -0.64, "hold_from": "2026-07-23T09:44:04.306333+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 18,730)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,030"}, {"label": "추세(20일선)", "ok": false, "detail": "18,841"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -5 · 기 -5"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,219"}]}
{"ts": "2026-07-24T09:28:04.966114+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 14510, "qty": 149, "cost": 2162314, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 11077, "target": 19936, "signals": [{"label": "손절선", "ok": true, "detail": "11,077 (현재 15,400)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 19,936"}, {"label": "추세(20일선)", "ok": true, "detail": "12,845"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -857 · 기 +1,172"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 14,791"}]}
{"ts": "2026-07-27T09:02:06.252280+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19100, "qty": 299, "cost": 5711757, "path": "pullback", "reason": "눌림목 지정가 20,032 도달", "stop": 17760, "target": 21780, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "19,070 vs 18,858"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,600 / 18,858"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,600 / 19,360"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+16.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +101 · 기 -3 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.13% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "146,760 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.13% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 20,032 (현재 19,070)"}]}
{"ts": "2026-07-27T09:02:06.252692+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 7470, "qty": 414, "cost": 3093044, "path": "pullback", "reason": "눌림목 지정가 7,910 도달", "stop": 6370, "target": 9669, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "7,470 vs 4,876"}, {"label": "정배열(5>20)", "ok": true, "detail": "6,452 / 4,876"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,452 / 4,889"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+82.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +49 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.79% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "49,327 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "0.79% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "74"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,910 (현재 7,470)"}]}
{"ts": "2026-07-27T09:08:02.105328+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 7910, "qty": 391, "cost": 3093274, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 6370, "target": 9669, "signals": [{"label": "손절선", "ok": true, "detail": "6,370 (현재 7,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 9,669"}, {"label": "추세(20일선)", "ok": true, "detail": "4,897"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +49 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 7,747"}]}
{"ts": "2026-07-28T09:00:18.106536+09:00", "side": "SELL", "code": "095610", "name": "테스", "price": 126200, "qty": 24, "proceeds": 3022894, "entry_price": 167779, "pnl": -1004410, "pnl_pct": -24.78, "hold_from": "2026-06-24T09:46:05.168473+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "131,479 (현재 128,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 240,379"}, {"label": "추세(20일선)", "ok": false, "detail": "134,815"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +269 · 기 -554"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-28T10:08:02.788479+09:00", "side": "SELL", "code": "252990", "name": "샘씨엔에스", "price": 11170, "qty": 303, "proceeds": 3377910, "entry_price": 14266, "pnl": -945348, "pnl_pct": -21.7, "hold_from": "2026-07-22T14:18:05.442603+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "11,223 (현재 11,220)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 20,352"}, {"label": "추세(20일선)", "ok": false, "detail": "12,636"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +106 · 기 -64"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-28T11:22:00.766355+09:00", "side": "SELL", "code": "003680", "name": "한성기업", "price": 6630, "qty": 805, "proceeds": 5326743, "entry_price": 7684, "pnl": -859575, "pnl_pct": -13.71, "hold_from": "2026-07-27T09:02:06.252691+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "6,577 (현재 6,380)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 9,897"}, {"label": "추세(20일선)", "ok": true, "detail": "4,821"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +96 · 기 +0"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T09:02:02.253534+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6540, "qty": 351, "cost": 2295884, "path": "pullback", "reason": "눌림목 지정가 7,837 도달", "stop": 5295, "target": 9031, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "6,540 vs 4,829"}, {"label": "정배열(5>20)", "ok": true, "detail": "6,266 / 4,829"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,266 / 4,873"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+70.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +188 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.87% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "116,047 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "1.87% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "63"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,837 (현재 6,540)"}]}
{"ts": "2026-07-29T09:02:02.253868+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 117900, "qty": 46, "cost": 5424214, "path": "pullback", "reason": "눌림목 지정가 118,115 도달", "stop": 111200, "target": 131300, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "117,800 vs 113,445"}, {"label": "정배열(5>20)", "ok": true, "detail": "117,020 / 113,445"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "117,020 / 109,982"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+45.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +39 · 기 +307 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+26%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.03% (환산) vs 평균 0.17% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 123,300"}, {"label": "거래량 급증", "ok": false, "detail": "44,660 (환산) vs 평균 289,522"}, {"label": "회전율 급증", "ok": false, "detail": "0.03% (환산) vs 평균 0.17%"}, {"label": "RSI", "ok": true, "detail": "57"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 118,115 (현재 117,800)"}]}
{"ts": "2026-07-29T09:16:04.484552+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 120500, "qty": 45, "cost": 5423313, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 111200, "target": 131300, "signals": [{"label": "손절선", "ok": true, "detail": "111,200 (현재 120,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 131,300"}, {"label": "추세(20일선)", "ok": true, "detail": "113,580"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +39 · 기 +307"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 120,492"}]}
{"ts": "2026-07-29T09:24:10.024717+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 18950, "qty": 301, "cost": 5704806, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 17760, "target": 21780, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 20,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,780"}, {"label": "추세(20일선)", "ok": true, "detail": "18,884"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +99 · 기 +138"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,418"}]}
{"ts": "2026-07-29T09:24:10.024961+09:00", "side": "SELL", "code": "010950", "name": "S-Oil", "price": 128600, "qty": 59, "proceeds": 7572605, "entry_price": 134408, "pnl": -358685, "pnl_pct": -4.32, "hold_from": "2026-07-09T09:36:03.476927+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "118,952 (현재 116,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 165,321"}, {"label": "추세(20일선)", "ok": true, "detail": "107,870"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +43 · 기 +245"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T09:24:10.025084+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6710, "qty": 343, "cost": 2301875, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 5295, "target": 9031, "signals": [{"label": "손절선", "ok": true, "detail": "5,295 (현재 8,460)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 9,031"}, {"label": "추세(20일선)", "ok": true, "detail": "4,732"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +188 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,796"}]}
{"ts": "2026-07-29T09:28:01.401823+09:00", "side": "BUY", "code": "090850", "name": "현대이지웰", "price": 6390, "qty": 838, "cost": 5355623, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 5867, "target": 7435, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "6,380 vs 5,358"}, {"label": "정배열(5>20)", "ok": true, "detail": "5,742 / 5,358"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "5,742 / 5,622"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+43.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +73 · 기 -3 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.62% (환산) vs 평균 0.22% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 5,700"}, {"label": "거래량 급증", "ok": true, "detail": "134,413 (환산) vs 평균 49,512"}, {"label": "회전율 급증", "ok": true, "detail": "0.62% (환산) vs 평균 0.22%"}, {"label": "RSI", "ok": true, "detail": "73"}]}
{"ts": "2026-07-29T13:14:05.457905+09:00", "side": "SELL", "code": "003680", "name": "한성기업", "price": 5580, "qty": 694, "proceeds": 3864969, "entry_price": 6624, "pnl": -732791, "pnl_pct": -15.76, "hold_from": "2026-07-29T09:02:02.253533+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,600 (현재 5,590)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 8,672"}, {"label": "추세(20일선)", "ok": true, "detail": "4,782"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +185 · 기 +0"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T13:34:03.607125+09:00", "side": "SELL", "code": "090850", "name": "현대이지웰", "price": 5860, "qty": 838, "proceeds": 4901104, "entry_price": 6390, "pnl": -454519, "pnl_pct": -8.29, "hold_from": "2026-07-29T09:28:01.401822+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,867 (현재 5,860)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 7,435"}, {"label": "추세(20일선)", "ok": true, "detail": "5,332"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +73 · 기 -3"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,525"}]}
{"ts": "2026-07-30T09:04:07.515415+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 121300, "qty": 41, "cost": 4974046, "path": "pullback", "reason": "눌림목 지정가 122,665 도달", "stop": 111000, "target": 141900, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "121,200 vs 118,305"}, {"label": "정배열(5>20)", "ok": true, "detail": "120,840 / 118,305"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "120,840 / 118,418"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+34.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -214 · 기 +182 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+36%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.18% (환산) vs 평균 0.37% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 130,700"}, {"label": "거래량 급증", "ok": false, "detail": "494,880 (환산) vs 평균 1,026,357"}, {"label": "회전율 급증", "ok": false, "detail": "0.18% (환산) vs 평균 0.37%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 122,665 (현재 121,200)"}]}
{"ts": "2026-07-30T09:04:07.515984+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6130, "qty": 323, "cost": 1980287, "path": "pullback", "reason": "눌림목 지정가 7,792 도달", "stop": 4793, "target": 8804, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "6,120 vs 4,808"}, {"label": "정배열(5>20)", "ok": true, "detail": "6,182 / 4,808"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,182 / 4,866"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+65.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +234 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "4.31% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "267,687 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "4.31% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,792 (현재 6,120)"}]}
{"ts": "2026-07-30T09:16:11.962505+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 125200, "qty": 40, "cost": 5008751, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 111000, "target": 141900, "signals": [{"label": "손절선", "ok": true, "detail": "111,000 (현재 125,400)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 141,900"}, {"label": "추세(20일선)", "ok": true, "detail": "118,515"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -214 · 기 +182"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 124,618"}]}
{"ts": "2026-07-30T09:24:07.563029+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 131800, "qty": 29, "cost": 3822773, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 116987, "target": 161427, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "132,000 vs 108,925"}, {"label": "정배열(5>20)", "ok": true, "detail": "115,580 / 108,925"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "115,580 / 113,230"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+51.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -6 · 기 +178 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+20%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.66% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 116,900"}, {"label": "거래량 급증", "ok": true, "detail": "738,813 (환산) vs 평균 359,705"}, {"label": "회전율 급증", "ok": true, "detail": "0.66% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-07-30T11:58:08.466564+09:00", "side": "SELL", "code": "161890", "name": "한국콜마", "price": 91700, "qty": 114, "proceeds": 10433415, "entry_price": 101116, "pnl": -1095514, "pnl_pct": -9.31, "hold_from": "2026-07-22T09:04:01.835859+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "92,100 (현재 91,800)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 119,147"}, {"label": "추세(20일선)", "ok": false, "detail": "98,155"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -7 · 기 +40"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-31T09:06:07.664664+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6550, "qty": 302, "cost": 1978397, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 4793, "target": 8804, "signals": [{"label": "손절선", "ok": true, "detail": "4,793 (현재 6,640)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 8,804"}, {"label": "추세(20일선)", "ok": true, "detail": "4,834"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +355 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,453"}]}
{"ts": "2026-07-31T09:06:07.665122+09:00", "side": "SELL", "code": "078930", "name": "GS", "price": 77700, "qty": 83, "proceeds": 6436524, "entry_price": 89534, "pnl": -995890, "pnl_pct": -13.22, "hold_from": "2026-07-23T09:50:01.532131+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "78,554 (현재 78,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 111,492"}, {"label": "추세(20일선)", "ok": true, "detail": "74,560"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -179 · 기 +325"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-08-03T09:44:10.613772+09:00", "side": "BUY", "code": "090850", "name": "현대이지웰", "price": 6120, "qty": 855, "cost": 5233385, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 5629, "target": 7102, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "6,120 vs 5,345"}, {"label": "정배열(5>20)", "ok": true, "detail": "5,690 / 5,345"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "5,690 / 5,618"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+31.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +80 · 기 +5 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.61% (환산) vs 평균 0.22% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 5,700"}, {"label": "거래량 급증", "ok": true, "detail": "132,260 (환산) vs 평균 49,512"}, {"label": "회전율 급증", "ok": true, "detail": "0.61% (환산) vs 평균 0.22%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-08-03T12:00:12.455648+09:00", "side": "BUY", "code": "194370", "name": "제이에스코퍼레이션", "price": 12910, "qty": 265, "cost": 3421663, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 11314, "target": 16103, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "12,930 vs 11,922"}, {"label": "정배열(5>20)", "ok": true, "detail": "12,138 / 11,922"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "12,138 / 11,924"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+27.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +7 · 기 +10 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+74%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.72% (환산) vs 평균 0.34% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 12,870"}, {"label": "거래량 급증", "ok": true, "detail": "208,994 (환산) vs 평균 99,303"}, {"label": "회전율 급증", "ok": true, "detail": "0.72% (환산) vs 평균 0.34%"}, {"label": "RSI", "ok": true, "detail": "63"}]}
{"ts": "2026-08-03T12:02:10.394192+09:00", "side": "BUY", "code": "194370", "name": "제이에스코퍼레이션", "price": 13420, "qty": 255, "cost": 3422613, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 11314, "target": 16103, "signals": [{"label": "손절선", "ok": true, "detail": "11,314 (현재 13,450)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 16,103"}, {"label": "추세(20일선)", "ok": true, "detail": "11,948"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +7 · 기 +10"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,339"}]}
{"ts": "2026-08-05T09:08:11.797804+09:00", "side": "SELL", "code": "090850", "name": "현대이지웰", "price": 5580, "qty": 855, "proceeds": 4761597, "entry_price": 6120, "pnl": -471788, "pnl_pct": -8.82, "hold_from": "2026-08-03T09:44:10.613767+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,629 (현재 5,580)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 7,102"}, {"label": "추세(20일선)", "ok": true, "detail": "5,318"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +14 · 기 -2"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,239"}]}
{"ts": "2026-08-05T09:08:12.223187+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 13110, "qty": 153, "cost": 2006131, "path": "pullback", "reason": "눌림목 지정가 13,947 도달", "stop": 10340, "target": 18650, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "13,110 vs 12,730"}, {"label": "정배열(5>20)", "ok": true, "detail": "14,370 / 12,730"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "14,370 / 13,268"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-5.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -72 · 기 +134 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.51% (환산) vs 평균 1.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 15,870"}, {"label": "거래량 급증", "ok": false, "detail": "308,907 (환산) vs 평균 882,736"}, {"label": "회전율 급증", "ok": false, "detail": "0.51% (환산) vs 평균 1.47%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 13,947 (현재 13,110)"}]}
{"ts": "2026-08-05T09:42:12.373226+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 13940, "qty": 144, "cost": 2007661, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 10340, "target": 18650, "signals": [{"label": "손절선", "ok": true, "detail": "10,340 (현재 13,930)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 18,650"}, {"label": "추세(20일선)", "ok": true, "detail": "12,772"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -72 · 기 +134"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,887"}]}
{"ts": "2026-08-06T09:00:22.079589+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18730, "qty": 600, "proceeds": 11216086, "entry_price": 19025, "pnl": -200476, "pnl_pct": -1.55, "hold_from": "2026-07-27T09:02:06.252279+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 18,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,554"}, {"label": "추세(20일선)", "ok": false, "detail": "18,842"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -203 · 기 -147"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-08-06T09:08:11.870297+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 136600, "qty": 11, "cost": 1502825, "path": "pullback", "reason": "눌림목 지정가 156,500 도달", "stop": 100700, "target": 208400, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "136,400 vs 135,235"}, {"label": "정배열(5>20)", "ok": true, "detail": "167,920 / 135,235"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "167,920 / 99,390"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+13.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -609 · 기 +419 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+44%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.58% (환산) vs 평균 3.06% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 202,500"}, {"label": "거래량 급증", "ok": false, "detail": "499,673 (환산) vs 평균 591,925"}, {"label": "회전율 급증", "ok": false, "detail": "2.58% (환산) vs 평균 3.06%"}, {"label": "RSI", "ok": true, "detail": "52"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 156,500 (현재 136,400)"}]}
{"ts": "2026-08-10T09:00:20.864217+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 136000, "qty": 28, "cost": 3808571, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 116987, "target": 161427, "signals": [{"label": "손절선", "ok": true, "detail": "116,987 (현재 137,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 161,427"}, {"label": "추세(20일선)", "ok": true, "detail": "109,175"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -253 · 기 +225"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 135,714"}]}
{"ts": "2026-08-10T13:04:18.279469+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 147100, "qty": 11, "cost": 1618343, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 100700, "target": 208400, "signals": [{"label": "손절선", "ok": true, "detail": "100,700 (현재 147,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 208,400"}, {"label": "추세(20일선)", "ok": true, "detail": "135,765"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -349 · 기 +177"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 146,939"}]}
@@ -0,0 +1,201 @@
{
"cash": 30872934.431500036,
"initial": 100000000,
"positions": {
"214450": {
"code": "214450",
"name": "파마리서치",
"sources": [
"auto"
],
"qty": 21,
"entry_price": 349976.1904761905,
"entry_at": "2026-07-21T12:06:01.191055+09:00",
"stop": 307839,
"target": 434250,
"peak": 411500,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 409000,
"tranches": 2,
"tranche_value": 3848025.874946516,
"last_add_price": 356000
},
"138040": {
"code": "138040",
"name": "메리츠금융지주",
"sources": [
"auto"
],
"qty": 83,
"entry_price": 124881.92771084337,
"entry_at": "2026-07-29T10:24:01.463012+09:00",
"stop": 114155,
"target": 146335,
"peak": 127600,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 123200,
"tranches": 2,
"tranche_value": 5187375.1457318,
"last_add_price": 126400
},
"003680": {
"code": "003680",
"name": "한성기업",
"sources": [
"auto"
],
"qty": 617,
"entry_price": 6332.852512155591,
"entry_at": "2026-07-30T09:04:07.518900+09:00",
"stop": 5039,
"target": 8921,
"peak": 6840,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 7,457 도달",
"cur_price": 6220,
"tranches": 2,
"tranche_value": 1957851.3491824612,
"last_add_price": 6550
},
"010950": {
"code": "010950",
"name": "S-Oil",
"sources": [
"auto"
],
"qty": 57,
"entry_price": 133863.15789473685,
"entry_at": "2026-07-30T09:24:07.565720+09:00",
"stop": 118207,
"target": 165176,
"peak": 139900,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 139600,
"tranches": 2,
"tranche_value": 3832048.06532556,
"last_add_price": 136000
},
"194370": {
"code": "194370",
"name": "제이에스코퍼레이션",
"sources": [
"auto"
],
"qty": 514,
"entry_price": 13160.038910505837,
"entry_at": "2026-08-03T12:00:12.460551+09:00",
"stop": 11445,
"target": 16590,
"peak": 14120,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 13370,
"tranches": 2,
"tranche_value": 3393597.375168939,
"last_add_price": 13420
},
"095610": {
"code": "095610",
"name": "테스",
"sources": [
"auto"
],
"qty": 21,
"entry_price": 141471.42857142858,
"entry_at": "2026-08-04T09:04:10.104323+09:00",
"stop": 101729,
"target": 220957,
"peak": 148000,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 145,918 도달",
"cur_price": 143700,
"tranches": 2,
"tranche_value": 1613823.6225366697,
"last_add_price": 147600
},
"252990": {
"code": "252990",
"name": "샘씨엔에스",
"sources": [
"auto"
],
"qty": 301,
"entry_price": 13423.189368770763,
"entry_at": "2026-08-05T09:02:14.769293+09:00",
"stop": 10340,
"target": 19590,
"peak": 15670,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 13,170 도달",
"cur_price": 15670,
"tranches": 2,
"tranche_value": 2024244.4253400748,
"last_add_price": 13830
},
"068270": {
"code": "068270",
"name": "셀트리온",
"sources": [
"interest"
],
"qty": 49,
"entry_price": 194155.10204081633,
"entry_at": "2026-08-06T09:34:17.073823+09:00",
"stop": 177099,
"target": 228267,
"peak": 201000,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 201000,
"tranches": 2,
"tranche_value": 4815698.713054757,
"last_add_price": 196400
}
},
"realized_pnl": -16577774.35700002,
"closed_trades": 33,
"wins": 2,
"peak_equity": 100182695.41500005,
"max_drawdown": 0.17470945980237,
"last_exit": {
"030000": "2026-08-06",
"086790": "2026-07-20",
"403870": "2026-07-07",
"240810": "2026-07-24",
"214450": "2026-07-06",
"093370": "2026-07-20",
"034730": "2026-07-08",
"319660": "2026-07-27",
"003490": "2026-07-09",
"105560": "2026-07-20",
"024060": "2026-07-27",
"095610": "2026-07-28",
"003680": "2026-07-29",
"138040": "2026-07-28",
"010950": "2026-07-29",
"252990": "2026-07-29",
"090850": "2026-08-05",
"078930": "2026-07-31"
},
"created_at": "2026-06-15T14:55:00.583212+09:00",
"updated_at": "2026-08-10T15:28:16.182579+09:00"
}
@@ -0,0 +1,101 @@
{"ts": "2026-06-17T11:15:02.403081+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 130900, "qty": 38, "cost": 4974946, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 118039, "target": 156622, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "129,300 vs 118,195"}, {"label": "정배열(5>20)", "ok": true, "detail": "120,400 / 118,195"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "120,400 / 118,307"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-13.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +371 · 기 +158 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+22%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.12% (환산) vs 평균 0.38% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 126,500"}, {"label": "거래량 급증", "ok": true, "detail": "3,094,534 (환산) vs 평균 1,031,725"}, {"label": "회전율 급증", "ok": true, "detail": "1.12% (환산) vs 평균 0.38%"}, {"label": "RSI", "ok": true, "detail": "60"}]}
{"ts": "2026-06-19T09:02:06.452507+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19160, "qty": 325, "cost": 6227934, "path": "pullback", "reason": "눌림목 지정가 19,690 도달", "stop": 17760, "target": 21960, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "19,150 vs 18,862"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,616 / 18,862"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,616 / 19,361"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-31.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,162 · 기 +2,080 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.03% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "37,673 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.03% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,690 (현재 19,150)"}]}
{"ts": "2026-06-23T09:00:13.294265+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18820, "qty": 325, "proceeds": 6104573, "entry_price": 19160, "pnl": -123361, "pnl_pct": -1.77, "hold_from": "2026-06-19T09:02:06.452506+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 18,710)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,960"}, {"label": "추세(20일선)", "ok": false, "detail": "18,840"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -318 · 기 -227"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,528"}]}
{"ts": "2026-06-23T12:04:04.265233+09:00", "side": "SELL", "code": "086790", "name": "하나금융지주", "price": 117700, "qty": 38, "proceeds": 4463878, "entry_price": 130900, "pnl": -511068, "pnl_pct": -10.08, "hold_from": "2026-06-17T11:15:02.403080+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "118,039 (현재 117,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 156,622"}, {"label": "추세(20일선)", "ok": false, "detail": "118,130"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +332 · 기 -364"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 134,300"}]}
{"ts": "2026-06-24T09:02:02.398330+09:00", "side": "BUY", "code": "403870", "name": "HPSP", "price": 53200, "qty": 49, "cost": 2607191, "path": "pullback", "reason": "눌림목 지정가 60,114 도달", "stop": 43200, "target": 73200, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "53,200 vs 52,378"}, {"label": "정배열(5>20)", "ok": true, "detail": "57,960 / 52,378"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "57,960 / 49,671"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+20.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +711 · 기 -2,060 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+29%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.34% (환산) vs 평균 5.97% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 71,500"}, {"label": "거래량 급증", "ok": false, "detail": "1,102,733 (환산) vs 평균 4,912,598"}, {"label": "회전율 급증", "ok": false, "detail": "1.34% (환산) vs 평균 5.97%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 60,114 (현재 53,200)"}]}
{"ts": "2026-06-24T09:08:01.010343+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 155400, "qty": 13, "cost": 2020503, "path": "pullback", "reason": "눌림목 지정가 155,963 도달", "stop": 118951, "target": 228299, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "155,400 vs 121,610"}, {"label": "정배열(5>20)", "ok": true, "detail": "143,100 / 121,610"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "143,100 / 121,690"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+45.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +210 · 기 +143 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+6%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "6.50% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": true, "detail": "3,192,593 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": true, "detail": "6.50% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 155,963 (현재 155,400)"}]}
{"ts": "2026-06-25T09:04:06.181643+09:00", "side": "BUY", "code": "003490", "name": "대한항공", "price": 28900, "qty": 187, "cost": 5405111, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 26248, "target": 34203, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "28,850 vs 25,948"}, {"label": "정배열(5>20)", "ok": true, "detail": "26,110 / 25,948"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "26,110 / 25,216"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-2.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +1,577 · 기 -7 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.9/5"}, {"label": "상승여력", "ok": true, "detail": "+15%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.54% (환산) vs 평균 0.58% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 28,400"}, {"label": "거래량 급증", "ok": true, "detail": "5,629,873 (환산) vs 평균 2,146,231"}, {"label": "회전율 급증", "ok": true, "detail": "1.54% (환산) vs 평균 0.58%"}, {"label": "RSI", "ok": true, "detail": "64"}]}
{"ts": "2026-06-26T09:00:09.837424+09:00", "side": "SELL", "code": "403870", "name": "HPSP", "price": 50000, "qty": 49, "proceeds": 2445222, "entry_price": 53200, "pnl": -161969, "pnl_pct": -6.02, "hold_from": "2026-06-24T09:02:02.398329+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "43,200 (현재 51,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 73,200"}, {"label": "추세(20일선)", "ok": false, "detail": "52,268"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -311 · 기 -267"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 57,056"}]}
{"ts": "2026-06-26T09:04:03.919139+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 164900, "qty": 12, "cost": 1979097, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 118951, "target": 228299, "signals": [{"label": "손절선", "ok": true, "detail": "118,951 (현재 164,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 228,299"}, {"label": "추세(20일선)", "ok": true, "detail": "122,075"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -140 · 기 +323"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 164,359"}]}
{"ts": "2026-06-30T09:00:10.793015+09:00", "side": "BUY", "code": "403870", "name": "HPSP", "price": 55300, "qty": 40, "cost": 2212332, "path": "pullback", "reason": "눌림목 지정가 60,222 도달", "stop": 43200, "target": 79500, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "53,700 vs 52,402"}, {"label": "정배열(5>20)", "ok": true, "detail": "58,060 / 52,402"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "58,060 / 49,679"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+12.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +222 · 기 -821 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+28%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.00% (환산) vs 평균 5.97% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 71,500"}, {"label": "거래량 급증", "ok": false, "detail": "827 (환산) vs 평균 4,912,598"}, {"label": "회전율 급증", "ok": false, "detail": "0.00% (환산) vs 평균 5.97%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 60,222 (현재 53,700)"}]}
{"ts": "2026-07-01T09:06:03.237217+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 357500, "qty": 11, "cost": 3933090, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 314220, "target": 444060, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "357,000 vs 296,975"}, {"label": "정배열(5>20)", "ok": true, "detail": "317,600 / 296,975"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "317,600 / 305,700"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+32.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -75 · 기 +221 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+35%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.89% (환산) vs 평균 0.93% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 334,500"}, {"label": "거래량 급증", "ok": true, "detail": "196,247 (환산) vs 평균 96,436"}, {"label": "회전율 급증", "ok": true, "detail": "1.89% (환산) vs 평균 0.93%"}, {"label": "RSI", "ok": true, "detail": "68"}]}
{"ts": "2026-07-01T09:24:02.336712+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 372000, "qty": 10, "cost": 3720558, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 314220, "target": 444060, "signals": [{"label": "손절선", "ok": true, "detail": "314,220 (현재 372,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 444,060"}, {"label": "추세(20일선)", "ok": true, "detail": "297,725"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -75 · 기 +221"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 368,499"}]}
{"ts": "2026-07-01T09:46:03.123574+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 118200, "qty": 52, "cost": 6147322, "path": "pullback", "reason": "눌림목 지정가 118,779 도달", "stop": 111000, "target": 132600, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "118,200 vs 118,155"}, {"label": "정배열(5>20)", "ok": true, "detail": "120,240 / 118,155"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "120,240 / 118,368"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+3.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +55 · 기 -166 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.35% (환산) vs 평균 0.37% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 130,700"}, {"label": "거래량 급증", "ok": false, "detail": "969,420 (환산) vs 평균 1,026,357"}, {"label": "회전율 급증", "ok": false, "detail": "0.35% (환산) vs 평균 0.37%"}, {"label": "RSI", "ok": true, "detail": "49"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 118,779 (현재 118,200)"}]}
{"ts": "2026-07-02T09:00:24.633647+09:00", "side": "BUY", "code": "034730", "name": "SK", "price": 707000, "qty": 4, "cost": 2828424, "path": "pullback", "reason": "눌림목 지정가 714,693 도달", "stop": 604000, "target": 913000, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "714,000 vs 675,150"}, {"label": "정배열(5>20)", "ok": true, "detail": "760,800 / 675,150"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "760,800 / 530,100"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+11.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -198 · 기 +92 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+17%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.32% (환산) vs 평균 0.45% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 883,000"}, {"label": "거래량 급증", "ok": false, "detail": "230,413 (환산) vs 평균 329,863"}, {"label": "회전율 급증", "ok": false, "detail": "0.32% (환산) vs 평균 0.45%"}, {"label": "RSI", "ok": true, "detail": "55"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 714,693 (현재 714,000)"}]}
{"ts": "2026-07-02T10:18:03.872753+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 15980, "qty": 139, "cost": 2221553, "path": "pullback", "reason": "눌림목 지정가 16,358 도달", "stop": 12444, "target": 23051, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "15,980 vs 12,848"}, {"label": "정배열(5>20)", "ok": true, "detail": "16,104 / 12,848"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "16,104 / 11,478"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+25.7%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,833 · 기 +437 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+25%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "9.98% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": true, "detail": "10,701,165 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": true, "detail": "9.98% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "60"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 16,358 (현재 15,980)"}]}
{"ts": "2026-07-02T10:18:03.873047+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 122200, "qty": 51, "cost": 6233135, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 111000, "target": 132600, "signals": [{"label": "손절선", "ok": true, "detail": "111,000 (현재 122,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 132,600"}, {"label": "추세(20일선)", "ok": true, "detail": "118,345"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +22 · 기 -44"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 121,743"}]}
{"ts": "2026-07-02T10:34:04.144316+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 18860, "qty": 328, "cost": 6187008, "path": "pullback", "reason": "눌림목 지정가 19,580 도달", "stop": 17760, "target": 21060, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "18,860 vs 18,848"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,558 / 18,848"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,558 / 19,356"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+3.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -339 · 기 +110 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+35%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.80% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "924,985 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.80% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "48"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,580 (현재 18,860)"}]}
{"ts": "2026-07-02T11:04:07.662696+09:00", "side": "BUY", "code": "003490", "name": "대한항공", "price": 29600, "qty": 182, "cost": 5388008, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 26248, "target": 34203, "signals": [{"label": "손절선", "ok": true, "detail": "26,248 (현재 29,600)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 34,203"}, {"label": "추세(20일선)", "ok": true, "detail": "25,985"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -206 · 기 +1,008"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 29,586"}]}
{"ts": "2026-07-02T11:20:02.080921+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 22550, "qty": 274, "cost": 6179627, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 17760, "target": 21060, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 19,350)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,060"}, {"label": "추세(20일선)", "ok": true, "detail": "18,872"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -339 · 기 +110"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,250"}]}
{"ts": "2026-07-02T11:24:06.170288+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18860, "qty": 602, "proceeds": 11331580, "entry_price": 20540, "pnl": -1035054, "pnl_pct": -8.18, "hold_from": "2026-07-02T10:34:04.144315+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "18,980 (현재 18,890)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 23,659"}, {"label": "추세(20일선)", "ok": true, "detail": "18,849"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -339 · 기 +110"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-03T09:44:02.632371+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 123600, "qty": 25, "proceeds": 3083974, "entry_price": 159960, "pnl": -915625, "pnl_pct": -22.73, "hold_from": "2026-06-24T09:08:01.010342+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "124,125 (현재 123,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 231,630"}, {"label": "추세(20일선)", "ok": true, "detail": "120,025"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +674 · 기 -2,170"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-03T10:24:02.796593+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19040, "qty": 316, "cost": 6017542, "path": "pullback", "reason": "눌림목 지정가 19,631 도달", "stop": 17760, "target": 21600, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "19,030 vs 18,856"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,592 / 18,856"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,592 / 19,359"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+2.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -35 · 기 +168 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+34%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.54% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "619,193 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.54% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "49"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,631 (현재 19,030)"}]}
{"ts": "2026-07-06T09:00:11.535411+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 130600, "qty": 13, "cost": 1698055, "path": "pullback", "reason": "눌림목 지정가 154,452 도달", "stop": 96000, "target": 199800, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "133,100 vs 120,495"}, {"label": "정배열(5>20)", "ok": true, "detail": "138,640 / 120,495"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "138,640 / 121,318"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+17.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +782 · 기 -1,979 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+31%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.01% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": false, "detail": "4,080 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": false, "detail": "0.01% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "52"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 154,452 (현재 133,100)"}]}
{"ts": "2026-07-06T10:02:06.373511+09:00", "side": "SELL", "code": "214450", "name": "파마리서치", "price": 320000, "qty": 21, "proceeds": 6706896, "entry_price": 364405, "pnl": -946752, "pnl_pct": -12.19, "hold_from": "2026-07-01T09:06:03.237216+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "320,410 (현재 320,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 452,393"}, {"label": "추세(20일선)", "ok": true, "detail": "295,125"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -108 · 기 +225"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-07T09:48:07.782659+09:00", "side": "SELL", "code": "403870", "name": "HPSP", "price": 43000, "qty": 40, "proceeds": 1716646, "entry_price": 55300, "pnl": -495686, "pnl_pct": -22.24, "hold_from": "2026-06-30T09:00:10.793007+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "43,200 (현재 43,050)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 79,500"}, {"label": "추세(20일선)", "ok": false, "detail": "51,870"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +1,424 · 기 -5,706"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 59,449"}]}
{"ts": "2026-07-07T10:06:07.269470+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 147500, "qty": 12, "cost": 1770266, "path": "pullback", "reason": "눌림목 지정가 148,050 도달", "stop": 108900, "target": 224700, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "147,400 vs 135,785"}, {"label": "정배열(5>20)", "ok": true, "detail": "170,120 / 135,785"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "170,120 / 99,573"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+37.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +96 · 기 -196 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+20%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "7.06% (환산) vs 평균 3.06% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 202,500"}, {"label": "거래량 급증", "ok": true, "detail": "1,366,200 (환산) vs 평균 591,925"}, {"label": "회전율 급증", "ok": true, "detail": "7.06% (환산) vs 평균 3.06%"}, {"label": "RSI", "ok": true, "detail": "56"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 148,050 (현재 147,400)"}]}
{"ts": "2026-07-07T10:28:06.483619+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 12410, "qty": 139, "proceeds": 1721626, "entry_price": 15980, "pnl": -499927, "pnl_pct": -22.34, "hold_from": "2026-07-02T10:18:03.872752+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "12,444 (현재 12,430)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 23,051"}, {"label": "추세(20일선)", "ok": false, "detail": "12,671"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -1,543 · 기 +15"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 16,975"}]}
{"ts": "2026-07-07T14:10:05.011607+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 183300, "qty": 9, "cost": 1649947, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 96000, "target": 199800, "signals": [{"label": "손절선", "ok": true, "detail": "96,000 (현재 183,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 199,800"}, {"label": "추세(20일선)", "ok": true, "detail": "120,210"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +263 · 기 -1,543"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 139,025"}]}
{"ts": "2026-07-07T14:10:05.014039+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 177000, "qty": 10, "cost": 1770266, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 108900, "target": 224700, "signals": [{"label": "손절선", "ok": true, "detail": "108,900 (현재 177,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 224,700"}, {"label": "추세(20일선)", "ok": true, "detail": "134,320"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +152 · 기 -281"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 156,742"}]}
{"ts": "2026-07-07T14:10:07.710976+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 20750, "qty": 290, "cost": 6018403, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 17760, "target": 21600, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 20,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,600"}, {"label": "추세(20일선)", "ok": true, "detail": "18,884"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +156 · 기 +113"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,358"}]}
{"ts": "2026-07-07T14:10:07.711904+09:00", "side": "BUY", "code": "034730", "name": "SK", "price": 815000, "qty": 4, "cost": 3260489, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 604000, "target": 913000, "signals": [{"label": "손절선", "ok": true, "detail": "604,000 (현재 815,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 913,000"}, {"label": "추세(20일선)", "ok": true, "detail": "673,250"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -44 · 기 +3"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 738,777"}]}
{"ts": "2026-07-08T09:00:20.333570+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 108300, "qty": 22, "proceeds": 2377954, "entry_price": 152159, "pnl": -970048, "pnl_pct": -28.82, "hold_from": "2026-07-06T09:00:11.535404+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "118,460 (현재 112,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 219,558"}, {"label": "추세(20일선)", "ok": false, "detail": "119,475"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +243 · 기 -857"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-08T09:00:20.334912+09:00", "side": "SELL", "code": "034730", "name": "SK", "price": 602000, "qty": 8, "proceeds": 4806609, "entry_price": 761000, "pnl": -1282304, "pnl_pct": -20.89, "hold_from": "2026-07-02T09:00:24.633638+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "633,892 (현재 602,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 1,015,215"}, {"label": "추세(20일선)", "ok": false, "detail": "669,550"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +49 · 기 -19"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-09T09:02:04.486732+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 158300, "qty": 36, "cost": 5699655, "path": "pullback", "reason": "눌림목 지정가 158,582 도달", "stop": 158000, "target": 158900, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "158,200 vs 149,700"}, {"label": "정배열(5>20)", "ok": true, "detail": "169,280 / 149,700"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "169,280 / 113,195"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+81.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +296 · 기 -306 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+13%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.72% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": false, "detail": "499,233 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": false, "detail": "1.72% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "55"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 158,582 (현재 158,200)"}]}
{"ts": "2026-07-09T09:12:02.528052+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 156900, "qty": 36, "proceeds": 5637386, "entry_price": 158300, "pnl": -62269, "pnl_pct": -0.88, "hold_from": "2026-07-09T09:02:04.486731+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "158,000 (현재 156,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "149,635"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +296 · 기 -306"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-09T09:36:03.478611+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 132000, "qty": 30, "cost": 3960594, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 117015, "target": 161970, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "131,900 vs 108,920"}, {"label": "정배열(5>20)", "ok": true, "detail": "115,560 / 108,920"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "115,560 / 113,228"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+22.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -184 · 기 +964 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+13%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.91% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 116,900"}, {"label": "거래량 급증", "ok": true, "detail": "1,026,867 (환산) vs 평균 359,705"}, {"label": "회전율 급증", "ok": true, "detail": "0.91% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-07-09T12:12:04.877857+09:00", "side": "SELL", "code": "003490", "name": "대한항공", "price": 26500, "qty": 369, "proceeds": 9759432, "entry_price": 29245, "pnl": -1033687, "pnl_pct": -9.39, "hold_from": "2026-06-25T09:04:06.181639+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "26,501 (현재 26,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 34,734"}, {"label": "추세(20일선)", "ok": true, "detail": "25,830"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -1,444 · 기 +2,767"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-10T09:24:02.499399+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 158900, "qty": 36, "cost": 5721258, "path": "pullback", "reason": "눌림목 지정가 159,557 도달", "stop": 158000, "target": 160700, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "158,800 vs 149,730"}, {"label": "정배열(5>20)", "ok": true, "detail": "169,400 / 149,730"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "169,400 / 113,205"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+82.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +225 · 기 -178 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+13%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "5.62% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": true, "detail": "1,627,273 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": true, "detail": "5.62% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "55"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 159,557 (현재 158,800)"}]}
{"ts": "2026-07-10T09:28:02.643670+09:00", "side": "BUY", "code": "105560", "name": "KB금융", "price": 185900, "qty": 23, "cost": 4276341, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 166448, "target": 224803, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "185,600 vs 159,890"}, {"label": "정배열(5>20)", "ok": true, "detail": "159,900 / 159,890"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "159,900 / 157,368"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+26.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,310 · 기 +1,527 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+16%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.06% (환산) vs 평균 0.46% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 182,700"}, {"label": "거래량 급증", "ok": true, "detail": "3,715,113 (환산) vs 평균 1,640,325"}, {"label": "회전율 급증", "ok": true, "detail": "1.06% (환산) vs 평균 0.46%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-07-10T09:46:11.495094+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 12830, "qty": 186, "cost": 2386738, "path": "pullback", "reason": "눌림목 지정가 15,971 도달", "stop": 10360, "target": 17770, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "12,820 vs 12,690"}, {"label": "정배열(5>20)", "ok": true, "detail": "15,472 / 12,690"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "15,472 / 11,425"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+1.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +228 · 기 +229 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+56%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "9.75% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": true, "detail": "10,460,473 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": true, "detail": "9.75% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 15,971 (현재 12,820)"}]}
{"ts": "2026-07-10T11:16:02.496061+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 13850, "qty": 173, "cost": 2396409, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 10360, "target": 17770, "signals": [{"label": "손절선", "ok": true, "detail": "10,360 (현재 13,850)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 17,770"}, {"label": "추세(20일선)", "ok": true, "detail": "12,742"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +210 · 기 +239"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,843"}]}
{"ts": "2026-07-10T12:14:02.691785+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 126200, "qty": 15, "cost": 1893284, "path": "pullback", "reason": "눌림목 지정가 151,752 도달", "stop": 96000, "target": 186600, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "126,200 vs 120,150"}, {"label": "정배열(5>20)", "ok": true, "detail": "137,260 / 120,150"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "137,260 / 121,203"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+17.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +483 · 기 -241 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+38%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "7.53% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": true, "detail": "3,695,762 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": true, "detail": "7.53% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 151,752 (현재 126,200)"}]}
{"ts": "2026-07-13T09:00:12.293400+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 136900, "qty": 29, "cost": 3970696, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 117015, "target": 161970, "signals": [{"label": "손절선", "ok": true, "detail": "117,015 (현재 136,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 161,970"}, {"label": "추세(20일선)", "ok": true, "detail": "109,140"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -64 · 기 +919"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 135,864"}]}
{"ts": "2026-07-13T09:26:03.430157+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 139100, "qty": 14, "cost": 1947692, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 96000, "target": 186600, "signals": [{"label": "손절선", "ok": true, "detail": "96,000 (현재 139,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 186,600"}, {"label": "추세(20일선)", "ok": true, "detail": "120,795"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -213 · 기 +772"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 136,162"}]}
{"ts": "2026-07-13T09:36:02.293764+09:00", "side": "BUY", "code": "105560", "name": "KB금융", "price": 191000, "qty": 23, "cost": 4393659, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 166448, "target": 224803, "signals": [{"label": "손절선", "ok": true, "detail": "166,448 (현재 191,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 224,803"}, {"label": "추세(20일선)", "ok": true, "detail": "160,160"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -867 · 기 +1,393"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 190,952"}]}
{"ts": "2026-07-13T12:44:04.374493+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 187900, "qty": 36, "proceeds": 6751209, "entry_price": 158900, "pnl": 1029951, "pnl_pct": 18.25, "hold_from": "2026-07-10T09:24:02.499393+09:00", "reason": "트레일링 익절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "189,133 (현재 187,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "151,185"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -254 · 기 +457"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-15T14:32:01.904618+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18570, "qty": 606, "proceeds": 11231476, "entry_price": 19858, "pnl": -804469, "pnl_pct": -6.49, "hold_from": "2026-07-03T10:24:02.796592+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "18,586 (현재 18,570)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,403"}, {"label": "추세(20일선)", "ok": false, "detail": "18,833"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -214 · 기 +240"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-20T12:28:02.336406+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 10310, "qty": 359, "proceeds": 3694072, "entry_price": 13322, "pnl": -1089075, "pnl_pct": -22.61, "hold_from": "2026-07-10T09:46:11.495093+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "10,360 (현재 10,310)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 19,245"}, {"label": "추세(20일선)", "ok": false, "detail": "14,755"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -887 · 기 +515"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-20T12:46:02.298292+09:00", "side": "SELL", "code": "086790", "name": "하나금융지주", "price": 131800, "qty": 103, "proceeds": 13548928, "entry_price": 120181, "pnl": 1168471, "pnl_pct": 9.67, "hold_from": "2026-07-01T09:46:03.123573+09:00", "reason": "트레일링 익절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "131,911 (현재 131,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "118,840"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +0 · 기 +424"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-20T12:48:03.494077+09:00", "side": "SELL", "code": "105560", "name": "KB금융", "price": 168100, "qty": 46, "proceeds": 7717521, "entry_price": 188450, "pnl": -952479, "pnl_pct": -10.8, "hold_from": "2026-07-10T09:28:02.643669+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "168,241 (현재 168,200)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 228,868"}, {"label": "추세(20일선)", "ok": true, "detail": "159,020"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -385 · 기 +288"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-21T12:06:01.191056+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 344500, "qty": 11, "cost": 3790068, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 303577, "target": 426346, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "344,500 vs 296,350"}, {"label": "정배열(5>20)", "ok": true, "detail": "315,100 / 296,350"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "315,100 / 305,492"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+39.7%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -7 · 기 +1 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+43%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.38% (환산) vs 평균 0.93% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 334,500"}, {"label": "거래량 급증", "ok": true, "detail": "247,158 (환산) vs 평균 96,436"}, {"label": "회전율 급증", "ok": true, "detail": "2.38% (환산) vs 평균 0.93%"}, {"label": "RSI", "ok": true, "detail": "65"}]}
{"ts": "2026-07-22T11:56:00.846714+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 159800, "qty": 35, "cost": 5593839, "path": "pullback", "reason": "눌림목 지정가 159,932 도달", "stop": 158000, "target": 163400, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "159,700 vs 149,775"}, {"label": "정배열(5>20)", "ok": true, "detail": "169,580 / 149,775"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "169,580 / 113,220"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+75.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -408 · 기 +146 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+12%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "4.73% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": false, "detail": "1,371,014 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": true, "detail": "4.73% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "55"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 159,932 (현재 159,700)"}]}
{"ts": "2026-07-22T12:12:00.758300+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 157300, "qty": 35, "proceeds": 5494764, "entry_price": 159800, "pnl": -99075, "pnl_pct": -1.56, "hold_from": "2026-07-22T11:56:00.846713+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "158,000 (현재 157,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 163,400"}, {"label": "추세(20일선)", "ok": true, "detail": "149,655"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -407 · 기 +141"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 169,305"}]}
{"ts": "2026-07-23T09:00:25.699142+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 160100, "qty": 35, "cost": 5604341, "path": "pullback", "reason": "눌림목 지정가 159,493 도달", "stop": 158000, "target": 164300, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "158,100 vs 149,695"}, {"label": "정배열(5>20)", "ok": true, "detail": "169,260 / 149,695"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "169,260 / 113,193"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+76.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -162 · 기 +37 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+13%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.05% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": false, "detail": "303,687 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": false, "detail": "1.05% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "55"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 159,493 (현재 158,100)"}]}
{"ts": "2026-07-23T09:32:04.431227+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 157800, "qty": 35, "proceeds": 5512230, "entry_price": 160100, "pnl": -92110, "pnl_pct": -1.44, "hold_from": "2026-07-23T09:00:25.699135+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "158,000 (현재 157,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "149,685"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -162 · 기 +37"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-23T09:44:04.308112+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 18850, "qty": 301, "cost": 5674701, "path": "pullback", "reason": "눌림목 지정가 19,627 도달", "stop": 17760, "target": 21030, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "18,850 vs 18,847"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,556 / 18,847"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,556 / 19,356"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+13.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -25 · 기 +6 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+34%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.34% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "388,767 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.34% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "48"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,627 (현재 18,850)"}]}
{"ts": "2026-07-23T09:50:01.533918+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 88200, "qty": 42, "cost": 3704956, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 77564, "target": 109473, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "88,200 vs 75,070"}, {"label": "정배열(5>20)", "ok": true, "detail": "83,000 / 75,070"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "83,000 / 75,058"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+47.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -150 · 기 +299 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+17%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.85% (환산) vs 평균 0.42% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 87,600"}, {"label": "거래량 급증", "ok": true, "detail": "785,587 (환산) vs 평균 392,182"}, {"label": "회전율 급증", "ok": true, "detail": "0.85% (환산) vs 평균 0.42%"}, {"label": "RSI", "ok": true, "detail": "67"}]}
{"ts": "2026-07-23T10:30:02.504689+09:00", "side": "BUY", "code": "024060", "name": "흥구석유", "price": 14140, "qty": 187, "cost": 2644577, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 11706, "target": 19008, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "14,180 vs 10,944"}, {"label": "정배열(5>20)", "ok": true, "detail": "13,154 / 10,944"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "13,154 / 12,687"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+55.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +109 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "84.26% (환산) vs 평균 31.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 13,990"}, {"label": "거래량 급증", "ok": true, "detail": "12,639,979 (환산) vs 평균 4,720,532"}, {"label": "회전율 급증", "ok": true, "detail": "84.26% (환산) vs 평균 31.47%"}, {"label": "RSI", "ok": true, "detail": "66"}]}
{"ts": "2026-07-23T12:22:02.614973+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 356000, "qty": 10, "cost": 3560534, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 303577, "target": 426346, "signals": [{"label": "손절선", "ok": true, "detail": "303,577 (현재 356,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 426,346"}, {"label": "추세(20일선)", "ok": true, "detail": "296,925"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +6 · 기 +26"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 355,034"}]}
{"ts": "2026-07-23T12:54:04.515832+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 90900, "qty": 41, "cost": 3727459, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 77564, "target": 109473, "signals": [{"label": "손절선", "ok": true, "detail": "77,564 (현재 91,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 109,473"}, {"label": "추세(20일선)", "ok": true, "detail": "75,210"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -169 · 기 +311"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 90,945"}]}
{"ts": "2026-07-24T09:00:08.902975+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 111800, "qty": 29, "proceeds": 3235878, "entry_price": 132428, "pnl": -605098, "pnl_pct": -15.58, "hold_from": "2026-07-10T12:14:02.691784+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "96,000 (현재 113,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 205,283"}, {"label": "추세(20일선)", "ok": false, "detail": "119,505"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -480 · 기 -206"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-24T09:00:08.905145+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18730, "qty": 301, "proceeds": 5626736, "entry_price": 18850, "pnl": -47965, "pnl_pct": -0.64, "hold_from": "2026-07-23T09:44:04.308111+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 18,730)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,030"}, {"label": "추세(20일선)", "ok": false, "detail": "18,841"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -5 · 기 -5"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,219"}]}
{"ts": "2026-07-24T09:02:04.062281+09:00", "side": "BUY", "code": "024060", "name": "흥구석유", "price": 15060, "qty": 175, "cost": 2635895, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 11706, "target": 19008, "signals": [{"label": "손절선", "ok": true, "detail": "11,706 (현재 15,020)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 19,008"}, {"label": "추세(20일선)", "ok": true, "detail": "10,986"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +208 · 기 -2"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 14,766"}]}
{"ts": "2026-07-27T09:02:06.254502+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19100, "qty": 299, "cost": 5711757, "path": "pullback", "reason": "눌림목 지정가 19,673 도달", "stop": 17760, "target": 21780, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "19,070 vs 18,858"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,600 / 18,858"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,600 / 19,360"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+16.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +101 · 기 -3 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.13% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "146,760 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.13% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,673 (현재 19,070)"}]}
{"ts": "2026-07-27T09:02:06.254811+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 7470, "qty": 414, "cost": 3093044, "path": "pullback", "reason": "눌림목 지정가 7,635 도달", "stop": 6370, "target": 9669, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "7,470 vs 4,876"}, {"label": "정배열(5>20)", "ok": true, "detail": "6,452 / 4,876"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,452 / 4,889"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+82.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +49 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.79% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "49,327 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "0.79% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "74"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,635 (현재 7,470)"}]}
{"ts": "2026-07-27T09:08:02.107067+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 7910, "qty": 391, "cost": 3093274, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 6370, "target": 9669, "signals": [{"label": "손절선", "ok": true, "detail": "6,370 (현재 7,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 9,669"}, {"label": "추세(20일선)", "ok": true, "detail": "4,897"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +49 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 7,747"}]}
{"ts": "2026-07-27T09:10:01.061111+09:00", "side": "SELL", "code": "024060", "name": "흥구석유", "price": 12030, "qty": 362, "proceeds": 4346368, "entry_price": 14585, "pnl": -934104, "pnl_pct": -17.52, "hold_from": "2026-07-23T10:30:02.504688+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "12,081 (현재 12,030)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 19,593"}, {"label": "추세(20일선)", "ok": true, "detail": "10,836"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -85 · 기 +2"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-27T09:12:01.540222+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 13150, "qty": 160, "cost": 2104316, "path": "pullback", "reason": "눌림목 지정가 13,180 도달", "stop": 10340, "target": 18770, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "13,150 vs 12,732"}, {"label": "정배열(5>20)", "ok": true, "detail": "14,378 / 12,732"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "14,378 / 13,268"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+1.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +27 · 기 +15 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.46% (환산) vs 평균 1.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 15,870"}, {"label": "거래량 급증", "ok": false, "detail": "274,967 (환산) vs 평균 882,736"}, {"label": "회전율 급증", "ok": false, "detail": "0.46% (환산) vs 평균 1.47%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 13,180 (현재 13,150)"}]}
{"ts": "2026-07-27T09:30:01.185145+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 149900, "qty": 37, "cost": 5547132, "path": "pullback", "reason": "눌림목 지정가 157,993 도달", "stop": 149899, "target": 149902, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "149,800 vs 149,280"}, {"label": "정배열(5>20)", "ok": true, "detail": "167,600 / 149,280"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "167,600 / 113,055"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+61.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +274 · 기 -315 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+22%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.69% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": false, "detail": "780,273 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": false, "detail": "2.69% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "52"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 157,993 (현재 149,800)"}]}
{"ts": "2026-07-27T09:32:01.412064+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 148500, "qty": 37, "proceeds": 5483786, "entry_price": 149900, "pnl": -63346, "pnl_pct": -0.93, "hold_from": "2026-07-27T09:30:01.185144+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "149,899 (현재 148,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 149,902"}, {"label": "추세(20일선)", "ok": false, "detail": "149,215"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +274 · 기 -315"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 159,969"}]}
{"ts": "2026-07-27T09:32:01.412365+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 127900, "qty": 44, "cost": 5628444, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 117645, "target": 148411, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "127,900 vs 113,950"}, {"label": "정배열(5>20)", "ok": true, "detail": "119,040 / 113,950"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "119,040 / 110,150"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+46.7%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +106 · 기 +291 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+16%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.38% (환산) vs 평균 0.17% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 123,300"}, {"label": "거래량 급증", "ok": true, "detail": "643,340 (환산) vs 평균 289,522"}, {"label": "회전율 급증", "ok": true, "detail": "0.38% (환산) vs 평균 0.17%"}, {"label": "RSI", "ok": true, "detail": "71"}]}
{"ts": "2026-07-28T09:04:02.759310+09:00", "side": "SELL", "code": "095610", "name": "테스", "price": 123200, "qty": 22, "proceeds": 2705115, "entry_price": 160909, "pnl": -835416, "pnl_pct": -23.44, "hold_from": "2026-07-07T10:06:07.269469+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "123,940 (현재 123,600)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 234,847"}, {"label": "추세(20일선)", "ok": false, "detail": "134,595"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +269 · 기 -554"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-28T11:22:00.768046+09:00", "side": "SELL", "code": "003680", "name": "한성기업", "price": 6630, "qty": 805, "proceeds": 5326743, "entry_price": 7684, "pnl": -859575, "pnl_pct": -13.71, "hold_from": "2026-07-27T09:02:06.254810+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "6,577 (현재 6,380)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 9,897"}, {"label": "추세(20일선)", "ok": true, "detail": "4,821"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +96 · 기 +0"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-28T12:56:02.896515+09:00", "side": "SELL", "code": "138040", "name": "메리츠금융지주", "price": 117400, "qty": 44, "proceeds": 5155527, "entry_price": 127900, "pnl": -472917, "pnl_pct": -8.21, "hold_from": "2026-07-27T09:32:01.412364+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "117,645 (현재 117,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 148,411"}, {"label": "추세(20일선)", "ok": true, "detail": "113,430"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +84 · 기 +324"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 130,553"}]}
{"ts": "2026-07-29T09:02:02.255678+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6540, "qty": 348, "cost": 2276261, "path": "pullback", "reason": "눌림목 지정가 7,526 도달", "stop": 5295, "target": 9031, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "6,540 vs 4,829"}, {"label": "정배열(5>20)", "ok": true, "detail": "6,266 / 4,829"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,266 / 4,873"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+70.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +188 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.87% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "116,047 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "1.87% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "63"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,526 (현재 6,540)"}]}
{"ts": "2026-07-29T09:24:10.027865+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 18950, "qty": 301, "cost": 5704806, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 17760, "target": 21780, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 20,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,780"}, {"label": "추세(20일선)", "ok": true, "detail": "18,884"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +99 · 기 +138"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,418"}]}
{"ts": "2026-07-29T09:24:10.028115+09:00", "side": "SELL", "code": "010950", "name": "S-Oil", "price": 128600, "qty": 59, "proceeds": 7572605, "entry_price": 134408, "pnl": -358685, "pnl_pct": -4.32, "hold_from": "2026-07-09T09:36:03.478610+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "118,952 (현재 116,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 165,321"}, {"label": "추세(20일선)", "ok": true, "detail": "107,870"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +43 · 기 +245"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T09:24:10.028241+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6710, "qty": 339, "cost": 2275031, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 5295, "target": 9031, "signals": [{"label": "손절선", "ok": true, "detail": "5,295 (현재 8,460)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 9,031"}, {"label": "추세(20일선)", "ok": true, "detail": "4,732"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +188 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,796"}]}
{"ts": "2026-07-29T09:24:10.028406+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 11310, "qty": 187, "cost": 2115287, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 10340, "target": 18770, "signals": [{"label": "손절선", "ok": true, "detail": "10,340 (현재 15,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 18,770"}, {"label": "추세(20일선)", "ok": true, "detail": "12,805"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +242 · 기 -182"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,887"}]}
{"ts": "2026-07-29T09:28:01.403531+09:00", "side": "BUY", "code": "090850", "name": "현대이지웰", "price": 6390, "qty": 828, "cost": 5291714, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 5867, "target": 7435, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "6,380 vs 5,358"}, {"label": "정배열(5>20)", "ok": true, "detail": "5,742 / 5,358"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "5,742 / 5,622"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+43.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +73 · 기 -3 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.62% (환산) vs 평균 0.22% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 5,700"}, {"label": "거래량 급증", "ok": true, "detail": "134,413 (환산) vs 평균 49,512"}, {"label": "회전율 급증", "ok": true, "detail": "0.62% (환산) vs 평균 0.22%"}, {"label": "RSI", "ok": true, "detail": "73"}]}
{"ts": "2026-07-29T10:24:01.463013+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 123400, "qty": 42, "cost": 5183577, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 113016, "target": 144168, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "123,400 vs 113,725"}, {"label": "정배열(5>20)", "ok": true, "detail": "118,140 / 113,725"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "118,140 / 110,075"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+51.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +47 · 기 +310 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+20%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.38% (환산) vs 평균 0.17% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 123,300"}, {"label": "거래량 급증", "ok": true, "detail": "644,676 (환산) vs 평균 289,522"}, {"label": "회전율 급증", "ok": true, "detail": "0.38% (환산) vs 평균 0.17%"}, {"label": "RSI", "ok": true, "detail": "67"}]}
{"ts": "2026-07-29T10:52:02.369415+09:00", "side": "SELL", "code": "252990", "name": "샘씨엔에스", "price": 10340, "qty": 347, "proceeds": 3580983, "entry_price": 12158, "pnl": -638619, "pnl_pct": -14.96, "hold_from": "2026-07-27T09:12:01.540221+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "10,340 (현재 10,340)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 15,795"}, {"label": "추세(20일선)", "ok": false, "detail": "12,592"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +239 · 기 -181"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T13:14:05.459920+09:00", "side": "SELL", "code": "003680", "name": "한성기업", "price": 5580, "qty": 687, "proceeds": 3825985, "entry_price": 6624, "pnl": -725308, "pnl_pct": -15.76, "hold_from": "2026-07-29T09:02:02.255677+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,600 (현재 5,590)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 8,672"}, {"label": "추세(20일선)", "ok": true, "detail": "4,782"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +185 · 기 +0"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T13:34:03.608819+09:00", "side": "SELL", "code": "090850", "name": "현대이지웰", "price": 5860, "qty": 828, "proceeds": 4842618, "entry_price": 6390, "pnl": -449095, "pnl_pct": -8.29, "hold_from": "2026-07-29T09:28:01.403529+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,867 (현재 5,860)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 7,435"}, {"label": "추세(20일선)", "ok": true, "detail": "5,332"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +73 · 기 -3"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,525"}]}
{"ts": "2026-07-30T09:04:07.518903+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6130, "qty": 319, "cost": 1955763, "path": "pullback", "reason": "눌림목 지정가 7,457 도달", "stop": 4793, "target": 8804, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "6,120 vs 4,808"}, {"label": "정배열(5>20)", "ok": true, "detail": "6,182 / 4,808"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,182 / 4,866"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+65.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +234 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "4.31% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "267,687 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "4.31% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,457 (현재 6,120)"}]}
{"ts": "2026-07-30T09:24:07.565722+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 131800, "qty": 29, "cost": 3822773, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 116987, "target": 161427, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "132,000 vs 108,925"}, {"label": "정배열(5>20)", "ok": true, "detail": "115,580 / 108,925"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "115,580 / 113,230"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+51.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -6 · 기 +178 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+20%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.66% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 116,900"}, {"label": "거래량 급증", "ok": true, "detail": "738,813 (환산) vs 평균 359,705"}, {"label": "회전율 급증", "ok": true, "detail": "0.66% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-07-30T09:26:07.513015+09:00", "side": "BUY", "code": "090850", "name": "현대이지웰", "price": 6300, "qty": 841, "cost": 5299095, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 5789, "target": 7322, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "6,280 vs 5,353"}, {"label": "정배열(5>20)", "ok": true, "detail": "5,722 / 5,353"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "5,722 / 5,620"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+46.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +87 · 기 +6 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.51% (환산) vs 평균 0.22% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 5,700"}, {"label": "거래량 급증", "ok": true, "detail": "109,080 (환산) vs 평균 49,512"}, {"label": "회전율 급증", "ok": true, "detail": "0.51% (환산) vs 평균 0.22%"}, {"label": "RSI", "ok": true, "detail": "71"}]}
{"ts": "2026-07-30T09:50:07.318850+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 126400, "qty": 41, "cost": 5183177, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 113016, "target": 144168, "signals": [{"label": "손절선", "ok": true, "detail": "113,016 (현재 126,200)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 144,168"}, {"label": "추세(20일선)", "ok": true, "detail": "113,865"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +9 · 기 +389"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 126,082"}]}
{"ts": "2026-07-31T09:06:07.669241+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6550, "qty": 298, "cost": 1952193, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 4793, "target": 8804, "signals": [{"label": "손절선", "ok": true, "detail": "4,793 (현재 6,640)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 8,804"}, {"label": "추세(20일선)", "ok": true, "detail": "4,834"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +355 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,453"}]}
{"ts": "2026-07-31T09:06:07.669454+09:00", "side": "SELL", "code": "078930", "name": "GS", "price": 77700, "qty": 83, "proceeds": 6436524, "entry_price": 89534, "pnl": -995890, "pnl_pct": -13.22, "hold_from": "2026-07-23T09:50:01.533917+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "78,554 (현재 78,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 111,492"}, {"label": "추세(20일선)", "ok": true, "detail": "74,560"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -179 · 기 +325"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-08-03T12:00:12.460555+09:00", "side": "BUY", "code": "194370", "name": "제이에스코퍼레이션", "price": 12910, "qty": 262, "cost": 3382927, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 11314, "target": 16103, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "12,930 vs 11,922"}, {"label": "정배열(5>20)", "ok": true, "detail": "12,138 / 11,922"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "12,138 / 11,924"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+27.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +7 · 기 +10 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+74%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.72% (환산) vs 평균 0.34% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 12,870"}, {"label": "거래량 급증", "ok": true, "detail": "208,994 (환산) vs 평균 99,303"}, {"label": "회전율 급증", "ok": true, "detail": "0.72% (환산) vs 평균 0.34%"}, {"label": "RSI", "ok": true, "detail": "63"}]}
{"ts": "2026-08-03T12:02:10.398435+09:00", "side": "BUY", "code": "194370", "name": "제이에스코퍼레이션", "price": 13420, "qty": 252, "cost": 3382347, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 11314, "target": 16103, "signals": [{"label": "손절선", "ok": true, "detail": "11,314 (현재 13,450)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 16,103"}, {"label": "추세(20일선)", "ok": true, "detail": "11,948"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +7 · 기 +10"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,339"}]}
{"ts": "2026-08-04T09:04:10.104326+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 135900, "qty": 11, "cost": 1495124, "path": "pullback", "reason": "눌림목 지정가 145,918 도달", "stop": 100700, "target": 206300, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "135,700 vs 135,200"}, {"label": "정배열(5>20)", "ok": true, "detail": "167,780 / 135,200"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "167,780 / 99,378"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+24.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +23 · 기 +54 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+45%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "6.62% (환산) vs 평균 3.06% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 202,500"}, {"label": "거래량 급증", "ok": true, "detail": "1,281,140 (환산) vs 평균 591,925"}, {"label": "회전율 급증", "ok": true, "detail": "6.62% (환산) vs 평균 3.06%"}, {"label": "RSI", "ok": true, "detail": "52"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 145,918 (현재 135,700)"}]}
{"ts": "2026-08-05T09:00:18.831380+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 147600, "qty": 10, "cost": 1476221, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 100700, "target": 206300, "signals": [{"label": "손절선", "ok": true, "detail": "100,700 (현재 147,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 206,300"}, {"label": "추세(20일선)", "ok": true, "detail": "135,790"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -256 · 기 +200"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 145,836"}]}
{"ts": "2026-08-05T09:02:14.769091+09:00", "side": "SELL", "code": "090850", "name": "현대이지웰", "price": 5700, "qty": 841, "proceeds": 4784352, "entry_price": 6300, "pnl": -514742, "pnl_pct": -9.52, "hold_from": "2026-07-30T09:26:07.513013+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,789 (현재 5,730)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 7,322"}, {"label": "추세(20일선)", "ok": true, "detail": "5,326"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +14 · 기 -2"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,413"}]}
{"ts": "2026-08-05T09:02:14.769295+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 13040, "qty": 155, "cost": 2021503, "path": "pullback", "reason": "눌림목 지정가 13,170 도달", "stop": 10340, "target": 18440, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "13,040 vs 12,727"}, {"label": "정배열(5>20)", "ok": true, "detail": "14,356 / 12,727"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "14,356 / 13,267"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-6.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -72 · 기 +134 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.13% (환산) vs 평균 1.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 15,870"}, {"label": "거래량 급증", "ok": false, "detail": "78,333 (환산) vs 평균 882,736"}, {"label": "회전율 급증", "ok": false, "detail": "0.13% (환산) vs 평균 1.47%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 13,170 (현재 13,040)"}]}
{"ts": "2026-08-05T09:38:13.266065+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 13830, "qty": 146, "cost": 2019483, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 10340, "target": 18440, "signals": [{"label": "손절선", "ok": true, "detail": "10,340 (현재 13,860)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 18,440"}, {"label": "추세(20일선)", "ok": true, "detail": "12,768"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -72 · 기 +134"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,817"}]}
{"ts": "2026-08-06T09:00:22.181097+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18730, "qty": 600, "proceeds": 11216086, "entry_price": 19025, "pnl": -200476, "pnl_pct": -1.55, "hold_from": "2026-07-27T09:02:06.254501+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 18,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,554"}, {"label": "추세(20일선)", "ok": false, "detail": "18,842"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -203 · 기 -147"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-08-06T09:34:17.073825+09:00", "side": "BUY", "code": "068270", "name": "셀트리온", "price": 192000, "qty": 25, "cost": 4800720, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 175344, "target": 225312, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "191,800 vs 177,680"}, {"label": "정배열(5>20)", "ok": true, "detail": "186,140 / 177,680"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "186,140 / 176,671"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+20.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +255 · 기 -319 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+44%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.67% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 191,700"}, {"label": "거래량 급증", "ok": true, "detail": "1,582,767 (환산) vs 평균 738,783"}, {"label": "회전율 급증", "ok": true, "detail": "0.67% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "63"}]}
{"ts": "2026-08-07T09:12:17.879554+09:00", "side": "BUY", "code": "068270", "name": "셀트리온", "price": 196400, "qty": 24, "cost": 4714307, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 175344, "target": 225312, "signals": [{"label": "손절선", "ok": true, "detail": "175,344 (현재 196,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 225,312"}, {"label": "추세(20일선)", "ok": true, "detail": "177,905"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +338 · 기 +73"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 196,264"}]}
{"ts": "2026-08-10T09:00:20.971135+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 136000, "qty": 28, "cost": 3808571, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 116987, "target": 161427, "signals": [{"label": "손절선", "ok": true, "detail": "116,987 (현재 137,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 161,427"}, {"label": "추세(20일선)", "ok": true, "detail": "109,175"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -253 · 기 +225"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 135,714"}]}
@@ -0,0 +1,201 @@
{
"cash": 18871261.522500005,
"initial": 100000000,
"positions": {
"214450": {
"code": "214450",
"name": "파마리서치",
"sources": [
"auto"
],
"qty": 22,
"entry_price": 347250.0,
"entry_at": "2026-07-13T09:12:04.324564+09:00",
"stop": 305399,
"target": 430953,
"peak": 411500,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 409000,
"tranches": 2,
"tranche_value": 3889733.683715179,
"last_add_price": 353000
},
"138040": {
"code": "138040",
"name": "메리츠금융지주",
"sources": [
"auto"
],
"qty": 89,
"entry_price": 119185.39325842696,
"entry_at": "2026-07-29T09:02:02.257865+09:00",
"stop": 111200,
"target": 135156,
"peak": 127600,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 118,115 도달",
"cur_price": 123200,
"tranches": 2,
"tranche_value": 5327150.576000001,
"last_add_price": 120500
},
"086790": {
"code": "086790",
"name": "하나금융지주",
"sources": [
"auto"
],
"qty": 79,
"entry_price": 123225.3164556962,
"entry_at": "2026-07-30T09:04:07.521823+09:00",
"stop": 111000,
"target": 147676,
"peak": 134600,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 122,665 도달",
"cur_price": 130600,
"tranches": 2,
"tranche_value": 4940372.790080874,
"last_add_price": 125200
},
"003680": {
"code": "003680",
"name": "한성기업",
"sources": [
"auto"
],
"qty": 606,
"entry_price": 6333.069306930693,
"entry_at": "2026-07-30T09:04:07.522091+09:00",
"stop": 5039,
"target": 8921,
"peak": 6840,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 7,792 도달",
"cur_price": 6220,
"tranches": 2,
"tranche_value": 1924945.6187384445,
"last_add_price": 6550
},
"010950": {
"code": "010950",
"name": "S-Oil",
"sources": [
"auto"
],
"qty": 55,
"entry_price": 133861.81818181818,
"entry_at": "2026-07-30T09:24:07.568342+09:00",
"stop": 118205,
"target": 165174,
"peak": 139900,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 139600,
"tranches": 2,
"tranche_value": 3791237.2526261737,
"last_add_price": 136000
},
"003490": {
"code": "003490",
"name": "대한항공",
"sources": [
"auto"
],
"qty": 395,
"entry_price": 25667.46835443038,
"entry_at": "2026-07-31T09:10:13.091944+09:00",
"stop": 23650,
"target": 29702,
"peak": 27650,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 25,331 도달",
"cur_price": 26850,
"tranches": 2,
"tranche_value": 5089986.002562501,
"last_add_price": 26100
},
"252990": {
"code": "252990",
"name": "샘씨엔에스",
"sources": [
"auto"
],
"qty": 300,
"entry_price": 13424.466666666667,
"entry_at": "2026-08-05T09:02:14.773219+09:00",
"stop": 10340,
"target": 19593,
"peak": 15670,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 13,947 도달",
"cur_price": 15670,
"tranches": 2,
"tranche_value": 2020520.412274148,
"last_add_price": 13830
},
"068270": {
"code": "068270",
"name": "셀트리온",
"sources": [
"interest"
],
"qty": 49,
"entry_price": 194155.10204081633,
"entry_at": "2026-08-06T09:34:17.077648+09:00",
"stop": 177099,
"target": 228267,
"peak": 201000,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 201000,
"tranches": 2,
"tranche_value": 4842897.369596543,
"last_add_price": 196400
}
},
"realized_pnl": -18257679.233000018,
"closed_trades": 30,
"wins": 0,
"peak_equity": 101140808.32700005,
"max_drawdown": 0.1947881632733674,
"last_exit": {
"030000": "2026-08-06",
"086790": "2026-07-29",
"010120": "2026-06-25",
"298040": "2026-06-26",
"403870": "2026-07-07",
"093370": "2026-07-20",
"240810": "2026-07-24",
"214450": "2026-07-06",
"034730": "2026-07-07",
"003490": "2026-07-23",
"105560": "2026-07-20",
"095610": "2026-07-29",
"024060": "2026-07-27",
"003680": "2026-07-29",
"252990": "2026-07-28",
"010950": "2026-07-29",
"090850": "2026-08-05",
"078930": "2026-07-31"
},
"created_at": "2026-06-15T14:55:00.583227+09:00",
"updated_at": "2026-08-10T15:28:16.186290+09:00"
}
@@ -0,0 +1,95 @@
{"ts": "2026-06-17T11:15:02.406376+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 130900, "qty": 38, "cost": 4974946, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 118039, "target": 156622, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "129,300 vs 118,950"}, {"label": "정배열(5>10)", "ok": true, "detail": "120,400 / 118,950"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "120,400 / 118,307"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-13.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +371 · 기 +158 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+22%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.12% (환산) vs 평균 0.38% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 126,500"}, {"label": "거래량 급증", "ok": true, "detail": "3,094,534 (환산) vs 평균 1,031,725"}, {"label": "회전율 급증", "ok": true, "detail": "1.12% (환산) vs 평균 0.38%"}, {"label": "RSI", "ok": true, "detail": "60"}]}
{"ts": "2026-06-17T16:47:31.348679+09:00", "side": "BUY", "code": "403870", "name": "HPSP", "price": 62900, "qty": 35, "cost": 2201830, "path": "pullback", "reason": "눌림목 지정가 64,531 도달", "stop": 48962, "target": 90776, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "62,800 vs 53,510"}, {"label": "정배열(5>10)", "ok": true, "detail": "59,880 / 53,510"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "59,880 / 49,831"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+21.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -4,434 · 기 +5,040 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+9%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "11.31% vs 평균 5.97% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 71,500"}, {"label": "거래량 급증", "ok": false, "detail": "9,309,211 vs 평균 4,912,598"}, {"label": "회전율 급증", "ok": true, "detail": "11.31% vs 평균 5.97%"}, {"label": "RSI", "ok": true, "detail": "58"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 64,531 (현재 62,800)"}]}
{"ts": "2026-06-19T09:02:06.456154+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19160, "qty": 325, "cost": 6227934, "path": "pullback", "reason": "눌림목 지정가 20,044 도달", "stop": 17760, "target": 21960, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "19,150 vs 18,963"}, {"label": "정배열(5>10)", "ok": true, "detail": "19,616 / 18,963"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,616 / 19,361"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-31.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,162 · 기 +2,080 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.03% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "37,673 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.03% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 20,044 (현재 19,150)"}]}
{"ts": "2026-06-23T09:00:13.389500+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18820, "qty": 325, "proceeds": 6104573, "entry_price": 19160, "pnl": -123361, "pnl_pct": -1.77, "hold_from": "2026-06-19T09:02:06.456153+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 18,710)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,960"}, {"label": "추세(10일선)", "ok": false, "detail": "18,919"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -318 · 기 -227"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,528"}]}
{"ts": "2026-06-23T12:04:04.268248+09:00", "side": "SELL", "code": "086790", "name": "하나금융지주", "price": 117700, "qty": 38, "proceeds": 4463878, "entry_price": 130900, "pnl": -511068, "pnl_pct": -10.08, "hold_from": "2026-06-17T11:15:02.406375+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "118,039 (현재 117,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 156,622"}, {"label": "추세(10일선)", "ok": false, "detail": "119,330"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +332 · 기 -364"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 134,300"}]}
{"ts": "2026-06-24T09:04:06.145785+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 156700, "qty": 13, "cost": 2037406, "path": "pullback", "reason": "눌림목 지정가 165,075 도달", "stop": 120251, "target": 229599, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "156,200 vs 128,170"}, {"label": "정배열(5>10)", "ok": true, "detail": "143,260 / 128,170"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "143,260 / 121,703"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+46.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +210 · 기 +143 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+6%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "5.83% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": true, "detail": "2,860,073 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": true, "detail": "5.83% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 165,075 (현재 156,200)"}]}
{"ts": "2026-06-24T09:12:05.775789+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 17270, "qty": 150, "cost": 2590889, "path": "pullback", "reason": "눌림목 지정가 17,366 도달", "stop": 13981, "target": 23847, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "17,280 vs 13,750"}, {"label": "정배열(5>10)", "ok": true, "detail": "16,364 / 13,750"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "16,364 / 11,500"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+21.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +1,740 · 기 -508 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+16%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.34% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": false, "detail": "2,509,340 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": false, "detail": "2.34% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "65"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 17,366 (현재 17,280)"}]}
{"ts": "2026-06-24T09:46:05.179971+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 158200, "qty": 13, "cost": 2056908, "path": "pullback", "reason": "눌림목 지정가 158,264 도달", "stop": 120729, "target": 233143, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "158,000 vs 153,380"}, {"label": "정배열(5>10)", "ok": true, "detail": "172,240 / 153,380"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "172,240 / 99,750"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+56.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +41 · 기 +65 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+5%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "4.25% (환산) vs 평균 3.06% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 202,500"}, {"label": "거래량 급증", "ok": false, "detail": "822,940 (환산) vs 평균 591,925"}, {"label": "회전율 급증", "ok": false, "detail": "4.25% (환산) vs 평균 3.06%"}, {"label": "RSI", "ok": true, "detail": "61"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 158,264 (현재 158,000)"}]}
{"ts": "2026-06-24T10:06:01.728022+09:00", "side": "BUY", "code": "298040", "name": "효성중공업", "price": 3474000, "qty": 1, "cost": 3474521, "path": "pullback", "reason": "눌림목 지정가 3,598,344 도달", "stop": 2985000, "target": 4452000, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "3,475,000 vs 3,470,900"}, {"label": "정배열(5>10)", "ok": true, "detail": "3,548,200 / 3,470,900"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "3,548,200 / 3,400,850"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-11.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +18 · 기 +0 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+34%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.75% (환산) vs 평균 0.63% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 4,085,000"}, {"label": "거래량 급증", "ok": true, "detail": "164,440 (환산) vs 평균 58,834"}, {"label": "회전율 급증", "ok": true, "detail": "1.75% (환산) vs 평균 0.63%"}, {"label": "RSI", "ok": true, "detail": "47"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 3,598,344 (현재 3,475,000)"}]}
{"ts": "2026-06-24T11:12:06.270714+09:00", "side": "BUY", "code": "010120", "name": "LS ELECTRIC", "price": 231500, "qty": 14, "cost": 3241486, "path": "pullback", "reason": "눌림목 지정가 232,322 도달", "stop": 197600, "target": 299300, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "231,250 vs 231,225"}, {"label": "정배열(5>10)", "ok": true, "detail": "235,350 / 231,225"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "235,350 / 221,484"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-16.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +29 · 기 -72 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+12%"}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.89% (환산) vs 평균 0.88% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 291,000"}, {"label": "거래량 급증", "ok": true, "detail": "2,836,457 (환산) vs 평균 1,321,579"}, {"label": "회전율 급증", "ok": true, "detail": "1.89% (환산) vs 평균 0.88%"}, {"label": "RSI", "ok": true, "detail": "47"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 232,322 (현재 231,250)"}]}
{"ts": "2026-06-24T11:12:06.271547+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 18260, "qty": 142, "cost": 2593309, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 13981, "target": 23847, "signals": [{"label": "손절선", "ok": true, "detail": "13,981 (현재 18,250)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 23,847"}, {"label": "추세(10일선)", "ok": true, "detail": "13,847"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +1,742 · 기 -508"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 18,094"}]}
{"ts": "2026-06-25T09:00:28.880475+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 179100, "qty": 11, "cost": 1970396, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 120729, "target": 233143, "signals": [{"label": "손절선", "ok": true, "detail": "120,729 (현재 178,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 233,143"}, {"label": "추세(10일선)", "ok": true, "detail": "155,410"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -56 · 기 +134"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 167,275"}]}
{"ts": "2026-06-25T09:04:06.187066+09:00", "side": "SELL", "code": "010120", "name": "LS ELECTRIC", "price": 228500, "qty": 14, "proceeds": 3192762, "entry_price": 231500, "pnl": -48724, "pnl_pct": -1.3, "hold_from": "2026-06-24T11:12:06.270710+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "197,600 (현재 229,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 299,300"}, {"label": "추세(10일선)", "ok": false, "detail": "231,000"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -56 · 기 -20"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 243,750"}]}
{"ts": "2026-06-25T09:04:06.187754+09:00", "side": "BUY", "code": "003490", "name": "대한항공", "price": 28900, "qty": 187, "cost": 5405111, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 26248, "target": 34203, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "28,850 vs 25,540"}, {"label": "정배열(5>10)", "ok": true, "detail": "26,110 / 25,540"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "26,110 / 25,216"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-2.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +1,577 · 기 -7 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.9/5"}, {"label": "상승여력", "ok": true, "detail": "+15%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.54% (환산) vs 평균 0.58% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 28,400"}, {"label": "거래량 급증", "ok": true, "detail": "5,629,873 (환산) vs 평균 2,146,231"}, {"label": "회전율 급증", "ok": true, "detail": "1.54% (환산) vs 평균 0.58%"}, {"label": "RSI", "ok": true, "detail": "64"}]}
{"ts": "2026-06-26T09:00:09.933144+09:00", "side": "SELL", "code": "298040", "name": "효성중공업", "price": 3285000, "qty": 1, "proceeds": 3278594, "entry_price": 3474000, "pnl": -195927, "pnl_pct": -5.44, "hold_from": "2026-06-24T10:06:01.728021+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "2,985,000 (현재 3,290,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 4,452,000"}, {"label": "추세(10일선)", "ok": false, "detail": "3,651,600"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -5 · 기 -14"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 3,613,320"}]}
{"ts": "2026-06-26T09:00:09.934097+09:00", "side": "SELL", "code": "403870", "name": "HPSP", "price": 50000, "qty": 35, "proceeds": 1746588, "entry_price": 62900, "pnl": -455243, "pnl_pct": -20.51, "hold_from": "2026-06-17T16:47:31.348671+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "48,962 (현재 51,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 90,776"}, {"label": "추세(10일선)", "ok": false, "detail": "52,330"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -311 · 기 -267"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 66,756"}]}
{"ts": "2026-06-26T10:14:04.087844+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 166900, "qty": 12, "cost": 2003100, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 120251, "target": 229599, "signals": [{"label": "손절선", "ok": true, "detail": "120,251 (현재 166,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 229,599"}, {"label": "추세(10일선)", "ok": true, "detail": "129,220"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -126 · 기 +320"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 165,659"}]}
{"ts": "2026-06-29T11:36:01.290723+09:00", "side": "BUY", "code": "034730", "name": "SK", "price": 745000, "qty": 3, "cost": 2235335, "path": "pullback", "reason": "눌림목 지정가 748,914 도달", "stop": 612829, "target": 1009343, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "744,000 vs 735,600"}, {"label": "정배열(5>10)", "ok": true, "detail": "766,800 / 735,600"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "766,800 / 530,600"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+12.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -194 · 기 +152 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+8%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.35% (환산) vs 평균 0.45% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 883,000"}, {"label": "거래량 급증", "ok": true, "detail": "977,966 (환산) vs 평균 329,863"}, {"label": "회전율 급증", "ok": true, "detail": "1.35% (환산) vs 평균 0.45%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 748,914 (현재 744,000)"}]}
{"ts": "2026-06-29T14:18:01.511202+09:00", "side": "BUY", "code": "034730", "name": "SK", "price": 778000, "qty": 3, "cost": 2334350, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 612829, "target": 1009343, "signals": [{"label": "손절선", "ok": true, "detail": "612,829 (현재 779,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 1,009,343"}, {"label": "추세(10일선)", "ok": true, "detail": "739,100"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -200 · 기 +143"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 778,043"}]}
{"ts": "2026-06-30T09:00:10.893524+09:00", "side": "BUY", "code": "403870", "name": "HPSP", "price": 55300, "qty": 40, "cost": 2212332, "path": "pullback", "reason": "눌림목 지정가 63,981 도달", "stop": 43200, "target": 79500, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "53,700 vs 52,600"}, {"label": "정배열(5>10)", "ok": true, "detail": "58,060 / 52,600"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "58,060 / 49,679"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+12.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +222 · 기 -821 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+28%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.00% (환산) vs 평균 5.97% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 71,500"}, {"label": "거래량 급증", "ok": false, "detail": "827 (환산) vs 평균 4,912,598"}, {"label": "회전율 급증", "ok": false, "detail": "0.00% (환산) vs 평균 5.97%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 63,981 (현재 53,700)"}]}
{"ts": "2026-07-01T09:06:03.238896+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 357500, "qty": 11, "cost": 3933090, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 314220, "target": 444060, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "357,000 vs 307,050"}, {"label": "정배열(5>10)", "ok": true, "detail": "317,600 / 307,050"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "317,600 / 305,700"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+32.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -75 · 기 +221 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+35%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.89% (환산) vs 평균 0.93% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 334,500"}, {"label": "거래량 급증", "ok": true, "detail": "196,247 (환산) vs 평균 96,436"}, {"label": "회전율 급증", "ok": true, "detail": "1.89% (환산) vs 평균 0.93%"}, {"label": "RSI", "ok": true, "detail": "68"}]}
{"ts": "2026-07-01T09:24:02.338393+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 372000, "qty": 11, "cost": 4092614, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 314220, "target": 444060, "signals": [{"label": "손절선", "ok": true, "detail": "314,220 (현재 372,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 444,060"}, {"label": "추세(10일선)", "ok": true, "detail": "308,550"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -75 · 기 +221"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 368,499"}]}
{"ts": "2026-07-02T10:18:03.875115+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 122200, "qty": 43, "cost": 5255388, "path": "pullback", "reason": "눌림목 지정가 122,215 도달", "stop": 111000, "target": 144600, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "122,000 vs 119,760"}, {"label": "정배열(5>10)", "ok": true, "detail": "121,000 / 119,760"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "121,000 / 118,432"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+10.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +22 · 기 -44 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+29%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.80% (환산) vs 평균 0.37% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 130,700"}, {"label": "거래량 급증", "ok": true, "detail": "2,199,199 (환산) vs 평균 1,026,357"}, {"label": "회전율 급증", "ok": true, "detail": "0.80% (환산) vs 평균 0.37%"}, {"label": "RSI", "ok": true, "detail": "52"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 122,215 (현재 122,000)"}]}
{"ts": "2026-07-02T11:04:07.665007+09:00", "side": "BUY", "code": "003490", "name": "대한항공", "price": 29600, "qty": 183, "cost": 5417613, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 26248, "target": 34203, "signals": [{"label": "손절선", "ok": true, "detail": "26,248 (현재 29,600)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 34,203"}, {"label": "추세(10일선)", "ok": true, "detail": "25,615"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -206 · 기 +1,008"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 29,586"}]}
{"ts": "2026-07-03T09:04:01.696234+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 14370, "qty": 292, "proceeds": 4187858, "entry_price": 17751, "pnl": -996340, "pnl_pct": -19.05, "hold_from": "2026-06-24T09:12:05.775786+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "14,457 (현재 14,390)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 24,340"}, {"label": "추세(10일선)", "ok": true, "detail": "13,461"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -1,591 · 기 +253"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-03T09:28:01.666133+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 125700, "qty": 25, "proceeds": 3136372, "entry_price": 161596, "pnl": -904134, "pnl_pct": -22.21, "hold_from": "2026-06-24T09:04:06.145784+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "125,761 (현재 125,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 233,266"}, {"label": "추세(10일선)", "ok": true, "detail": "125,120"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +674 · 기 -2,170"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-03T10:16:03.277539+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 126200, "qty": 42, "cost": 5301195, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 111000, "target": 144600, "signals": [{"label": "손절선", "ok": true, "detail": "111,000 (현재 126,200)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 144,600"}, {"label": "추세(10일선)", "ok": true, "detail": "120,180"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -140 · 기 +278"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 125,493"}]}
{"ts": "2026-07-03T10:24:02.798365+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19040, "qty": 313, "cost": 5960414, "path": "pullback", "reason": "눌림목 지정가 20,004 도달", "stop": 17760, "target": 21600, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "19,030 vs 18,951"}, {"label": "정배열(5>10)", "ok": true, "detail": "19,592 / 18,951"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,592 / 19,359"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+2.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -35 · 기 +168 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+34%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.54% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "619,193 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.54% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "49"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 20,004 (현재 19,030)"}]}
{"ts": "2026-07-06T09:00:11.637613+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 130600, "qty": 13, "cost": 1698055, "path": "pullback", "reason": "눌림목 지정가 164,068 도달", "stop": 96000, "target": 199800, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "133,100 vs 125,860"}, {"label": "정배열(5>10)", "ok": true, "detail": "138,640 / 125,860"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "138,640 / 121,318"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+17.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +782 · 기 -1,979 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+31%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.01% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": false, "detail": "4,080 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": false, "detail": "0.01% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "52"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 164,068 (현재 133,100)"}]}
{"ts": "2026-07-06T09:46:01.674804+09:00", "side": "SELL", "code": "214450", "name": "파마리서치", "price": 320500, "qty": 22, "proceeds": 7037251, "entry_price": 364750, "pnl": -988453, "pnl_pct": -12.13, "hold_from": "2026-07-01T09:06:03.238895+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "320,756 (현재 320,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 452,739"}, {"label": "추세(10일선)", "ok": true, "detail": "303,400"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -111 · 기 +227"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-06T10:02:06.384555+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 13370, "qty": 157, "cost": 2099405, "path": "pullback", "reason": "눌림목 지정가 17,049 도달", "stop": 10360, "target": 19390, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "13,370 vs 13,359"}, {"label": "정배열(5>10)", "ok": true, "detail": "15,582 / 13,359"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "15,582 / 11,434"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-11.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,199 · 기 +137 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+50%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "12.53% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": true, "detail": "13,437,708 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": true, "detail": "12.53% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 17,049 (현재 13,370)"}]}
{"ts": "2026-07-07T09:48:07.786285+09:00", "side": "SELL", "code": "403870", "name": "HPSP", "price": 43000, "qty": 40, "proceeds": 1716646, "entry_price": 55300, "pnl": -495686, "pnl_pct": -22.24, "hold_from": "2026-06-30T09:00:10.893514+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "43,200 (현재 43,050)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 79,500"}, {"label": "추세(10일선)", "ok": false, "detail": "51,535"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +1,424 · 기 -5,706"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 59,449"}]}
{"ts": "2026-07-07T10:30:07.385339+09:00", "side": "SELL", "code": "034730", "name": "SK", "price": 628000, "qty": 6, "proceeds": 3760652, "entry_price": 761500, "pnl": -809033, "pnl_pct": -17.53, "hold_from": "2026-06-29T11:36:01.290722+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "629,329 (현재 628,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 1,025,843"}, {"label": "추세(10일선)", "ok": false, "detail": "724,000"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -58 · 기 +6"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-07T12:02:08.262891+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 12230, "qty": 157, "proceeds": 1916366, "entry_price": 13370, "pnl": -183039, "pnl_pct": -8.53, "hold_from": "2026-07-06T10:02:06.384550+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "10,360 (현재 12,230)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 19,390"}, {"label": "추세(10일선)", "ok": false, "detail": "13,245"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -1,558 · 기 -4"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 14,372"}]}
{"ts": "2026-07-07T14:10:10.484381+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 183300, "qty": 9, "cost": 1649947, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 96000, "target": 199800, "signals": [{"label": "손절선", "ok": true, "detail": "96,000 (현재 183,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 199,800"}, {"label": "추세(10일선)", "ok": true, "detail": "123,150"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +263 · 기 -1,543"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 139,025"}]}
{"ts": "2026-07-07T14:10:10.486606+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 20750, "qty": 287, "cost": 5956143, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 17760, "target": 21600, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 20,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,600"}, {"label": "추세(10일선)", "ok": true, "detail": "18,901"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +156 · 기 +113"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,358"}]}
{"ts": "2026-07-08T09:00:20.439012+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 108300, "qty": 22, "proceeds": 2377954, "entry_price": 152159, "pnl": -970048, "pnl_pct": -28.82, "hold_from": "2026-07-06T09:00:11.637606+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "118,460 (현재 112,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 219,558"}, {"label": "추세(10일선)", "ok": false, "detail": "123,820"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +243 · 기 -857"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-09T09:36:03.480276+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 132000, "qty": 30, "cost": 3960594, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 117015, "target": 161970, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "131,900 vs 108,660"}, {"label": "정배열(5>10)", "ok": true, "detail": "115,560 / 108,660"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "115,560 / 113,228"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+22.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -184 · 기 +964 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+13%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.91% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 116,900"}, {"label": "거래량 급증", "ok": true, "detail": "1,026,867 (환산) vs 평균 359,705"}, {"label": "회전율 급증", "ok": true, "detail": "0.91% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-07-09T12:12:04.879546+09:00", "side": "SELL", "code": "003490", "name": "대한항공", "price": 26500, "qty": 370, "proceeds": 9785880, "entry_price": 29246, "pnl": -1036843, "pnl_pct": -9.39, "hold_from": "2026-06-25T09:04:06.187750+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "26,502 (현재 26,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 34,735"}, {"label": "추세(10일선)", "ok": true, "detail": "25,305"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -1,444 · 기 +2,767"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-10T09:24:02.504790+09:00", "side": "BUY", "code": "105560", "name": "KB금융", "price": 184900, "qty": 23, "cost": 4253338, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 165505, "target": 223689, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "184,800 vs 158,260"}, {"label": "정배열(5>10)", "ok": true, "detail": "159,740 / 158,260"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "159,740 / 157,355"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+26.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,310 · 기 +1,527 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+17%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.97% (환산) vs 평균 0.46% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 182,700"}, {"label": "거래량 급증", "ok": true, "detail": "3,410,527 (환산) vs 평균 1,640,325"}, {"label": "회전율 급증", "ok": true, "detail": "0.97% (환산) vs 평균 0.46%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-07-10T11:06:06.492597+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 13660, "qty": 140, "cost": 1912687, "path": "pullback", "reason": "눌림목 지정가 16,984 도달", "stop": 10360, "target": 20260, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "13,630 vs 13,385"}, {"label": "정배열(5>10)", "ok": true, "detail": "15,634 / 13,385"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "15,634 / 11,439"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+6.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +210 · 기 +239 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+47%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "14.23% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": true, "detail": "15,267,605 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": true, "detail": "14.23% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "52"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 16,984 (현재 13,630)"}]}
{"ts": "2026-07-10T12:14:02.693532+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 126200, "qty": 15, "cost": 1893284, "path": "pullback", "reason": "눌림목 지정가 162,268 도달", "stop": 96000, "target": 186600, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "126,200 vs 125,170"}, {"label": "정배열(5>10)", "ok": true, "detail": "137,260 / 125,170"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "137,260 / 121,203"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+17.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +483 · 기 -241 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+38%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "7.53% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": true, "detail": "3,695,762 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": true, "detail": "7.53% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 162,268 (현재 126,200)"}]}
{"ts": "2026-07-13T09:00:12.396262+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 136900, "qty": 29, "cost": 3970696, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 117015, "target": 161970, "signals": [{"label": "손절선", "ok": true, "detail": "117,015 (현재 136,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 161,970"}, {"label": "추세(10일선)", "ok": true, "detail": "109,100"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -64 · 기 +919"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 135,864"}]}
{"ts": "2026-07-13T09:12:04.324565+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 341500, "qty": 11, "cost": 3757063, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 300363, "target": 423774, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "341,000 vs 305,450"}, {"label": "정배열(5>10)", "ok": true, "detail": "314,400 / 305,450"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "314,400 / 305,433"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+32.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -63 · 기 +144 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+41%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.90% (환산) vs 평균 0.93% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 334,500"}, {"label": "거래량 급증", "ok": true, "detail": "197,687 (환산) vs 평균 96,436"}, {"label": "회전율 급증", "ok": true, "detail": "1.90% (환산) vs 평균 0.93%"}, {"label": "RSI", "ok": true, "detail": "64"}]}
{"ts": "2026-07-13T09:24:06.471276+09:00", "side": "BUY", "code": "105560", "name": "KB금융", "price": 190400, "qty": 23, "cost": 4379857, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 165505, "target": 223689, "signals": [{"label": "손절선", "ok": true, "detail": "165,505 (현재 190,400)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 223,689"}, {"label": "추세(10일선)", "ok": true, "detail": "158,820"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -867 · 기 +1,393"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 189,927"}]}
{"ts": "2026-07-13T09:26:03.431888+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 139100, "qty": 13, "cost": 1808571, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 96000, "target": 186600, "signals": [{"label": "손절선", "ok": true, "detail": "96,000 (현재 139,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 186,600"}, {"label": "추세(10일선)", "ok": true, "detail": "126,460"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -213 · 기 +772"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 136,162"}]}
{"ts": "2026-07-15T14:32:01.906503+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18570, "qty": 600, "proceeds": 11120273, "entry_price": 19858, "pnl": -796284, "pnl_pct": -6.49, "hold_from": "2026-07-03T10:24:02.798364+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "18,586 (현재 18,570)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,402"}, {"label": "추세(10일선)", "ok": false, "detail": "18,905"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -214 · 기 +240"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-16T09:28:03.502833+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 353000, "qty": 11, "cost": 3883582, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 300363, "target": 423774, "signals": [{"label": "손절선", "ok": true, "detail": "300,363 (현재 352,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 423,774"}, {"label": "추세(10일선)", "ok": true, "detail": "306,600"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -33 · 기 +28"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 351,963"}]}
{"ts": "2026-07-20T12:28:02.338385+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 10310, "qty": 140, "proceeds": 1440585, "entry_price": 13660, "pnl": -472101, "pnl_pct": -24.52, "hold_from": "2026-07-10T11:06:06.492596+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "10,360 (현재 10,310)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 20,260"}, {"label": "추세(10일선)", "ok": false, "detail": "12,013"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -887 · 기 +515"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 14,626"}]}
{"ts": "2026-07-20T12:58:05.505774+09:00", "side": "SELL", "code": "105560", "name": "KB금융", "price": 166600, "qty": 46, "proceeds": 7648656, "entry_price": 187650, "pnl": -984539, "pnl_pct": -11.22, "hold_from": "2026-07-10T09:24:02.504787+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "167,541 (현재 166,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 227,868"}, {"label": "추세(10일선)", "ok": true, "detail": "156,450"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -385 · 기 +288"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-21T14:20:02.206535+09:00", "side": "BUY", "code": "003490", "name": "대한항공", "price": 25350, "qty": 222, "cost": 5628544, "path": "pullback", "reason": "눌림목 지정가 25,328 도달", "stop": 23650, "target": 28750, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "25,300 vs 25,185"}, {"label": "정배열(5>10)", "ok": true, "detail": "25,400 / 25,185"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "25,400 / 25,157"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+18.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +524 · 기 +141 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.9/5"}, {"label": "상승여력", "ok": true, "detail": "+44%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.44% (환산) vs 평균 0.58% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 28,400"}, {"label": "거래량 급증", "ok": false, "detail": "1,611,169 (환산) vs 평균 2,146,231"}, {"label": "회전율 급증", "ok": false, "detail": "0.44% (환산) vs 평균 0.58%"}, {"label": "RSI", "ok": true, "detail": "49"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 25,328 (현재 25,300)"}]}
{"ts": "2026-07-22T14:18:05.445917+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 14030, "qty": 152, "cost": 2132880, "path": "pullback", "reason": "눌림목 지정가 14,023 도달", "stop": 11077, "target": 19936, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "14,020 vs 12,975"}, {"label": "정배열(5>10)", "ok": true, "detail": "14,552 / 12,975"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "14,552 / 13,283"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+10.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,005 · 기 +1,723 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.97% (환산) vs 평균 1.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 15,870"}, {"label": "거래량 급증", "ok": false, "detail": "585,754 (환산) vs 평균 882,736"}, {"label": "회전율 급증", "ok": false, "detail": "0.97% (환산) vs 평균 1.47%"}, {"label": "RSI", "ok": true, "detail": "53"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 14,023 (현재 14,020)"}]}
{"ts": "2026-07-23T09:00:25.805090+09:00", "side": "SELL", "code": "003490", "name": "대한항공", "price": 24900, "qty": 222, "proceeds": 5517021, "entry_price": 25350, "pnl": -111523, "pnl_pct": -1.78, "hold_from": "2026-07-21T14:20:02.206534+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "23,650 (현재 24,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 28,750"}, {"label": "추세(10일선)", "ok": false, "detail": "25,145"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -381 · 기 -427"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 25,990"}]}
{"ts": "2026-07-23T09:50:01.535676+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 88200, "qty": 42, "cost": 3704956, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 77564, "target": 109473, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "88,200 vs 80,900"}, {"label": "정배열(5>10)", "ok": true, "detail": "83,000 / 80,900"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "83,000 / 75,058"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+47.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -150 · 기 +299 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+17%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.85% (환산) vs 평균 0.42% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 87,600"}, {"label": "거래량 급증", "ok": true, "detail": "785,587 (환산) vs 평균 392,182"}, {"label": "회전율 급증", "ok": true, "detail": "0.85% (환산) vs 평균 0.42%"}, {"label": "RSI", "ok": true, "detail": "67"}]}
{"ts": "2026-07-23T10:24:01.524474+09:00", "side": "SELL", "code": "095610", "name": "테스", "price": 152100, "qty": 24, "proceeds": 3643282, "entry_price": 167779, "pnl": -384022, "pnl_pct": -9.35, "hold_from": "2026-06-24T09:46:05.179968+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "131,479 (현재 152,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 240,379"}, {"label": "추세(10일선)", "ok": false, "detail": "152,780"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -101 · 기 -107"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-23T10:30:02.506420+09:00", "side": "BUY", "code": "024060", "name": "흥구석유", "price": 14140, "qty": 185, "cost": 2616292, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 11706, "target": 19008, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "14,180 vs 12,429"}, {"label": "정배열(5>10)", "ok": true, "detail": "13,154 / 12,429"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "13,154 / 12,687"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+55.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +109 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "84.26% (환산) vs 평균 31.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 13,990"}, {"label": "거래량 급증", "ok": true, "detail": "12,639,979 (환산) vs 평균 4,720,532"}, {"label": "회전율 급증", "ok": true, "detail": "84.26% (환산) vs 평균 31.47%"}, {"label": "RSI", "ok": true, "detail": "66"}]}
{"ts": "2026-07-23T12:54:04.517542+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 90900, "qty": 41, "cost": 3727459, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 77564, "target": 109473, "signals": [{"label": "손절선", "ok": true, "detail": "77,564 (현재 91,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 109,473"}, {"label": "추세(10일선)", "ok": true, "detail": "81,180"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -169 · 기 +311"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 90,945"}]}
{"ts": "2026-07-24T09:00:09.008368+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 111800, "qty": 28, "proceeds": 3124296, "entry_price": 132189, "pnl": -577559, "pnl_pct": -15.42, "hold_from": "2026-07-10T12:14:02.693531+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "96,000 (현재 113,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 204,568"}, {"label": "추세(10일선)", "ok": false, "detail": "123,880"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -480 · 기 -206"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-24T09:00:09.009227+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 155500, "qty": 12, "cost": 1866280, "path": "pullback", "reason": "눌림목 지정가 158,093 도달", "stop": 117686, "target": 231128, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "155,000 vs 153,080"}, {"label": "정배열(5>10)", "ok": true, "detail": "171,640 / 153,080"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "171,640 / 99,700"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+44.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +200 · 기 -454 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+27%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "3.77% (환산) vs 평균 3.06% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 202,500"}, {"label": "거래량 급증", "ok": false, "detail": "730,327 (환산) vs 평균 591,925"}, {"label": "회전율 급증", "ok": false, "detail": "3.77% (환산) vs 평균 3.06%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 158,093 (현재 155,000)"}]}
{"ts": "2026-07-24T09:02:04.063974+09:00", "side": "BUY", "code": "024060", "name": "흥구석유", "price": 15060, "qty": 174, "cost": 2620833, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 11706, "target": 19008, "signals": [{"label": "손절선", "ok": true, "detail": "11,706 (현재 15,020)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 19,008"}, {"label": "추세(10일선)", "ok": true, "detail": "12,513"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +208 · 기 -2"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 14,766"}]}
{"ts": "2026-07-24T09:28:04.969410+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 14510, "qty": 147, "cost": 2133290, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 11077, "target": 19936, "signals": [{"label": "손절선", "ok": true, "detail": "11,077 (현재 15,400)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 19,936"}, {"label": "추세(10일선)", "ok": true, "detail": "13,113"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -857 · 기 +1,172"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 14,791"}]}
{"ts": "2026-07-24T10:02:04.460952+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 18950, "qty": 300, "cost": 5685853, "path": "pullback", "reason": "눌림목 지정가 20,012 도달", "stop": 17760, "target": 21330, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "18,950 vs 18,943"}, {"label": "정배열(5>10)", "ok": true, "detail": "19,576 / 18,943"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,576 / 19,358"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+19.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +2 · 기 -5 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.39% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "454,069 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.39% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "49"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 20,012 (현재 18,950)"}]}
{"ts": "2026-07-27T09:10:01.062860+09:00", "side": "SELL", "code": "024060", "name": "흥구석유", "price": 12030, "qty": 359, "proceeds": 4310348, "entry_price": 14586, "pnl": -926777, "pnl_pct": -17.52, "hold_from": "2026-07-23T10:30:02.506419+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "12,082 (현재 12,030)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 19,594"}, {"label": "추세(10일선)", "ok": false, "detail": "12,214"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -85 · 기 +2"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-27T09:12:01.542201+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 7850, "qty": 404, "cost": 3171876, "path": "pullback", "reason": "눌림목 지정가 7,907 도달", "stop": 6743, "target": 10064, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "7,840 vs 5,428"}, {"label": "정배열(5>10)", "ok": true, "detail": "6,526 / 5,428"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,526 / 4,895"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+91.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +49 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "11.17% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "693,433 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": true, "detail": "11.17% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": false, "detail": "80"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,907 (현재 7,840)"}]}
{"ts": "2026-07-27T12:56:04.257218+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 8300, "qty": 382, "cost": 3171076, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 6743, "target": 10064, "signals": [{"label": "손절선", "ok": true, "detail": "6,743 (현재 8,310)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 10,064"}, {"label": "추세(10일선)", "ok": true, "detail": "5,476"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +50 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 8,127"}]}
{"ts": "2026-07-27T13:38:04.253231+09:00", "side": "SELL", "code": "003680", "name": "한성기업", "price": 6880, "qty": 786, "proceeds": 5397135, "entry_price": 8069, "pnl": -945816, "pnl_pct": -14.73, "hold_from": "2026-07-27T09:12:01.542199+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "6,962 (현재 6,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 10,282"}, {"label": "추세(10일선)", "ok": true, "detail": "5,334"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +50 · 기 +0"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-28T09:00:18.311555+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6780, "qty": 379, "cost": 2570005, "path": "pullback", "reason": "눌림목 지정가 7,884 도달", "stop": 5628, "target": 9085, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "7,050 vs 5,350"}, {"label": "정배열(5>10)", "ok": true, "detail": "6,368 / 5,350"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,368 / 4,882"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+73.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +86 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.01% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "813 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "0.01% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "69"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,884 (현재 7,050)"}]}
{"ts": "2026-07-28T09:10:01.764446+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 7100, "qty": 362, "cost": 2570586, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 5628, "target": 9085, "signals": [{"label": "손절선", "ok": true, "detail": "5,628 (현재 7,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 9,085"}, {"label": "추세(10일선)", "ok": true, "detail": "5,354"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +86 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 7,079"}]}
{"ts": "2026-07-28T10:08:02.791861+09:00", "side": "SELL", "code": "252990", "name": "샘씨엔에스", "price": 11170, "qty": 299, "proceeds": 3333317, "entry_price": 14266, "pnl": -932852, "pnl_pct": -21.7, "hold_from": "2026-07-22T14:18:05.445916+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "11,223 (현재 11,220)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 20,352"}, {"label": "추세(10일선)", "ok": false, "detail": "12,695"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +106 · 기 -64"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T09:02:02.257867+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 117900, "qty": 45, "cost": 5306296, "path": "pullback", "reason": "눌림목 지정가 118,115 도달", "stop": 111200, "target": 131300, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "117,800 vs 116,390"}, {"label": "정배열(5>10)", "ok": true, "detail": "117,020 / 116,390"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "117,020 / 109,982"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+45.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +39 · 기 +307 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+26%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.03% (환산) vs 평균 0.17% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 123,300"}, {"label": "거래량 급증", "ok": false, "detail": "44,660 (환산) vs 평균 289,522"}, {"label": "회전율 급증", "ok": false, "detail": "0.03% (환산) vs 평균 0.17%"}, {"label": "RSI", "ok": true, "detail": "57"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 118,115 (현재 117,800)"}]}
{"ts": "2026-07-29T09:16:04.488056+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 120500, "qty": 44, "cost": 5302795, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 111200, "target": 131300, "signals": [{"label": "손절선", "ok": true, "detail": "111,200 (현재 120,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 131,300"}, {"label": "추세(10일선)", "ok": true, "detail": "116,660"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +39 · 기 +307"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 120,492"}]}
{"ts": "2026-07-29T09:24:10.030807+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 122600, "qty": 15, "cost": 1839276, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 117686, "target": 231128, "signals": [{"label": "손절선", "ok": true, "detail": "117,686 (현재 177,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 231,128"}, {"label": "추세(10일선)", "ok": true, "detail": "148,710"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +453 · 기 -688"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 164,742"}]}
{"ts": "2026-07-29T09:24:10.030921+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 18950, "qty": 300, "cost": 5685853, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 17760, "target": 21330, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 20,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,330"}, {"label": "추세(10일선)", "ok": true, "detail": "18,901"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +99 · 기 +138"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,268"}]}
{"ts": "2026-07-29T09:24:10.031108+09:00", "side": "SELL", "code": "010950", "name": "S-Oil", "price": 128600, "qty": 59, "proceeds": 7572605, "entry_price": 134408, "pnl": -358685, "pnl_pct": -4.32, "hold_from": "2026-07-09T09:36:03.480275+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "118,952 (현재 116,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 165,321"}, {"label": "추세(10일선)", "ok": true, "detail": "105,620"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +43 · 기 +245"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T09:28:01.405241+09:00", "side": "BUY", "code": "090850", "name": "현대이지웰", "price": 6390, "qty": 817, "cost": 5221413, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 5867, "target": 7435, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "6,380 vs 5,591"}, {"label": "정배열(5>10)", "ok": true, "detail": "5,742 / 5,591"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "5,742 / 5,622"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+43.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +73 · 기 -3 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.62% (환산) vs 평균 0.22% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 5,700"}, {"label": "거래량 급증", "ok": true, "detail": "134,413 (환산) vs 평균 49,512"}, {"label": "회전율 급증", "ok": true, "detail": "0.62% (환산) vs 평균 0.22%"}, {"label": "RSI", "ok": true, "detail": "73"}]}
{"ts": "2026-07-29T10:18:05.395067+09:00", "side": "SELL", "code": "095610", "name": "테스", "price": 116400, "qty": 27, "proceeds": 3136672, "entry_price": 137222, "pnl": -568884, "pnl_pct": -15.17, "hold_from": "2026-07-24T09:00:09.009222+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "117,686 (현재 115,800)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 210,267"}, {"label": "추세(10일선)", "ok": false, "detail": "149,160"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +445 · 기 -685"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T12:04:01.708942+09:00", "side": "SELL", "code": "086790", "name": "하나금융지주", "price": 119200, "qty": 85, "proceeds": 10112243, "entry_price": 124176, "pnl": -444341, "pnl_pct": -4.01, "hold_from": "2026-07-02T10:18:03.875113+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "111,006 (현재 119,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 150,518"}, {"label": "추세(10일선)", "ok": false, "detail": "119,490"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -11 · 기 -51"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T13:06:06.538231+09:00", "side": "SELL", "code": "003680", "name": "한성기업", "price": 5690, "qty": 741, "proceeds": 4208068, "entry_price": 6936, "pnl": -932523, "pnl_pct": -17.97, "hold_from": "2026-07-28T09:00:18.311548+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,741 (현재 5,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 9,327"}, {"label": "추세(10일선)", "ok": true, "detail": "5,214"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +185 · 기 +0"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T13:34:03.610479+09:00", "side": "SELL", "code": "090850", "name": "현대이지웰", "price": 5860, "qty": 817, "proceeds": 4778284, "entry_price": 6390, "pnl": -443129, "pnl_pct": -8.29, "hold_from": "2026-07-29T09:28:01.405240+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,867 (현재 5,860)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 7,435"}, {"label": "추세(10일선)", "ok": true, "detail": "5,539"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +73 · 기 -3"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,525"}]}
{"ts": "2026-07-30T09:04:07.521825+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 121300, "qty": 40, "cost": 4852728, "path": "pullback", "reason": "눌림목 지정가 122,665 도달", "stop": 111000, "target": 141900, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "121,200 vs 119,680"}, {"label": "정배열(5>10)", "ok": true, "detail": "120,840 / 119,680"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "120,840 / 118,418"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+34.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -214 · 기 +182 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+36%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.18% (환산) vs 평균 0.37% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 130,700"}, {"label": "거래량 급증", "ok": false, "detail": "494,880 (환산) vs 평균 1,026,357"}, {"label": "회전율 급증", "ok": false, "detail": "0.18% (환산) vs 평균 0.37%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 122,665 (현재 121,200)"}]}
{"ts": "2026-07-30T09:04:07.522093+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6130, "qty": 313, "cost": 1918978, "path": "pullback", "reason": "눌림목 지정가 7,792 도달", "stop": 4793, "target": 8804, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "6,120 vs 5,256"}, {"label": "정배열(5>10)", "ok": true, "detail": "6,182 / 5,256"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,182 / 4,866"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+65.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +234 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "4.31% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "267,687 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "4.31% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,792 (현재 6,120)"}]}
{"ts": "2026-07-30T09:16:11.967598+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 125200, "qty": 39, "cost": 4883532, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 111000, "target": 141900, "signals": [{"label": "손절선", "ok": true, "detail": "111,000 (현재 125,400)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 141,900"}, {"label": "추세(10일선)", "ok": true, "detail": "120,100"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -214 · 기 +182"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 124,618"}]}
{"ts": "2026-07-30T09:24:07.568344+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 131800, "qty": 28, "cost": 3690954, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 116987, "target": 161427, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "132,000 vs 108,670"}, {"label": "정배열(5>10)", "ok": true, "detail": "115,580 / 108,670"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "115,580 / 113,230"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+51.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -6 · 기 +178 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+20%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.66% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 116,900"}, {"label": "거래량 급증", "ok": true, "detail": "738,813 (환산) vs 평균 359,705"}, {"label": "회전율 급증", "ok": true, "detail": "0.66% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-07-30T09:26:07.515659+09:00", "side": "BUY", "code": "090850", "name": "현대이지웰", "price": 6300, "qty": 832, "cost": 5242386, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 5789, "target": 7322, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "6,280 vs 5,581"}, {"label": "정배열(5>10)", "ok": true, "detail": "5,722 / 5,581"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "5,722 / 5,620"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+46.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +87 · 기 +6 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.51% (환산) vs 평균 0.22% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 5,700"}, {"label": "거래량 급증", "ok": true, "detail": "109,080 (환산) vs 평균 49,512"}, {"label": "회전율 급증", "ok": true, "detail": "0.51% (환산) vs 평균 0.22%"}, {"label": "RSI", "ok": true, "detail": "71"}]}
{"ts": "2026-07-31T09:06:07.673294+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6550, "qty": 293, "cost": 1919438, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 4793, "target": 8804, "signals": [{"label": "손절선", "ok": true, "detail": "4,793 (현재 6,640)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 8,804"}, {"label": "추세(10일선)", "ok": true, "detail": "5,308"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +355 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,453"}]}
{"ts": "2026-07-31T09:06:07.673492+09:00", "side": "SELL", "code": "078930", "name": "GS", "price": 77700, "qty": 83, "proceeds": 6436524, "entry_price": 89534, "pnl": -995890, "pnl_pct": -13.22, "hold_from": "2026-07-23T09:50:01.535674+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "78,554 (현재 78,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 111,492"}, {"label": "추세(10일선)", "ok": false, "detail": "79,880"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -179 · 기 +325"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-31T09:10:13.091947+09:00", "side": "BUY", "code": "003490", "name": "대한항공", "price": 25250, "qty": 201, "cost": 5076011, "path": "pullback", "reason": "눌림목 지정가 25,331 도달", "stop": 23650, "target": 28450, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "25,200 vs 25,175"}, {"label": "정배열(5>10)", "ok": true, "detail": "25,380 / 25,175"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "25,380 / 25,155"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+10.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -414 · 기 +642 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+45%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.35% (환산) vs 평균 0.58% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 28,400"}, {"label": "거래량 급증", "ok": false, "detail": "1,295,520 (환산) vs 평균 2,146,231"}, {"label": "회전율 급증", "ok": false, "detail": "0.35% (환산) vs 평균 0.58%"}, {"label": "RSI", "ok": true, "detail": "48"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 25,331 (현재 25,200)"}]}
{"ts": "2026-07-31T10:36:07.698613+09:00", "side": "BUY", "code": "003490", "name": "대한항공", "price": 26100, "qty": 194, "cost": 5064160, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 23650, "target": 28450, "signals": [{"label": "손절선", "ok": true, "detail": "23,650 (현재 26,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 28,450"}, {"label": "추세(10일선)", "ok": true, "detail": "25,265"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -410 · 기 +640"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 25,884"}]}
{"ts": "2026-08-05T09:02:14.773015+09:00", "side": "SELL", "code": "090850", "name": "현대이지웰", "price": 5700, "qty": 832, "proceeds": 4733152, "entry_price": 6300, "pnl": -509234, "pnl_pct": -9.52, "hold_from": "2026-07-30T09:26:07.515657+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,789 (현재 5,730)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 7,322"}, {"label": "추세(10일선)", "ok": true, "detail": "5,526"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +14 · 기 -2"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,413"}]}
{"ts": "2026-08-05T09:02:14.773222+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 13040, "qty": 154, "cost": 2008461, "path": "pullback", "reason": "눌림목 지정가 13,947 도달", "stop": 10340, "target": 18440, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "13,040 vs 12,877"}, {"label": "정배열(5>10)", "ok": true, "detail": "14,356 / 12,877"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "14,356 / 13,267"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-6.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -72 · 기 +134 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.13% (환산) vs 평균 1.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 15,870"}, {"label": "거래량 급증", "ok": false, "detail": "78,333 (환산) vs 평균 882,736"}, {"label": "회전율 급증", "ok": false, "detail": "0.13% (환산) vs 평균 1.47%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 13,947 (현재 13,040)"}]}
{"ts": "2026-08-05T09:38:13.270070+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 13830, "qty": 146, "cost": 2019483, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 10340, "target": 18440, "signals": [{"label": "손절선", "ok": true, "detail": "10,340 (현재 13,860)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 18,440"}, {"label": "추세(10일선)", "ok": true, "detail": "12,959"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -72 · 기 +134"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,817"}]}
{"ts": "2026-08-06T09:00:22.286269+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18730, "qty": 600, "proceeds": 11216086, "entry_price": 18950, "pnl": -155620, "pnl_pct": -1.16, "hold_from": "2026-07-24T10:02:04.460951+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 18,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,330"}, {"label": "추세(10일선)", "ok": false, "detail": "18,923"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -203 · 기 -147"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-08-06T09:34:17.077651+09:00", "side": "BUY", "code": "068270", "name": "셀트리온", "price": 192000, "qty": 25, "cost": 4800720, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 175344, "target": 225312, "signals": [{"label": "추세(10일선 위)", "ok": true, "detail": "191,800 vs 180,670"}, {"label": "정배열(5>10)", "ok": true, "detail": "186,140 / 180,670"}, {"label": "추세 기울기(10일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "186,140 / 176,671"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+20.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +255 · 기 -319 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+44%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.67% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 191,700"}, {"label": "거래량 급증", "ok": true, "detail": "1,582,767 (환산) vs 평균 738,783"}, {"label": "회전율 급증", "ok": true, "detail": "0.67% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "63"}]}
{"ts": "2026-08-07T09:12:17.883738+09:00", "side": "BUY", "code": "068270", "name": "셀트리온", "price": 196400, "qty": 24, "cost": 4714307, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 175344, "target": 225312, "signals": [{"label": "손절선", "ok": true, "detail": "175,344 (현재 196,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 225,312"}, {"label": "추세(10일선)", "ok": true, "detail": "181,120"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +338 · 기 +73"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 196,264"}]}
{"ts": "2026-08-10T09:00:21.079732+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 136000, "qty": 27, "cost": 3672551, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 116987, "target": 161427, "signals": [{"label": "손절선", "ok": true, "detail": "116,987 (현재 137,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 161,427"}, {"label": "추세(10일선)", "ok": true, "detail": "109,170"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -253 · 기 +225"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 135,714"}]}
@@ -0,0 +1,201 @@
{
"cash": 26742074.230499957,
"initial": 100000000,
"positions": {
"003680": {
"code": "003680",
"name": "한성기업",
"sources": [
"auto"
],
"qty": 852,
"entry_price": 6333.098591549296,
"entry_at": "2026-07-30T09:04:07.525083+09:00",
"stop": 5363,
"target": 7789,
"peak": 6840,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 7,457 도달",
"cur_price": 6220,
"tranches": 2,
"tranche_value": 2702321.452399152,
"last_add_price": 6550
},
"194370": {
"code": "194370",
"name": "제이에스코퍼레이션",
"sources": [
"auto"
],
"qty": 698,
"entry_price": 13159.885386819484,
"entry_at": "2026-08-03T12:00:12.468905+09:00",
"stop": 11874,
"target": 15089,
"peak": 14120,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 13370,
"tranches": 2,
"tranche_value": 4597484.241421635,
"last_add_price": 13420
},
"095610": {
"code": "095610",
"name": "테스",
"sources": [
"auto"
],
"qty": 25,
"entry_price": 141516.0,
"entry_at": "2026-08-04T09:04:10.112981+09:00",
"stop": 111709,
"target": 186227,
"peak": 148000,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 145,918 도달",
"cur_price": 143700,
"tranches": 2,
"tranche_value": 1856071.8339699174,
"last_add_price": 147600
},
"078930": {
"code": "078930",
"name": "GS",
"sources": [
"auto"
],
"qty": 100,
"entry_price": 91919.0,
"entry_at": "2026-08-04T09:50:10.235258+09:00",
"stop": 83395,
"target": 104705,
"peak": 101600,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 97700,
"tranches": 2,
"tranche_value": 4659757.825201359,
"last_add_price": 93500
},
"252990": {
"code": "252990",
"name": "샘씨엔에스",
"sources": [
"auto"
],
"qty": 355,
"entry_price": 13422.760563380281,
"entry_at": "2026-08-05T09:02:14.777207+09:00",
"stop": 11093,
"target": 16917,
"peak": 15670,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 13,170 도달",
"cur_price": 15670,
"tranches": 2,
"tranche_value": 2390089.3312908146,
"last_add_price": 13830
},
"068270": {
"code": "068270",
"name": "셀트리온",
"sources": [
"interest"
],
"qty": 54,
"entry_price": 194200.0,
"entry_at": "2026-08-06T09:34:17.081460+09:00",
"stop": 181408,
"target": 213388,
"peak": 201000,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 201000,
"tranches": 2,
"tranche_value": 5316706.344343748,
"last_add_price": 196400
},
"030000": {
"code": "030000",
"name": "제일기획",
"sources": [
"auto"
],
"qty": 278,
"entry_price": 19120,
"entry_at": "2026-08-07T09:00:20.838249+09:00",
"stop": 18038,
"target": 20743,
"peak": 19330,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 19,668 도달",
"cur_price": 18970,
"tranches": 1,
"tranche_value": 5334796.2471562475,
"last_add_price": 19120
},
"214450": {
"code": "214450",
"name": "파마리서치",
"sources": [
"auto"
],
"qty": 23,
"entry_price": 391652.17391304346,
"entry_at": "2026-08-10T09:00:21.187673+09:00",
"stop": 355549,
"target": 445806,
"peak": 411500,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 409000,
"tranches": 2,
"tranche_value": 4726305.668282297,
"last_add_price": 400000
}
},
"realized_pnl": -16362952.80350003,
"closed_trades": 43,
"wins": 6,
"peak_equity": 100344662.275,
"max_drawdown": 0.16636733158011952,
"last_exit": {
"086790": "2026-07-20",
"030000": "2026-08-06",
"403870": "2026-07-02",
"003490": "2026-07-07",
"240810": "2026-07-24",
"214450": "2026-08-07",
"093370": "2026-07-20",
"034730": "2026-07-08",
"319660": "2026-07-27",
"095610": "2026-07-29",
"105560": "2026-07-20",
"010950": "2026-08-03",
"024060": "2026-07-27",
"003680": "2026-07-29",
"138040": "2026-08-04",
"252990": "2026-07-28",
"090850": "2026-08-06",
"078930": "2026-07-31"
},
"created_at": "2026-06-15T14:55:00.583241+09:00",
"updated_at": "2026-08-10T15:28:16.190010+09:00"
}
@@ -0,0 +1,119 @@
{"ts": "2026-06-17T11:15:02.409673+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 130900, "qty": 47, "cost": 6153223, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 121254, "target": 145369, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "129,300 vs 118,195"}, {"label": "정배열(5>20)", "ok": true, "detail": "120,400 / 118,195"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "120,400 / 118,307"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-13.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +371 · 기 +158 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+22%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.12% (환산) vs 평균 0.38% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 126,500"}, {"label": "거래량 급증", "ok": true, "detail": "3,094,534 (환산) vs 평균 1,031,725"}, {"label": "회전율 급증", "ok": true, "detail": "1.12% (환산) vs 평균 0.38%"}, {"label": "RSI", "ok": true, "detail": "60"}]}
{"ts": "2026-06-19T09:02:06.459894+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19160, "qty": 325, "cost": 6227934, "path": "pullback", "reason": "눌림목 지정가 19,690 도달", "stop": 18100, "target": 20749, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "19,150 vs 18,862"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,616 / 18,862"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,616 / 19,361"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-31.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,162 · 기 +2,080 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.03% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "37,673 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.03% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,690 (현재 19,150)"}]}
{"ts": "2026-06-19T13:32:02.900378+09:00", "side": "SELL", "code": "086790", "name": "하나금융지주", "price": 121100, "qty": 47, "proceeds": 5680601, "entry_price": 130900, "pnl": -472622, "pnl_pct": -7.49, "hold_from": "2026-06-17T11:15:02.409672+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "121,254 (현재 121,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 145,369"}, {"label": "추세(20일선)", "ok": true, "detail": "118,300"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +531 · 기 -129"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 134,178"}]}
{"ts": "2026-06-23T09:00:13.491015+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18820, "qty": 325, "proceeds": 6104573, "entry_price": 19160, "pnl": -123361, "pnl_pct": -1.77, "hold_from": "2026-06-19T09:02:06.459893+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "18,100 (현재 18,710)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 20,749"}, {"label": "추세(20일선)", "ok": false, "detail": "18,840"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -318 · 기 -227"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,528"}]}
{"ts": "2026-06-24T09:02:02.401579+09:00", "side": "BUY", "code": "403870", "name": "HPSP", "price": 53200, "qty": 49, "cost": 2607191, "path": "pullback", "reason": "눌림목 지정가 60,114 도달", "stop": 43200, "target": 68200, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "53,200 vs 52,378"}, {"label": "정배열(5>20)", "ok": true, "detail": "57,960 / 52,378"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "57,960 / 49,671"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+20.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +711 · 기 -2,060 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+29%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.34% (환산) vs 평균 5.97% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 71,500"}, {"label": "거래량 급증", "ok": false, "detail": "1,102,733 (환산) vs 평균 4,912,598"}, {"label": "회전율 급증", "ok": false, "detail": "1.34% (환산) vs 평균 5.97%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 60,114 (현재 53,200)"}]}
{"ts": "2026-06-24T09:08:01.013601+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 155400, "qty": 18, "cost": 2797620, "path": "pullback", "reason": "눌림목 지정가 155,963 도달", "stop": 128063, "target": 196406, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "155,400 vs 121,610"}, {"label": "정배열(5>20)", "ok": true, "detail": "143,100 / 121,610"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "143,100 / 121,690"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+45.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +210 · 기 +143 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+6%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "6.50% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": true, "detail": "3,192,593 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": true, "detail": "6.50% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 155,963 (현재 155,400)"}]}
{"ts": "2026-06-25T09:04:06.192527+09:00", "side": "BUY", "code": "003490", "name": "대한항공", "price": 28900, "qty": 215, "cost": 6214432, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 26911, "target": 31883, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "28,850 vs 25,948"}, {"label": "정배열(5>20)", "ok": true, "detail": "26,110 / 25,948"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "26,110 / 25,216"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-2.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +1,577 · 기 -7 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.9/5"}, {"label": "상승여력", "ok": true, "detail": "+15%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.54% (환산) vs 평균 0.58% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 28,400"}, {"label": "거래량 급증", "ok": true, "detail": "5,629,873 (환산) vs 평균 2,146,231"}, {"label": "회전율 급증", "ok": true, "detail": "1.54% (환산) vs 평균 0.58%"}, {"label": "RSI", "ok": true, "detail": "64"}]}
{"ts": "2026-06-26T09:00:10.033266+09:00", "side": "SELL", "code": "403870", "name": "HPSP", "price": 50000, "qty": 49, "proceeds": 2445222, "entry_price": 53200, "pnl": -161969, "pnl_pct": -6.02, "hold_from": "2026-06-24T09:02:02.401577+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "43,200 (현재 51,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 68,200"}, {"label": "추세(20일선)", "ok": false, "detail": "52,268"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -311 · 기 -267"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 57,056"}]}
{"ts": "2026-06-26T09:04:03.922193+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 164900, "qty": 17, "cost": 2803720, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 128063, "target": 196406, "signals": [{"label": "손절선", "ok": true, "detail": "128,063 (현재 164,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 196,406"}, {"label": "추세(20일선)", "ok": true, "detail": "122,075"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -140 · 기 +323"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 164,359"}]}
{"ts": "2026-06-30T09:00:10.993349+09:00", "side": "BUY", "code": "403870", "name": "HPSP", "price": 55300, "qty": 43, "cost": 2378257, "path": "pullback", "reason": "눌림목 지정가 60,222 도달", "stop": 44022, "target": 72218, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "53,700 vs 52,402"}, {"label": "정배열(5>20)", "ok": true, "detail": "58,060 / 52,402"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "58,060 / 49,679"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+12.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +222 · 기 -821 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+28%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.00% (환산) vs 평균 5.97% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 71,500"}, {"label": "거래량 급증", "ok": false, "detail": "827 (환산) vs 평균 4,912,598"}, {"label": "회전율 급증", "ok": false, "detail": "0.00% (환산) vs 평균 5.97%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 60,222 (현재 53,700)"}]}
{"ts": "2026-07-01T09:06:03.240663+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 357500, "qty": 15, "cost": 5363304, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 325040, "target": 406190, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "357,000 vs 296,975"}, {"label": "정배열(5>20)", "ok": true, "detail": "317,600 / 296,975"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "317,600 / 305,700"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+32.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -75 · 기 +221 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+35%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.89% (환산) vs 평균 0.93% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 334,500"}, {"label": "거래량 급증", "ok": true, "detail": "196,247 (환산) vs 평균 96,436"}, {"label": "회전율 급증", "ok": true, "detail": "1.89% (환산) vs 평균 0.93%"}, {"label": "RSI", "ok": true, "detail": "68"}]}
{"ts": "2026-07-01T09:24:02.340124+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 372000, "qty": 14, "cost": 5208781, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 325040, "target": 406190, "signals": [{"label": "손절선", "ok": true, "detail": "325,040 (현재 372,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 406,190"}, {"label": "추세(20일선)", "ok": true, "detail": "297,725"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -75 · 기 +221"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 368,499"}]}
{"ts": "2026-07-01T09:46:03.128913+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 118200, "qty": 52, "cost": 6147322, "path": "pullback", "reason": "눌림목 지정가 118,779 도달", "stop": 111000, "target": 129000, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "118,200 vs 118,155"}, {"label": "정배열(5>20)", "ok": true, "detail": "120,240 / 118,155"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "120,240 / 118,368"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+3.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +55 · 기 -166 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.35% (환산) vs 평균 0.37% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 130,700"}, {"label": "거래량 급증", "ok": false, "detail": "969,420 (환산) vs 평균 1,026,357"}, {"label": "회전율 급증", "ok": false, "detail": "0.35% (환산) vs 평균 0.37%"}, {"label": "RSI", "ok": true, "detail": "49"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 118,779 (현재 118,200)"}]}
{"ts": "2026-07-02T09:00:24.843175+09:00", "side": "BUY", "code": "034730", "name": "SK", "price": 707000, "qty": 4, "cost": 2828424, "path": "pullback", "reason": "눌림목 지정가 714,693 도달", "stop": 606693, "target": 857461, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "714,000 vs 675,150"}, {"label": "정배열(5>20)", "ok": true, "detail": "760,800 / 675,150"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "760,800 / 530,100"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+11.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -198 · 기 +92 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+17%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.32% (환산) vs 평균 0.45% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 883,000"}, {"label": "거래량 급증", "ok": false, "detail": "230,413 (환산) vs 평균 329,863"}, {"label": "회전율 급증", "ok": false, "detail": "0.32% (환산) vs 평균 0.45%"}, {"label": "RSI", "ok": true, "detail": "55"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 714,693 (현재 714,000)"}]}
{"ts": "2026-07-02T09:08:01.945995+09:00", "side": "SELL", "code": "003490", "name": "대한항공", "price": 26900, "qty": 215, "proceeds": 5772222, "entry_price": 28900, "pnl": -442210, "pnl_pct": -6.92, "hold_from": "2026-06-25T09:04:06.192525+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "26,911 (현재 26,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 31,883"}, {"label": "추세(20일선)", "ok": true, "detail": "25,850"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -249 · 기 +991"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 29,517"}]}
{"ts": "2026-07-02T10:18:03.877299+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 15980, "qty": 185, "cost": 2956743, "path": "pullback", "reason": "눌림목 지정가 16,358 도달", "stop": 13328, "target": 19958, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "15,980 vs 12,848"}, {"label": "정배열(5>20)", "ok": true, "detail": "16,104 / 12,848"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "16,104 / 11,478"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+25.7%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,833 · 기 +437 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+25%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "9.98% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": true, "detail": "10,701,165 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": true, "detail": "9.98% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "60"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 16,358 (현재 15,980)"}]}
{"ts": "2026-07-02T10:18:03.877574+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 122200, "qty": 51, "cost": 6233135, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 111000, "target": 129000, "signals": [{"label": "손절선", "ok": true, "detail": "111,000 (현재 122,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 129,000"}, {"label": "추세(20일선)", "ok": true, "detail": "118,345"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +22 · 기 -44"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 121,743"}]}
{"ts": "2026-07-02T10:34:04.147746+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 18860, "qty": 326, "cost": 6149282, "path": "pullback", "reason": "눌림목 지정가 19,580 도달", "stop": 17760, "target": 20510, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "18,860 vs 18,848"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,558 / 18,848"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,558 / 19,356"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+3.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -339 · 기 +110 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+35%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.80% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "924,985 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.80% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "48"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,580 (현재 18,860)"}]}
{"ts": "2026-07-02T11:20:02.084479+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 22550, "qty": 272, "cost": 6134520, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 17760, "target": 20510, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 19,350)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 20,510"}, {"label": "추세(20일선)", "ok": true, "detail": "18,872"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -339 · 기 +110"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,250"}]}
{"ts": "2026-07-02T11:22:01.992492+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 19000, "qty": 598, "proceeds": 11339844, "entry_price": 20538, "pnl": -943958, "pnl_pct": -7.49, "hold_from": "2026-07-02T10:34:04.147745+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "19,368 (현재 19,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,293"}, {"label": "추세(20일선)", "ok": true, "detail": "18,860"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -339 · 기 +110"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-02T14:48:03.100788+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 133000, "qty": 35, "proceeds": 4645923, "entry_price": 160014, "pnl": -955417, "pnl_pct": -16.88, "hold_from": "2026-06-24T09:08:01.013600+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "133,138 (현재 133,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 200,329"}, {"label": "추세(20일선)", "ok": true, "detail": "120,490"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +395 · 기 -1,516"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-02T15:04:06.212995+09:00", "side": "SELL", "code": "403870", "name": "HPSP", "price": 43900, "qty": 43, "proceeds": 1884019, "entry_price": 55300, "pnl": -494238, "pnl_pct": -20.61, "hold_from": "2026-06-30T09:00:10.993341+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "44,022 (현재 43,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 72,218"}, {"label": "추세(20일선)", "ok": false, "detail": "51,912"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +2,379 · 기 -6,625"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 59,411"}]}
{"ts": "2026-07-03T09:02:04.951718+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 133400, "qty": 16, "cost": 2134720, "path": "pullback", "reason": "눌림목 지정가 154,163 도달", "stop": 104263, "target": 177106, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "133,300 vs 120,505"}, {"label": "정배열(5>20)", "ok": true, "detail": "138,680 / 120,505"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "138,680 / 121,322"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+18.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +674 · 기 -2,170 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+31%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.16% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": false, "detail": "571,607 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": false, "detail": "1.16% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "52"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 154,163 (현재 133,300)"}]}
{"ts": "2026-07-03T09:50:01.694989+09:00", "side": "SELL", "code": "214450", "name": "파마리서치", "price": 328500, "qty": 29, "proceeds": 9507923, "entry_price": 364500, "pnl": -1064162, "pnl_pct": -9.88, "hold_from": "2026-07-01T09:06:03.240662+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "331,504 (현재 331,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 413,994"}, {"label": "추세(20일선)", "ok": true, "detail": "295,675"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -127 · 기 +294"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-03T09:56:06.797073+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 13310, "qty": 185, "proceeds": 2457548, "entry_price": 15980, "pnl": -499195, "pnl_pct": -16.71, "hold_from": "2026-07-02T10:18:03.877298+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "13,328 (현재 13,320)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 19,958"}, {"label": "추세(20일선)", "ok": true, "detail": "12,716"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -1,591 · 기 +253"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 16,944"}]}
{"ts": "2026-07-03T10:24:02.800122+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19040, "qty": 312, "cost": 5941371, "path": "pullback", "reason": "눌림목 지정가 19,631 도달", "stop": 17921, "target": 20718, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "19,030 vs 18,856"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,592 / 18,856"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,592 / 19,359"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+2.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -35 · 기 +168 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+34%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.54% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "619,193 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.54% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "49"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,631 (현재 19,030)"}]}
{"ts": "2026-07-03T12:00:02.677657+09:00", "side": "BUY", "code": "003490", "name": "대한항공", "price": 28800, "qty": 206, "cost": 5933690, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 26795, "target": 31807, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "28,750 vs 25,942"}, {"label": "정배열(5>20)", "ok": true, "detail": "26,090 / 25,942"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "26,090 / 25,214"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+8.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +55 · 기 +1,952 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.9/5"}, {"label": "상승여력", "ok": true, "detail": "+20%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.38% (환산) vs 평균 0.58% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 28,400"}, {"label": "거래량 급증", "ok": true, "detail": "5,054,442 (환산) vs 평균 2,146,231"}, {"label": "회전율 급증", "ok": true, "detail": "1.38% (환산) vs 평균 0.58%"}, {"label": "RSI", "ok": true, "detail": "64"}]}
{"ts": "2026-07-06T09:00:11.744896+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 14510, "qty": 172, "cost": 2496094, "path": "pullback", "reason": "눌림목 지정가 16,248 도달", "stop": 11748, "target": 18653, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "14,490 vs 12,774"}, {"label": "정배열(5>20)", "ok": true, "detail": "15,806 / 12,774"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "15,806 / 11,453"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+7.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,226 · 기 +134 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+38%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.02% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": false, "detail": "20,667 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": false, "detail": "0.02% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "54"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 16,248 (현재 14,490)"}]}
{"ts": "2026-07-06T09:18:01.695485+09:00", "side": "BUY", "code": "003490", "name": "대한항공", "price": 29500, "qty": 201, "cost": 5930389, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 26795, "target": 31807, "signals": [{"label": "손절선", "ok": true, "detail": "26,795 (현재 29,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 31,807"}, {"label": "추세(20일선)", "ok": true, "detail": "25,980"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -142 · 기 +2,052"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 29,483"}]}
{"ts": "2026-07-07T10:06:07.272817+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 147500, "qty": 16, "cost": 2360354, "path": "pullback", "reason": "눌림목 지정가 148,050 도달", "stop": 118550, "target": 190925, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "147,400 vs 135,785"}, {"label": "정배열(5>20)", "ok": true, "detail": "170,120 / 135,785"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "170,120 / 99,573"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+37.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +96 · 기 -196 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+20%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "7.06% (환산) vs 평균 3.06% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 202,500"}, {"label": "거래량 급증", "ok": true, "detail": "1,366,200 (환산) vs 평균 591,925"}, {"label": "회전율 급증", "ok": true, "detail": "7.06% (환산) vs 평균 3.06%"}, {"label": "RSI", "ok": true, "detail": "56"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 148,050 (현재 147,400)"}]}
{"ts": "2026-07-07T12:02:08.265020+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 12230, "qty": 172, "proceeds": 2099458, "entry_price": 14510, "pnl": -396636, "pnl_pct": -15.71, "hold_from": "2026-07-06T09:00:11.744888+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "11,748 (현재 12,230)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 18,653"}, {"label": "추세(20일선)", "ok": false, "detail": "12,661"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -1,558 · 기 -4"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 15,512"}]}
{"ts": "2026-07-07T14:10:15.944417+09:00", "side": "SELL", "code": "003490", "name": "대한항공", "price": 26600, "qty": 407, "proceeds": 10805089, "entry_price": 29146, "pnl": -1058990, "pnl_pct": -8.73, "hold_from": "2026-07-03T12:00:02.677656+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "27,098 (현재 26,600)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 32,217"}, {"label": "추세(20일선)", "ok": true, "detail": "25,870"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -532 · 기 +3,040"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-07T14:10:18.610637+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 177000, "qty": 13, "cost": 2301345, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 118550, "target": 190925, "signals": [{"label": "손절선", "ok": true, "detail": "118,550 (현재 177,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 190,925"}, {"label": "추세(20일선)", "ok": true, "detail": "134,320"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +152 · 기 -281"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 156,742"}]}
{"ts": "2026-07-07T14:10:21.227329+09:00", "side": "BUY", "code": "034730", "name": "SK", "price": 815000, "qty": 4, "cost": 3260489, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 606693, "target": 857461, "signals": [{"label": "손절선", "ok": true, "detail": "606,693 (현재 815,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 857,461"}, {"label": "추세(20일선)", "ok": true, "detail": "673,250"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -44 · 기 +3"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 738,777"}]}
{"ts": "2026-07-08T09:00:20.537372+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 108300, "qty": 16, "proceeds": 1729421, "entry_price": 133400, "pnl": -405299, "pnl_pct": -18.82, "hold_from": "2026-07-03T09:02:04.951717+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "166,450 (현재 112,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": false, "detail": "119,475"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +243 · 기 -857"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-08T09:00:20.538559+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 19110, "qty": 312, "proceeds": 5950693, "entry_price": 19040, "pnl": 9322, "pnl_pct": 0.37, "hold_from": "2026-07-03T10:24:02.800121+09:00", "reason": "트레일링 익절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "19,796 (현재 19,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "18,860"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +193 · 기 +193"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-08T09:00:20.539046+09:00", "side": "SELL", "code": "034730", "name": "SK", "price": 602000, "qty": 8, "proceeds": 4806609, "entry_price": 761000, "pnl": -1282304, "pnl_pct": -20.89, "hold_from": "2026-07-02T09:00:24.843168+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "665,669 (현재 602,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 903,996"}, {"label": "추세(20일선)", "ok": false, "detail": "669,550"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +49 · 기 -19"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-09T09:02:04.490070+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19110, "qty": 298, "cost": 5695634, "path": "pullback", "reason": "눌림목 지정가 19,657 도달", "stop": 18017, "target": 20749, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "19,070 vs 18,858"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,600 / 18,858"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,600 / 19,360"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+0.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -10 · 기 +164 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.08% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "93,540 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.08% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,657 (현재 19,070)"}]}
{"ts": "2026-07-09T09:02:04.490181+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 158300, "qty": 36, "cost": 5699655, "path": "pullback", "reason": "눌림목 지정가 158,582 도달", "stop": 158000, "target": 158750, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "158,200 vs 149,700"}, {"label": "정배열(5>20)", "ok": true, "detail": "169,280 / 149,700"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "169,280 / 113,195"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+81.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +296 · 기 -306 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+13%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.72% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": false, "detail": "499,233 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": false, "detail": "1.72% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "55"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 158,582 (현재 158,200)"}]}
{"ts": "2026-07-09T09:12:02.531380+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 156900, "qty": 36, "proceeds": 5637386, "entry_price": 158300, "pnl": -62269, "pnl_pct": -0.88, "hold_from": "2026-07-09T09:02:04.490180+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "158,000 (현재 156,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "149,635"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +296 · 기 -306"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-09T09:36:03.481941+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 132000, "qty": 40, "cost": 5280792, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 120761, "target": 148858, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "131,900 vs 108,920"}, {"label": "정배열(5>20)", "ok": true, "detail": "115,560 / 108,920"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "115,560 / 113,228"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+22.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -184 · 기 +964 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+13%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.91% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 116,900"}, {"label": "거래량 급증", "ok": true, "detail": "1,026,867 (환산) vs 평균 359,705"}, {"label": "회전율 급증", "ok": true, "detail": "0.91% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-07-10T09:24:02.510323+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 158900, "qty": 36, "cost": 5721258, "path": "pullback", "reason": "눌림목 지정가 159,557 도달", "stop": 158000, "target": 160250, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "158,800 vs 149,730"}, {"label": "정배열(5>20)", "ok": true, "detail": "169,400 / 149,730"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "169,400 / 113,205"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+82.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +225 · 기 -178 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+13%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "5.62% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": true, "detail": "1,627,273 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": true, "detail": "5.62% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "55"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 159,557 (현재 158,800)"}]}
{"ts": "2026-07-10T09:28:02.647025+09:00", "side": "BUY", "code": "105560", "name": "KB금융", "price": 185900, "qty": 31, "cost": 5763764, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 171311, "target": 207783, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "185,600 vs 159,890"}, {"label": "정배열(5>20)", "ok": true, "detail": "159,900 / 159,890"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "159,900 / 157,368"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+26.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,310 · 기 +1,527 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+16%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.06% (환산) vs 평균 0.46% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 182,700"}, {"label": "거래량 급증", "ok": true, "detail": "3,715,113 (환산) vs 평균 1,640,325"}, {"label": "회전율 급증", "ok": true, "detail": "1.06% (환산) vs 평균 0.46%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-07-10T09:46:11.498476+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 12830, "qty": 187, "cost": 2399570, "path": "pullback", "reason": "눌림목 지정가 15,971 도달", "stop": 10360, "target": 16535, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "12,820 vs 12,690"}, {"label": "정배열(5>20)", "ok": true, "detail": "15,472 / 12,690"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "15,472 / 11,425"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+1.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +228 · 기 +229 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+56%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "9.75% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": true, "detail": "10,460,473 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": true, "detail": "9.75% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 15,971 (현재 12,820)"}]}
{"ts": "2026-07-10T11:16:02.499492+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 13850, "qty": 173, "cost": 2396409, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 10360, "target": 16535, "signals": [{"label": "손절선", "ok": true, "detail": "10,360 (현재 13,850)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 16,535"}, {"label": "추세(20일선)", "ok": true, "detail": "12,742"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +210 · 기 +239"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,843"}]}
{"ts": "2026-07-10T12:14:02.695248+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 126200, "qty": 15, "cost": 1893284, "path": "pullback", "reason": "눌림목 지정가 151,752 도달", "stop": 96000, "target": 171500, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "126,200 vs 120,150"}, {"label": "정배열(5>20)", "ok": true, "detail": "137,260 / 120,150"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "137,260 / 121,203"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+17.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +483 · 기 -241 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+38%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "7.53% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": true, "detail": "3,695,762 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": true, "detail": "7.53% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 151,752 (현재 126,200)"}]}
{"ts": "2026-07-13T09:00:12.503132+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 136900, "qty": 39, "cost": 5339901, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 120761, "target": 148858, "signals": [{"label": "손절선", "ok": true, "detail": "120,761 (현재 136,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 148,858"}, {"label": "추세(20일선)", "ok": true, "detail": "109,140"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -64 · 기 +919"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 135,864"}]}
{"ts": "2026-07-13T09:26:03.433552+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 139100, "qty": 14, "cost": 1947692, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 96000, "target": 171500, "signals": [{"label": "손절선", "ok": true, "detail": "96,000 (현재 139,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 171,500"}, {"label": "추세(20일선)", "ok": true, "detail": "120,795"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -213 · 기 +772"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 136,162"}]}
{"ts": "2026-07-13T09:36:02.297086+09:00", "side": "BUY", "code": "105560", "name": "KB금융", "price": 191000, "qty": 30, "cost": 5730860, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 171311, "target": 207783, "signals": [{"label": "손절선", "ok": true, "detail": "171,311 (현재 191,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 207,783"}, {"label": "추세(20일선)", "ok": true, "detail": "160,160"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -867 · 기 +1,393"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 190,952"}]}
{"ts": "2026-07-13T12:44:04.377755+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 187900, "qty": 36, "proceeds": 6751209, "entry_price": 158900, "pnl": 1029951, "pnl_pct": 18.25, "hold_from": "2026-07-10T09:24:02.510319+09:00", "reason": "트레일링 익절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "189,133 (현재 187,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "151,185"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -254 · 기 +457"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-16T09:00:12.628220+09:00", "side": "SELL", "code": "095610", "name": "테스", "price": 209000, "qty": 29, "proceeds": 6049181, "entry_price": 160724, "pnl": 1387482, "pnl_pct": 30.04, "hold_from": "2026-07-07T10:06:07.272816+09:00", "reason": "트레일링 익절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "210,764 (현재 207,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "138,765"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -799 · 기 +891"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-16T09:00:12.629372+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18580, "qty": 298, "proceeds": 5526043, "entry_price": 19110, "pnl": -169591, "pnl_pct": -2.77, "hold_from": "2026-07-09T09:02:04.490068+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "18,017 (현재 18,560)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 20,749"}, {"label": "추세(20일선)", "ok": false, "detail": "18,832"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -120 · 기 -150"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,486"}]}
{"ts": "2026-07-20T09:04:02.905960+09:00", "side": "SELL", "code": "105560", "name": "KB금융", "price": 173000, "qty": 61, "proceeds": 10532422, "entry_price": 188408, "pnl": -962202, "pnl_pct": -8.18, "hold_from": "2026-07-10T09:28:02.647023+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "173,252 (현재 173,200)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 211,143"}, {"label": "추세(20일선)", "ok": true, "detail": "159,270"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -332 · 기 +291"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-20T12:28:02.340218+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 10310, "qty": 360, "proceeds": 3704362, "entry_price": 13320, "pnl": -1091617, "pnl_pct": -22.6, "hold_from": "2026-07-10T09:46:11.498474+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "10,360 (현재 10,310)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 17,760"}, {"label": "추세(20일선)", "ok": false, "detail": "14,755"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -887 · 기 +515"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-20T12:46:02.301563+09:00", "side": "SELL", "code": "086790", "name": "하나금융지주", "price": 131800, "qty": 103, "proceeds": 13548928, "entry_price": 120181, "pnl": 1168471, "pnl_pct": 9.67, "hold_from": "2026-07-01T09:46:03.128911+09:00", "reason": "트레일링 익절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "131,911 (현재 131,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "118,840"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +0 · 기 +424"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-21T12:06:01.194400+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 344500, "qty": 15, "cost": 5168275, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 313808, "target": 390538, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "344,500 vs 296,350"}, {"label": "정배열(5>20)", "ok": true, "detail": "315,100 / 296,350"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "315,100 / 305,492"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+39.7%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -7 · 기 +1 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+43%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.38% (환산) vs 평균 0.93% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 334,500"}, {"label": "거래량 급증", "ok": true, "detail": "247,158 (환산) vs 평균 96,436"}, {"label": "회전율 급증", "ok": true, "detail": "2.38% (환산) vs 평균 0.93%"}, {"label": "RSI", "ok": true, "detail": "65"}]}
{"ts": "2026-07-22T11:56:00.850083+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 159800, "qty": 36, "cost": 5753663, "path": "pullback", "reason": "눌림목 지정가 159,932 도달", "stop": 158000, "target": 162500, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "159,700 vs 149,775"}, {"label": "정배열(5>20)", "ok": true, "detail": "169,580 / 149,775"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "169,580 / 113,220"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+75.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -408 · 기 +146 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+12%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "4.73% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": false, "detail": "1,371,014 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": true, "detail": "4.73% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "55"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 159,932 (현재 159,700)"}]}
{"ts": "2026-07-22T12:12:00.761634+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 157300, "qty": 36, "proceeds": 5651758, "entry_price": 159800, "pnl": -101905, "pnl_pct": -1.56, "hold_from": "2026-07-22T11:56:00.850081+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "158,000 (현재 157,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 162,500"}, {"label": "추세(20일선)", "ok": true, "detail": "149,655"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -407 · 기 +141"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 169,305"}]}
{"ts": "2026-07-23T09:00:25.909523+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 160100, "qty": 36, "cost": 5764465, "path": "pullback", "reason": "눌림목 지정가 159,493 도달", "stop": 158000, "target": 163250, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "158,100 vs 149,695"}, {"label": "정배열(5>20)", "ok": true, "detail": "169,260 / 149,695"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "169,260 / 113,193"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+76.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -162 · 기 +37 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+13%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.05% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": false, "detail": "303,687 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": false, "detail": "1.05% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "55"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 159,493 (현재 158,100)"}]}
{"ts": "2026-07-23T09:32:04.434630+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 157800, "qty": 36, "proceeds": 5669722, "entry_price": 160100, "pnl": -94742, "pnl_pct": -1.44, "hold_from": "2026-07-23T09:00:25.909516+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "158,000 (현재 157,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "149,685"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -162 · 기 +37"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-23T09:44:04.311545+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 18850, "qty": 308, "cost": 5806671, "path": "pullback", "reason": "눌림목 지정가 19,627 도달", "stop": 17760, "target": 20485, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "18,850 vs 18,847"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,556 / 18,847"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,556 / 19,356"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+13.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -25 · 기 +6 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+34%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.34% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "388,767 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.34% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "48"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,627 (현재 18,850)"}]}
{"ts": "2026-07-23T09:50:01.537437+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 88200, "qty": 58, "cost": 5116367, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 80223, "target": 100166, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "88,200 vs 75,070"}, {"label": "정배열(5>20)", "ok": true, "detail": "83,000 / 75,070"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "83,000 / 75,058"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+47.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -150 · 기 +299 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+17%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.85% (환산) vs 평균 0.42% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 87,600"}, {"label": "거래량 급증", "ok": true, "detail": "785,587 (환산) vs 평균 392,182"}, {"label": "회전율 급증", "ok": true, "detail": "0.85% (환산) vs 평균 0.42%"}, {"label": "RSI", "ok": true, "detail": "67"}]}
{"ts": "2026-07-23T10:30:02.508176+09:00", "side": "BUY", "code": "024060", "name": "흥구석유", "price": 14140, "qty": 255, "cost": 3606241, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 12315, "target": 16878, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "14,180 vs 10,944"}, {"label": "정배열(5>20)", "ok": true, "detail": "13,154 / 10,944"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "13,154 / 12,687"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+55.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +109 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "84.26% (환산) vs 평균 31.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 13,990"}, {"label": "거래량 급증", "ok": true, "detail": "12,639,979 (환산) vs 평균 4,720,532"}, {"label": "회전율 급증", "ok": true, "detail": "84.26% (환산) vs 평균 31.47%"}, {"label": "RSI", "ok": true, "detail": "66"}]}
{"ts": "2026-07-23T12:22:02.618391+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 356000, "qty": 14, "cost": 4984748, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 313808, "target": 390538, "signals": [{"label": "손절선", "ok": true, "detail": "313,808 (현재 356,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 390,538"}, {"label": "추세(20일선)", "ok": true, "detail": "296,925"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +6 · 기 +26"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 355,034"}]}
{"ts": "2026-07-23T12:54:04.519326+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 90900, "qty": 56, "cost": 5091164, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 80223, "target": 100166, "signals": [{"label": "손절선", "ok": true, "detail": "80,223 (현재 91,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 100,166"}, {"label": "추세(20일선)", "ok": true, "detail": "75,210"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -169 · 기 +311"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 90,945"}]}
{"ts": "2026-07-24T09:00:09.111297+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 111800, "qty": 29, "proceeds": 3235878, "entry_price": 132428, "pnl": -605098, "pnl_pct": -15.58, "hold_from": "2026-07-10T12:14:02.695247+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "102,540 (현재 113,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 177,258"}, {"label": "추세(20일선)", "ok": false, "detail": "119,505"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -480 · 기 -206"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-24T09:00:09.112484+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18730, "qty": 308, "proceeds": 5757591, "entry_price": 18850, "pnl": -49080, "pnl_pct": -0.64, "hold_from": "2026-07-23T09:44:04.311543+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 18,730)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 20,485"}, {"label": "추세(20일선)", "ok": false, "detail": "18,841"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -5 · 기 -5"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,219"}]}
{"ts": "2026-07-24T09:02:04.065706+09:00", "side": "BUY", "code": "024060", "name": "흥구석유", "price": 15060, "qty": 239, "cost": 3599880, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 12315, "target": 16878, "signals": [{"label": "손절선", "ok": true, "detail": "12,315 (현재 15,020)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 16,878"}, {"label": "추세(20일선)", "ok": true, "detail": "10,986"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +208 · 기 -2"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 14,766"}]}
{"ts": "2026-07-27T09:02:06.258351+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 139000, "qty": 15, "cost": 2085313, "path": "pullback", "reason": "눌림목 지정가 146,775 도달", "stop": 108775, "target": 184337, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "138,700 vs 135,350"}, {"label": "정배열(5>20)", "ok": true, "detail": "168,380 / 135,350"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "168,380 / 99,428"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+28.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +238 · 기 -568 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+41%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.72% (환산) vs 평균 3.06% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 202,500"}, {"label": "거래량 급증", "ok": false, "detail": "526,333 (환산) vs 평균 591,925"}, {"label": "회전율 급증", "ok": false, "detail": "2.72% (환산) vs 평균 3.06%"}, {"label": "RSI", "ok": true, "detail": "53"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 146,775 (현재 138,700)"}]}
{"ts": "2026-07-27T09:02:06.258454+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19100, "qty": 308, "cost": 5883682, "path": "pullback", "reason": "눌림목 지정가 19,673 도달", "stop": 18023, "target": 20715, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "19,070 vs 18,858"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,600 / 18,858"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,600 / 19,360"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+16.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +101 · 기 -3 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.13% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "146,760 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.13% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,673 (현재 19,070)"}]}
{"ts": "2026-07-27T09:02:06.258780+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 7470, "qty": 568, "cost": 4243596, "path": "pullback", "reason": "눌림목 지정가 7,635 도달", "stop": 6645, "target": 8707, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "7,470 vs 4,876"}, {"label": "정배열(5>20)", "ok": true, "detail": "6,452 / 4,876"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,452 / 4,889"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+82.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +49 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.79% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "49,327 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "0.79% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "74"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,635 (현재 7,470)"}]}
{"ts": "2026-07-27T09:04:05.341119+09:00", "side": "SELL", "code": "010950", "name": "S-Oil", "price": 143200, "qty": 79, "proceeds": 11290740, "entry_price": 134419, "pnl": 670047, "pnl_pct": 6.53, "hold_from": "2026-07-09T09:36:03.481939+09:00", "reason": "트레일링 익절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "143,490 (현재 143,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "109,490"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +123 · 기 +226"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-27T09:04:05.341251+09:00", "side": "SELL", "code": "024060", "name": "흥구석유", "price": 12200, "qty": 494, "proceeds": 6015048, "entry_price": 14585, "pnl": -1191073, "pnl_pct": -16.35, "hold_from": "2026-07-23T10:30:02.508174+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "12,707 (현재 12,250)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 17,402"}, {"label": "추세(20일선)", "ok": true, "detail": "10,847"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -85 · 기 +2"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-27T09:08:02.110523+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 7910, "qty": 536, "cost": 4240396, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 6645, "target": 8707, "signals": [{"label": "손절선", "ok": true, "detail": "6,645 (현재 7,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 8,707"}, {"label": "추세(20일선)", "ok": true, "detail": "4,897"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +49 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 7,747"}]}
{"ts": "2026-07-27T09:12:01.544268+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 13150, "qty": 199, "cost": 2617243, "path": "pullback", "reason": "눌림목 지정가 13,180 도달", "stop": 10830, "target": 16630, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "13,150 vs 12,732"}, {"label": "정배열(5>20)", "ok": true, "detail": "14,378 / 12,732"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "14,378 / 13,268"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+1.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +27 · 기 +15 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.46% (환산) vs 평균 1.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 15,870"}, {"label": "거래량 급증", "ok": false, "detail": "274,967 (환산) vs 평균 882,736"}, {"label": "회전율 급증", "ok": false, "detail": "0.46% (환산) vs 평균 1.47%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 13,180 (현재 13,150)"}]}
{"ts": "2026-07-27T09:30:01.188634+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 149900, "qty": 38, "cost": 5697054, "path": "pullback", "reason": "눌림목 지정가 157,993 도달", "stop": 149899, "target": 149902, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "149,800 vs 149,280"}, {"label": "정배열(5>20)", "ok": true, "detail": "167,600 / 149,280"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "167,600 / 113,055"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+61.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +274 · 기 -315 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+22%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.69% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": false, "detail": "780,273 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": false, "detail": "2.69% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "52"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 157,993 (현재 149,800)"}]}
{"ts": "2026-07-27T09:32:01.415993+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 148500, "qty": 38, "proceeds": 5631996, "entry_price": 149900, "pnl": -65058, "pnl_pct": -0.93, "hold_from": "2026-07-27T09:30:01.188633+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "149,899 (현재 148,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 149,902"}, {"label": "추세(20일선)", "ok": false, "detail": "149,215"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +274 · 기 -315"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 159,969"}]}
{"ts": "2026-07-27T09:32:01.416274+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 127900, "qty": 45, "cost": 5756363, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 120209, "target": 139437, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "127,900 vs 113,950"}, {"label": "정배열(5>20)", "ok": true, "detail": "119,040 / 113,950"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "119,040 / 110,150"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+46.7%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +106 · 기 +291 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+16%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.38% (환산) vs 평균 0.17% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 123,300"}, {"label": "거래량 급증", "ok": true, "detail": "643,340 (환산) vs 평균 289,522"}, {"label": "회전율 급증", "ok": true, "detail": "0.38% (환산) vs 평균 0.17%"}, {"label": "RSI", "ok": true, "detail": "71"}]}
{"ts": "2026-07-27T13:40:01.118855+09:00", "side": "SELL", "code": "003680", "name": "한성기업", "price": 6780, "qty": 1104, "proceeds": 7470524, "entry_price": 7684, "pnl": -1013468, "pnl_pct": -11.76, "hold_from": "2026-07-27T09:02:06.258778+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "6,854 (현재 6,770)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 8,929"}, {"label": "추세(20일선)", "ok": true, "detail": "4,841"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +50 · 기 +0"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-28T09:00:18.415985+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6780, "qty": 525, "cost": 3560034, "path": "pullback", "reason": "눌림목 지정가 7,596 도달", "stop": 5916, "target": 8077, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "7,050 vs 4,855"}, {"label": "정배열(5>20)", "ok": true, "detail": "6,368 / 4,855"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,368 / 4,882"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+73.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +86 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.01% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "813 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "0.01% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "69"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,596 (현재 7,050)"}]}
{"ts": "2026-07-28T09:10:01.766164+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 7100, "qty": 502, "cost": 3564735, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 5916, "target": 8077, "signals": [{"label": "손절선", "ok": true, "detail": "5,916 (현재 7,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 8,077"}, {"label": "추세(20일선)", "ok": true, "detail": "4,857"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +86 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 7,079"}]}
{"ts": "2026-07-28T09:38:04.856150+09:00", "side": "SELL", "code": "138040", "name": "메리츠금융지주", "price": 120100, "qty": 45, "proceeds": 5393961, "entry_price": 127900, "pnl": -362402, "pnl_pct": -6.1, "hold_from": "2026-07-27T09:32:01.416272+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "120,209 (현재 120,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 139,437"}, {"label": "추세(20일선)", "ok": true, "detail": "113,560"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +77 · 기 +325"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 130,460"}]}
{"ts": "2026-07-28T11:04:03.876316+09:00", "side": "SELL", "code": "252990", "name": "샘씨엔에스", "price": 10790, "qty": 199, "proceeds": 2143023, "entry_price": 13150, "pnl": -474220, "pnl_pct": -17.95, "hold_from": "2026-07-27T09:12:01.544267+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "10,830 (현재 10,810)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 16,630"}, {"label": "추세(20일선)", "ok": false, "detail": "12,616"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +156 · 기 -156"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 14,003"}]}
{"ts": "2026-07-29T09:24:10.033574+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 122600, "qty": 17, "cost": 2084513, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 108775, "target": 184337, "signals": [{"label": "손절선", "ok": true, "detail": "108,775 (현재 177,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 184,337"}, {"label": "추세(20일선)", "ok": true, "detail": "134,320"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +453 · 기 -688"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 148,242"}]}
{"ts": "2026-07-29T09:26:01.925323+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18940, "qty": 308, "proceeds": 5822145, "entry_price": 19100, "pnl": -61538, "pnl_pct": -0.84, "hold_from": "2026-07-27T09:02:06.258453+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "19,645 (현재 18,950)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "18,852"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +99 · 기 +138"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T09:26:01.925475+09:00", "side": "SELL", "code": "003680", "name": "한성기업", "price": 6610, "qty": 1027, "proceeds": 6775232, "entry_price": 6936, "pnl": -349536, "pnl_pct": -4.71, "hold_from": "2026-07-28T09:00:18.415977+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "7,526 (현재 6,610)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "4,833"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +188 · 기 +0"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T09:28:01.406972+09:00", "side": "BUY", "code": "090850", "name": "현대이지웰", "price": 6390, "qty": 871, "cost": 5566525, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 5998, "target": 6978, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "6,380 vs 5,358"}, {"label": "정배열(5>20)", "ok": true, "detail": "5,742 / 5,358"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "5,742 / 5,622"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+43.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +73 · 기 -3 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.62% (환산) vs 평균 0.22% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 5,700"}, {"label": "거래량 급증", "ok": true, "detail": "134,413 (환산) vs 평균 49,512"}, {"label": "회전율 급증", "ok": true, "detail": "0.62% (환산) vs 평균 0.22%"}, {"label": "RSI", "ok": true, "detail": "73"}]}
{"ts": "2026-07-29T10:24:01.466402+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 123400, "qty": 45, "cost": 5553833, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 115612, "target": 135082, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "123,400 vs 113,725"}, {"label": "정배열(5>20)", "ok": true, "detail": "118,140 / 113,725"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "118,140 / 110,075"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+51.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +47 · 기 +310 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+20%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.38% (환산) vs 평균 0.17% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 123,300"}, {"label": "거래량 급증", "ok": true, "detail": "644,676 (환산) vs 평균 289,522"}, {"label": "회전율 급증", "ok": true, "detail": "0.38% (환산) vs 평균 0.17%"}, {"label": "RSI", "ok": true, "detail": "67"}]}
{"ts": "2026-07-29T10:42:05.435654+09:00", "side": "SELL", "code": "090850", "name": "현대이지웰", "price": 5980, "qty": 871, "proceeds": 5198423, "entry_price": 6390, "pnl": -368102, "pnl_pct": -6.42, "hold_from": "2026-07-29T09:28:01.406971+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,998 (현재 5,980)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 6,978"}, {"label": "추세(20일선)", "ok": true, "detail": "5,338"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +77 · 기 -3"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,521"}]}
{"ts": "2026-07-29T12:50:05.492063+09:00", "side": "SELL", "code": "095610", "name": "테스", "price": 108000, "qty": 32, "proceeds": 3449261, "entry_price": 130288, "pnl": -720565, "pnl_pct": -17.11, "hold_from": "2026-07-27T09:02:06.258350+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "108,775 (현재 108,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 171,878"}, {"label": "추세(20일선)", "ok": false, "detail": "133,815"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +449 · 기 -685"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T14:20:01.529112+09:00", "side": "SELL", "code": "138040", "name": "메리츠금융지주", "price": 115500, "qty": 45, "proceeds": 5187365, "entry_price": 123400, "pnl": -366468, "pnl_pct": -6.4, "hold_from": "2026-07-29T10:24:01.466401+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "115,612 (현재 115,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 135,082"}, {"label": "추세(20일선)", "ok": true, "detail": "113,330"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +44 · 기 +333"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 126,053"}]}
{"ts": "2026-07-30T09:04:07.524832+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19090, "qty": 289, "cost": 5517838, "path": "pullback", "reason": "눌림목 지정가 19,653 도달", "stop": 17993, "target": 20736, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "19,100 vs 18,860"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,606 / 18,860"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,606 / 19,360"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+29.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +2 · 기 +327 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+32%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.14% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "160,727 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.14% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,653 (현재 19,100)"}]}
{"ts": "2026-07-30T09:04:07.525085+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6130, "qty": 440, "cost": 2697605, "path": "pullback", "reason": "눌림목 지정가 7,457 도달", "stop": 5127, "target": 7634, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "6,120 vs 4,808"}, {"label": "정배열(5>20)", "ok": true, "detail": "6,182 / 4,808"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,182 / 4,866"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+65.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +234 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "4.31% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "267,687 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "4.31% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,457 (현재 6,120)"}]}
{"ts": "2026-07-30T09:22:07.837500+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 124400, "qty": 44, "cost": 5474421, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 116537, "target": 136194, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "124,300 vs 113,770"}, {"label": "정배열(5>20)", "ok": true, "detail": "118,320 / 113,770"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "118,320 / 110,090"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+55.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +9 · 기 +389 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+19%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.37% (환산) vs 평균 0.17% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 123,300"}, {"label": "거래량 급증", "ok": true, "detail": "615,133 (환산) vs 평균 289,522"}, {"label": "회전율 급증", "ok": true, "detail": "0.37% (환산) vs 평균 0.17%"}, {"label": "RSI", "ok": true, "detail": "68"}]}
{"ts": "2026-07-30T09:24:07.570832+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 131800, "qty": 40, "cost": 5272791, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 120690, "target": 148465, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "132,000 vs 108,925"}, {"label": "정배열(5>20)", "ok": true, "detail": "115,580 / 108,925"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "115,580 / 113,230"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+51.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -6 · 기 +178 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+20%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.66% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 116,900"}, {"label": "거래량 급증", "ok": true, "detail": "738,813 (환산) vs 평균 359,705"}, {"label": "회전율 급증", "ok": true, "detail": "0.66% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-07-30T09:26:07.518278+09:00", "side": "BUY", "code": "090850", "name": "현대이지웰", "price": 6300, "qty": 880, "cost": 5544832, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 5917, "target": 6875, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "6,280 vs 5,353"}, {"label": "정배열(5>20)", "ok": true, "detail": "5,722 / 5,353"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "5,722 / 5,620"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+46.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +87 · 기 +6 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.51% (환산) vs 평균 0.22% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 5,700"}, {"label": "거래량 급증", "ok": true, "detail": "109,080 (환산) vs 평균 49,512"}, {"label": "회전율 급증", "ok": true, "detail": "0.51% (환산) vs 평균 0.22%"}, {"label": "RSI", "ok": true, "detail": "71"}]}
{"ts": "2026-07-30T10:10:07.466772+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 127700, "qty": 43, "cost": 5491924, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 116537, "target": 136194, "signals": [{"label": "손절선", "ok": true, "detail": "116,537 (현재 127,600)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 136,194"}, {"label": "추세(20일선)", "ok": true, "detail": "113,935"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +35 · 기 +392"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 127,135"}]}
{"ts": "2026-07-31T09:04:08.455844+09:00", "side": "SELL", "code": "078930", "name": "GS", "price": 69100, "qty": 114, "proceeds": 7862039, "entry_price": 89526, "pnl": -2345492, "pnl_pct": -22.82, "hold_from": "2026-07-23T09:50:01.537436+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "81,292 (현재 79,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 101,878"}, {"label": "추세(20일선)", "ok": true, "detail": "74,655"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -179 · 기 +325"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-31T09:06:07.677038+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6550, "qty": 412, "cost": 2699005, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 5127, "target": 7634, "signals": [{"label": "손절선", "ok": true, "detail": "5,127 (현재 6,640)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 7,634"}, {"label": "추세(20일선)", "ok": true, "detail": "4,834"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +355 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,453"}]}
{"ts": "2026-08-03T09:34:09.209896+09:00", "side": "SELL", "code": "010950", "name": "S-Oil", "price": 120300, "qty": 40, "proceeds": 4802617, "entry_price": 131800, "pnl": -470174, "pnl_pct": -8.73, "hold_from": "2026-07-30T09:24:07.570830+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "120,690 (현재 120,400)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 148,465"}, {"label": "추세(20일선)", "ok": true, "detail": "108,345"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -35 · 기 +48"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 135,311"}]}
{"ts": "2026-08-03T12:00:12.468908+09:00", "side": "BUY", "code": "194370", "name": "제이에스코퍼레이션", "price": 12910, "qty": 356, "cost": 4596649, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 11713, "target": 14706, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "12,930 vs 11,922"}, {"label": "정배열(5>20)", "ok": true, "detail": "12,138 / 11,922"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "12,138 / 11,924"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+27.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +7 · 기 +10 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+74%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.72% (환산) vs 평균 0.34% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 12,870"}, {"label": "거래량 급증", "ok": true, "detail": "208,994 (환산) vs 평균 99,303"}, {"label": "회전율 급증", "ok": true, "detail": "0.72% (환산) vs 평균 0.34%"}, {"label": "RSI", "ok": true, "detail": "63"}]}
{"ts": "2026-08-03T12:02:10.405836+09:00", "side": "BUY", "code": "194370", "name": "제이에스코퍼레이션", "price": 13420, "qty": 342, "cost": 4590328, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 11713, "target": 14706, "signals": [{"label": "손절선", "ok": true, "detail": "11,713 (현재 13,450)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 14,706"}, {"label": "추세(20일선)", "ok": true, "detail": "11,948"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +7 · 기 +10"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,339"}]}
{"ts": "2026-08-04T09:04:10.112983+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 135900, "qty": 13, "cost": 1766965, "path": "pullback", "reason": "눌림목 지정가 145,918 도달", "stop": 104818, "target": 182523, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "135,700 vs 135,200"}, {"label": "정배열(5>20)", "ok": true, "detail": "167,780 / 135,200"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "167,780 / 99,378"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+24.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +23 · 기 +54 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+45%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "6.62% (환산) vs 평균 3.06% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 202,500"}, {"label": "거래량 급증", "ok": true, "detail": "1,281,140 (환산) vs 평균 591,925"}, {"label": "회전율 급증", "ok": true, "detail": "6.62% (환산) vs 평균 3.06%"}, {"label": "RSI", "ok": true, "detail": "52"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 145,918 (현재 135,700)"}]}
{"ts": "2026-08-04T09:50:10.235261+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 90400, "qty": 51, "cost": 4611092, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 82166, "target": 102752, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "90,300 vs 75,175"}, {"label": "정배열(5>20)", "ok": true, "detail": "83,420 / 75,175"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "83,420 / 75,093"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+56.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +68 · 기 +117 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+14%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.87% (환산) vs 평균 0.42% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 87,600"}, {"label": "거래량 급증", "ok": true, "detail": "805,693 (환산) vs 평균 392,182"}, {"label": "회전율 급증", "ok": true, "detail": "0.87% (환산) vs 평균 0.42%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-08-04T10:32:13.426775+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 93500, "qty": 49, "cost": 4582187, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 82166, "target": 102752, "signals": [{"label": "손절선", "ok": true, "detail": "82,166 (현재 93,400)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 102,752"}, {"label": "추세(20일선)", "ok": true, "detail": "75,330"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +57 · 기 +117"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 93,241"}]}
{"ts": "2026-08-04T12:16:10.467115+09:00", "side": "SELL", "code": "138040", "name": "메리츠금융지주", "price": 117800, "qty": 87, "proceeds": 10228615, "entry_price": 126031, "pnl": -737729, "pnl_pct": -6.53, "hold_from": "2026-07-30T09:22:07.837498+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "117,825 (현재 117,800)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 138,340"}, {"label": "추세(20일선)", "ok": true, "detail": "113,445"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -24 · 기 +268"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-08-04T13:26:13.462956+09:00", "side": "SELL", "code": "090850", "name": "현대이지웰", "price": 5910, "qty": 880, "proceeds": 5190658, "entry_price": 6300, "pnl": -354173, "pnl_pct": -6.19, "hold_from": "2026-07-30T09:26:07.518276+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,917 (현재 5,910)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 6,875"}, {"label": "추세(20일선)", "ok": true, "detail": "5,335"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +36 · 기 +9"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,419"}]}
{"ts": "2026-08-05T09:00:19.042122+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 147600, "qty": 12, "cost": 1771466, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 104818, "target": 182523, "signals": [{"label": "손절선", "ok": true, "detail": "104,818 (현재 147,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 182,523"}, {"label": "추세(20일선)", "ok": true, "detail": "135,790"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -256 · 기 +200"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 145,836"}]}
{"ts": "2026-08-05T09:02:14.777027+09:00", "side": "BUY", "code": "090850", "name": "현대이지웰", "price": 5710, "qty": 934, "cost": 5333940, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 5372, "target": 6218, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "5,730 vs 5,326"}, {"label": "정배열(5>20)", "ok": true, "detail": "5,612 / 5,326"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "5,612 / 5,611"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+11.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +14 · 기 -2 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.46% (환산) vs 평균 0.22% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 5,700"}, {"label": "거래량 급증", "ok": true, "detail": "99,627 (환산) vs 평균 49,512"}, {"label": "회전율 급증", "ok": true, "detail": "0.46% (환산) vs 평균 0.22%"}, {"label": "RSI", "ok": true, "detail": "61"}]}
{"ts": "2026-08-05T09:02:14.777209+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 13040, "qty": 183, "cost": 2386678, "path": "pullback", "reason": "눌림목 지정가 13,170 도달", "stop": 10710, "target": 16534, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "13,040 vs 12,727"}, {"label": "정배열(5>20)", "ok": true, "detail": "14,356 / 12,727"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "14,356 / 13,267"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-6.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -72 · 기 +134 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.13% (환산) vs 평균 1.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 15,870"}, {"label": "거래량 급증", "ok": false, "detail": "78,333 (환산) vs 평균 882,736"}, {"label": "회전율 급증", "ok": false, "detail": "0.13% (환산) vs 평균 1.47%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 13,170 (현재 13,040)"}]}
{"ts": "2026-08-05T09:38:13.273979+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 13830, "qty": 172, "cost": 2379117, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 10710, "target": 16534, "signals": [{"label": "손절선", "ok": true, "detail": "10,710 (현재 13,860)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 16,534"}, {"label": "추세(20일선)", "ok": true, "detail": "12,768"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -72 · 기 +134"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,817"}]}
{"ts": "2026-08-06T09:00:22.388193+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18730, "qty": 289, "proceeds": 5402415, "entry_price": 19090, "pnl": -115423, "pnl_pct": -1.89, "hold_from": "2026-07-30T09:04:07.524830+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "17,993 (현재 18,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 20,736"}, {"label": "추세(20일선)", "ok": false, "detail": "18,842"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -203 · 기 -147"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,459"}]}
{"ts": "2026-08-06T09:34:17.081462+09:00", "side": "BUY", "code": "068270", "name": "셀트리온", "price": 192000, "qty": 27, "cost": 5184778, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 179508, "target": 210738, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "191,800 vs 177,680"}, {"label": "정배열(5>20)", "ok": true, "detail": "186,140 / 177,680"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "186,140 / 176,671"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+20.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +255 · 기 -319 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+44%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.67% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 191,700"}, {"label": "거래량 급증", "ok": true, "detail": "1,582,767 (환산) vs 평균 738,783"}, {"label": "회전율 급증", "ok": true, "detail": "0.67% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "63"}]}
{"ts": "2026-08-06T09:34:17.081755+09:00", "side": "SELL", "code": "090850", "name": "현대이지웰", "price": 5350, "qty": 934, "proceeds": 4987156, "entry_price": 5710, "pnl": -346784, "pnl_pct": -6.3, "hold_from": "2026-08-05T09:02:14.777025+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,372 (현재 5,370)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 6,218"}, {"label": "추세(20일선)", "ok": true, "detail": "5,308"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -30 · 기 -23"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 5,829"}]}
{"ts": "2026-08-07T09:00:20.838255+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19120, "qty": 278, "cost": 5316157, "path": "pullback", "reason": "눌림목 지정가 19,668 도달", "stop": 18038, "target": 20743, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "19,060 vs 18,858"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,598 / 18,858"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,598 / 19,360"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+10.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +73 · 기 -81 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+32%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.06% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "64,387 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.06% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 19,668 (현재 19,060)"}]}
{"ts": "2026-08-07T09:12:17.887713+09:00", "side": "BUY", "code": "068270", "name": "셀트리온", "price": 196400, "qty": 27, "cost": 5303595, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 179508, "target": 210738, "signals": [{"label": "손절선", "ok": true, "detail": "179,508 (현재 196,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 210,738"}, {"label": "추세(20일선)", "ok": true, "detail": "177,905"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +338 · 기 +73"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 196,264"}]}
{"ts": "2026-08-07T11:24:18.220965+09:00", "side": "SELL", "code": "214450", "name": "파마리서치", "price": 356000, "qty": 29, "proceeds": 10303868, "entry_price": 350052, "pnl": 150845, "pnl_pct": 1.7, "hold_from": "2026-07-21T12:06:01.194399+09:00", "reason": "트레일링 익절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "372,486 (현재 354,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "296,825"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +101 · 기 +31"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-08-10T09:00:21.187679+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 384000, "qty": 12, "cost": 4608691, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 349611, "target": 435583, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "383,000 vs 298,275"}, {"label": "정배열(5>20)", "ok": true, "detail": "322,800 / 298,275"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "322,800 / 306,133"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+29.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +35 · 기 -12 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+29%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.87% (환산) vs 평균 0.93% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 334,500"}, {"label": "거래량 급증", "ok": true, "detail": "193,800 (환산) vs 평균 96,436"}, {"label": "회전율 급증", "ok": true, "detail": "1.87% (환산) vs 평균 0.93%"}, {"label": "RSI", "ok": true, "detail": "72"}]}
{"ts": "2026-08-10T09:02:13.489860+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 400000, "qty": 11, "cost": 4400660, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 349611, "target": 435583, "signals": [{"label": "손절선", "ok": true, "detail": "349,611 (현재 399,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 435,583"}, {"label": "추세(20일선)", "ok": true, "detail": "299,100"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +35 · 기 -12"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 396,034"}]}
@@ -0,0 +1,201 @@
{
"cash": 30345484.581500012,
"initial": 100000000,
"positions": {
"214450": {
"code": "214450",
"name": "파마리서치",
"sources": [
"auto"
],
"qty": 22,
"entry_price": 350250.0,
"entry_at": "2026-07-21T12:06:01.196090+09:00",
"stop": 308113,
"target": 413456,
"peak": 411500,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 409000,
"tranches": 2,
"tranche_value": 3939968.9939820534,
"last_add_price": 356000
},
"138040": {
"code": "138040",
"name": "메리츠금융지주",
"sources": [
"auto"
],
"qty": 93,
"entry_price": 119186.02150537634,
"entry_at": "2026-07-29T09:02:02.261876+09:00",
"stop": 111200,
"target": 131165,
"peak": 127600,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 118,115 도달",
"cur_price": 123200,
"tranches": 2,
"tranche_value": 5570614.761375001,
"last_add_price": 120500
},
"086790": {
"code": "086790",
"name": "하나금융지주",
"sources": [
"auto"
],
"qty": 84,
"entry_price": 123203.57142857143,
"entry_at": "2026-07-30T09:04:07.527580+09:00",
"stop": 111000,
"target": 141509,
"peak": 134600,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 122,665 도달",
"cur_price": 130600,
"tranches": 2,
"tranche_value": 5217780.328505317,
"last_add_price": 125200
},
"003680": {
"code": "003680",
"name": "한성기업",
"sources": [
"auto"
],
"qty": 642,
"entry_price": 6332.803738317757,
"entry_at": "2026-07-30T09:04:07.528031+09:00",
"stop": 5039,
"target": 8274,
"peak": 6840,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 7,792 도달",
"cur_price": 6220,
"tranches": 2,
"tranche_value": 2036737.90524699,
"last_add_price": 6550
},
"010950": {
"code": "010950",
"name": "S-Oil",
"sources": [
"auto"
],
"qty": 59,
"entry_price": 133864.40677966102,
"entry_at": "2026-07-30T09:24:07.573212+09:00",
"stop": 118208,
"target": 157349,
"peak": 139900,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 139600,
"tranches": 2,
"tranche_value": 4011548.961969723,
"last_add_price": 136000
},
"194370": {
"code": "194370",
"name": "제이에스코퍼레이션",
"sources": [
"auto"
],
"qty": 535,
"entry_price": 13159.757009345794,
"entry_at": "2026-08-03T12:00:12.472627+09:00",
"stop": 11445,
"target": 15732,
"peak": 14120,
"trailing_on": false,
"scaled_out": false,
"entry_path": "breakout",
"entry_reason": "거래량·회전율 동반 전고점 돌파",
"cur_price": 13370,
"tranches": 2,
"tranche_value": 3529514.3397388323,
"last_add_price": 13420
},
"252990": {
"code": "252990",
"name": "샘씨엔에스",
"sources": [
"auto"
],
"qty": 306,
"entry_price": 13511.437908496731,
"entry_at": "2026-08-05T09:08:12.255584+09:00",
"stop": 10405,
"target": 18170,
"peak": 15670,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 13,947 도달",
"cur_price": 15670,
"tranches": 2,
"tranche_value": 2074177.1346915166,
"last_add_price": 13940
},
"095610": {
"code": "095610",
"name": "테스",
"sources": [
"auto"
],
"qty": 23,
"entry_price": 141621.73913043478,
"entry_at": "2026-08-06T09:08:11.885940+09:00",
"stop": 100700,
"target": 203004,
"peak": 147300,
"trailing_on": false,
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 156,500 도달",
"cur_price": 143700,
"tranches": 2,
"tranche_value": 1664530.2588398196,
"last_add_price": 147100
}
},
"realized_pnl": -14111355.194000024,
"closed_trades": 36,
"wins": 5,
"peak_equity": 101368884.75700004,
"max_drawdown": 0.15532723273265314,
"last_exit": {
"030000": "2026-08-06",
"086790": "2026-07-20",
"403870": "2026-07-07",
"095610": "2026-07-28",
"009150": "2026-07-06",
"093370": "2026-07-20",
"240810": "2026-07-24",
"214450": "2026-07-06",
"034730": "2026-07-07",
"319660": "2026-07-23",
"003490": "2026-07-09",
"105560": "2026-07-20",
"252990": "2026-07-28",
"003680": "2026-07-29",
"010950": "2026-07-29",
"090850": "2026-08-05",
"161890": "2026-07-30",
"078930": "2026-07-31"
},
"created_at": "2026-06-15T14:55:00.583273+09:00",
"updated_at": "2026-08-10T15:28:16.193323+09:00"
}
@@ -0,0 +1,107 @@
{"ts": "2026-06-17T11:15:02.413027+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 130900, "qty": 38, "cost": 4974946, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 118039, "target": 150191, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "129,300 vs 118,195"}, {"label": "정배열(5>20)", "ok": true, "detail": "120,400 / 118,195"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "120,400 / 118,307"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-13.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +371 · 기 +158 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+22%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.12% (환산) vs 평균 0.38% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 126,500"}, {"label": "거래량 급증", "ok": true, "detail": "3,094,534 (환산) vs 평균 1,031,725"}, {"label": "회전율 급증", "ok": true, "detail": "1.12% (환산) vs 평균 0.38%"}, {"label": "RSI", "ok": true, "detail": "60"}]}
{"ts": "2026-06-17T16:47:31.396578+09:00", "side": "BUY", "code": "403870", "name": "HPSP", "price": 62900, "qty": 35, "cost": 2201830, "path": "pullback", "reason": "눌림목 지정가 64,531 도달", "stop": 48962, "target": 83807, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "62,800 vs 52,858"}, {"label": "정배열(5>20)", "ok": true, "detail": "59,880 / 52,858"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "59,880 / 49,831"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+21.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -4,434 · 기 +5,040 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+9%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "11.31% vs 평균 5.97% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 71,500"}, {"label": "거래량 급증", "ok": false, "detail": "9,309,211 vs 평균 4,912,598"}, {"label": "회전율 급증", "ok": true, "detail": "11.31% vs 평균 5.97%"}, {"label": "RSI", "ok": true, "detail": "58"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 64,531 (현재 62,800)"}]}
{"ts": "2026-06-19T09:02:06.463340+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19160, "qty": 325, "cost": 6227934, "path": "pullback", "reason": "눌림목 지정가 20,044 도달", "stop": 17760, "target": 21260, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "19,150 vs 18,862"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,616 / 18,862"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,616 / 19,361"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-31.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,162 · 기 +2,080 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.03% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "37,673 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.03% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 20,044 (현재 19,150)"}]}
{"ts": "2026-06-23T09:00:13.593176+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18820, "qty": 325, "proceeds": 6104573, "entry_price": 19160, "pnl": -123361, "pnl_pct": -1.77, "hold_from": "2026-06-19T09:02:06.463339+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 18,710)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,260"}, {"label": "추세(20일선)", "ok": false, "detail": "18,840"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -318 · 기 -227"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,528"}]}
{"ts": "2026-06-23T12:04:04.273308+09:00", "side": "SELL", "code": "086790", "name": "하나금융지주", "price": 117700, "qty": 38, "proceeds": 4463878, "entry_price": 130900, "pnl": -511068, "pnl_pct": -10.08, "hold_from": "2026-06-17T11:15:02.413026+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "118,039 (현재 117,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 150,191"}, {"label": "추세(20일선)", "ok": false, "detail": "118,130"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +332 · 기 -364"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 134,300"}]}
{"ts": "2026-06-24T09:04:06.149002+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 156700, "qty": 13, "cost": 2037406, "path": "pullback", "reason": "눌림목 지정가 165,075 도달", "stop": 120251, "target": 211374, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "156,200 vs 121,650"}, {"label": "정배열(5>20)", "ok": true, "detail": "143,260 / 121,650"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "143,260 / 121,703"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+46.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +210 · 기 +143 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+6%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "5.83% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": true, "detail": "2,860,073 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": true, "detail": "5.83% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 165,075 (현재 156,200)"}]}
{"ts": "2026-06-24T09:12:05.785677+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 17270, "qty": 150, "cost": 2590889, "path": "pullback", "reason": "눌림목 지정가 17,366 도달", "stop": 13981, "target": 22203, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "17,280 vs 12,914"}, {"label": "정배열(5>20)", "ok": true, "detail": "16,364 / 12,914"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "16,364 / 11,500"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+21.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +1,740 · 기 -508 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+16%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.34% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": false, "detail": "2,509,340 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": false, "detail": "2.34% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "65"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 17,366 (현재 17,280)"}]}
{"ts": "2026-06-24T09:46:05.189379+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 158200, "qty": 13, "cost": 2056908, "path": "pullback", "reason": "눌림목 지정가 158,264 도달", "stop": 120729, "target": 214407, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "158,000 vs 136,315"}, {"label": "정배열(5>20)", "ok": true, "detail": "172,240 / 136,315"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "172,240 / 99,750"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+56.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +41 · 기 +65 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+5%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "4.25% (환산) vs 평균 3.06% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 202,500"}, {"label": "거래량 급증", "ok": false, "detail": "822,940 (환산) vs 평균 591,925"}, {"label": "회전율 급증", "ok": false, "detail": "4.25% (환산) vs 평균 3.06%"}, {"label": "RSI", "ok": true, "detail": "61"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 158,264 (현재 158,000)"}]}
{"ts": "2026-06-24T11:12:06.280465+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 18260, "qty": 142, "cost": 2593309, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 13981, "target": 22203, "signals": [{"label": "손절선", "ok": true, "detail": "13,981 (현재 18,250)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,203"}, {"label": "추세(20일선)", "ok": true, "detail": "12,962"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +1,742 · 기 -508"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 18,094"}]}
{"ts": "2026-06-25T09:00:29.074464+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 179100, "qty": 11, "cost": 1970396, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 120729, "target": 214407, "signals": [{"label": "손절선", "ok": true, "detail": "120,729 (현재 178,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 214,407"}, {"label": "추세(20일선)", "ok": true, "detail": "137,330"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -56 · 기 +134"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 167,275"}]}
{"ts": "2026-06-25T09:04:06.196762+09:00", "side": "BUY", "code": "003490", "name": "대한항공", "price": 28900, "qty": 187, "cost": 5405111, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 26248, "target": 32878, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "28,850 vs 25,948"}, {"label": "정배열(5>20)", "ok": true, "detail": "26,110 / 25,948"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "26,110 / 25,216"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-2.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +1,577 · 기 -7 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.9/5"}, {"label": "상승여력", "ok": true, "detail": "+15%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.54% (환산) vs 평균 0.58% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 28,400"}, {"label": "거래량 급증", "ok": true, "detail": "5,629,873 (환산) vs 평균 2,146,231"}, {"label": "회전율 급증", "ok": true, "detail": "1.54% (환산) vs 평균 0.58%"}, {"label": "RSI", "ok": true, "detail": "64"}]}
{"ts": "2026-06-26T09:00:10.133337+09:00", "side": "SELL", "code": "403870", "name": "HPSP", "price": 50000, "qty": 35, "proceeds": 1746588, "entry_price": 62900, "pnl": -455243, "pnl_pct": -20.51, "hold_from": "2026-06-17T16:47:31.396571+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "48,962 (현재 51,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 83,807"}, {"label": "추세(20일선)", "ok": false, "detail": "52,268"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -311 · 기 -267"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 66,756"}]}
{"ts": "2026-06-26T10:14:04.091073+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 166900, "qty": 12, "cost": 2003100, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 120251, "target": 211374, "signals": [{"label": "손절선", "ok": true, "detail": "120,251 (현재 166,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 211,374"}, {"label": "추세(20일선)", "ok": true, "detail": "122,175"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -126 · 기 +320"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 165,659"}]}
{"ts": "2026-06-29T11:36:01.294138+09:00", "side": "BUY", "code": "034730", "name": "SK", "price": 745000, "qty": 3, "cost": 2235335, "path": "pullback", "reason": "눌림목 지정가 748,914 도달", "stop": 612829, "target": 943257, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "744,000 vs 676,650"}, {"label": "정배열(5>20)", "ok": true, "detail": "766,800 / 676,650"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "766,800 / 530,600"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+12.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -194 · 기 +152 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+8%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.35% (환산) vs 평균 0.45% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 883,000"}, {"label": "거래량 급증", "ok": true, "detail": "977,966 (환산) vs 평균 329,863"}, {"label": "회전율 급증", "ok": true, "detail": "1.35% (환산) vs 평균 0.45%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 748,914 (현재 744,000)"}]}
{"ts": "2026-06-29T14:18:01.514472+09:00", "side": "BUY", "code": "034730", "name": "SK", "price": 778000, "qty": 3, "cost": 2334350, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 612829, "target": 943257, "signals": [{"label": "손절선", "ok": true, "detail": "612,829 (현재 779,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 943,257"}, {"label": "추세(20일선)", "ok": true, "detail": "678,400"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -200 · 기 +143"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 778,043"}]}
{"ts": "2026-06-30T09:00:11.093487+09:00", "side": "BUY", "code": "403870", "name": "HPSP", "price": 55300, "qty": 41, "cost": 2267640, "path": "pullback", "reason": "눌림목 지정가 63,981 도달", "stop": 43200, "target": 73450, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "53,700 vs 52,402"}, {"label": "정배열(5>20)", "ok": true, "detail": "58,060 / 52,402"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "58,060 / 49,679"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+12.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +222 · 기 -821 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+28%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.00% (환산) vs 평균 5.97% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 71,500"}, {"label": "거래량 급증", "ok": false, "detail": "827 (환산) vs 평균 4,912,598"}, {"label": "회전율 급증", "ok": false, "detail": "0.00% (환산) vs 평균 5.97%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 63,981 (현재 53,700)"}]}
{"ts": "2026-07-01T09:06:03.242428+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 357500, "qty": 11, "cost": 3933090, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 314220, "target": 422420, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "357,000 vs 296,975"}, {"label": "정배열(5>20)", "ok": true, "detail": "317,600 / 296,975"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "317,600 / 305,700"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+32.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -75 · 기 +221 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+35%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.89% (환산) vs 평균 0.93% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 334,500"}, {"label": "거래량 급증", "ok": true, "detail": "196,247 (환산) vs 평균 96,436"}, {"label": "회전율 급증", "ok": true, "detail": "1.89% (환산) vs 평균 0.93%"}, {"label": "RSI", "ok": true, "detail": "68"}]}
{"ts": "2026-07-01T09:24:02.341813+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 372000, "qty": 11, "cost": 4092614, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 314220, "target": 422420, "signals": [{"label": "손절선", "ok": true, "detail": "314,220 (현재 372,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 422,420"}, {"label": "추세(20일선)", "ok": true, "detail": "297,725"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -75 · 기 +221"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 368,499"}]}
{"ts": "2026-07-01T09:46:03.131564+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 118200, "qty": 53, "cost": 6265540, "path": "pullback", "reason": "눌림목 지정가 122,286 도달", "stop": 111000, "target": 129000, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "118,200 vs 118,155"}, {"label": "정배열(5>20)", "ok": true, "detail": "120,240 / 118,155"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "120,240 / 118,368"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+3.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +55 · 기 -166 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.35% (환산) vs 평균 0.37% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 130,700"}, {"label": "거래량 급증", "ok": false, "detail": "969,420 (환산) vs 평균 1,026,357"}, {"label": "회전율 급증", "ok": false, "detail": "0.35% (환산) vs 평균 0.37%"}, {"label": "RSI", "ok": true, "detail": "49"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 122,286 (현재 118,200)"}]}
{"ts": "2026-07-01T11:06:02.383642+09:00", "side": "SELL", "code": "095610", "name": "테스", "price": 212000, "qty": 24, "proceeds": 5078078, "entry_price": 167779, "pnl": 1050774, "pnl_pct": 26.36, "hold_from": "2026-06-24T09:46:05.189377+09:00", "reason": "트레일링 익절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "213,193 (현재 213,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "139,065"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -229 · 기 +300"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-02T10:18:03.879326+09:00", "side": "BUY", "code": "009150", "name": "삼성전기", "price": 1985000, "qty": 3, "cost": 5955893, "path": "pullback", "reason": "눌림목 지정가 1,994,011 도달", "stop": 1901000, "target": 2111000, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "1,982,000 vs 1,967,800"}, {"label": "정배열(5>20)", "ok": true, "detail": "2,038,800 / 1,967,800"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "2,038,800 / 1,295,483"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+17.7%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +337 · 기 +193 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+6%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "4.19% (환산) vs 평균 1.76% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 2,417,000"}, {"label": "거래량 급증", "ok": true, "detail": "3,133,469 (환산) vs 평균 1,312,239"}, {"label": "회전율 급증", "ok": true, "detail": "4.19% (환산) vs 평균 1.76%"}, {"label": "RSI", "ok": true, "detail": "56"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 1,994,011 (현재 1,982,000)"}]}
{"ts": "2026-07-02T10:18:03.879709+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 122200, "qty": 51, "cost": 6233135, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 111000, "target": 129000, "signals": [{"label": "손절선", "ok": true, "detail": "111,000 (현재 122,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 129,000"}, {"label": "추세(20일선)", "ok": true, "detail": "118,345"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +22 · 기 -44"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 121,743"}]}
{"ts": "2026-07-02T11:04:07.669466+09:00", "side": "BUY", "code": "003490", "name": "대한항공", "price": 29600, "qty": 183, "cost": 5417613, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 26248, "target": 32878, "signals": [{"label": "손절선", "ok": true, "detail": "26,248 (현재 29,600)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 32,878"}, {"label": "추세(20일선)", "ok": true, "detail": "25,985"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -206 · 기 +1,008"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 29,586"}]}
{"ts": "2026-07-03T09:00:13.858285+09:00", "side": "SELL", "code": "009150", "name": "삼성전기", "price": 1895000, "qty": 3, "proceeds": 5673914, "entry_price": 1985000, "pnl": -281979, "pnl_pct": -4.53, "hold_from": "2026-07-02T10:18:03.879324+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "1,901,000 (현재 1,894,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 2,111,000"}, {"label": "추세(20일선)", "ok": false, "detail": "1,963,400"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +132 · 기 +129"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 2,084,495"}]}
{"ts": "2026-07-03T09:04:01.699572+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 14370, "qty": 292, "proceeds": 4187858, "entry_price": 17751, "pnl": -996340, "pnl_pct": -19.05, "hold_from": "2026-06-24T09:12:05.785674+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "14,457 (현재 14,390)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 22,693"}, {"label": "추세(20일선)", "ok": true, "detail": "12,769"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -1,591 · 기 +253"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-03T09:28:01.669535+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 125700, "qty": 25, "proceeds": 3136372, "entry_price": 161596, "pnl": -904134, "pnl_pct": -22.21, "hold_from": "2026-06-24T09:04:06.149001+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "125,761 (현재 125,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 215,349"}, {"label": "추세(20일선)", "ok": true, "detail": "120,125"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +674 · 기 -2,170"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-03T10:24:02.801848+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19040, "qty": 318, "cost": 6055628, "path": "pullback", "reason": "눌림목 지정가 20,004 도달", "stop": 17760, "target": 20960, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "19,030 vs 18,856"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,592 / 18,856"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,592 / 19,359"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+2.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -35 · 기 +168 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+34%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.54% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "619,193 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.54% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "49"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 20,004 (현재 19,030)"}]}
{"ts": "2026-07-06T09:00:11.853391+09:00", "side": "BUY", "code": "009150", "name": "삼성전기", "price": 1993000, "qty": 3, "cost": 5979897, "path": "pullback", "reason": "눌림목 지정가 1,995,439 도달", "stop": 1901000, "target": 2131000, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "1,975,000 vs 1,967,450"}, {"label": "정배열(5>20)", "ok": true, "detail": "2,037,400 / 1,967,450"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "2,037,400 / 1,295,367"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+9.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +151 · 기 +57 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+9%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.82% (환산) vs 평균 1.76% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 2,417,000"}, {"label": "거래량 급증", "ok": false, "detail": "615,080 (환산) vs 평균 1,312,239"}, {"label": "회전율 급증", "ok": false, "detail": "0.82% (환산) vs 평균 1.76%"}, {"label": "RSI", "ok": true, "detail": "55"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 1,995,439 (현재 1,975,000)"}]}
{"ts": "2026-07-06T09:00:11.855830+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 130600, "qty": 13, "cost": 1698055, "path": "pullback", "reason": "눌림목 지정가 164,068 도달", "stop": 96000, "target": 182500, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "133,100 vs 120,495"}, {"label": "정배열(5>20)", "ok": true, "detail": "138,640 / 120,495"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "138,640 / 121,318"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+17.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +782 · 기 -1,979 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+31%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.01% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": false, "detail": "4,080 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": false, "detail": "0.01% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "52"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 164,068 (현재 133,100)"}]}
{"ts": "2026-07-06T09:46:01.678190+09:00", "side": "SELL", "code": "214450", "name": "파마리서치", "price": 320500, "qty": 22, "proceeds": 7037251, "entry_price": 364750, "pnl": -988453, "pnl_pct": -12.13, "hold_from": "2026-07-01T09:06:03.242427+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "320,756 (현재 320,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 430,741"}, {"label": "추세(20일선)", "ok": true, "detail": "295,150"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -111 · 기 +227"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-06T09:48:02.508738+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 13270, "qty": 165, "cost": 2189878, "path": "pullback", "reason": "눌림목 지정가 17,049 도달", "stop": 10360, "target": 17635, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "13,260 vs 12,712"}, {"label": "정배열(5>20)", "ok": true, "detail": "15,560 / 12,712"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "15,560 / 11,433"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-13.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,226 · 기 +134 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+51%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "12.27% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": true, "detail": "13,156,373 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": true, "detail": "12.27% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 17,049 (현재 13,260)"}]}
{"ts": "2026-07-06T10:06:02.828319+09:00", "side": "SELL", "code": "009150", "name": "삼성전기", "price": 1900000, "qty": 3, "proceeds": 5688885, "entry_price": 1993000, "pnl": -291012, "pnl_pct": -4.67, "hold_from": "2026-07-06T09:00:11.853382+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "1,901,000 (현재 1,901,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 2,131,000"}, {"label": "추세(20일선)", "ok": false, "detail": "1,963,750"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +135 · 기 +46"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 2,089,780"}]}
{"ts": "2026-07-07T09:12:07.295107+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 155900, "qty": 12, "cost": 1871081, "path": "pullback", "reason": "눌림목 지정가 158,314 도달", "stop": 118529, "target": 211957, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "155,800 vs 136,205"}, {"label": "정배열(5>20)", "ok": true, "detail": "171,800 / 136,205"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "171,800 / 99,713"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+43.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +80 · 기 -197 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+14%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "3.33% (환산) vs 평균 3.06% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 202,500"}, {"label": "거래량 급증", "ok": false, "detail": "645,567 (환산) vs 평균 591,925"}, {"label": "회전율 급증", "ok": false, "detail": "3.33% (환산) vs 평균 3.06%"}, {"label": "RSI", "ok": true, "detail": "60"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 158,314 (현재 155,800)"}]}
{"ts": "2026-07-07T09:48:07.792188+09:00", "side": "SELL", "code": "403870", "name": "HPSP", "price": 43000, "qty": 41, "proceeds": 1759562, "entry_price": 55300, "pnl": -508078, "pnl_pct": -22.24, "hold_from": "2026-06-30T09:00:11.093478+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "43,200 (현재 43,050)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 73,450"}, {"label": "추세(20일선)", "ok": false, "detail": "51,870"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +1,424 · 기 -5,706"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 59,449"}]}
{"ts": "2026-07-07T10:30:07.388508+09:00", "side": "SELL", "code": "034730", "name": "SK", "price": 628000, "qty": 6, "proceeds": 3760652, "entry_price": 761500, "pnl": -809033, "pnl_pct": -17.53, "hold_from": "2026-06-29T11:36:01.294137+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "629,329 (현재 628,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 959,757"}, {"label": "추세(20일선)", "ok": false, "detail": "670,850"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -58 · 기 +6"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-07T12:02:08.267102+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 12230, "qty": 165, "proceeds": 2014015, "entry_price": 13270, "pnl": -175863, "pnl_pct": -7.84, "hold_from": "2026-07-06T09:48:02.508720+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "10,360 (현재 12,230)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 17,635"}, {"label": "추세(20일선)", "ok": false, "detail": "12,661"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -1,558 · 기 -4"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 14,272"}]}
{"ts": "2026-07-07T14:10:26.687582+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 177000, "qty": 11, "cost": 1947292, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 118529, "target": 211957, "signals": [{"label": "손절선", "ok": true, "detail": "118,529 (현재 177,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 211,957"}, {"label": "추세(20일선)", "ok": true, "detail": "134,320"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +152 · 기 -281"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 165,142"}]}
{"ts": "2026-07-07T14:10:29.432913+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 20750, "qty": 291, "cost": 6039156, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 17760, "target": 20960, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 20,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 20,960"}, {"label": "추세(20일선)", "ok": true, "detail": "18,884"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +156 · 기 +113"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,358"}]}
{"ts": "2026-07-08T09:00:20.636622+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 108300, "qty": 13, "proceeds": 1405155, "entry_price": 130600, "pnl": -292900, "pnl_pct": -17.08, "hold_from": "2026-07-06T09:00:11.855821+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "166,450 (현재 112,700)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": false, "detail": "119,475"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +243 · 기 -857"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-08T09:48:01.897845+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 161100, "qty": 36, "cost": 5800470, "path": "pullback", "reason": "눌림목 지정가 168,676 도달", "stop": 158000, "target": 165750, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "161,600 vs 149,870"}, {"label": "정배열(5>20)", "ok": true, "detail": "169,960 / 149,870"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "169,960 / 113,252"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+77.7%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +198 · 기 -309 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+11%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "3.83% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": false, "detail": "1,110,233 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": false, "detail": "3.83% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "56"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 168,676 (현재 161,600)"}]}
{"ts": "2026-07-08T10:26:01.992536+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 157600, "qty": 36, "proceeds": 5662536, "entry_price": 161100, "pnl": -137933, "pnl_pct": -2.17, "hold_from": "2026-07-08T09:48:01.897844+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "158,000 (현재 158,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 165,750"}, {"label": "추세(20일선)", "ok": true, "detail": "149,690"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +198 · 기 -312"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 170,862"}]}
{"ts": "2026-07-09T09:02:04.491859+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 158300, "qty": 36, "cost": 5699655, "path": "pullback", "reason": "눌림목 지정가 168,455 도달", "stop": 158000, "target": 158750, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "158,200 vs 149,700"}, {"label": "정배열(5>20)", "ok": true, "detail": "169,280 / 149,700"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "169,280 / 113,195"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+81.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +296 · 기 -306 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+13%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.72% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": false, "detail": "499,233 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": false, "detail": "1.72% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "55"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 168,455 (현재 158,200)"}]}
{"ts": "2026-07-09T09:12:02.533043+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 156900, "qty": 36, "proceeds": 5637386, "entry_price": 158300, "pnl": -62269, "pnl_pct": -0.88, "hold_from": "2026-07-09T09:02:04.491858+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "158,000 (현재 156,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "149,635"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +296 · 기 -306"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-09T09:36:03.483809+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 132000, "qty": 31, "cost": 4092614, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 117015, "target": 154477, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "131,900 vs 108,920"}, {"label": "정배열(5>20)", "ok": true, "detail": "115,560 / 108,920"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "115,560 / 113,228"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+22.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -184 · 기 +964 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+13%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.91% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 116,900"}, {"label": "거래량 급증", "ok": true, "detail": "1,026,867 (환산) vs 평균 359,705"}, {"label": "회전율 급증", "ok": true, "detail": "0.91% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-07-09T12:12:04.882801+09:00", "side": "SELL", "code": "003490", "name": "대한항공", "price": 26500, "qty": 370, "proceeds": 9785880, "entry_price": 29246, "pnl": -1036843, "pnl_pct": -9.39, "hold_from": "2026-06-25T09:04:06.196759+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "26,502 (현재 26,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 33,363"}, {"label": "추세(20일선)", "ok": true, "detail": "25,830"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -1,444 · 기 +2,767"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-10T09:00:14.370382+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 164000, "qty": 35, "cost": 5740861, "path": "pullback", "reason": "눌림목 지정가 169,105 도달", "stop": 158000, "target": 173000, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "162,200 vs 149,900"}, {"label": "정배열(5>20)", "ok": true, "detail": "170,080 / 149,900"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "170,080 / 113,262"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+85.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +225 · 기 -178 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+10%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.58% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": false, "detail": "746,107 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": false, "detail": "2.58% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "56"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 169,105 (현재 162,200)"}]}
{"ts": "2026-07-10T09:28:02.648741+09:00", "side": "BUY", "code": "105560", "name": "KB금융", "price": 185900, "qty": 24, "cost": 4462269, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 166448, "target": 215077, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "185,600 vs 159,890"}, {"label": "정배열(5>20)", "ok": true, "detail": "159,900 / 159,890"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "159,900 / 157,368"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+26.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,310 · 기 +1,527 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+16%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.06% (환산) vs 평균 0.46% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 182,700"}, {"label": "거래량 급증", "ok": true, "detail": "3,715,113 (환산) vs 평균 1,640,325"}, {"label": "회전율 급증", "ok": true, "detail": "1.06% (환산) vs 평균 0.46%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-07-10T09:46:11.500206+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 12830, "qty": 189, "cost": 2425234, "path": "pullback", "reason": "눌림목 지정가 16,984 도달", "stop": 10360, "target": 16535, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "12,820 vs 12,690"}, {"label": "정배열(5>20)", "ok": true, "detail": "15,472 / 12,690"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "15,472 / 11,425"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+1.9%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +228 · 기 +229 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+56%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "9.75% (환산) vs 평균 4.77% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 20,050"}, {"label": "거래량 급증", "ok": true, "detail": "10,460,473 (환산) vs 평균 5,114,125"}, {"label": "회전율 급증", "ok": true, "detail": "9.75% (환산) vs 평균 4.77%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 16,984 (현재 12,820)"}]}
{"ts": "2026-07-10T11:16:02.501268+09:00", "side": "BUY", "code": "093370", "name": "후성", "price": 13850, "qty": 175, "cost": 2424114, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 10360, "target": 16535, "signals": [{"label": "손절선", "ok": true, "detail": "10,360 (현재 13,850)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 16,535"}, {"label": "추세(20일선)", "ok": true, "detail": "12,742"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +210 · 기 +239"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,843"}]}
{"ts": "2026-07-10T12:14:02.697000+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 126200, "qty": 15, "cost": 1893284, "path": "pullback", "reason": "눌림목 지정가 162,268 도달", "stop": 96000, "target": 171500, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "126,200 vs 120,150"}, {"label": "정배열(5>20)", "ok": true, "detail": "137,260 / 120,150"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "137,260 / 121,203"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+17.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +483 · 기 -241 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+38%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "7.53% (환산) vs 평균 2.51% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 183,300"}, {"label": "거래량 급증", "ok": true, "detail": "3,695,762 (환산) vs 평균 1,234,482"}, {"label": "회전율 급증", "ok": true, "detail": "7.53% (환산) vs 평균 2.51%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 162,268 (현재 126,200)"}]}
{"ts": "2026-07-13T09:00:12.613767+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 136900, "qty": 29, "cost": 3970696, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 117015, "target": 154477, "signals": [{"label": "손절선", "ok": true, "detail": "117,015 (현재 136,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 154,477"}, {"label": "추세(20일선)", "ok": true, "detail": "109,140"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -64 · 기 +919"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 135,864"}]}
{"ts": "2026-07-13T09:26:03.435229+09:00", "side": "BUY", "code": "240810", "name": "원익IPS", "price": 139100, "qty": 14, "cost": 1947692, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 96000, "target": 171500, "signals": [{"label": "손절선", "ok": true, "detail": "96,000 (현재 139,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 171,500"}, {"label": "추세(20일선)", "ok": true, "detail": "120,795"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -213 · 기 +772"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 136,162"}]}
{"ts": "2026-07-13T09:36:02.298797+09:00", "side": "BUY", "code": "105560", "name": "KB금융", "price": 191000, "qty": 23, "cost": 4393659, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 166448, "target": 215077, "signals": [{"label": "손절선", "ok": true, "detail": "166,448 (현재 191,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 215,077"}, {"label": "추세(20일선)", "ok": true, "detail": "160,160"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -867 · 기 +1,393"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 190,952"}]}
{"ts": "2026-07-13T12:44:04.379393+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 187900, "qty": 35, "proceeds": 6563676, "entry_price": 164000, "pnl": 822815, "pnl_pct": 14.57, "hold_from": "2026-07-10T09:00:14.370375+09:00", "reason": "트레일링 익절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "189,133 (현재 187,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "151,185"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -254 · 기 +457"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-15T14:32:01.909939+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18570, "qty": 609, "proceeds": 11287077, "entry_price": 19857, "pnl": -807707, "pnl_pct": -6.48, "hold_from": "2026-07-03T10:24:02.801847+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "18,585 (현재 18,570)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,765"}, {"label": "추세(20일선)", "ok": false, "detail": "18,833"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -214 · 기 +240"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-16T09:00:12.739588+09:00", "side": "SELL", "code": "095610", "name": "테스", "price": 209000, "qty": 23, "proceeds": 4797626, "entry_price": 165991, "pnl": 979254, "pnl_pct": 25.91, "hold_from": "2026-07-07T09:12:07.295106+09:00", "reason": "트레일링 익절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "210,764 (현재 207,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "138,765"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -799 · 기 +891"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-20T12:28:02.341884+09:00", "side": "SELL", "code": "093370", "name": "후성", "price": 10310, "qty": 364, "proceeds": 3745522, "entry_price": 13320, "pnl": -1103825, "pnl_pct": -22.6, "hold_from": "2026-07-10T09:46:11.500205+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "10,360 (현재 10,310)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 17,761"}, {"label": "추세(20일선)", "ok": false, "detail": "14,755"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -887 · 기 +515"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-20T12:46:02.303249+09:00", "side": "SELL", "code": "086790", "name": "하나금융지주", "price": 131800, "qty": 104, "proceeds": 13680471, "entry_price": 120162, "pnl": 1181796, "pnl_pct": 9.69, "hold_from": "2026-07-01T09:46:03.131562+09:00", "reason": "트레일링 익절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "131,911 (현재 131,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "118,840"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +0 · 기 +424"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-20T12:50:02.312055+09:00", "side": "SELL", "code": "105560", "name": "KB금융", "price": 167800, "qty": 47, "proceeds": 7871221, "entry_price": 188396, "pnl": -984707, "pnl_pct": -10.93, "hold_from": "2026-07-10T09:28:02.648740+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "168,187 (현재 167,800)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 218,709"}, {"label": "추세(20일선)", "ok": true, "detail": "159,000"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -385 · 기 +288"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-21T10:12:01.069761+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 167000, "qty": 35, "cost": 5845877, "path": "pullback", "reason": "눌림목 지정가 169,640 도달", "stop": 158000, "target": 180500, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "167,000 vs 150,140"}, {"label": "정배열(5>20)", "ok": true, "detail": "171,040 / 150,140"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "171,040 / 113,342"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+92.8%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -534 · 기 +316 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+7%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "3.29% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": false, "detail": "951,819 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": false, "detail": "3.29% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "58"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 169,640 (현재 167,000)"}]}
{"ts": "2026-07-21T12:06:01.196091+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 344500, "qty": 11, "cost": 3790068, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 303577, "target": 405884, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "344,500 vs 296,350"}, {"label": "정배열(5>20)", "ok": true, "detail": "315,100 / 296,350"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "315,100 / 305,492"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+39.7%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -7 · 기 +1 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+43%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.38% (환산) vs 평균 0.93% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 334,500"}, {"label": "거래량 급증", "ok": true, "detail": "247,158 (환산) vs 평균 96,436"}, {"label": "회전율 급증", "ok": true, "detail": "2.38% (환산) vs 평균 0.93%"}, {"label": "RSI", "ok": true, "detail": "65"}]}
{"ts": "2026-07-22T09:00:10.175022+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 177600, "qty": 32, "cost": 5684052, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 158000, "target": 180500, "signals": [{"label": "손절선", "ok": true, "detail": "158,000 (현재 178,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 180,500"}, {"label": "추세(20일선)", "ok": true, "detail": "150,715"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -377 · 기 +151"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 175,894"}]}
{"ts": "2026-07-22T09:04:01.842572+09:00", "side": "BUY", "code": "161890", "name": "한국콜마", "price": 99200, "qty": 59, "cost": 5853678, "path": "pullback", "reason": "눌림목 지정가 98,848 도달", "stop": 92100, "target": 109850, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "98,800 vs 98,505"}, {"label": "정배열(5>20)", "ok": true, "detail": "107,060 / 98,505"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "107,060 / 91,913"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+27.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +29 · 기 -34 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.16% (환산) vs 평균 1.76% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 124,600"}, {"label": "거래량 급증", "ok": false, "detail": "272,433 (환산) vs 평균 415,172"}, {"label": "회전율 급증", "ok": false, "detail": "1.16% (환산) vs 평균 1.76%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 98,848 (현재 98,800)"}]}
{"ts": "2026-07-22T12:12:00.763311+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 157300, "qty": 67, "proceeds": 10518549, "entry_price": 172063, "pnl": -1011380, "pnl_pct": -8.58, "hold_from": "2026-07-21T10:12:01.069760+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "158,000 (현재 157,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 193,157"}, {"label": "추세(20일선)", "ok": true, "detail": "149,655"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -407 · 기 +141"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-22T14:18:05.449230+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 14030, "qty": 156, "cost": 2189008, "path": "pullback", "reason": "눌림목 지정가 14,023 도달", "stop": 11077, "target": 18460, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "14,020 vs 12,776"}, {"label": "정배열(5>20)", "ok": true, "detail": "14,552 / 12,776"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "14,552 / 13,283"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+10.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -1,005 · 기 +1,723 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.97% (환산) vs 평균 1.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 15,870"}, {"label": "거래량 급증", "ok": false, "detail": "585,754 (환산) vs 평균 882,736"}, {"label": "회전율 급증", "ok": false, "detail": "0.97% (환산) vs 평균 1.47%"}, {"label": "RSI", "ok": true, "detail": "53"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 14,023 (현재 14,020)"}]}
{"ts": "2026-07-22T15:04:01.021107+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 158100, "qty": 12, "cost": 1897485, "path": "pullback", "reason": "눌림목 지정가 158,107 도달", "stop": 120314, "target": 214778, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "158,000 vs 136,315"}, {"label": "정배열(5>20)", "ok": true, "detail": "172,240 / 136,315"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "172,240 / 99,750"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+49.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -311 · 기 +22 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+24%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "5.02% (환산) vs 평균 3.06% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 202,500"}, {"label": "거래량 급증", "ok": false, "detail": "971,360 (환산) vs 평균 591,925"}, {"label": "회전율 급증", "ok": true, "detail": "5.02% (환산) vs 평균 3.06%"}, {"label": "RSI", "ok": true, "detail": "61"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 158,107 (현재 158,000)"}]}
{"ts": "2026-07-23T09:00:26.010701+09:00", "side": "BUY", "code": "319660", "name": "피에스케이", "price": 160100, "qty": 35, "cost": 5604341, "path": "pullback", "reason": "눌림목 지정가 169,062 도달", "stop": 158000, "target": 163250, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "158,100 vs 149,695"}, {"label": "정배열(5>20)", "ok": true, "detail": "169,260 / 149,695"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "169,260 / 113,193"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+76.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -162 · 기 +37 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+13%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.05% (환산) vs 평균 2.68% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 196,500"}, {"label": "거래량 급증", "ok": false, "detail": "303,687 (환산) vs 평균 777,376"}, {"label": "회전율 급증", "ok": false, "detail": "1.05% (환산) vs 평균 2.68%"}, {"label": "RSI", "ok": true, "detail": "55"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 169,062 (현재 158,100)"}]}
{"ts": "2026-07-23T09:32:04.436337+09:00", "side": "SELL", "code": "319660", "name": "피에스케이", "price": 157800, "qty": 35, "proceeds": 5512230, "entry_price": 160100, "pnl": -92110, "pnl_pct": -1.44, "hold_from": "2026-07-23T09:00:26.010694+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "158,000 (현재 157,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "149,685"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -162 · 기 +37"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-23T09:44:04.313306+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 18850, "qty": 306, "cost": 5768965, "path": "pullback", "reason": "눌림목 지정가 20,001 도달", "stop": 17760, "target": 20485, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "18,850 vs 18,847"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,556 / 18,847"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,556 / 19,356"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+13.5%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -25 · 기 +6 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+34%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.34% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "388,767 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.34% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "48"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 20,001 (현재 18,850)"}]}
{"ts": "2026-07-23T09:50:01.539143+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 88200, "qty": 43, "cost": 3793169, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 77564, "target": 104155, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "88,200 vs 75,070"}, {"label": "정배열(5>20)", "ok": true, "detail": "83,000 / 75,070"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "83,000 / 75,058"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+47.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -150 · 기 +299 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+17%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.85% (환산) vs 평균 0.42% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 87,600"}, {"label": "거래량 급증", "ok": true, "detail": "785,587 (환산) vs 평균 392,182"}, {"label": "회전율 급증", "ok": true, "detail": "0.85% (환산) vs 평균 0.42%"}, {"label": "RSI", "ok": true, "detail": "67"}]}
{"ts": "2026-07-23T12:18:01.568808+09:00", "side": "BUY", "code": "161890", "name": "한국콜마", "price": 103100, "qty": 57, "cost": 5877582, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 92100, "target": 109850, "signals": [{"label": "손절선", "ok": true, "detail": "92,100 (현재 103,100)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 109,850"}, {"label": "추세(20일선)", "ok": true, "detail": "98,720"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +222 · 기 -227"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 103,029"}]}
{"ts": "2026-07-23T12:22:02.620162+09:00", "side": "BUY", "code": "214450", "name": "파마리서치", "price": 356000, "qty": 11, "cost": 3916587, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 303577, "target": 405884, "signals": [{"label": "손절선", "ok": true, "detail": "303,577 (현재 356,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 405,884"}, {"label": "추세(20일선)", "ok": true, "detail": "296,925"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +6 · 기 +26"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 355,034"}]}
{"ts": "2026-07-23T12:54:04.521033+09:00", "side": "BUY", "code": "078930", "name": "GS", "price": 90900, "qty": 42, "cost": 3818373, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 77564, "target": 104155, "signals": [{"label": "손절선", "ok": true, "detail": "77,564 (현재 91,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 104,155"}, {"label": "추세(20일선)", "ok": true, "detail": "75,210"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -169 · 기 +311"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 90,945"}]}
{"ts": "2026-07-24T09:00:09.216831+09:00", "side": "SELL", "code": "240810", "name": "원익IPS", "price": 111800, "qty": 29, "proceeds": 3235878, "entry_price": 132428, "pnl": -605098, "pnl_pct": -15.58, "hold_from": "2026-07-10T12:14:02.696999+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "96,000 (현재 113,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 187,069"}, {"label": "추세(20일선)", "ok": false, "detail": "119,505"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -480 · 기 -206"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-24T09:00:09.218482+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18730, "qty": 306, "proceeds": 5720204, "entry_price": 18850, "pnl": -48761, "pnl_pct": -0.64, "hold_from": "2026-07-23T09:44:04.313305+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 18,730)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 20,485"}, {"label": "추세(20일선)", "ok": false, "detail": "18,841"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -5 · 기 -5"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,219"}]}
{"ts": "2026-07-24T09:28:04.972694+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 14510, "qty": 151, "cost": 2191339, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 11077, "target": 18460, "signals": [{"label": "손절선", "ok": true, "detail": "11,077 (현재 15,400)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 18,460"}, {"label": "추세(20일선)", "ok": true, "detail": "12,845"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -857 · 기 +1,172"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 14,791"}]}
{"ts": "2026-07-27T09:02:06.260444+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 19100, "qty": 304, "cost": 5807271, "path": "pullback", "reason": "눌림목 지정가 20,032 도달", "stop": 17760, "target": 21110, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "19,070 vs 18,858"}, {"label": "정배열(5>20)", "ok": true, "detail": "19,600 / 18,858"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "19,600 / 19,360"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+16.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +101 · 기 -3 (천주)"}, {"label": "투자의견", "ok": true, "detail": "4.0/5"}, {"label": "상승여력", "ok": true, "detail": "+33%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.13% (환산) vs 평균 0.62% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 21,150"}, {"label": "거래량 급증", "ok": false, "detail": "146,760 (환산) vs 평균 711,709"}, {"label": "회전율 급증", "ok": false, "detail": "0.13% (환산) vs 평균 0.62%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 20,032 (현재 19,070)"}]}
{"ts": "2026-07-27T09:02:06.260602+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 7470, "qty": 421, "cost": 3145342, "path": "pullback", "reason": "눌림목 지정가 7,910 도달", "stop": 6370, "target": 9119, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "7,470 vs 4,876"}, {"label": "정배열(5>20)", "ok": true, "detail": "6,452 / 4,876"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,452 / 4,889"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+82.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +49 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.79% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "49,327 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "0.79% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "74"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,910 (현재 7,470)"}]}
{"ts": "2026-07-27T09:08:02.112215+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 7910, "qty": 398, "cost": 3148652, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 6370, "target": 9119, "signals": [{"label": "손절선", "ok": true, "detail": "6,370 (현재 7,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 9,119"}, {"label": "추세(20일선)", "ok": true, "detail": "4,897"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +49 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 7,747"}]}
{"ts": "2026-07-28T10:08:02.795319+09:00", "side": "SELL", "code": "252990", "name": "샘씨엔에스", "price": 11170, "qty": 307, "proceeds": 3422503, "entry_price": 14266, "pnl": -957844, "pnl_pct": -21.7, "hold_from": "2026-07-22T14:18:05.449229+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "11,223 (현재 11,220)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 18,831"}, {"label": "추세(20일선)", "ok": false, "detail": "12,636"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +106 · 기 -64"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-28T11:22:00.772935+09:00", "side": "SELL", "code": "003680", "name": "한성기업", "price": 6630, "qty": 819, "proceeds": 5419382, "entry_price": 7684, "pnl": -874612, "pnl_pct": -13.71, "hold_from": "2026-07-27T09:02:06.260601+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "6,577 (현재 6,380)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 9,344"}, {"label": "추세(20일선)", "ok": true, "detail": "4,821"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +96 · 기 +0"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-28T11:34:01.995508+09:00", "side": "SELL", "code": "095610", "name": "테스", "price": 120300, "qty": 12, "proceeds": 1440785, "entry_price": 158100, "pnl": -456700, "pnl_pct": -23.91, "hold_from": "2026-07-22T15:04:01.021105+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "120,314 (현재 120,300)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 214,778"}, {"label": "추세(20일선)", "ok": false, "detail": "134,430"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +285 · 기 -563"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 168,711"}]}
{"ts": "2026-07-29T09:02:02.261523+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6540, "qty": 358, "cost": 2341671, "path": "pullback", "reason": "눌림목 지정가 7,837 도달", "stop": 5295, "target": 8408, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "6,540 vs 4,829"}, {"label": "정배열(5>20)", "ok": true, "detail": "6,266 / 4,829"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,266 / 4,873"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+70.4%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +188 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "1.87% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "116,047 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "1.87% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "63"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,837 (현재 6,540)"}]}
{"ts": "2026-07-29T09:02:02.261877+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 117900, "qty": 47, "cost": 5542131, "path": "pullback", "reason": "눌림목 지정가 118,115 도달", "stop": 111200, "target": 127950, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "117,800 vs 113,445"}, {"label": "정배열(5>20)", "ok": true, "detail": "117,020 / 113,445"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "117,020 / 109,982"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+45.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +39 · 기 +307 (천주)"}, {"label": "투자의견", "ok": true, "detail": "3.8/5"}, {"label": "상승여력", "ok": true, "detail": "+26%"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.03% (환산) vs 평균 0.17% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 123,300"}, {"label": "거래량 급증", "ok": false, "detail": "44,660 (환산) vs 평균 289,522"}, {"label": "회전율 급증", "ok": false, "detail": "0.03% (환산) vs 평균 0.17%"}, {"label": "RSI", "ok": true, "detail": "57"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 118,115 (현재 117,800)"}]}
{"ts": "2026-07-29T09:16:04.491611+09:00", "side": "BUY", "code": "138040", "name": "메리츠금융지주", "price": 120500, "qty": 46, "cost": 5543831, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 111200, "target": 127950, "signals": [{"label": "손절선", "ok": true, "detail": "111,200 (현재 120,500)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 127,950"}, {"label": "추세(20일선)", "ok": true, "detail": "113,580"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +39 · 기 +307"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 120,492"}]}
{"ts": "2026-07-29T09:24:10.036116+09:00", "side": "BUY", "code": "030000", "name": "제일기획", "price": 18950, "qty": 307, "cost": 5818523, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 17760, "target": 21110, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 20,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 21,110"}, {"label": "추세(20일선)", "ok": true, "detail": "18,884"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +99 · 기 +138"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 19,418"}]}
{"ts": "2026-07-29T09:24:10.036308+09:00", "side": "SELL", "code": "010950", "name": "S-Oil", "price": 128600, "qty": 60, "proceeds": 7700954, "entry_price": 134368, "pnl": -362356, "pnl_pct": -4.29, "hold_from": "2026-07-09T09:36:03.483808+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "118,912 (현재 116,900)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 157,553"}, {"label": "추세(20일선)", "ok": true, "detail": "107,870"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +43 · 기 +245"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T09:26:01.927146+09:00", "side": "SELL", "code": "003680", "name": "한성기업", "price": 6610, "qty": 358, "proceeds": 2361766, "entry_price": 6540, "pnl": 20094, "pnl_pct": 1.07, "hold_from": "2026-07-29T09:02:02.261522+09:00", "reason": "트레일링 익절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "7,526 (현재 6,610)"}, {"label": "목표/트레일링", "ok": null, "detail": "트레일링 ON"}, {"label": "추세(20일선)", "ok": true, "detail": "4,833"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +188 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-29T09:28:01.408657+09:00", "side": "BUY", "code": "090850", "name": "현대이지웰", "price": 6390, "qty": 854, "cost": 5457879, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 5867, "target": 7174, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "6,380 vs 5,358"}, {"label": "정배열(5>20)", "ok": true, "detail": "5,742 / 5,358"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "5,742 / 5,622"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+43.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +73 · 기 -3 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.62% (환산) vs 평균 0.22% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 5,700"}, {"label": "거래량 급증", "ok": true, "detail": "134,413 (환산) vs 평균 49,512"}, {"label": "회전율 급증", "ok": true, "detail": "0.62% (환산) vs 평균 0.22%"}, {"label": "RSI", "ok": true, "detail": "73"}]}
{"ts": "2026-07-29T13:34:03.613777+09:00", "side": "SELL", "code": "090850", "name": "현대이지웰", "price": 5860, "qty": 854, "proceeds": 4994681, "entry_price": 6390, "pnl": -463197, "pnl_pct": -8.29, "hold_from": "2026-07-29T09:28:01.408655+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,867 (현재 5,860)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 7,174"}, {"label": "추세(20일선)", "ok": true, "detail": "5,332"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +73 · 기 -3"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,525"}]}
{"ts": "2026-07-30T09:04:07.527582+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 121300, "qty": 43, "cost": 5216682, "path": "pullback", "reason": "눌림목 지정가 122,665 도달", "stop": 111000, "target": 136750, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "121,200 vs 118,305"}, {"label": "정배열(5>20)", "ok": true, "detail": "120,840 / 118,305"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "120,840 / 118,418"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+34.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -214 · 기 +182 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+36%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.18% (환산) vs 평균 0.37% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 130,700"}, {"label": "거래량 급증", "ok": false, "detail": "494,880 (환산) vs 평균 1,026,357"}, {"label": "회전율 급증", "ok": false, "detail": "0.18% (환산) vs 평균 0.37%"}, {"label": "RSI", "ok": true, "detail": "51"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 122,665 (현재 121,200)"}]}
{"ts": "2026-07-30T09:04:07.528033+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6130, "qty": 332, "cost": 2035465, "path": "pullback", "reason": "눌림목 지정가 7,792 도달", "stop": 4793, "target": 8135, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "6,120 vs 4,808"}, {"label": "정배열(5>20)", "ok": true, "detail": "6,182 / 4,808"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "6,182 / 4,866"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+65.6%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +234 · 기 +0 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "4.31% (환산) vs 평균 5.69% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 8,460"}, {"label": "거래량 급증", "ok": false, "detail": "267,687 (환산) vs 평균 353,452"}, {"label": "회전율 급증", "ok": false, "detail": "4.31% (환산) vs 평균 5.69%"}, {"label": "RSI", "ok": true, "detail": "59"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 7,792 (현재 6,120)"}]}
{"ts": "2026-07-30T09:16:11.972281+09:00", "side": "BUY", "code": "086790", "name": "하나금융지주", "price": 125200, "qty": 41, "cost": 5133970, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 111000, "target": 136750, "signals": [{"label": "손절선", "ok": true, "detail": "111,000 (현재 125,400)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 136,750"}, {"label": "추세(20일선)", "ok": true, "detail": "118,515"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -214 · 기 +182"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 124,618"}]}
{"ts": "2026-07-30T09:24:07.573214+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 131800, "qty": 30, "cost": 3954593, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 116987, "target": 154020, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "132,000 vs 108,925"}, {"label": "정배열(5>20)", "ok": true, "detail": "115,580 / 108,925"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "115,580 / 113,230"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+51.2%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -6 · 기 +178 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+20%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.66% (환산) vs 평균 0.32% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 116,900"}, {"label": "거래량 급증", "ok": true, "detail": "738,813 (환산) vs 평균 359,705"}, {"label": "회전율 급증", "ok": true, "detail": "0.66% (환산) vs 평균 0.32%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-07-30T11:58:08.476701+09:00", "side": "SELL", "code": "161890", "name": "한국콜마", "price": 91700, "qty": 116, "proceeds": 10616457, "entry_price": 101116, "pnl": -1114802, "pnl_pct": -9.31, "hold_from": "2026-07-22T09:04:01.842571+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "92,100 (현재 91,800)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 114,641"}, {"label": "추세(20일선)", "ok": false, "detail": "98,155"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -7 · 기 +40"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-07-31T09:06:07.680660+09:00", "side": "BUY", "code": "003680", "name": "한성기업", "price": 6550, "qty": 310, "cost": 2030805, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 4793, "target": 8135, "signals": [{"label": "손절선", "ok": true, "detail": "4,793 (현재 6,640)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 8,135"}, {"label": "추세(20일선)", "ok": true, "detail": "4,834"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +355 · 기 +0"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,453"}]}
{"ts": "2026-07-31T09:06:07.681033+09:00", "side": "SELL", "code": "078930", "name": "GS", "price": 77700, "qty": 85, "proceeds": 6591621, "entry_price": 89534, "pnl": -1019920, "pnl_pct": -13.22, "hold_from": "2026-07-23T09:50:01.539141+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "78,555 (현재 78,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 106,003"}, {"label": "추세(20일선)", "ok": true, "detail": "74,560"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -179 · 기 +325"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-08-03T09:44:10.630065+09:00", "side": "BUY", "code": "090850", "name": "현대이지웰", "price": 6120, "qty": 878, "cost": 5374166, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 5629, "target": 6857, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "6,120 vs 5,345"}, {"label": "정배열(5>20)", "ok": true, "detail": "5,690 / 5,345"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "5,690 / 5,618"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+31.1%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +80 · 기 +5 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.61% (환산) vs 평균 0.22% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 5,700"}, {"label": "거래량 급증", "ok": true, "detail": "132,260 (환산) vs 평균 49,512"}, {"label": "회전율 급증", "ok": true, "detail": "0.61% (환산) vs 평균 0.22%"}, {"label": "RSI", "ok": true, "detail": "69"}]}
{"ts": "2026-08-03T12:00:12.472629+09:00", "side": "BUY", "code": "194370", "name": "제이에스코퍼레이션", "price": 12910, "qty": 273, "cost": 3524959, "path": "breakout", "reason": "거래량·회전율 동반 전고점 돌파", "stop": 11314, "target": 15304, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "12,930 vs 11,922"}, {"label": "정배열(5>20)", "ok": true, "detail": "12,138 / 11,922"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "12,138 / 11,924"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+27.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 +7 · 기 +10 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+74%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "어닝 서프라이즈", "ok": true, "detail": "+ "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.72% (환산) vs 평균 0.34% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": true, "detail": "고점 12,870"}, {"label": "거래량 급증", "ok": true, "detail": "208,994 (환산) vs 평균 99,303"}, {"label": "회전율 급증", "ok": true, "detail": "0.72% (환산) vs 평균 0.34%"}, {"label": "RSI", "ok": true, "detail": "63"}]}
{"ts": "2026-08-03T12:02:10.409213+09:00", "side": "BUY", "code": "194370", "name": "제이에스코퍼레이션", "price": 13420, "qty": 262, "cost": 3516567, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 11314, "target": 15304, "signals": [{"label": "손절선", "ok": true, "detail": "11,314 (현재 13,450)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 15,304"}, {"label": "추세(20일선)", "ok": true, "detail": "11,948"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +7 · 기 +10"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,339"}]}
{"ts": "2026-08-05T09:08:12.255231+09:00", "side": "SELL", "code": "090850", "name": "현대이지웰", "price": 5580, "qty": 878, "proceeds": 4889686, "entry_price": 6120, "pnl": -484480, "pnl_pct": -8.82, "hold_from": "2026-08-03T09:44:10.630062+09:00", "reason": "손절", "partial": false, "signals": [{"label": "손절선", "ok": false, "detail": "5,629 (현재 5,580)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 6,857"}, {"label": "추세(20일선)", "ok": true, "detail": "5,318"}, {"label": "수급(외/기)", "ok": true, "detail": "외 +14 · 기 -2"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 6,239"}]}
{"ts": "2026-08-05T09:08:12.255588+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 13110, "qty": 158, "cost": 2071691, "path": "pullback", "reason": "눌림목 지정가 13,947 도달", "stop": 10340, "target": 17265, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "13,110 vs 12,730"}, {"label": "정배열(5>20)", "ok": true, "detail": "14,370 / 12,730"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 하향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "14,370 / 13,268"}, {"label": "상대강도(시장대비)", "ok": false, "detail": "-5.0%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -72 · 기 +134 (천주)"}, {"label": "애널", "ok": null, "detail": "데이터 없음(통과)"}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "0.51% (환산) vs 평균 1.47% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 15,870"}, {"label": "거래량 급증", "ok": false, "detail": "308,907 (환산) vs 평균 882,736"}, {"label": "회전율 급증", "ok": false, "detail": "0.51% (환산) vs 평균 1.47%"}, {"label": "RSI", "ok": true, "detail": "50"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 13,947 (현재 13,110)"}]}
{"ts": "2026-08-05T09:42:12.394579+09:00", "side": "BUY", "code": "252990", "name": "샘씨엔에스", "price": 13940, "qty": 148, "cost": 2063429, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 10340, "target": 17265, "signals": [{"label": "손절선", "ok": true, "detail": "10,340 (현재 13,930)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 17,265"}, {"label": "추세(20일선)", "ok": true, "detail": "12,772"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -72 · 기 +134"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 13,887"}]}
{"ts": "2026-08-06T09:00:22.493715+09:00", "side": "SELL", "code": "030000", "name": "제일기획", "price": 18730, "qty": 611, "proceeds": 11421714, "entry_price": 19025, "pnl": -204079, "pnl_pct": -1.55, "hold_from": "2026-07-27T09:02:06.260443+09:00", "reason": "추세·수급 이탈", "partial": false, "signals": [{"label": "손절선", "ok": true, "detail": "17,760 (현재 18,750)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 20,922"}, {"label": "추세(20일선)", "ok": false, "detail": "18,842"}, {"label": "수급(외/기)", "ok": false, "detail": "외 -203 · 기 -147"}, {"label": "분할(2/2)", "ok": null, "detail": "추가 종료"}]}
{"ts": "2026-08-06T09:08:11.885943+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 136600, "qty": 12, "cost": 1639446, "path": "pullback", "reason": "눌림목 지정가 156,500 도달", "stop": 100700, "target": 190450, "signals": [{"label": "추세(20일선 위)", "ok": true, "detail": "136,400 vs 135,235"}, {"label": "정배열(5>20)", "ok": true, "detail": "167,920 / 135,235"}, {"label": "추세 기울기(20일선↑)", "ok": null, "detail": "게이트 끔(완화) · 실제 우상향"}, {"label": "중기 정배열(5>60)", "ok": true, "detail": "167,920 / 99,390"}, {"label": "상대강도(시장대비)", "ok": true, "detail": "+13.3%p"}, {"label": "수급(5일 외/기)", "ok": true, "detail": "외 -609 · 기 +419 (천주)"}, {"label": "상승여력", "ok": true, "detail": "+44%"}, {"label": "목표가 리비전", "ok": true, "detail": "상향 "}, {"label": "시장 강세", "ok": true, "detail": "강세"}, {"label": "과열 아님(회전율)", "ok": true, "detail": "2.58% (환산) vs 평균 3.06% (보류 3배↑)"}, {"label": "돌파(전고점)", "ok": false, "detail": "고점 202,500"}, {"label": "거래량 급증", "ok": false, "detail": "499,673 (환산) vs 평균 591,925"}, {"label": "회전율 급증", "ok": false, "detail": "2.58% (환산) vs 평균 3.06%"}, {"label": "RSI", "ok": true, "detail": "52"}, {"label": "눌림목 도달", "ok": true, "detail": "지정가 156,500 (현재 136,400)"}]}
{"ts": "2026-08-10T09:00:21.288242+09:00", "side": "BUY", "code": "010950", "name": "S-Oil", "price": 136000, "qty": 29, "cost": 3944592, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 116987, "target": 154020, "signals": [{"label": "손절선", "ok": true, "detail": "116,987 (현재 137,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 154,020"}, {"label": "추세(20일선)", "ok": true, "detail": "109,175"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -253 · 기 +225"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 135,714"}]}
{"ts": "2026-08-10T13:04:18.294941+09:00", "side": "BUY", "code": "095610", "name": "테스", "price": 147100, "qty": 11, "cost": 1618343, "path": "add", "reason": "추격매수 — 2/2차 (추세 지속)", "stop": 100700, "target": 190450, "signals": [{"label": "손절선", "ok": true, "detail": "100,700 (현재 147,000)"}, {"label": "목표/트레일링", "ok": null, "detail": "목표 190,450"}, {"label": "추세(20일선)", "ok": true, "detail": "135,765"}, {"label": "수급(외/기)", "ok": true, "detail": "외 -349 · 기 +177"}, {"label": "분할(1/2)", "ok": null, "detail": "추가 트리거 146,939"}]}

Some files were not shown because too many files have changed in this diff Show More