feat: 새로운 안전 규칙 및 최적화 적용을 통한 트레이딩 시스템 개선
변경 사항 (Changes): 구문 오류(Syntax error) 및 토큰 낭비를 방지하기 위해 에이전트 쉘(Agent shell)과 파이썬 코드 스니펫에 다수의 신규 안전 규칙(Safety rules)을 추가함. 스키마 검증 및 적절한 SQL 포맷팅을 보장하기 위해 임시(Ad-hoc) 데이터베이스 쿼리 작성 가이드라인을 도입함. 코드 수정 후 UI 기능이 정상 작동하는지 확인하기 위해, 백테스트 웹 서비스 재시작 및 브라우저 검증에 대한 새로운 규칙을 구현함. 시스템 전반의 무결성(Integrity)을 유지하기 위해 실전 매매(Live trading), 웹 백테스팅, 파라미터 탐색(Parameter searches) 간의 일관성 검사(Consistency checks) 체계를 확립함. 기대 효과 (Impact): 이러한 개선 사항들은 트레이딩 시스템의 견고성(Robustness)과 신뢰성을 향상시키며, 에러 발생을 최소화하고 다양한 시스템 컴포넌트 간의 원활한 상호작용을 보장함.
This commit is contained in:
@@ -28,8 +28,7 @@
|
||||
<li class="nav-item"><a class="nav-link" data-tab="dashboard" href="#">📈 오늘 운영</a></li>
|
||||
<li class="nav-item"><a class="nav-link" data-tab="liveconfig" href="#">⚙️ 운영 설정</a></li>
|
||||
<li class="nav-item"><a class="nav-link" data-tab="portfolio" href="#">💼 보유·매도</a></li>
|
||||
<!-- 숨김 전략(SCALP·DBBAND·RANGE_BREAK) 탭 — 사용자 지정으로 미노출 (HIDDEN_STRATEGY_IDS) -->
|
||||
<li class="nav-item" style="display:none"><a class="nav-link" data-tab="backtest" href="#">🧪 스캘핑 백테스트</a></li>
|
||||
<li class="nav-item"><a class="nav-link" data-tab="backtest" href="#">📉 스캘핑 백테스트</a></li>
|
||||
<li class="nav-item"><a class="nav-link" data-tab="tail" href="#">🎣 꼬리잡기 백테스트</a></li>
|
||||
<li class="nav-item" style="display:none"><a class="nav-link" data-tab="dbband" href="#">📊 DBBAND</a></li>
|
||||
<li class="nav-item"><a class="nav-link" data-tab="breakout" href="#">🚀 돌파매매 백테스트</a></li>
|
||||
@@ -142,6 +141,9 @@
|
||||
<div class="col-auto">
|
||||
<label class="form-label param-row" style="color:var(--muted);font-size:12px">전략 선택 (kis_trader 봇)</label><br>
|
||||
<div class="d-flex flex-wrap gap-2 gap-md-3 mt-1 align-items-center" style="max-width:920px">
|
||||
<label class="d-flex align-items-center gap-1 mb-0">
|
||||
<input type="radio" name="act_strategy" value="SCALP"> 스캘핑 (SCALP)
|
||||
</label>
|
||||
<label class="d-flex align-items-center gap-1 mb-0">
|
||||
<input type="radio" name="act_strategy" value="SHORT" checked> 꼬리잡기 (SHORT)
|
||||
</label>
|
||||
@@ -173,7 +175,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 요약 카드 -->
|
||||
<!-- 요약 카드 (백테 탭과 동일 레이아웃 + 운용한도 대비 수익률) -->
|
||||
<div class="row g-3 mb-3" id="act_summary_row">
|
||||
<div class="col-6 col-md-3 col-lg-2"><div class="card p-3">
|
||||
<div class="card-title">총 거래</div><div class="stat-val" id="a_total">-</div>
|
||||
@@ -182,7 +184,7 @@
|
||||
<div class="card-title">승률</div><div class="stat-val" id="a_winrate">-</div>
|
||||
</div></div>
|
||||
<div class="col-6 col-md-3 col-lg-2"><div class="card p-3">
|
||||
<div class="card-title">순손익</div><div class="stat-val" id="a_pnl">-</div>
|
||||
<div class="card-title">순손익(수수료·세금 포함)</div><div class="stat-val" id="a_pnl">-</div>
|
||||
</div></div>
|
||||
<div class="col-6 col-md-3 col-lg-2"><div class="card p-3">
|
||||
<div class="card-title">Profit Factor</div><div class="stat-val" id="a_pf">-</div>
|
||||
@@ -193,6 +195,12 @@
|
||||
<div class="col-6 col-md-3 col-lg-2"><div class="card p-3">
|
||||
<div class="card-title">평균 보유(분)</div><div class="stat-val" id="a_hold">-</div>
|
||||
</div></div>
|
||||
<div class="col-6 col-md-3 col-lg-2"><div class="card p-3">
|
||||
<div class="card-title">총 수익률(운용한도 대비)</div><div class="stat-val" id="a_bot_pct">-</div>
|
||||
</div></div>
|
||||
<div class="col-6 col-md-3 col-lg-2"><div class="card p-3">
|
||||
<div class="card-title">일평균 수익률</div><div class="stat-val" id="a_daily_avg_pct">-</div>
|
||||
</div></div>
|
||||
</div>
|
||||
<div id="act_filter_note" class="mb-2" style="display:none;font-size:12px;color:var(--muted)"></div>
|
||||
<!-- 승/패 바 -->
|
||||
@@ -241,6 +249,8 @@
|
||||
<span class="trade-sort-label">정렬</span>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn active" data-sort="exit_desc">매도 최신</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn" data-sort="exit_asc">매도 오래된순</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn" data-sort="buy_desc">매수 최신</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn" data-sort="buy_asc">매수 오래된순</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn" data-sort="pnl_desc">손익↑</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn" data-sort="pnl_asc">손익↓</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn" data-sort="rate_desc">수익률↑</button>
|
||||
@@ -396,28 +406,49 @@
|
||||
|
||||
<!-- ═══ 스캘핑 백테스트 탭 ═══════════════════════════════════════════════ -->
|
||||
<div id="tab-backtest" style="display:none">
|
||||
<div class="card p-3 mb-3">
|
||||
<div class="row g-2 align-items-end mb-1">
|
||||
<div class="col-12" style="font-size:12px;color:var(--muted)">
|
||||
📉 <b>반전(Reversal)</b> 전용 — 모멘텀 추격은 <b>🌊 모멘텀 백테스트</b> 탭을 사용하세요.
|
||||
</div>
|
||||
<div class="card p-3 mb-3" style="border-left:4px solid var(--accent)">
|
||||
<div style="font-size:14px;line-height:1.7">
|
||||
<b>📉 스캘핑 Reversal — 키움 <code>scalp_re</code> 조건검색 + RSI V자 반전</b><br>
|
||||
<span style="color:var(--muted);font-size:12px">
|
||||
• <b>SCAN</b>: 키움 조건검색 → <code>target_candidates_history</code> (strategy_id=SCALP)<br>
|
||||
• <b>TRIGGER</b>: RSI 과매도 반등 · 낙폭필터 · (선택) MACD 골든크로스 — <code>scalping_engine</code> 라이브와 100% 동일<br>
|
||||
• 모멘텀 추격은 <b>🌊 모멘텀 백테스트</b> 탭 사용 (SCALP 와 분리)
|
||||
</span>
|
||||
</div>
|
||||
<div class="row g-2 align-items-end">
|
||||
<!-- 기간 -->
|
||||
<div class="col-6 col-md-2">
|
||||
</div>
|
||||
<div class="card p-3 mb-3">
|
||||
<div class="row g-2 align-items-end mb-2">
|
||||
<div class="col-auto">
|
||||
<label class="form-label param-row">시작일</label>
|
||||
<input type="date" class="form-control" id="bt_start">
|
||||
<input type="date" class="form-control" id="bt_start" style="width:150px">
|
||||
</div>
|
||||
<div class="col-6 col-md-2">
|
||||
<div class="col-auto">
|
||||
<label class="form-label param-row">종료일</label>
|
||||
<input type="date" class="form-control" id="bt_end">
|
||||
<input type="date" class="form-control" id="bt_end" style="width:150px">
|
||||
</div>
|
||||
<div class="col-12 mt-1">
|
||||
<div class="col-auto">
|
||||
<label class="form-label param-row" title="종목당 1회 매수 금액">1회투자(원)<span class="d-block text-muted fw-normal" style="font-size:10px">SCALP_SLOT_MONEY</span></label>
|
||||
<input type="number" class="form-control" id="bt_slot" value="3000000" min="100000" step="100000" style="width:130px">
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<label class="form-label param-row" title="동시 보유 종목 수">동시보유(종)<span class="d-block text-muted fw-normal" style="font-size:10px">SCALP_MAX_STOCKS</span></label>
|
||||
<input type="number" class="form-control" id="bt_max_stocks" value="3" min="1" max="50" style="width:72px">
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<label class="form-label param-row" title="총 운용한도 — 수익률% 분모">총운용한도(원)<span class="d-block text-muted fw-normal" style="font-size:10px">SCALP_TOTAL_BUDGET_KRW</span></label>
|
||||
<input type="number" class="form-control" id="bt_total_budget" value="9000000" min="0" step="100000" style="width:130px">
|
||||
</div>
|
||||
<div class="col-12 mt-2">
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" id="bt_use_univ_history" checked>
|
||||
<label class="form-check-label" for="bt_use_univ_history" style="font-size:12px;color:var(--muted)">
|
||||
<b>저장 후보 이력</b> (<code>target_candidates_history</code>)
|
||||
<span id="bt_univ_hint">— 체크: 저장 이력 / 해제: 반전 시뮬 유니버스</span>
|
||||
<b>저장 후보 이력</b> (<code>target_candidates_history</code>, strategy_id=SCALP) — 체크: DB 슬롯·후보 / 해제: 반전 시뮬 유니버스
|
||||
</label>
|
||||
</div>
|
||||
<div class="form-check mt-1">
|
||||
<input class="form-check-input" type="checkbox" id="bt_env_timeline">
|
||||
<label class="form-check-label" for="bt_env_timeline" style="font-size:12px;color:var(--muted)" title="ON: 봉 시각별 과거 env 스냅샷으로 파람 덮어씀. OFF(기본): 폼 파람 고정">
|
||||
<b>env 타임라인</b> — 체크: 그 시각 DB설정 재현 / <b>해제(기본)</b>: 폼 파람으로 구간 전체
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
@@ -450,10 +481,6 @@
|
||||
<label class="form-label param-row">낙폭필터(%)</label>
|
||||
<input type="number" class="form-control" id="bt_drop" value="2.0" min="0.5" max="5" step="0.1">
|
||||
</div>
|
||||
<div class="col-4 col-md-1">
|
||||
<label class="form-label param-row">투자금(원)</label>
|
||||
<input type="number" class="form-control" id="bt_slot" value="1000000" min="100000" step="100000">
|
||||
</div>
|
||||
</div>
|
||||
<!-- 고급 필터 (2행) -->
|
||||
<div class="row g-2 align-items-end mt-1">
|
||||
@@ -475,33 +502,47 @@
|
||||
</div>
|
||||
<div class="col-4 col-md-1">
|
||||
<label class="form-label param-row" title="매수 가능 시작 시각(HHMM)">매수시작</label>
|
||||
<input type="number" class="form-control" id="bt_time_start" value="830" min="900" max="1500" step="100">
|
||||
<input type="number" class="form-control" id="bt_time_start" value="830" min="830" max="1500" step="10" style="width:80px">
|
||||
</div>
|
||||
<div class="col-4 col-md-1">
|
||||
<label class="form-label param-row" title="매수 가능 종료 시각(HHMM)">매수종료</label>
|
||||
<input type="number" class="form-control" id="bt_time_end" value="1530" min="900" max="1530" step="100">
|
||||
<input type="number" class="form-control" id="bt_time_end" value="1530" min="900" max="1530" step="10" style="width:80px">
|
||||
</div>
|
||||
<div class="col-4 col-md-1">
|
||||
<label class="form-label param-row" title="종목당 하루 최대 거래횟수">일일최대매수</label>
|
||||
<input type="number" class="form-control" id="bt_max_daily" value="3" min="1" max="10">
|
||||
</div>
|
||||
</div>
|
||||
<!-- 방어로직 (스캘핑 전용 env — param_search/엔진과 동일) -->
|
||||
<div class="row g-2 align-items-end mt-1">
|
||||
<div class="col-12 col-md-2">
|
||||
<label class="form-label param-row" title="OFF면 진입 방어(낙폭/고점추격/급등/최소가격)를 비활성화하고, 손절/익절/장마감청산은 유지">방어로직</label>
|
||||
<div class="form-check mt-1">
|
||||
<!-- TRIGGER (SCAN vs TRIGGER — tail·모멘텀 탭과 동일 패턴) -->
|
||||
<div class="row g-2 align-items-center mt-2 p-2 rounded" style="background:#0d1117;border:1px solid #21262d">
|
||||
<div class="col-12"><span class="text-muted" style="font-size:11px"><b style="color:var(--accent)">TRIGGER 필터</b> — HTS SCAN 통과 후 엔진 검사</span></div>
|
||||
<div class="col-6 col-md-2">
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" id="bt_skip_hts_dupes" checked>
|
||||
<label class="form-check-label" for="bt_skip_hts_dupes" style="font-size:12px" title="SCALP_SKIP_HTS_SCAN_DUPES — 낙폭·RSI·거래량 중복 생략">HTS중복스킵</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-6 col-md-2">
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" id="bt_require_reversal" checked>
|
||||
<label class="form-check-label" for="bt_require_reversal" style="font-size:12px" title="SCALP_REQUIRE_REVERSAL_CANDLE">반전캔들필수</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-6 col-md-2">
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" id="bt_use_defense" checked>
|
||||
<label class="form-check-label" for="bt_use_defense">진입 방어 ON</label>
|
||||
<label class="form-check-label" for="bt_use_defense" style="font-size:12px">진입방어 ON</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12 col-md-2">
|
||||
<label class="form-label param-row" title="HTS C — MACD+Stoch [12,26,5,3,3] 골든크로스를 TRIGGER에서 검사 (HTS SCAN에서는 C 제거)">진입모드</label>
|
||||
<div class="form-check mt-1">
|
||||
<div class="col-6 col-md-2">
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" id="bt_use_macd">
|
||||
<label class="form-check-label" for="bt_use_macd">MACD 골든크로스 ON</label>
|
||||
<label class="form-check-label" for="bt_use_macd" style="font-size:12px" title="SCALP_USE_MACD_CROSS">MACD골든크로스</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 방어 수치 -->
|
||||
<div class="row g-2 align-items-end mt-1">
|
||||
<div class="col-4 col-md-1">
|
||||
<label class="form-label param-row" title="당일고가 대비 이 비율 이하면 진입 허용">고점추격방지</label>
|
||||
<input type="number" class="form-control" id="bt_high_chase" value="0.96" min="0.5" max="1" step="0.01">
|
||||
@@ -528,47 +569,16 @@
|
||||
<span class="text-muted" style="font-size:11px">탐색: CLI param_search_scalping.py</span>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 파라미터 설명 — 통합봇 (kis_trader/main.py + ScalpingStrategy + scalping_engine) 기준 -->
|
||||
<!--
|
||||
⚠️ 옛날 단일파일 봇(kis_scalping_ver1.py) 시절의 잔재 안내문을 통합봇 기준으로 전부 갱신.
|
||||
라이브와 백테스트는 동일한 ``scalping_engine.check_buy_signal_live`` /
|
||||
``check_sell_signal_live`` 를 호출하므로 모든 입력란이 라이브 봇에도 그대로 적용된다.
|
||||
-->
|
||||
<div class="mt-3 p-2 rounded" style="background:#0d1117;border:1px solid #21262d;font-size:11px;color:var(--muted)">
|
||||
<b style="color:var(--accent)">📖 파라미터 설명 (실제 봇 <code>kis_trader/main.py</code> = ScalpingStrategy + scalping_engine 기준 — 라이브와 100% 동일 함수 호출)</b>
|
||||
<div class="row g-1 mt-1">
|
||||
<div class="col-12 col-md-6">
|
||||
<table style="width:100%;border-collapse:collapse">
|
||||
<tr><td style="color:#58a6ff;padding:1px 6px;white-space:nowrap">RSI 기간</td><td>RSI 계산 캔들 수 → 라이브 봇 엔진 기본 <b>3</b> (scalping_engine ``rsi_period`` 기본 3, 백테 입력으로 그리드 가능)</td></tr>
|
||||
<tr><td style="color:#58a6ff;padding:1px 6px;white-space:nowrap">RSI 과매도</td><td>이 값 <b>이하</b>일 때 매수 신호 → 봇 DB: <b>SCALP_RSI_OVERSOLD</b> (기본 25)</td></tr>
|
||||
<tr><td style="color:#58a6ff;padding:1px 6px;white-space:nowrap">RSI 과열</td><td>이 값 <b>초과</b>면 진입 금지 (고점 추격 방지) → 봇 DB: <b>SCALP_RSI_OVERBOUGHT</b> (기본 75)</td></tr>
|
||||
<tr><td style="color:#58a6ff;padding:1px 6px;white-space:nowrap">손절(%)</td><td>매수가 대비 하락 시 손절 → 봇 DB: <b>SCALP_STOP_LOSS_PCT</b> (기본 1.5%)</td></tr>
|
||||
<tr><td style="color:#58a6ff;padding:1px 6px;white-space:nowrap">익절(%)</td><td>매수가 대비 상승 시 익절(2순위) → 봇 DB: <b>SCALP_TAKE_PROFIT_PCT</b></td></tr>
|
||||
<tr><td style="color:#58a6ff;padding:1px 6px;white-space:nowrap">익절상한(%)</td><td>목표가 천장 — min(익절, 상한) → DB: <b>SCALP_TP_MAX_PCT</b> (기본 2%, 0=OFF)</td></tr>
|
||||
<tr><td style="color:#58a6ff;padding:1px 6px;white-space:nowrap">낙폭필터(%)</td><td>당일 시가→저가 낙폭이 이 값 이상이어야 진입 → 봇 DB: <b>SCALP_MIN_DROP_RATE</b> (기본 1.5%)</td></tr>
|
||||
<tr><td style="color:#58a6ff;padding:1px 6px;white-space:nowrap">투자금(원)</td><td>1회 최대 투자금 → 봇: <b>SCALP_MAX_LOSS_PER_TRADE_KRW ÷ SCALP_STOP_LOSS_PCT</b> 공식 적용 (없으면 MAX_LOSS_PER_TRADE_KRW), 상한은 <b>SCALP_MAX_BUY_AMOUNT</b>(없으면 MAX_BUY_AMOUNT_PER_STOCK)<br><span style="opacity:.7">예) 200,000÷0.015 = 13,333,333원</span></td></tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="col-12 col-md-6">
|
||||
<table style="width:100%;border-collapse:collapse">
|
||||
<tr><td style="color:#3fb950;padding:1px 6px;white-space:nowrap">쿨다운(분)</td><td>청산 후 같은 종목 재진입 금지(분) → 봇 DB: <b>REENTRY_COOLDOWN_SEC</b>(초) ÷60 자동 변환 (scalping_engine.py)</td></tr>
|
||||
<tr><td style="color:#3fb950;padding:1px 6px;white-space:nowrap">거래량배수</td><td>신호봉 거래량 ≥ 20봉 평균 × N배. 0=비활성 → 봇 DB: <b>VOL_MULTIPLIER</b> (라이브·백테 동일)</td></tr>
|
||||
<tr><td style="color:#3fb950;padding:1px 6px;white-space:nowrap">어깨발동%</td><td>진입가 대비 이 % 이상 수익 후 max_price 추적 시작 → DB: <b>SCALP_SHOULDER_MIN_HIGH_PCT</b> (없으면 SHOULDER_MIN_HIGH_PCT)</td></tr>
|
||||
<tr><td style="color:#3fb950;padding:1px 6px;white-space:nowrap">어깨폭%</td><td>고점 대비 이 % 하락 시 <b>1순위 어깨컷</b> → DB: <b>SCALP_SHOULDER_CUT_PCT</b> (꼬리잡기와 동일 로직)</td></tr>
|
||||
<tr><td style="color:#3fb950;padding:1px 6px;white-space:nowrap">매수시작/종료</td><td>매수 가능 시간대 (HHMM) → 봇 DB: <b>SCALP_TIME_START / SCALP_TIME_END</b> (없으면 글로벌 TIME_START/TIME_END)</td></tr>
|
||||
<tr><td style="color:#3fb950;padding:1px 6px;white-space:nowrap">일일최대매수</td><td>종목당 하루 최대 거래횟수 → 봇 DB: <b>SCALP_MAX_DAILY</b> (없으면 엔진 기본 3)</td></tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mt-1">⚡ 진입가 = <b>신호봉 다음 봉 시가</b> (실제 주문과 동일하게 1봉 지연) | 수수료 0.015%×2 + 거래세 0.18% 자동 차감</div>
|
||||
<div class="mt-1" style="color:#3fb950">✅ <b>라이브-백테스트 100% 동일 엔진</b>: 라이브 ScalpingStrategy.check_buy / check_sell_signals 가 모두 ``scalping_engine.check_buy_signal_live`` / ``check_sell_signal_live`` 를 직접 호출합니다.</div>
|
||||
<b style="color:var(--accent)">📖 SCAN vs TRIGGER vs 청산</b><br>
|
||||
SCAN: 키움 <code>scalp_re</code> · TRIGGER: RSI V자 + (skip OFF 시) 낙폭·거래량·반전캔들 · 청산: 어깨→익절→손절→금액손실→EOD (tp_max는 익절 상한) · 진입=신호봉 다음봉 시가 · 탐색: <code>param_search_scalping.py</code>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 파라미터 요약 -->
|
||||
<div id="bt_params_bar" class="text-muted mb-3" style="font-size:12px;display:none"></div>
|
||||
|
||||
<!-- 요약 카드 -->
|
||||
<!-- 요약 카드 (꼬리/모멘텀/돌파와 동일 8칸) -->
|
||||
<div class="row g-3 mb-3">
|
||||
<div class="col-6 col-md-3 col-lg-2"><div class="card p-3">
|
||||
<div class="card-title">총 거래</div><div class="stat-val" id="b_total">-</div>
|
||||
@@ -588,6 +598,12 @@
|
||||
<div class="col-6 col-md-3 col-lg-2"><div class="card p-3">
|
||||
<div class="card-title">평균 보유(분)</div><div class="stat-val" id="b_hold">-</div>
|
||||
</div></div>
|
||||
<div class="col-6 col-md-3 col-lg-2"><div class="card p-3">
|
||||
<div class="card-title">총 수익률(운용한도 대비)</div><div class="stat-val" id="b_bot_pct">-</div>
|
||||
</div></div>
|
||||
<div class="col-6 col-md-3 col-lg-2"><div class="card p-3">
|
||||
<div class="card-title">일평균 수익률</div><div class="stat-val" id="b_daily_avg_pct">-</div>
|
||||
</div></div>
|
||||
</div>
|
||||
<!-- Buy & Hold 비교 -->
|
||||
<!-- 승/패 바 -->
|
||||
@@ -629,6 +645,8 @@
|
||||
<span class="trade-sort-label">정렬</span>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn active" data-sort="exit_desc">매도 최신</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn" data-sort="exit_asc">매도 오래된순</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn" data-sort="buy_desc">매수 최신</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn" data-sort="buy_asc">매수 오래된순</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn" data-sort="pnl_desc">손익↑</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn" data-sort="pnl_asc">손익↓</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn" data-sort="rate_desc">수익률↑</button>
|
||||
@@ -640,7 +658,7 @@
|
||||
<thead><tr>
|
||||
<th>종목</th><th>매수시각</th><th>매도시각</th>
|
||||
<th>매수가</th><th>매도가</th><th>수량</th>
|
||||
<th>손익(원)</th><th>수익률%</th><th>보유(분)</th><th>매도사유</th><th>진입RSI</th>
|
||||
<th>손익(원)</th><th>수익률%</th><th>누적손익</th><th>누적%</th><th>보유(분)</th><th>매도사유</th><th>진입RSI</th>
|
||||
</tr></thead>
|
||||
<tbody id="bt_tbody"></tbody>
|
||||
</table>
|
||||
@@ -719,17 +737,23 @@
|
||||
</label>
|
||||
</div>
|
||||
<div class="form-check form-check-inline mt-1">
|
||||
<input class="form-check-input" type="checkbox" id="tl_use_tick_db">
|
||||
<input class="form-check-input" type="checkbox" id="tl_use_tick_db" checked>
|
||||
<label class="form-check-label" for="tl_use_tick_db" style="font-size:12px;color:var(--muted)"
|
||||
title="TAIL_BACKTEST_USE_TICK_DB — 기본 OFF(실매 정합). 저장 틱 ~3초라 실시간 구독 진입과 어긋남. 켜면 limit_atr·align 진입가를 ws_ticks로 재생">
|
||||
<b>틱 재생</b> (<code>ws_ticks</code>) — 기본 OFF · 실매는 OHLC 경로 권장
|
||||
title="TAIL_BACKTEST_USE_TICK_DB — 기본 ON. limit_atr·align 진입가를 ws_ticks로 재생(실매 체결 정합)">
|
||||
<b>틱 진입</b> (<code>ws_ticks</code>) — 기본 ON
|
||||
</label>
|
||||
</div>
|
||||
<div class="form-check form-check-inline mt-1">
|
||||
<input class="form-check-input" type="checkbox" id="tl_tick_fallback_ohlc" checked>
|
||||
<input class="form-check-input" type="checkbox" id="tl_tick_fallback_ohlc">
|
||||
<label class="form-check-label" for="tl_tick_fallback_ohlc" style="font-size:12px;color:var(--muted)"
|
||||
title="TAIL_BACKTEST_TICK_FALLBACK_OHLC — 해당 분 틱 없을 때 3분봉 OHLC 폴백">
|
||||
틱 없으면 <b>OHLC 폴백</b>
|
||||
title="TAIL_BACKTEST_TICK_FALLBACK_OHLC — 기본 OFF. 틱 없으면 체결 스킵(실매 정합). ON=3분봉 OHLC 폴백(유령거래)">
|
||||
틱 없으면 <b>OHLC 폴백</b> (기본 OFF)
|
||||
</label>
|
||||
</div>
|
||||
<div class="form-check mt-1">
|
||||
<input class="form-check-input" type="checkbox" id="tl_env_timeline">
|
||||
<label class="form-check-label" for="tl_env_timeline" style="font-size:12px;color:var(--muted)" title="ON: 봉 시각별 과거 env. OFF(기본): 폼 파람 고정">
|
||||
<b>env 타임라인</b> — 체크: 그 시각 DB설정 재현 / <b>해제(기본)</b>: 폼 파람으로 구간 전체
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
@@ -797,16 +821,22 @@
|
||||
<input type="number" class="form-control" id="tl_high_chase" value="96" min="90" max="100" step="1">
|
||||
</div>
|
||||
</div>
|
||||
<!-- 당일 누적손익 트레일 익절 (포트폴리오·일단위) -->
|
||||
<!-- 당일 누적손익 다단트레일 — SHORT_DAILY_PROFIT_TARGET_ENABLED -->
|
||||
<div class="row g-2 align-items-end mt-1">
|
||||
<div class="col-12"><span style="font-size:11px;color:var(--muted)">📅 당일 누적손익 트레일 익절 — 그날 실현손익 고점 대비 되돌리면 신규매수 중단 (실매 daily_profit_halt 동일). 다단 입력 시 단일 되돌림은 무시</span></div>
|
||||
<div class="col-12"><span style="font-size:11px;color:var(--muted)">📅 다단트레일 ON이면 당일 실현손익 고점 대비 되돌릴 때 <b>신규매수만</b> 중단. DB=<code>SHORT_DAILY_PROFIT_TARGET_ENABLED</code>. 이번만 끄려면 체크 해제 후 실행(봇저장 X면 DB 유지).</span></div>
|
||||
<div class="col-auto">
|
||||
<div class="form-check mt-3">
|
||||
<input class="form-check-input" type="checkbox" id="tl_daily_profit_enabled">
|
||||
<label class="form-check-label param-row" for="tl_daily_profit_enabled" title="SHORT_DAILY_PROFIT_TARGET_ENABLED — 다단트레일 ON/OFF. 로드=DB, 봇저장 시 DB 반영">다단트레일</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12 col-md-4">
|
||||
<label class="form-label param-row" title="다단 트레일(ratchet식): 수익원:컷%,… — 벌수록 컷% 타이트하게 사수. 비우면 단일 되돌림 사용. 예: 30000:50,100000:35,300000:25">다단트레일(수익원:컷%,…)</label>
|
||||
<label class="form-label param-row" title="다단 트레일(ratchet식): 수익원:컷%,… — 벌수록 컷% 타이트하게 사수. 비우면 단일 되돌림 사용. 예: 30000:50,100000:35,300000:25">다단규칙(수익원:컷%,…)</label>
|
||||
<select class="form-select form-select-sm mb-1" id="tl_daily_trail_preset"
|
||||
title="파람서치 그리드 프리셋 — 고르면 아래 칸이 채워집니다(직접 수정 가능)"
|
||||
title="프리셋 — 고르면 아래 칸이 채워집니다(감시 스위치는 그대로)"
|
||||
onchange="btApplyPreset('tl_daily_trail_tiers', this.value, false)">
|
||||
<option value="__custom__">프리셋 선택…(직접입력)</option>
|
||||
<option value="off">off (다단 미사용)</option>
|
||||
<option value="off">off (다단 숫자 비움)</option>
|
||||
<option value="20000:40,50000:30,150000:20">보수 20000:40,50000:30,150000:20</option>
|
||||
<option value="30000:50,100000:35,300000:25">중도 30000:50,100000:35,300000:25</option>
|
||||
<option value="50000:60,200000:45,500000:30">공격 50000:60,200000:45,500000:30</option>
|
||||
@@ -814,7 +844,7 @@
|
||||
<input type="text" class="form-control" id="tl_daily_trail_tiers" value="" placeholder="30000:50,100000:35,300000:25" style="font-size:12px">
|
||||
</div>
|
||||
<div class="col-4 col-md-2">
|
||||
<label class="form-label param-row" title="다단이 비었을 때만: 당일 실현손익 고점 대비 이 % 되돌리면 중단. 0=OFF">단일되돌림(%)</label>
|
||||
<label class="form-label param-row" title="다단이 비었을 때만: 당일 실현손익 고점 대비 이 % 되돌리면 중단. 0=미사용">단일되돌림(%)</label>
|
||||
<input type="number" class="form-control" id="tl_daily_trail_drop" value="0" min="0" max="90" step="5" style="width:110px">
|
||||
</div>
|
||||
<div class="col-4 col-md-2">
|
||||
@@ -899,8 +929,20 @@
|
||||
<input type="number" class="form-control" id="tl_te" value="1530" min="900" max="1530" step="100">
|
||||
</div>
|
||||
<div class="col-4 col-md-1">
|
||||
<label class="form-label param-row" title="종목당 하루 최대 거래횟수 (실매 MAX_STOCKS)">일일최대매수</label>
|
||||
<input type="number" class="form-control" id="tl_maxd" value="3" min="1" max="10">
|
||||
<label class="form-label param-row" title="종목당 하루 최대 거래횟수 (안전판)">일일최대매수</label>
|
||||
<input type="number" class="form-control" id="tl_maxd" value="20" min="1" max="50">
|
||||
</div>
|
||||
<div class="col-4 col-md-1">
|
||||
<label class="form-label param-row" title="종목당 당일 실현손익 한도(원, 양수) — 이하면 그 종목만 재진입 금지">종목손실한도(원)</label>
|
||||
<input type="number" class="form-control" id="tl_symbol_loss_krw" value="30000" min="0" step="5000">
|
||||
</div>
|
||||
<div class="col-4 col-md-1">
|
||||
<label class="form-label param-row" title="1회투자금 대비 % — KRW·% 중 먼저 닿는 쪽 적용">종목손실한도(%)</label>
|
||||
<input type="number" class="form-control" id="tl_symbol_loss_pct" value="1.5" min="0" max="10" step="0.5">
|
||||
</div>
|
||||
<div class="col-4 col-md-1">
|
||||
<label class="form-label param-row" title="재진입 허용 최소 당일 누적순익(원, 수수료·세금 감안)">재진입최소(원)</label>
|
||||
<input type="number" class="form-control" id="tl_reentry_min_edge" value="0" min="0" step="500">
|
||||
</div>
|
||||
<div class="col-auto d-flex align-items-end">
|
||||
<div class="form-check mb-2">
|
||||
@@ -1060,7 +1102,9 @@
|
||||
<tr><td style="color:#58a6ff;padding:1px 6px;white-space:nowrap">총 운용한도</td><td>동시 보유 매입금 합 ≤ <b>SHORT_TOTAL_BUDGET_KRW</b> (0=동시보유×1회투자금)</td></tr>
|
||||
<tr><td style="color:#58a6ff;padding:1px 6px;white-space:nowrap">동시보유</td><td><b>SHORT_MAX_STOCKS</b> / MAX_STOCKS — 시각순 포트폴리오, 1봉 1매수</td></tr>
|
||||
<tr><td style="color:#58a6ff;padding:1px 6px;white-space:nowrap">봇저장</td><td><code>insert_env_snapshot</code> → <b>config_short</b> + env_config 자동 분리</td></tr>
|
||||
<tr><td style="color:#58a6ff;padding:1px 6px;white-space:nowrap">RSI과열기준</td><td><b>RSI_OVERHEAT_THRESHOLD</b> · 쿨다운 <b>REENTRY_COOLDOWN_SEC</b></td></tr>
|
||||
<tr><td style="color:#58a6ff;padding:1px 6px;white-space:nowrap">일일최대매수</td><td><b>TAIL_MAX_DAILY</b> — 무한루프 안전판(기본 20). 실질 제어는 아래 손실한도·재진입최소.</td></tr>
|
||||
<tr><td style="color:#58a6ff;padding:1px 6px;white-space:nowrap">종목손실한도</td><td><b>TAIL_SYMBOL_DAILY_LOSS_LIMIT_KRW/PCT</b>(양수) — 종목 당일 실현손익이 −한도 이하면 그 종목만 재진입 금지. KRW·% 중 <b>먼저 닿는 쪽</b>.</td></tr>
|
||||
<tr><td style="color:#58a6ff;padding:1px 6px;white-space:nowrap">재진입최소(원)</td><td><b>TAIL_REENTRY_MIN_EDGE_KRW</b> — 2회째 진입부터 당일 누적순익이 이 값 미만이면 차단(회전매매 방지).</td></tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1151,6 +1195,8 @@
|
||||
<span class="trade-sort-label">정렬</span>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn active" data-sort="exit_desc">매도 최신</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn" data-sort="exit_asc">매도 오래된순</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn" data-sort="buy_desc">매수 최신</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn" data-sort="buy_asc">매수 오래된순</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn" data-sort="pnl_desc">손익↑</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn" data-sort="pnl_asc">손익↓</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn" data-sort="rate_desc">수익률↑</button>
|
||||
@@ -1242,6 +1288,10 @@
|
||||
<input class="form-check-input" type="checkbox" id="db_use_trend" checked>
|
||||
<label class="form-check-label" for="db_use_trend">추세 MA 필터</label>
|
||||
</div>
|
||||
<div class="col-auto form-check mt-2">
|
||||
<input class="form-check-input" type="checkbox" id="db_env_timeline">
|
||||
<label class="form-check-label" for="db_env_timeline" style="font-size:12px;color:var(--muted)" title="ON: 봉 시각별 과거 env. OFF(기본): 폼 파람 고정">env 타임라인</label>
|
||||
</div>
|
||||
<div class="col-12 col-md-auto mt-2 d-flex gap-1 flex-wrap align-items-center">
|
||||
<span class="align-self-center me-1" style="font-size:11px;color:var(--muted)">분봉수집</span>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary" style="color:#58a6ff;border-color:#58a6ff" onclick="dbFetchMinKiwoom(60)" title="KR=키움 ka10080 / US=KIS 해외분봉 → holding_min_candles">60분</button>
|
||||
@@ -1384,6 +1434,16 @@
|
||||
<input type="number" class="form-control" id="bo_total_budget" value="2000000" min="0" step="100000" style="width:130px">
|
||||
</div>
|
||||
</div>
|
||||
<!-- TRIGGER (SCAN vs TRIGGER — 스캘핑·모멘텀 탭과 동일 패턴) -->
|
||||
<div class="row g-2 align-items-center mt-2 p-2 rounded" style="background:#0d1117;border:1px solid #21262d">
|
||||
<div class="col-12"><span class="text-muted" style="font-size:11px"><b style="color:var(--accent)">TRIGGER 필터</b> — HTS breakout SCAN 통과 후 엔진 검사</span></div>
|
||||
<div class="col-6 col-md-2">
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" id="bo_skip_hts_dupes" checked>
|
||||
<label class="form-check-label" for="bo_skip_hts_dupes" style="font-size:12px" title="BREAKOUT_SKIP_HTS_SCAN_DUPES — 일봉 돌파·등락·거래량 중복 생략">HTS중복스킵</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 매도/포지션 (2행) -->
|
||||
<div class="row g-2 align-items-end mt-1 flex-wrap">
|
||||
<div class="col-auto">
|
||||
@@ -1457,7 +1517,7 @@
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<label class="form-label param-row" title="종목당 일일 최대 진입 횟수">일일최대</label>
|
||||
<input type="number" class="form-control" id="bo_max_daily" value="1" min="1" max="5" step="1" style="width:64px">
|
||||
<input type="number" class="form-control" id="bo_max_daily" value="100" min="1" max="100" step="1" style="width:64px">
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<label class="form-label param-row" title="종목당 매도 후 재진입 금지(분)">쿨다운(분)</label>
|
||||
@@ -1479,6 +1539,10 @@
|
||||
<label class="form-label param-row" title="돌파봉 양봉 몸통(종가-시가)/시가 가 이 % 이상이어야 진입. 도지·윗꼬리(찌르고 빠짐) 차단. 0=OFF">양봉몸통최소(%)</label>
|
||||
<input type="number" class="form-control" id="bo_body_min" value="0" min="0" max="10" step="0.05" style="width:90px">
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<label class="form-label param-row" title="다단 래칫 — 값 있으면 단일 어깨컷 대체. 형식 수익%:컷%,… (BREAKOUT_RATCHET_TIERS). 비우면 OFF">래칫티어</label>
|
||||
<input type="text" class="form-control" id="bo_ratchet" value="" placeholder="3:1.5,6:1.0" style="width:160px;font-size:12px">
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<label class="form-label param-row" title="종목당 1회 최대 손실(원)">1회최대손실</label>
|
||||
<input type="number" class="form-control" id="bo_max_loss" value="200000" min="0" step="10000" style="width:110px">
|
||||
@@ -1514,16 +1578,22 @@
|
||||
<input type="number" class="form-control" id="bo_ema_slow" value="21" min="3" max="120" step="1">
|
||||
</div>
|
||||
</div>
|
||||
<!-- 당일 누적손익 트레일 익절 (포트폴리오·일단위) -->
|
||||
<!-- 당일 누적손익 다단트레일 — BREAKOUT_DAILY_PROFIT_TARGET_ENABLED -->
|
||||
<div class="row g-2 align-items-end mt-1">
|
||||
<div class="col-12"><span style="font-size:11px;color:var(--muted)">📅 당일 누적손익 트레일 익절 — 그날 실현손익 고점 대비 되돌리면 신규매수 중단 (실매 daily_profit_halt 동일). 다단 입력 시 단일 되돌림은 무시</span></div>
|
||||
<div class="col-12"><span style="font-size:11px;color:var(--muted)">📅 다단트레일 ON이면 당일 실현손익 고점 대비 되돌릴 때 <b>신규매수만</b> 중단. DB=<code>BREAKOUT_DAILY_PROFIT_TARGET_ENABLED</code>. 이번만 끄려면 체크 해제 후 실행(봇저장 X면 DB 유지).</span></div>
|
||||
<div class="col-auto">
|
||||
<div class="form-check mt-3">
|
||||
<input class="form-check-input" type="checkbox" id="bo_daily_profit_enabled">
|
||||
<label class="form-check-label param-row" for="bo_daily_profit_enabled" title="BREAKOUT_DAILY_PROFIT_TARGET_ENABLED — 다단트레일 ON/OFF. 로드=DB, 봇저장 시 DB 반영">다단트레일</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12 col-md-4">
|
||||
<label class="form-label param-row" title="다단 트레일(ratchet식): 수익원:컷%,… — 벌수록 컷% 타이트. 비우면 단일 되돌림 사용. 예: 30000:50,100000:35,300000:25">다단트레일(수익원:컷%,…)</label>
|
||||
<label class="form-label param-row" title="다단 트레일(ratchet식): 수익원:컷%,… — 벌수록 컷% 타이트. 비우면 단일 되돌림 사용. 예: 30000:50,100000:35,300000:25">다단규칙(수익원:컷%,…)</label>
|
||||
<select class="form-select form-select-sm mb-1" id="bo_daily_trail_preset"
|
||||
title="프리셋 — 고르면 아래 칸이 채워집니다(직접 수정 가능). 저장하면 ★ 항목으로 추가됨"
|
||||
title="프리셋 — 고르면 아래 칸이 채워집니다(감시 스위치는 그대로)"
|
||||
onchange="btApplyPreset('bo_daily_trail_tiers', this.value, false)">
|
||||
<option value="__custom__">프리셋 선택…(직접입력)</option>
|
||||
<option value="off">off (다단 미사용)</option>
|
||||
<option value="off">off (다단 숫자 비움)</option>
|
||||
<option value="20000:40,50000:30,150000:20">보수 20000:40,50000:30,150000:20</option>
|
||||
<option value="30000:50,100000:35,300000:25">중도 30000:50,100000:35,300000:25</option>
|
||||
<option value="50000:60,200000:45,500000:30">공격 50000:60,200000:45,500000:30</option>
|
||||
@@ -1531,7 +1601,7 @@
|
||||
<input type="text" class="form-control" id="bo_daily_trail_tiers" value="" placeholder="30000:50,100000:35,300000:25" style="font-size:12px">
|
||||
</div>
|
||||
<div class="col-4 col-md-2">
|
||||
<label class="form-label param-row" title="다단이 비었을 때만: 당일 실현손익 고점 대비 이 % 되돌리면 중단. 0=OFF">단일되돌림(%)</label>
|
||||
<label class="form-label param-row" title="다단이 비었을 때만: 당일 실현손익 고점 대비 이 % 되돌리면 중단. 0=미사용">단일되돌림(%)</label>
|
||||
<input type="number" class="form-control" id="bo_daily_trail_drop" value="0" min="0" max="90" step="5" style="width:110px">
|
||||
</div>
|
||||
<div class="col-4 col-md-2">
|
||||
@@ -1554,6 +1624,12 @@
|
||||
<b>저장 후보 이력</b> (<code>target_candidates_history</code>) — 체크: DB 슬롯·후보 / 해제: ws_candles 전 종목
|
||||
</label>
|
||||
</div>
|
||||
<div class="form-check mt-1">
|
||||
<input class="form-check-input" type="checkbox" id="bo_env_timeline">
|
||||
<label class="form-check-label" for="bo_env_timeline" style="font-size:12px;color:var(--muted)" title="ON: 봉 시각별 과거 env. OFF(기본): 폼 파람 고정">
|
||||
<b>env 타임라인</b> — 체크: 그 시각 DB설정 재현 / <b>해제(기본)</b>: 폼 파람으로 구간 전체
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12 col-md-auto mt-2 d-flex gap-2 flex-wrap">
|
||||
<button class="btn btn-primary px-4" onclick="runBreakoutBacktest()">🚀 백테스트 실행</button>
|
||||
@@ -1658,6 +1734,8 @@
|
||||
<span class="trade-sort-label">정렬</span>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn active" data-sort="exit_desc">매도 최신</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn" data-sort="exit_asc">매도 오래된순</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn" data-sort="buy_desc">매수 최신</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn" data-sort="buy_asc">매수 오래된순</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn" data-sort="pnl_desc">손익↑</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn" data-sort="pnl_asc">손익↓</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn" data-sort="rate_desc">수익률↑</button>
|
||||
@@ -1669,7 +1747,8 @@
|
||||
<thead><tr>
|
||||
<th>종목</th><th>매수시각</th><th>매도시각</th>
|
||||
<th>매수가</th><th>매도가</th><th>수량</th>
|
||||
<th>손익(원)</th><th>수익률%</th><th>보유(분)</th><th>매도사유</th>
|
||||
<th>손익(원)</th><th>수익률%</th><th>누적손익</th><th>누적%</th>
|
||||
<th>보유(분)</th><th>체결디버그</th><th>매도사유</th>
|
||||
</tr></thead>
|
||||
<tbody id="bo_tbody"></tbody>
|
||||
</table>
|
||||
@@ -1795,6 +1874,12 @@
|
||||
<b>저장 후보 이력</b> (<code>target_candidates_history</code>, strategy_id=RANGE_BREAK)
|
||||
</label>
|
||||
</div>
|
||||
<div class="form-check mt-1">
|
||||
<input class="form-check-input" type="checkbox" id="rb_env_timeline">
|
||||
<label class="form-check-label" for="rb_env_timeline" style="font-size:12px;color:var(--muted)" title="ON: 봉 시각별 과거 env. OFF(기본): 폼 파람 고정">
|
||||
<b>env 타임라인</b> — 체크: 그 시각 DB설정 재현 / <b>해제(기본)</b>: 폼 파람으로 구간 전체
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12 col-md-auto mt-2 d-flex gap-2 flex-wrap">
|
||||
<button class="btn btn-primary px-4" onclick="runRangeBreakBacktest()">🚀 백테스트 실행</button>
|
||||
@@ -1809,26 +1894,67 @@
|
||||
</div>
|
||||
<div id="rb_params_bar" class="text-muted mb-3" style="font-size:12px;display:none"></div>
|
||||
<div id="rb_result_area" style="display:none">
|
||||
<!-- 요약 카드 — 꼬리/스캘핑과 동일 8칸 -->
|
||||
<div class="row g-3 mb-3">
|
||||
<div class="col-6 col-md-3 col-lg-2"><div class="card p-3"><div class="card-title">총 거래</div><div class="stat-val" id="rb_total">-</div></div></div>
|
||||
<div class="col-6 col-md-3 col-lg-2"><div class="card p-3"><div class="card-title">승률</div><div class="stat-val" id="rb_winrate">-</div></div></div>
|
||||
<div class="col-6 col-md-3 col-lg-2"><div class="card p-3"><div class="card-title">순손익</div><div class="stat-val" id="rb_pnl">-</div></div></div>
|
||||
<div class="col-6 col-md-3 col-lg-2"><div class="card p-3"><div class="card-title">PF</div><div class="stat-val" id="rb_pf">-</div></div></div>
|
||||
<div class="col-6 col-md-3 col-lg-2"><div class="card p-3"><div class="card-title">MDD</div><div class="stat-val" id="rb_mdd">-</div></div></div>
|
||||
<div class="col-6 col-md-3 col-lg-2"><div class="card p-3"><div class="card-title">평균보유</div><div class="stat-val" id="rb_hold">-</div></div></div>
|
||||
<div class="col-6 col-md-3 col-lg-2"><div class="card p-3">
|
||||
<div class="card-title">총 거래</div><div class="stat-val" id="rb_total">-</div>
|
||||
</div></div>
|
||||
<div class="col-6 col-md-3 col-lg-2"><div class="card p-3">
|
||||
<div class="card-title">승률</div><div class="stat-val" id="rb_winrate">-</div>
|
||||
</div></div>
|
||||
<div class="col-6 col-md-3 col-lg-2"><div class="card p-3">
|
||||
<div class="card-title">순손익(수수료·세금 포함)</div><div class="stat-val" id="rb_pnl">-</div>
|
||||
</div></div>
|
||||
<div class="col-6 col-md-3 col-lg-2"><div class="card p-3">
|
||||
<div class="card-title">Profit Factor</div><div class="stat-val" id="rb_pf">-</div>
|
||||
</div></div>
|
||||
<div class="col-6 col-md-3 col-lg-2"><div class="card p-3">
|
||||
<div class="card-title">최대 낙폭(MDD)</div><div class="stat-val red" id="rb_mdd">-</div>
|
||||
</div></div>
|
||||
<div class="col-6 col-md-3 col-lg-2"><div class="card p-3">
|
||||
<div class="card-title">평균 보유(분)</div><div class="stat-val" id="rb_hold">-</div>
|
||||
</div></div>
|
||||
<div class="col-6 col-md-3 col-lg-2"><div class="card p-3">
|
||||
<div class="card-title">총 수익률(운용한도 대비)</div><div class="stat-val" id="rb_bot_pct">-</div>
|
||||
</div></div>
|
||||
<div class="col-6 col-md-3 col-lg-2"><div class="card p-3">
|
||||
<div class="card-title">일평균 수익률</div><div class="stat-val" id="rb_daily_avg_pct">-</div>
|
||||
</div></div>
|
||||
</div>
|
||||
<div class="card p-3 mb-3" id="rb_winbar_card" style="display:none">
|
||||
<div class="d-flex justify-content-between mb-1">
|
||||
<span style="color:var(--green)" id="rb_win_label">-</span>
|
||||
<span style="color:var(--red)" id="rb_loss_label">-</span>
|
||||
</div>
|
||||
<div class="ratio-bar">
|
||||
<span class="ratio-fill-g" id="rb_ratio_g" style="width:50%"></span>
|
||||
<span class="ratio-fill-r" id="rb_ratio_r" style="width:50%"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row g-3 mb-3">
|
||||
<div class="col-md-6"><div class="card p-3"><div class="card-title">누적손익</div><canvas id="rb_equity_chart" height="120"></canvas></div></div>
|
||||
<div class="col-md-3"><div class="card p-3"><div class="card-title">청산사유</div><canvas id="rb_reason_chart" height="120"></canvas></div></div>
|
||||
<div class="col-md-3"><div class="card p-3"><div class="card-title">일별손익</div><canvas id="rb_daily_chart" height="120"></canvas></div></div>
|
||||
</div>
|
||||
<div id="rb_trade_context" class="mb-2 p-2 rounded" style="font-size:12px;background:var(--bg-secondary, #1c2128);color:var(--muted);display:none"></div>
|
||||
<div class="trade-sort-bar mb-2" data-tbody="rb_tbody">
|
||||
<span class="trade-sort-label">정렬</span>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn active" data-sort="exit_desc">매도 최신</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn" data-sort="exit_asc">매도 오래된순</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn" data-sort="buy_desc">매수 최신</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn" data-sort="buy_asc">매수 오래된순</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn" data-sort="pnl_desc">손익↑</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn" data-sort="pnl_asc">손익↓</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn" data-sort="rate_desc">수익률↑</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn" data-sort="rate_asc">수익률↓</button>
|
||||
</div>
|
||||
<div class="card p-3">
|
||||
<div class="card-title mb-2">거래내역</div>
|
||||
<div class="table-responsive"><table class="table table-sm table-hover">
|
||||
<thead><tr>
|
||||
<th>종목</th><th>매수시각</th><th>매도시각</th>
|
||||
<th>매수가</th><th>매도가</th><th>수량</th>
|
||||
<th>손익(원)</th><th>수익률%</th><th>보유(분)</th><th>매도사유</th>
|
||||
<th>손익(원)</th><th>수익률%</th><th>누적손익</th><th>누적%</th><th>보유(분)</th><th>매도사유</th>
|
||||
</tr></thead>
|
||||
<tbody id="rb_tbody"></tbody>
|
||||
</table></div>
|
||||
@@ -1841,7 +1967,7 @@
|
||||
[모멘텀 전략 = 키움 'scalp' 조건검색(갭상승+신고가) 추종]
|
||||
- 봇: STRATEGY_MOMENTUM_ENABLED=true 로 켜면 MomentumStrategy 가독립 쓰레드로 동작.
|
||||
- 청산: momentum_engine 전용 — 래칫/어깨 → 트레일 → 손절 → 익절상한(tp_max) → 장마감.
|
||||
- 새 ENV 키 'MOMENTUM_*' 우선, 없으면 기존 'SCALP_MOM_*' 자동 fallback.
|
||||
- env 키 <code>MOMENTUM_*</code> 전용.
|
||||
- 백엔드: /api/backtest/momentum → momentum_engine (SCALP reversal 과 분리).
|
||||
-->
|
||||
<div id="tab-momentum" style="display:none">
|
||||
@@ -1854,7 +1980,7 @@
|
||||
• <b>진입</b>: 키움 <code>scalp</code> 조건검색(갭상승+신고가+거래량 폭증) → 봇 자체 RSI 강세/거래량 spike/양봉 검증<br>
|
||||
• <b>청산</b>: <code>momentum_engine</code> — <b>래칫/어깨·트레일 우선</b>, 익절%는 <b>tp_max 상한(마지막)</b> · 손절/EOD<br>
|
||||
• <b>봇 ON</b>: <code>STRATEGY_MOMENTUM_ENABLED=true</code> + <code>CONDITION_MOMENTUM_NAME/SEQ</code> 설정<br>
|
||||
• <b>호환</b>: 새 키 <code>MOMENTUM_*</code> 미설정 시 기존 <code>SCALP_MOM_*</code> 자동 fallback (운영 데이터 그대로 승계)
|
||||
• env 키: <code>MOMENTUM_*</code> 전용
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
@@ -2045,6 +2171,12 @@
|
||||
<label class="form-check-label param-row" for="mom_eod_enabled" title="ON=설정 시각 이후 보유 전량 당일청산">EOD청산</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-auto d-flex align-items-end">
|
||||
<div class="form-check mb-2">
|
||||
<input class="form-check-input" type="checkbox" id="mom_skip_pre_sub">
|
||||
<label class="form-check-label param-row" for="mom_skip_pre_sub" title="정합용: 종목 첫 ws_tick 분 이전 진입 제외 (파람 탐색은 OFF 권장)">구독전분제외<span class="d-block text-muted fw-normal" style="font-size:10px">MOMENTUM_BACKTEST_SKIP_PRE_SUBSCRIBE</span></label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<label class="form-label param-row" title="EOD 당일청산 시각 (HH:MM)">EOD시각<span class="d-block text-muted fw-normal" style="font-size:10px">MOMENTUM_EOD_HM</span></label>
|
||||
<input type="text" class="form-control" id="mom_eod_hm" value="15:25" placeholder="15:25" style="width:72px">
|
||||
@@ -2072,7 +2204,7 @@
|
||||
<span id="mom_pg_filter_note" class="d-block text-muted" style="font-size:10px"></span>
|
||||
</div>
|
||||
<div class="col-6 col-md-2">
|
||||
<label class="form-label param-row" title="호가 스프레드 상한(%). 0.45=0.45%. kiwoom_0d 본체 재계산(6/25~). 본체 없는 날은 log 판정 폴백">스프레드상한(%)<span class="d-block text-muted fw-normal" style="font-size:10px">ORDERBOOK_MAX_SPREAD_PCT</span></label>
|
||||
<label class="form-label param-row" title="호가 스프레드 상한(%). 0.45=0.45%. kiwoom_0d 본체 재계산(6/25~). 본체 없는 날은 log 판정 폴백">스프레드상한(%)<span class="d-block text-muted fw-normal" style="font-size:10px">MOMENTUM_ORDERBOOK_MAX_SPREAD_PCT</span></label>
|
||||
<input type="number" step="0.01" class="form-control form-control-sm" id="mom_max_spread_pct" value="0.45">
|
||||
</div>
|
||||
<div class="col-6 col-md-2">
|
||||
@@ -2121,15 +2253,21 @@
|
||||
<label class="form-label param-row" title="본절사수 시 최소 순이익 마진(%)">본절마진(%)<span class="d-block text-muted fw-normal" style="font-size:10px">breakeven buffer · MOMENTUM_MIN_PROFIT_PCT</span></label>
|
||||
<input type="number" class="form-control" id="mom_min_margin" value="0.2" min="0" max="50" step="0.1">
|
||||
</div>
|
||||
<!-- 당일 누적손익 트레일 익절 (포트폴리오·일단위) -->
|
||||
<div class="col-12 mt-1"><span style="font-size:11px;color:var(--muted)">📅 당일 누적손익 트레일 익절 — 그날 실현손익 고점 대비 되돌리면 신규매수 중단 (실매 daily_profit_halt 동일). 다단 입력 시 단일 되돌림은 무시</span></div>
|
||||
<!-- 당일 누적손익 다단트레일 — MOMENTUM_DAILY_PROFIT_TARGET_ENABLED -->
|
||||
<div class="col-12 mt-1"><span style="font-size:11px;color:var(--muted)">📅 다단트레일 ON이면 당일 실현손익 고점 대비 되돌릴 때 <b>신규매수만</b> 중단. DB=<code>MOMENTUM_DAILY_PROFIT_TARGET_ENABLED</code>. 이번만 끄려면 체크 해제 후 실행(봇저장 X면 DB 유지).</span></div>
|
||||
<div class="col-auto">
|
||||
<div class="form-check mt-2">
|
||||
<input class="form-check-input" type="checkbox" id="mom_daily_profit_enabled">
|
||||
<label class="form-check-label param-row" for="mom_daily_profit_enabled" title="MOMENTUM_DAILY_PROFIT_TARGET_ENABLED — 다단트레일 ON/OFF. 로드=DB, 봇저장 시 DB 반영">다단트레일</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12 col-md-4">
|
||||
<label class="form-label param-row" title="다단 트레일(ratchet식): 수익원:컷%,… — 벌수록 컷% 타이트. 비우면 단일 되돌림 사용. 예: 30000:50,100000:35,300000:25">다단트레일(수익원:컷%,…)</label>
|
||||
<label class="form-label param-row" title="다단 트레일(ratchet식): 수익원:컷%,… — 벌수록 컷% 타이트. 비우면 단일 되돌림 사용. 예: 30000:50,100000:35,300000:25">다단규칙(수익원:컷%,…)</label>
|
||||
<select class="form-select form-select-sm mb-1" id="mom_daily_trail_preset"
|
||||
title="프리셋 — 고르면 아래 칸이 채워집니다(직접 수정 가능). 저장하면 ★ 항목으로 추가됨"
|
||||
title="프리셋 — 고르면 아래 칸이 채워집니다(감시 스위치는 그대로)"
|
||||
onchange="btApplyPreset('mom_daily_trail_tiers', this.value, false)">
|
||||
<option value="__custom__">프리셋 선택…(직접입력)</option>
|
||||
<option value="off">off (다단 미사용)</option>
|
||||
<option value="off">off (다단 숫자 비움)</option>
|
||||
<option value="20000:40,50000:30,150000:20">보수 20000:40,50000:30,150000:20</option>
|
||||
<option value="30000:50,100000:35,300000:25">중도 30000:50,100000:35,300000:25</option>
|
||||
<option value="50000:60,200000:45,500000:30">공격 50000:60,200000:45,500000:30</option>
|
||||
@@ -2137,7 +2275,7 @@
|
||||
<input type="text" class="form-control" id="mom_daily_trail_tiers" value="" placeholder="30000:50,100000:35,300000:25" style="font-size:12px">
|
||||
</div>
|
||||
<div class="col-4 col-md-2">
|
||||
<label class="form-label param-row" title="다단이 비었을 때만: 당일 실현손익 고점 대비 이 % 되돌리면 중단. 0=OFF">단일되돌림(%)</label>
|
||||
<label class="form-label param-row" title="다단이 비었을 때만: 당일 실현손익 고점 대비 이 % 되돌리면 중단. 0=미사용">단일되돌림(%)</label>
|
||||
<input type="number" class="form-control" id="mom_daily_trail_drop" value="0" min="0" max="90" step="5" style="width:110px">
|
||||
</div>
|
||||
<div class="col-4 col-md-2">
|
||||
@@ -2151,6 +2289,20 @@
|
||||
<option value="both">both</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-12 mt-2">
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" id="mom_use_univ_history" checked>
|
||||
<label class="form-check-label" for="mom_use_univ_history" style="font-size:12px;color:var(--muted)">
|
||||
<b>저장 후보 이력</b> (<code>target_candidates_history</code>) — 체크: DB 슬롯·후보 / 해제: 시뮬 유니버스
|
||||
</label>
|
||||
</div>
|
||||
<div class="form-check mt-1">
|
||||
<input class="form-check-input" type="checkbox" id="mom_env_timeline">
|
||||
<label class="form-check-label" for="mom_env_timeline" style="font-size:12px;color:var(--muted)" title="ON: 봉 시각별 과거 env. OFF(기본): 폼 파람 고정">
|
||||
<b>env 타임라인</b> — 체크: 그 시각 DB설정 재현 / <b>해제(기본)</b>: 폼 파람으로 구간 전체
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12 col-md-auto mt-2 d-flex gap-2 flex-wrap">
|
||||
<button class="btn btn-primary px-4" onclick="runMomentumBacktest()">🚀 백테스트 실행</button>
|
||||
<button type="button" class="btn btn-outline-info px-3" onclick="saveMomentumConfig()" title="현재 입력값을 config_momentum + env_config 에 저장 (실매 MomentumStrategy 동일 소스)">💾 봇에 설정저장</button>
|
||||
@@ -2242,6 +2394,8 @@
|
||||
<span class="trade-sort-label">정렬</span>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn active" data-sort="exit_desc">매도 최신</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn" data-sort="exit_asc">매도 오래된순</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn" data-sort="buy_desc">매수 최신</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn" data-sort="buy_asc">매수 오래된순</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn" data-sort="pnl_desc">손익↑</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn" data-sort="pnl_asc">손익↓</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn" data-sort="rate_desc">수익률↑</button>
|
||||
@@ -2317,7 +2471,7 @@
|
||||
<div class="card-title">승률</div><div class="stat-val" id="hd_wr">-</div>
|
||||
</div></div>
|
||||
<div class="col-6 col-md-2"><div class="card p-3">
|
||||
<div class="card-title">순손익</div><div class="stat-val" id="hd_pnl">-</div>
|
||||
<div class="card-title">순손익(수수료·세금 포함)</div><div class="stat-val" id="hd_pnl">-</div>
|
||||
</div></div>
|
||||
<div class="col-6 col-md-2"><div class="card p-3">
|
||||
<div class="card-title">Profit Factor</div><div class="stat-val" id="hd_pf">-</div>
|
||||
@@ -2328,6 +2482,12 @@
|
||||
<div class="col-6 col-md-2"><div class="card p-3">
|
||||
<div class="card-title">평균 보유(일)</div><div class="stat-val" id="hd_hold">-</div>
|
||||
</div></div>
|
||||
<div class="col-6 col-md-2"><div class="card p-3">
|
||||
<div class="card-title">총 수익률(운용한도 대비)</div><div class="stat-val" id="hd_bot_pct_sum">-</div>
|
||||
</div></div>
|
||||
<div class="col-6 col-md-2"><div class="card p-3">
|
||||
<div class="card-title">일평균 수익률</div><div class="stat-val" id="hd_daily_avg_pct">-</div>
|
||||
</div></div>
|
||||
</div>
|
||||
<!-- Buy & Hold 비교 -->
|
||||
<div class="row g-3 mb-3" id="hd_bnh_row" style="display:none">
|
||||
@@ -2395,10 +2555,13 @@
|
||||
</div>
|
||||
<!-- 거래 내역 -->
|
||||
<div class="section-title mt-3">가상 거래 내역 (최근 200건)</div>
|
||||
<div id="hd_trade_context" class="mb-2 p-2 rounded" style="font-size:12px;background:var(--bg-secondary, #1c2128);color:var(--muted);display:none"></div>
|
||||
<div class="trade-sort-bar mb-2" data-tbody="hd_trade_tbody">
|
||||
<span class="trade-sort-label">정렬</span>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn active" data-sort="exit_desc">매도 최신</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn" data-sort="exit_asc">매도 오래된순</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn" data-sort="buy_desc">매수 최신</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn" data-sort="buy_asc">매수 오래된순</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn" data-sort="pnl_desc">손익↑</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn" data-sort="pnl_asc">손익↓</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn" data-sort="rate_desc">수익률↑</button>
|
||||
@@ -2409,7 +2572,7 @@
|
||||
<table class="table table-hover" style="font-size:12px">
|
||||
<thead><tr>
|
||||
<th>종목</th><th>매수일</th><th>매도일</th><th>매수가</th><th>매도가</th>
|
||||
<th>수량</th><th>손익(원)</th><th>수익률%</th><th>보유(일)</th><th>매도사유</th>
|
||||
<th>수량</th><th>손익(원)</th><th>수익률%</th><th>누적손익</th><th>누적%</th><th>보유(일)</th><th>매도사유</th>
|
||||
</tr></thead>
|
||||
<tbody id="hd_trade_tbody"></tbody>
|
||||
</table>
|
||||
@@ -2636,10 +2799,13 @@
|
||||
<!-- 결과: 거래 목록 (다른 전략과 동일한 공통 컴포넌트 renderVirtualTrades 사용) -->
|
||||
<div class="card p-3 mb-3" id="ubx_trades_card" style="display:none">
|
||||
<h6 class="mb-2">거래 목록 <small class="text-muted" id="ubx_trades_sub"></small></h6>
|
||||
<div id="ubx_trade_context" class="mb-2 p-2 rounded" style="font-size:12px;background:var(--bg-secondary, #1c2128);color:var(--muted);display:none"></div>
|
||||
<div class="trade-sort-bar mb-2" data-tbody="ubx_trades_tbody">
|
||||
<span class="trade-sort-label">정렬</span>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn active" data-sort="exit_desc">매도 최신</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn" data-sort="exit_asc">매도 오래된순</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn" data-sort="buy_desc">매수 최신</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn" data-sort="buy_asc">매수 오래된순</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn" data-sort="pnl_desc">손익↑</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn" data-sort="pnl_asc">손익↓</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary trade-sort-btn" data-sort="rate_desc">수익률↑</button>
|
||||
@@ -2650,7 +2816,7 @@
|
||||
<thead><tr>
|
||||
<th>종목</th><th>매수시각</th><th>매도시각</th>
|
||||
<th>매수가</th><th>매도가</th><th>수량</th>
|
||||
<th>손익(원)</th><th>수익률%</th><th>보유(봉)</th><th>청산사유</th>
|
||||
<th>손익(원)</th><th>수익률%</th><th>누적손익</th><th>누적%</th><th>보유(봉)</th><th>청산사유</th>
|
||||
</tr></thead>
|
||||
<tbody id="ubx_trades_tbody"></tbody>
|
||||
</table>
|
||||
|
||||
Reference in New Issue
Block a user