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>
This commit is contained in:
hyowons
2026-06-15 18:57:30 +09:00
parent ef477d878c
commit e3c54d62ed
278 changed files with 128243 additions and 93084 deletions
+6
View File
@@ -38,6 +38,9 @@ SMA_LONG = 20
SMA_MID = 60 # 중기 추세선 — 정배열 확인(5>20>60). 데이터 부족 시 게이트 미적용
TREND_SLOPE_DAYS = 5 # 20일선 기울기 판정: 현재 20일선 vs N일 전 20일선(우상향 여부)
REL_STRENGTH_DAYS = 20 # 상대강도: 종목 N일 수익률 − 시장지수 N일 수익률 (라이브 전용)
TREND_SLOPE_GATE = 1 # 추세 게이트 ① 장기선 우상향 요구 (1=요구/0=완화). 보수성 완화 변이 실험용
MID_ARRAY_GATE = 1 # 추세 게이트 ② 5일선>중기선(60) 요구 (1=요구/0=완화)
IMMEDIATE_ENTRY = 0 # 즉시매수: 조건 통과 종목이 돌파·눌림목 둘 다 아니어도 강세장이면 현재가 즉시 매수 (1=켜기). 꾸준한 상승 종목 놓침 방지 실험용
ATR_PERIOD = 14
BREAKOUT_LOOKBACK = 20 # 돌파 판정용 최근 고점 구간
SWING_LOW_LOOKBACK = 10 # 손절선 후보 스윙 저점 구간
@@ -87,6 +90,9 @@ PARAMS_PATH = STATE_DIR / 'params.json'
TUNABLE = [
{'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': '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': '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': 'SWING_LOW_LOOKBACK', 'label': '스윙 저점 구간(일)', 'type': 'int', 'min': 3, 'max': 60, 'step': 1, 'group': '변동성·기간'},
+1 -6
View File
@@ -326,12 +326,7 @@ def _run_scan(pf, uni, quotes, cmkt, now, execute: bool = True) -> dict:
decisions.append({
'code': code, 'name': name, 'sources': sources, 'price': cur_price,
'state': 'SKIP', 'reason': '추세 미충족', 'action': None,
'checks': [
{'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}"},
],
'checks': signals.trend_checks(ind), # 4조건+상대강도 모두 표시 (왜 제외인지 보이게)
})
continue
+46 -25
View File
@@ -74,11 +74,11 @@ def trend_ok(ind: dict) -> bool:
기본: 현재가>20일선 & 정배열(5>20). 보강: 20일선 우상향 5>중기선(60) 데이터 있을 때만."""
if not (ind['price'] > ind['sma_long'] and ind['sma_short'] > ind['sma_long']):
return False
if ind.get('sma_long_slope_up') is False: # ① 20일선이 꺾여 내려오면 제외
return False
if getattr(config, 'TREND_SLOPE_GATE', 1) and ind.get('sma_long_slope_up') is False:
return False # ① 장기선이 꺾여 내려오면 제외 (게이트 ON일 때만)
sm = ind.get('sma_mid')
if sm is not None and ind['sma_short'] <= sm: # ② 단기선이 중기선 아래면(역배열) 제외
return False
if getattr(config, 'MID_ARRAY_GATE', 1) and sm is not None and ind['sma_short'] <= sm:
return False # ② 단기선이 중기선 아래면(역배열) 제외 (게이트 ON일 때만)
return True
@@ -122,29 +122,44 @@ def _analyst_checks(analyst: dict | None, price: float) -> tuple[bool, list[dict
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:
"""미보유 종목 매수 판단. flow/analyst 는 engine 이 trend 통과 후 주입."""
price = ind['price']
checks: list[dict] = []
# 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'})
checks: list[dict] = list(trend_checks(ind)) # 1. 추세 게이트 (제외 카드와 공유)
# 2. 수급
fnet = flow.get('foreign', 0) if flow else 0
@@ -241,6 +256,12 @@ def evaluate_candidate(code, name, sources, ind, flow, analyst, market_ok) -> di
'buy_price': price, 'watch_price': 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,
'reason': f'눌림목 대기 — 지정가 {limit:,}'}
@@ -279,7 +300,7 @@ def evaluate_holding(position, ind, flow, analyst, held_days=None) -> dict:
{'label': '목표/트레일링', 'ok': None,
'detail': ('트레일링 ON' if trailing_on else
('일부익절 완료' 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}"},
{'label': '수급(외/기)', 'ok': supply_ok, 'detail': f'{fnet:+,} · 기 {inet:+,}'},
{'label': f'분할({tranches}/{config.ENTRY_TRANCHES})', 'ok': None,
+150 -31
View File
@@ -27,7 +27,7 @@ BIND_HOST = ''
BIND_PORT = 18792
STATE_BADGE = {
'SELL': ('매도', '#ef4444'), 'ADD': ('추격매수', '#16a34a'), 'BUY': ('매수', '#22c55e'),
'SELL': ('매도', '#ef4444'), 'ADD': ('추격매수', '#0f7a34'), 'BUY': ('매수', '#22c55e'),
'HOLD': ('보유', '#3b82f6'), 'WAIT': ('대기', '#eab308'), 'SKIP': ('제외', '#6b7280'),
'NODATA': ('데이터없음', '#374151'),
}
@@ -745,6 +745,56 @@ def _market_fit_words(p: dict) -> str:
return '·'.join([m] + adj + [style])
def _cat_labels(p: dict) -> tuple[str, str, str, str]:
"""전략을 4카테고리 두글자 이름으로 — (추세, 진입, 매도, 베팅)."""
p = p or {}
sma = p.get('SMA_LONG', 20)
trend = {10: '민감', 20: '표준', 40: '둔감', 60: '장기'}.get(sma, '표준')
entry = '적극' if p.get('VOLUME_BREAKOUT_MULT', 1.5) <= 1.5 else '신중'
rr = p.get('RR_RATIO', 2.0)
sell = '한방' if rr >= 2.5 else '단타' if rr <= 1.5 else '균형'
bet = '집중' if p.get('RISK_PER_TRADE_PCT', 0.01) >= 0.02 else '분산'
return trend, entry, sell, bet
def _cat_name(p: dict) -> str:
"""4카테고리 이름 한 줄 — 예 '표준·적극·균형·분산'."""
return '·'.join(_cat_labels(p))
def _cat_detail_html(p: dict) -> str:
"""펼침용 — 4카테고리 각각의 선택값·쉬운 설명."""
p = p or {}
trend, entry, sell, bet = _cat_labels(p)
sma = p.get('SMA_LONG', 20); vol = p.get('VOLUME_BREAKOUT_MULT', 1.5)
rr = p.get('RR_RATIO', 2.0); risk = p.get('RISK_PER_TRADE_PCT', 0.01)
stop = p.get('STOP_ATR_MULT', 2.0); hold = p.get('MAX_HOLD_DAYS', 0)
rows = [
('🟦 추세', trend, f'{sma:g}일선 기준', '추세 — 며칠짜리 평균선으로 보나',
f'추세를 며칠짜리 평균선으로 보는지예요. 이 전략은 {sma:g}일선 기준({trend}).\n\n'
'· 민감(10일선): 빨리 반응 — 기회 빨리 잡지만 속임수(휩쏘)도 많음\n'
'· 표준(20일선): 무난한 중간\n· 둔감(40일선): 천천히 — 늦지만 안정적\n· 장기(60일선): 큰 흐름만'),
('🟩 진입', entry, f'돌파 거래량 {vol:g}', '진입 — 얼마나 쉽게 사나',
f'돌파로 살 때 거래량이 평소의 몇 배는 터져야 사는지예요. 이 전략은 {vol:g}배({entry}).\n\n'
'· 적극(1.3배): 문턱 낮음 — 자주 삼\n· 신중(2.0배): 확실히 터질 때만 삼'),
('🟥 매도', sell, f'손익비 {rr:g} · 손절 ATR{stop:g}' + (f' · 시간손절 {hold}' if hold else ''),
'매도 — 얼마나 길게 먹나',
f'목표 수익을 손절폭의 몇 배로 잡는지예요. 이 전략은 손익비 {rr:g}({sell}).\n\n'
'· 한방(3.0): 길게 들고 크게 먹기\n· 균형(2.0): 중간\n· 단타(1.5): 짧게 자주 먹기\n\n'
f'손절은 변동성(ATR)의 {stop:g}배 빠지면 실행' + (f', {hold}일 지나도 안 오르면 정리해요.' if hold else '해요.')),
('🟨 베팅', bet, f'종목당 리스크 {risk * 100:g}%', '베팅 — 한 종목에 얼마나',
f'한 종목에 자산의 몇 %까지 거는지예요. 이 전략은 {risk * 100:g}%({bet}).\n\n'
'· 집중(2%): 크게 베팅 — 수익·손실 둘 다 큼\n· 분산(1%): 작게 — 안정적'),
]
out = ''
for cat, name, val, title, desc in rows:
out += (f'<div class="kv"><span class="k">{cat}</span>'
f'<span><b>{_esc(name)}</b> <span class="muted">— {_esc(val)}</span>'
f'<button type="button" class="chk-i" data-title="{_esc(title)}" '
f'data-detail="{_esc(desc)}">ⓘ</button></span></div>')
return out
# 약세장 모드 단어 칩 — 비교군 행·드롭다운에서 한눈에 구분 (긴 접미사 대신).
_BEAR_WORD = {0: '회피', 1: '안정', 2: '적극'}
_BEAR_NAME = {0: '회피 (현금화)', 1: '안정 (돌파만·기본)', 2: '적극 (눌림허용)'}
@@ -771,6 +821,51 @@ def _bear_chip_html(p) -> str:
f'data-detail="{_esc(_BEAR_DESC[m] + _BEAR_LEGEND)}">{_BEAR_WORD[m]}</span>')
def _gate_info(p):
"""진입 게이트 차원 — (이름, 설명). 유형·약세장대처와 독립된 3번째 축."""
p = p or {}
off = []
if not int(p.get('TREND_SLOPE_GATE', 1)):
off.append('장기선 우상향 요구')
if not int(p.get('MID_ARRAY_GATE', 1)):
off.append('중기 정배열(5>60) 요구')
if not off:
return ('보수 (현행)',
'추세 조건을 모두 요구해요 — 현재가>장기선·정배열·장기선 우상향·중기 정배열(5>60). '
'안전하지만 매수 기회가 적어요(보수적).')
return ('완화 — ' + '·'.join('장기선 기울기' if '우상향' in o else '중기 정배열' for o in off) + ' 면제',
'추세 게이트를 완화한 변이예요. 꺼진 조건:\n· ' + '\n· '.join(off)
+ '\n\n기본 조건(현재가>장기선·정배열)은 그대로라, 단기 반등 초입 종목도 잡아 더 적극적으로 매수해요. '
'보수형(현행)과 라이브로 비교 중입니다.')
def _relax_chip_html(p) -> str:
"""추세 게이트 완화 칩 — 장기선 기울기/중기정배열 게이트를 끈 변이 표시. 현행(둘다 ON)이면 빈 문자열."""
p = p or {}
off = []
if not int(p.get('TREND_SLOPE_GATE', 1)):
off.append('장기선 우상향 요구')
if not int(p.get('MID_ARRAY_GATE', 1)):
off.append('중기 정배열(5>60) 요구')
if not off:
return ''
desc = ('추세 게이트 완화 변이 — 다음 조건을 꺼서 더 적극적으로 매수해요:\n· '
+ '\n· '.join(off) + '\n\n보수형(현행)과 라이브로 비교 중인 실험 전략입니다.')
return (f'<span class="bic bic-relax" data-title="추세 게이트 완화" '
f'data-detail="{_esc(desc)}">완화</span>')
def _immediate_chip_html(p) -> str:
"""즉시매수 칩 — 돌파·눌림목 안 기다리고 조건 통과 시 현재가 즉시 매수하는 변이. 아니면 빈 문자열."""
if not int((p or {}).get('IMMEDIATE_ENTRY', 0)):
return ''
desc = ('즉시매수 변이 — 추세·정배열·수급·애널을 다 통과한 종목이면, 돌파나 눌림목을 안 기다리고 '
'강세장에서 현재가에 바로 사요. 꾸준히 오르기만 하는 좋은 종목을 놓치지 않으려는 실험 전략이에요. '
'(기다렸다 사는 기존 전략과 라이브 비교 중)')
return (f'<span class="bic bic-now" data-title="즉시매수" '
f'data-detail="{_esc(desc)}">즉시</span>')
def _backtest_panel() -> str:
"""백테스트 결과 — 유형별(세부 라벨) 대표(1위) 조합 요약. 비교군은 이 대표들로 자동 구성되므로
수동 추가/제거 없이 읽기 전용 요약만 보여준다."""
@@ -1028,12 +1123,14 @@ def _compare_panel() -> str:
rows += (
f'<details class="row" data-reg="{i}" data-rank="{rank_of[v["id"]]}" data-bt="{bt_attr}" '
f'data-held="{s.get("open_positions", 0)}" data-trades="{s.get("closed_trades", 0)}"><summary>'
f'<span class="vid">{rank_of[v["id"]]}위</span>{_bear_chip_html(mp)} <span class="muted">{_vid_disp(vid)}</span> '
f'<span class="nm">{_esc(mf_w)}</span>{tag}'
f'<span class="vid">{rank_of[v["id"]]}위</span>{_bear_chip_html(mp)}{_relax_chip_html(mp)}{_immediate_chip_html(mp)} <span class="muted">{_vid_disp(vid)}</span> '
f'<span class="nm">{_esc(_cat_name(mp))}</span>{tag}'
f'<span class="rt"><span class="muted">🛒{s.get("open_positions", 0)}</span> '
f'<b style="color:{rc}">{ret:+g}%</b></span></summary>'
f'<div class="body">'
f'<div class="kv"><span class="k">유형</span><span>{_esc(mf_sum)}'
f'<div class="kv"><span class="k">전략 4요소</span><span class="muted">추세·진입·매도·베팅</span></div>'
f'{_cat_detail_html(mp)}'
f'<div class="kv"><span class="k">시장적합</span><span>{_esc(mf_sum)}'
f'<button type="button" class="chk-i" data-title="{_esc(mf_t)}" '
f'data-detail="{_esc(mf_b)}">ⓘ</button></span></div>'
f'<div class="kv"><span class="k">약세장대처</span><span><b>{_BEAR_NAME[bm]}</b>'
@@ -1197,6 +1294,7 @@ h1{font-size:17px;margin:10px 0 2px}h2{font-size:14px;margin:22px 0 8px;color:#c
.vid{background:#1e293b;color:#7dd3fc;border-radius:5px;padding:1px 6px;font-size:11px;font-weight:700}
.bic{border-radius:5px;padding:1px 5px;font-size:10px;font-weight:700;margin-left:4px}
.bic0{background:#334155;color:#cbd5e1}.bic1{background:#1e3a5f;color:#7dd3fc}.bic2{background:#4a2e12;color:#fbbf24}
.bic-relax{background:#3b1d4a;color:#d8b4fe}.bic-now{background:#0c3a2e;color:#6ee7b7}
.cmp-btlink{background:#0f2a3f;color:#7dd3fc;border:1px solid #1e3a5f;border-radius:6px;padding:3px 8px;font-size:11px;font-weight:600;display:inline-block}
.note{white-space:pre-wrap;line-height:1.65;font-size:13px;color:#cbd5e1}
ul.an{margin:6px 0;padding-left:18px;line-height:1.7;font-size:13px}
@@ -1326,12 +1424,15 @@ td:first-child,th:first-child{text-align:left}
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>{_esc(vid)} 전략 상세</title>{style}</head><body><div id="page">
{back}
<h1><span class="vid">{rank or ""}</span> <span class="muted">{_vid_disp(vid)}</span> {_esc(_market_fit_words(params))}
<span class="bic bic{bm}">{_BEAR_WORD[bm]}</span> {icon}</h1>
<h1><span class="vid">{rank or ""}</span> <span class="muted">{_vid_disp(vid)}</span> {_esc(_cat_name(params))}
<span class="bic bic{bm}">{_BEAR_WORD[bm]}</span>{_relax_chip_html(params)}{_immediate_chip_html(params)} {icon}</h1>
<div class="sub">{_esc(_market_fit_summary(params))} · 약세장대처: {_BEAR_NAME[bm]}</div>
<div class="card">{notes_html}</div>
<h2>🧩 전략 4요소 (이름 풀이)</h2>
<div class="card">{_cat_detail_html(params)}</div>
<h2>📈 수익률 추이</h2>
<div class="card">{_ret_chart_svg(series, idx_series)}</div>
@@ -1380,7 +1481,9 @@ _DAY_CAL_JS = """<script>(function(){
function render(){
var p=cur.split('-'), y=+p[0], m=+p[1];
var startDow=new Date(y,m-1,1).getDay(), ndays=new Date(y,m,0).getDate();
var minYM=(TD[TD.length-1]||'').slice(0,7), maxYM=(TD[0]||'').slice(0,7);
var allYM=TD.concat([TODAY]); // 이동 범위에 오늘 포함 (거래 없어도 오늘 월까지 이동 가능)
var minYM=allYM.reduce(function(a,b){return a<b?a:b;}).slice(0,7);
var maxYM=allYM.reduce(function(a,b){return a>b?a:b;}).slice(0,7);
var h='<div class="cal-hd">'
+'<button type="button" data-nav="-1"'+(cur<=minYM?' disabled':'')+'></button>'
+'<span>'+y+'.'+pad(m)+'</span>'
@@ -1390,9 +1493,12 @@ _DAY_CAL_JS = """<script>(function(){
for(var i=0;i<startDow;i++)h+='<div></div>';
for(var d=1;d<=ndays;d++){
var ds=y+'-'+pad(m)+'-'+pad(d);
var cls='cal-d'+(ds===TODAY?' tdy':'');
if(tset[ds]){h+='<a class="'+cls+' on'+(ds===SEL?' sel':'')+'" data-d="'+ds+'" href="/?t=lab&s=day&d='+ds+'">'+d+'</a>';}
else{h+='<span class="'+cls+' off">'+d+'</span>';}
var isToday=(ds===TODAY), hasTr=!!tset[ds];
var cls='cal-d'+(isToday?' tdy':'');
if(hasTr||isToday){ // 거래일=밝게(on) / 오늘은 거래없어도 클릭가능(today-open)
cls+=hasTr?' on':' today-open';
h+='<a class="'+cls+(ds===SEL?' sel':'')+'" data-d="'+ds+'" href="/?t=lab&s=day&d='+ds+'">'+d+'</a>';
} else { h+='<span class="'+cls+' off">'+d+'</span>'; }
}
h+='</div>';
box.innerHTML=h;
@@ -1404,7 +1510,7 @@ _DAY_CAL_JS = """<script>(function(){
cur=ny+'-'+pad(nm); render();
});
});
box.querySelectorAll('.cal-d.on').forEach(function(a){
box.querySelectorAll('.cal-d[data-d]').forEach(function(a){
a.addEventListener('click',function(e){ e.preventDefault(); pick(a.getAttribute('data-d')); });
});
}
@@ -1468,19 +1574,18 @@ def _day_trades_panel(sel_date: str | None = None) -> str:
if d:
all_rows.append((d, v['id'], r))
dates = sorted({d for d, _, _ in all_rows}, reverse=True) # 최신순
dates = sorted({d for d, _, _ in all_rows}, reverse=True) # 거래일만, 최신순
today = datetime.now(config.KST).strftime('%Y-%m-%d')
selectable = set(dates) | {today} # 오늘은 거래 없어도 선택 가능
back = '<label for="sub-cmp" class="cmp-btlink" role="button" tabindex="0">← 비교로</label>'
if not dates:
return (f'<h2 class="cmp-title">📋 거래목록 {back}</h2>'
'<div class="empty">아직 거래 기록이 없어요 — 스캔이 진입 조건을 기다리는 중</div>')
if sel_date not in dates:
sel_date = dates[0] # 기본 = 최근 거래일
if sel_date not in selectable:
sel_date = today # 기본 = 오늘 (거래 없으면 '이 날은 거래 없어요' 표시)
# 달력형 날짜 선택 — 거래일만 밝게·클릭가능, 거래 없는 날은 어둡게. 월 이동은 JS(새로고침 X).
is_today = sel_date == datetime.now(config.KST).strftime('%Y-%m-%d')
is_today = sel_date == today
cal_js = (_DAY_CAL_JS.replace('__DATES__', json.dumps(dates))
.replace('__SEL__', sel_date)
.replace('__TODAY__', datetime.now(config.KST).strftime('%Y-%m-%d')))
.replace('__TODAY__', today))
picker = (f'<details class="day-cal-wrap" id="day-cal-wrap"><summary>'
f'📅 <b id="day-sel-label">{sel_date}{" (오늘)" if is_today else ""}</b> '
f'<span class="muted">▾ 날짜 선택</span>'
@@ -1513,7 +1618,9 @@ def _day_trades_panel(sel_date: str | None = None) -> str:
a['n'] = len(a['vids'])
if not agg:
return head + '<div class="empty">이 날은 거래가 없어요</div>'
# 빈 날도 #day-sub·#day-rows 컨테이너 유지 — 다른 날로 fetch 전환 시 갱신되게
return (head + '<div class="sub" id="day-sub">이 날은 거래가 없어요</div>'
+ '<div id="day-rows"><div class="empty">이 날은 거래가 없어요 — 스캔이 진입 조건을 기다렸어요</div></div>')
# (종목, 방향) 단위로 한 아이템 — 같은 종목에 매수·매도 동시면 2개 아이템으로 분리.
# 정렬: 매도(청산) 먼저, 그다음 전략 수 많은 순.
@@ -1686,14 +1793,18 @@ def _trades_table(trades) -> str:
return tr_rows or '<div class="empty">거래 없음</div>'
def _decision_card(d, watch_n: int = 0, held_n: int = 0, acc_detail: str = '') -> str:
"""관심종목 탭 종목 카드 (일반·제외목록 공용). watch_n/held_n = 이 종목을 관심/보유 중인 계좌 수.
acc_detail 있으면 👁🛒 클릭 '어느 전략이 보는지' 목록 토스트."""
def _decision_card(d, watch_n: int = 0, held_n: int = 0, acc_detail: str = '', buy_n: int = 0) -> str:
"""관심종목 탭 종목 카드 (일반·제외목록 공용). watch_n=관심(대기+매수준비) 총합, buy_n=매수준비중, held_n=보유.
acc_detail 있으면 배지 클릭 '어느 전략이 보는지' 목록 토스트."""
chips = _chips(d.get('checks', []))
src = '/'.join(ORIGIN_LABEL.get(s, s) for s in d.get('sources', []))
acc = ''
wait_n = max(0, watch_n - buy_n) # 대기중 = 관심 총합 − 매수준비중
if watch_n or held_n:
parts = ([f'👁{watch_n}'] if watch_n else []) + ([f'🛒{held_n}'] if held_n else [])
# 🟢 매수준비중 · 🟡 대기중 · 🛒 보유 — 0인 항목은 생략
parts = ([f'<span style="color:#22c55e">🟢{buy_n}</span>'] if buy_n else []) \
+ ([f'<span style="color:#eab308">🟡{wait_n}</span>'] if wait_n else []) \
+ ([f'🛒{held_n}'] if held_n else [])
attrs = (f' data-title="{_esc(d.get("name"))} — 보는 전략" data-detail="{_esc(acc_detail)}"'
if acc_detail else '')
acc = f' <span class="muted acc-n"{attrs}>{" ".join(parts)}</span>'
@@ -1706,7 +1817,7 @@ def _decision_card(d, watch_n: int = 0, held_n: int = 0, acc_detail: str = '') -
f'<button type="submit" title="관찰목록에서 삭제">✕</button></form>')
return (
f'<div class="card"><div class="card-h">'
f'<b>{_esc(d.get("name"))}</b> <span class="muted">{_esc(d.get("code"))} · {_esc(src)}</span>{acc}'
f'<b>{_esc(d.get("name"))}</b> <span class="muted">{_esc(src)}</span>{acc}'
f'<span class="price">{price_h}{pnl_h}</span>{del_btn}</div>'
f'<div class="reason">{_esc(d.get("reason",""))}</div>'
f'<div class="chks">{chips}</div></div>'
@@ -1792,7 +1903,9 @@ def render_html(view: str | None = None, day_date: str | None = None,
if ws:
if lines:
lines.append('')
lines.append(f'👁 관심 {len(ws)}개 전략:')
_nb = sum(1 for _, st, _ in ws if st in ('BUY', 'ADD'))
_nw = len(ws) - _nb
lines.append(f'관심 {len(ws)}개 — 🟢매수준비 {_nb} · 🟡대기 {_nw}:')
for vid, st, rsn in ws:
em = '🟢' if st in ('BUY', 'ADD') else '🟡'
rk = rank_map.get(vid)
@@ -1838,7 +1951,7 @@ def render_html(view: str | None = None, day_date: str | None = None,
judge_html += f'<h3 class="grp"><span class="badge" style="background:{color}">{label}</span> {len(items)}</h3>'
for d in items:
judge_html += _decision_card(d, watch_n.get(d.get('code'), 0), held_n.get(d.get('code'), 0),
_acc_detail(d.get('code')))
_acc_detail(d.get('code')), buy_n.get(d.get('code'), 0))
# 관찰목록 중 아직 스캔 안 된(방금 추가 등) 종목 → '스캔 대기'로 즉시 표시
wl = umod._load_watchlist()
@@ -1854,7 +1967,7 @@ def render_html(view: str | None = None, day_date: str | None = None,
f'<button type="submit" title="관찰목록에서 삭제">✕</button></form>')
judge_html += (
f'<div class="card"><div class="card-h">'
f'<b>{_esc(e.get("name") or code)}</b> <span class="muted">{_esc(code)} · {_esc(src)}</span>'
f'<b>{_esc(e.get("name") or code)}</b> <span class="muted">{_esc(src)}</span>'
f'<span class="price muted">다음 스캔 대기</span>{del_btn}</div></div>'
)
@@ -1866,7 +1979,7 @@ def render_html(view: str | None = None, day_date: str | None = None,
f'<span class="bt-type-d" style="display:inline;margin-left:6px">스캔은 하되 매수 안 함</span></summary>'
f'<div class="body">' + ''.join(
_decision_card(d, watch_n.get(d.get('code'), 0), held_n.get(d.get('code'), 0),
_acc_detail(d.get('code')))
_acc_detail(d.get('code')), buy_n.get(d.get('code'), 0))
for d in excluded) + '</div></details>'
)
@@ -1879,8 +1992,10 @@ def render_html(view: str | None = None, day_date: str | None = None,
_sel = ' selected' if view == vv['id'] else ''
_fav = f'{icon_of[vv["id"]]} ' if vv['id'] in icon_of else ''
_vp = vv.get('params') or {}
_rx = ' 완화' if (not int(_vp.get('TREND_SLOPE_GATE', 1)) or not int(_vp.get('MID_ARRAY_GATE', 1))) else ''
_im = ' 즉시' if int(_vp.get('IMMEDIATE_ENTRY', 0)) else ''
opts += (f'<option value="{_esc(vv["id"])}"{_sel}>{_fav}{_rk(vv["id"])}{_vid_disp(vv["id"])} '
f'[{_BEAR_WORD[_bear_mode(_vp)]}] · {_esc(_market_fit_words(_vp))}</option>')
f'[{_BEAR_WORD[_bear_mode(_vp)]}{_rx}{_im}] · {_esc(_cat_name(_vp))}</option>')
view_sel = (f'<div class="sub" style="margin:4px 0 8px">체크리스트 시각: '
f'<select id="judge-view" '
f'onchange="location.href=\'/?t=watch&view=\'+encodeURIComponent(this.value)">{opts}</select></div>')
@@ -1935,6 +2050,7 @@ h3.grp{{font-size:13px;margin:16px 0 8px;color:#cbd5e1}}
.chks{{display:flex;flex-wrap:wrap;gap:5px}}
.chk{{background:#0f151c;border:1px solid #1f2937;border-radius:6px;padding:2px 7px;font-size:11px}}
.chk .cd{{color:#6b7280;margin-left:5px}}
.acc-n{{font-size:9px}}
.acc-n[data-detail]{{cursor:pointer;text-decoration:underline dotted #475569;text-underline-offset:3px}}
#chk-toast .ct-d{{max-height:55vh;overflow-y:auto}}
.chk-i{{background:none;border:none;color:#60a5fa;font-size:11px;cursor:pointer;padding:0 0 0 4px;line-height:1;vertical-align:baseline}}
@@ -1976,6 +2092,7 @@ h3.grp{{font-size:13px;margin:16px 0 8px;color:#cbd5e1}}
.cal-wd{{text-align:center;font-size:9px;color:#64748b;padding:1px 0}}
.cal-d{{position:relative;text-align:center;padding:5px 0;border-radius:5px;font-size:11px;font-variant-numeric:tabular-nums}}
.cal-d.on{{background:#0f2a3f;color:#7dd3fc;border:1px solid #1e3a5f;font-weight:700;text-decoration:none;cursor:pointer}}
.cal-d.today-open{{color:#7dd3fc;border:1px dashed #334155;text-decoration:none;cursor:pointer}}
.cal-d.off{{color:#2c3848}}
.cal-d.sel{{background:#2563eb;color:#fff;border-color:#60a5fa;box-shadow:0 0 0 1px #60a5fa}}
.cal-d.tdy::after{{content:'';position:absolute;bottom:2px;left:50%;transform:translateX(-50%);width:3px;height:3px;border-radius:50%;background:#7dd3fc}}
@@ -1996,6 +2113,8 @@ h3.grp{{font-size:13px;margin:16px 0 8px;color:#cbd5e1}}
.bic0{{background:#334155;color:#cbd5e1}}
.bic1{{background:#1e3a5f;color:#7dd3fc}}
.bic2{{background:#4a2e12;color:#fbbf24}}
.bic-relax{{background:#3b1d4a;color:#d8b4fe}}
.bic-now{{background:#0c3a2e;color:#6ee7b7}}
.cmp-sortbar{{display:flex;gap:6px;margin:0 0 10px}}
.cmp-sortbar button{{flex:1;background:#141b24;border:1px solid #1f2937;border-radius:8px;color:#9ca3af;font-size:11px;font-weight:600;padding:7px 4px;cursor:pointer}}
.cmp-sortbar button.active{{background:#15406e;color:#fff;border-color:#2952cc}}
@@ -2100,7 +2219,7 @@ input[name="tab"],input[name="subtab"]{{display:none}}
<input type="text" id="wq" placeholder="종목명 또는 6자리 코드 검색" aria-label="종목 검색" autocomplete="off">
<button type="button" id="wq-btn" class="btn-addcmp">검색</button></div>
<div id="wq-results" class="wsearch-results hidden"></div>
<div class="sub">상태 그룹은 전체 전략(메인+변이) 합산 전략이라도 보유/매수대기면 그룹으로 · 체크리스트는 기준전략(M) 시각 · 👁관심 🛒보유 전략 </div>
<div class="sub">상태 그룹은 전체 전략(메인+변이) 합산 전략이라도 보유/매수대기면 그룹으로 · 배지: 🟢매수준비 · 🟡대기 · 🛒보유 전략 (탭하면 어떤 전략인지)</div>
<div class="sub">종목명 일부만 입력해도 후보가 떠요 · 후보를 누르면 추가 · 자산(비하이브 워치·관심·보유) 자동 편입 · 삭제는 카드의 (수동만) · 보유 중이면 삭제해도 청산까지 추적</div>
{view_sel}
{judge_html}
+2 -2
View File
@@ -35,9 +35,9 @@ def _eval_combo(args):
# 백테스트에서 실제 영향 있는 파라미터만 스윕 (애널 게이트·시장필터는 backtest 중립이라 제외).
# 기존 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 = {
'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], # 손익비
'STOP_ATR_MULT': [1.5, 2.0], # 손절 폭
'PULLBACK_ATR_MULT': [1.0, 1.5], # 눌림 깊이
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
@@ -9,5 +9,5 @@
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-11T09:00:01.943184+09:00",
"updated_at": "2026-06-12T15:25:02.233392+09:00"
"updated_at": "2026-06-15T15:25:02.113024+09:00"
}
@@ -9,5 +9,5 @@
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-11T09:00:01.943289+09:00",
"updated_at": "2026-06-12T15:25:03.011659+09:00"
"updated_at": "2026-06-15T15:25:02.148135+09:00"
}
@@ -9,5 +9,5 @@
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-11T09:00:01.944222+09:00",
"updated_at": "2026-06-12T15:25:03.143491+09:00"
"updated_at": "2026-06-15T15:25:02.276302+09:00"
}
@@ -9,5 +9,5 @@
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-11T09:00:01.944232+09:00",
"updated_at": "2026-06-12T15:25:03.144663+09:00"
"updated_at": "2026-06-15T15:25:02.277525+09:00"
}
@@ -9,5 +9,5 @@
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-11T09:00:01.944241+09:00",
"updated_at": "2026-06-12T15:25:03.145850+09:00"
"updated_at": "2026-06-15T15:25:02.278741+09:00"
}
@@ -9,5 +9,5 @@
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-11T09:00:01.944251+09:00",
"updated_at": "2026-06-12T15:25:03.147039+09:00"
"updated_at": "2026-06-15T15:25:02.279953+09:00"
}
@@ -9,5 +9,5 @@
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-11T09:00:01.944261+09:00",
"updated_at": "2026-06-12T15:25:03.148171+09:00"
"updated_at": "2026-06-15T15:25:02.281173+09:00"
}
@@ -18,7 +18,7 @@
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 233,744 도달",
"cur_price": 247500,
"cur_price": 248750,
"tranches": 2,
"tranche_value": 3332473.3402132783,
"last_add_price": 244500
@@ -31,5 +31,5 @@
"max_drawdown": 0.005230139292375102,
"last_exit": {},
"created_at": "2026-06-11T09:00:01.944270+09:00",
"updated_at": "2026-06-12T15:25:03.149359+09:00"
"updated_at": "2026-06-15T15:25:02.282444+09:00"
}
@@ -18,7 +18,7 @@
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 232,280 도달",
"cur_price": 247500,
"cur_price": 248750,
"tranches": 2,
"tranche_value": 3741721.8543046354,
"last_add_price": 238500
@@ -31,5 +31,5 @@
"max_drawdown": 0.0059876134567287895,
"last_exit": {},
"created_at": "2026-06-11T09:00:01.944280+09:00",
"updated_at": "2026-06-12T15:25:03.150563+09:00"
"updated_at": "2026-06-15T15:25:02.283725+09:00"
}
@@ -9,5 +9,5 @@
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-11T09:00:01.944290+09:00",
"updated_at": "2026-06-12T15:25:03.151726+09:00"
"updated_at": "2026-06-15T15:25:02.284988+09:00"
}
@@ -9,5 +9,5 @@
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-11T09:00:01.944300+09:00",
"updated_at": "2026-06-12T15:25:03.152868+09:00"
"updated_at": "2026-06-15T15:25:02.286210+09:00"
}
@@ -8,6 +8,6 @@
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-11T09:00:01.943320+09:00",
"updated_at": "2026-06-12T15:25:03.024987+09:00"
"created_at": "2026-06-15T14:55:00.582443+09:00",
"updated_at": "2026-06-15T15:25:02.287442+09:00"
}
@@ -9,5 +9,5 @@
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-11T09:00:01.943299+09:00",
"updated_at": "2026-06-12T15:25:03.014412+09:00"
"updated_at": "2026-06-15T15:25:02.150231+09:00"
}
@@ -8,6 +8,6 @@
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-11T09:00:01.943331+09:00",
"updated_at": "2026-06-12T15:25:03.027412+09:00"
"created_at": "2026-06-15T14:55:00.582452+09:00",
"updated_at": "2026-06-15T15:25:02.288736+09:00"
}
@@ -8,6 +8,6 @@
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-11T09:00:01.943342+09:00",
"updated_at": "2026-06-12T15:25:03.029560+09:00"
"created_at": "2026-06-15T14:55:00.582461+09:00",
"updated_at": "2026-06-15T15:25:02.290034+09:00"
}
@@ -8,6 +8,6 @@
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-11T09:00:01.943352+09:00",
"updated_at": "2026-06-12T15:25:03.031721+09:00"
"created_at": "2026-06-15T14:55:00.582469+09:00",
"updated_at": "2026-06-15T15:25:02.291322+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.582478+09:00",
"updated_at": "2026-06-15T15:25:02.292542+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.582490+09:00",
"updated_at": "2026-06-15T15:25:02.293831+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.582499+09:00",
"updated_at": "2026-06-15T15:25:02.295144+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.582507+09:00",
"updated_at": "2026-06-15T15:25:02.296435+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.582515+09:00",
"updated_at": "2026-06-15T15:25:02.297662+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.582546+09:00",
"updated_at": "2026-06-15T15:25:02.298875+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.582554+09:00",
"updated_at": "2026-06-15T15:25:02.300087+09:00"
}
@@ -9,5 +9,5 @@
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-11T09:00:01.943310+09:00",
"updated_at": "2026-06-12T15:25:03.016933+09:00"
"updated_at": "2026-06-15T15:25:02.152146+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.582561+09:00",
"updated_at": "2026-06-15T15:25:02.301307+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.582647+09:00",
"updated_at": "2026-06-15T15:25:02.315746+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.582670+09:00",
"updated_at": "2026-06-15T15:25:02.319615+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.582678+09:00",
"updated_at": "2026-06-15T15:25:02.320890+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.582685+09:00",
"updated_at": "2026-06-15T15:25:02.322172+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.582693+09:00",
"updated_at": "2026-06-15T15:25:02.323394+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.582701+09:00",
"updated_at": "2026-06-15T15:25:02.324728+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.582708+09:00",
"updated_at": "2026-06-15T15:25:02.326019+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.582717+09:00",
"updated_at": "2026-06-15T15:25:02.327240+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.582725+09:00",
"updated_at": "2026-06-15T15:25:02.328455+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.582733+09:00",
"updated_at": "2026-06-15T15:25:02.329672+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.582740+09:00",
"updated_at": "2026-06-15T15:25:02.330947+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.582748+09:00",
"updated_at": "2026-06-15T15:25:02.332191+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.582755+09:00",
"updated_at": "2026-06-15T15:25:02.333422+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.582763+09:00",
"updated_at": "2026-06-15T15:25:02.334642+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.582771+09:00",
"updated_at": "2026-06-15T15:25:02.335934+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.582779+09:00",
"updated_at": "2026-06-15T15:25:02.337220+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.582787+09:00",
"updated_at": "2026-06-15T15:25:02.338496+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.582795+09:00",
"updated_at": "2026-06-15T15:25:02.339790+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.582803+09:00",
"updated_at": "2026-06-15T15:25:02.341070+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.582811+09:00",
"updated_at": "2026-06-15T15:25:02.342372+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.582819+09:00",
"updated_at": "2026-06-15T15:25:02.343597+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.582826+09:00",
"updated_at": "2026-06-15T15:25:02.344810+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.582834+09:00",
"updated_at": "2026-06-15T15:25:02.346088+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.582841+09:00",
"updated_at": "2026-06-15T15:25:02.347368+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.582849+09:00",
"updated_at": "2026-06-15T15:25:02.348667+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.582857+09:00",
"updated_at": "2026-06-15T15:25:02.349953+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.582864+09:00",
"updated_at": "2026-06-15T15:25:02.351247+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.582872+09:00",
"updated_at": "2026-06-15T15:25:02.352529+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.582879+09:00",
"updated_at": "2026-06-15T15:25:02.353755+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.582887+09:00",
"updated_at": "2026-06-15T15:25:02.354966+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.582894+09:00",
"updated_at": "2026-06-15T15:25:02.356166+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.582902+09:00",
"updated_at": "2026-06-15T15:25:02.357379+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.582910+09:00",
"updated_at": "2026-06-15T15:25:02.358617+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.582918+09:00",
"updated_at": "2026-06-15T15:25:02.359838+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.582926+09:00",
"updated_at": "2026-06-15T15:25:02.361064+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.582933+09:00",
"updated_at": "2026-06-15T15:25:02.362282+09:00"
}
@@ -1,13 +0,0 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-11T09:00:01.943361+09:00",
"updated_at": "2026-06-12T15:25:03.033694+09:00"
}
@@ -1,13 +0,0 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-11T09:00:01.943371+09:00",
"updated_at": "2026-06-12T15:25:03.035650+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.583136+09:00",
"updated_at": "2026-06-15T15:25:02.390047+09:00"
}
@@ -1,13 +0,0 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-11T09:00:01.943381+09:00",
"updated_at": "2026-06-12T15:25:03.037555+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.583144+09:00",
"updated_at": "2026-06-15T15:25:02.391331+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.583184+09:00",
"updated_at": "2026-06-15T15:25:02.397768+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.583191+09:00",
"updated_at": "2026-06-15T15:25:02.398982+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.583198+09:00",
"updated_at": "2026-06-15T15:25:02.400251+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.583205+09:00",
"updated_at": "2026-06-15T15:25:02.401542+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.583212+09:00",
"updated_at": "2026-06-15T15:25:02.402814+09:00"
}
@@ -18,7 +18,7 @@
"scaled_out": false,
"entry_path": "pullback",
"entry_reason": "눌림목 지정가 233,744 도달",
"cur_price": 247500,
"cur_price": 248750,
"tranches": 2,
"tranche_value": 6250000.0,
"last_add_price": 244500
@@ -31,5 +31,5 @@
"max_drawdown": 0.009821865591495171,
"last_exit": {},
"created_at": "2026-06-11T09:00:01.943203+09:00",
"updated_at": "2026-06-12T15:25:02.979059+09:00"
"updated_at": "2026-06-15T15:25:02.126478+09:00"
}
@@ -1,13 +0,0 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-11T09:00:01.943391+09:00",
"updated_at": "2026-06-12T15:25:03.039344+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.583220+09:00",
"updated_at": "2026-06-15T15:25:02.404094+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.583227+09:00",
"updated_at": "2026-06-15T15:25:02.405315+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.583234+09:00",
"updated_at": "2026-06-15T15:25:02.406536+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.583241+09:00",
"updated_at": "2026-06-15T15:25:02.407826+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.583249+09:00",
"updated_at": "2026-06-15T15:25:02.409101+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.583273+09:00",
"updated_at": "2026-06-15T15:25:02.410386+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.583281+09:00",
"updated_at": "2026-06-15T15:25:02.411696+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.583289+09:00",
"updated_at": "2026-06-15T15:25:02.412998+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.583297+09:00",
"updated_at": "2026-06-15T15:25:02.414287+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.583304+09:00",
"updated_at": "2026-06-15T15:25:02.415576+09:00"
}
@@ -1,13 +0,0 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-11T09:00:01.943400+09:00",
"updated_at": "2026-06-12T15:25:03.041123+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.583311+09:00",
"updated_at": "2026-06-15T15:25:02.416804+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.583318+09:00",
"updated_at": "2026-06-15T15:25:02.418088+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.583325+09:00",
"updated_at": "2026-06-15T15:25:02.419309+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.583333+09:00",
"updated_at": "2026-06-15T15:25:02.420587+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.583340+09:00",
"updated_at": "2026-06-15T15:25:02.421869+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.583347+09:00",
"updated_at": "2026-06-15T15:25:02.423094+09:00"
}
@@ -0,0 +1,13 @@
{
"cash": 100000000,
"initial": 100000000,
"positions": {},
"realized_pnl": 0.0,
"closed_trades": 0,
"wins": 0,
"peak_equity": 100000000,
"max_drawdown": 0.0,
"last_exit": {},
"created_at": "2026-06-15T14:55:00.583354+09:00",
"updated_at": "2026-06-15T15:25:02.424338+09:00"
}

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