fix: 하드닝 루프 9회차 — 매수 원복·잔고 연속조회·결과 불명 매도·브레이커·경보 보강
- 8회차 HIGH 수정 16건 레드팀 재검증: 12 확인·3 부분·1 미수정 → 전부 보강 - trade_executor/fill_sweep: 늦게 확정된 0체결 BUY → CANCELLED + ActiveTrade close, 부분체결 → 수량 축소(멱등, 재기동 후 TH 재구성) - korea_investment_api: get_balance_all_v2(tr_cont 연속조회, _partial), get_todays_orders_v2(실패 None), 브레이커 청산용 조회 면제(OPEN 중 미집계) - swing/exit_service·mdd_manager: 매도 직전 상한·MDD 축소가 전체 잔고 페이지 사용(§8.5-37), 불명 대기 중 부분익절 skip·쿨다운·pre_hldg 차감, 대기 TTL 15:30+재매수 폐기(대조 1회 선행)(§8.5-38 해소) - swing/scheduler: 청산 TIMED_OUT/SKIPPED/in-flight 시 MDD 축소·진입 보류(예외는 진입만), 3사이클 연속 시 error+텔레그램 - daytrading: 결과 불명 매도 재판정 v3(주문조회 v2 None→보류, 등록 이후 일치 행→accepted, 원장≤0→보류), 재기동 복원 min(주문가능,보유), 잔고 조회 후 일일손실한도 재확인, 단독 실행 Redis 접속 제거 - main: 스트림 무수신 경보 v4(희망 구독 기준), 첫 하트비트 없음 stale(HB_FIRST_BEAT_GRACE_SEC) - 운영: Jenkinsfile health_watch.py 디렉터리 잔존 복구, prod_smoke 사이드카 확인, config 키 12개 선언(동작 무변경) - 진입가 v3(max(AT,PA))는 KIS 이동평균 평단 전제 오류로 레드팀 반증 → 폐기 - CLAUDE.md §3.2 ③-d, §8.5-37/38 갱신, §8.5-39~48 신규(Crisis 손절 소급 §8.5-39 는 사용자 결정 대기) - 유닛 스위트 2781 passed / 0 failed (소켓 차단), 네트워크 시도 0건 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
@@ -1256,6 +1256,9 @@ async def test_h2_unresolved_unknown_caps_resell_by_sellable(monkeypatch):
|
||||
monkeypatch.setattr(te, "safe_place_order", _order)
|
||||
monkeypatch.setattr(es, "_finalize_exit", AsyncMock(return_value={"ok": 1}))
|
||||
monkeypatch.setattr(es.korea_investment_api, "get_todays_orders", AsyncMock(return_value=[]))
|
||||
# [C-1 r9] 재시도 판정은 get_todays_orders_v2(실패=None) + DT 원장 상한을 쓴다(목킹 보정)
|
||||
monkeypatch.setattr(es.korea_investment_api, "get_todays_orders_v2", AsyncMock(return_value=[]))
|
||||
monkeypatch.setattr(es, "_fetch_dt_ledger_net_qty_impl", AsyncMock(return_value=10))
|
||||
# 보유 30, 주문가능 26, 비DT(스윙) 20 → DT 매도가능 6 (> 10−10=0 → 미접수)
|
||||
monkeypatch.setattr(es.korea_investment_api, "get_balance", _bal_seq("222222", (30, 26)))
|
||||
monkeypatch.setattr("app.core.database.AsyncSessionLocal",
|
||||
@@ -1530,7 +1533,11 @@ async def test_r5_stale_row_without_holdings_drop_is_not_acceptance(monkeypatch)
|
||||
|
||||
rows = [{"pdno": "064400", "sll_buy_dvsn_cd": "01", "ord_qty": "4", "tot_ccld_qty": "4",
|
||||
"odno": "0000555"}]
|
||||
with patch.object(es.korea_investment_api, "get_todays_orders", AsyncMock(return_value=rows)):
|
||||
# [C-1 r9] 재시도 판정은 get_todays_orders_v2 + DT 원장 상한(목킹 보정). 행에 주문시각이 없어
|
||||
# 등록 이후임을 입증하지 못하므로 v3 도 접수로 보지 않는다.
|
||||
with patch.object(es.korea_investment_api, "get_todays_orders", AsyncMock(return_value=rows)), \
|
||||
patch.object(es.korea_investment_api, "get_todays_orders_v2", AsyncMock(return_value=rows)), \
|
||||
patch.object(es, "_fetch_dt_ledger_net_qty_impl", AsyncMock(return_value=4)):
|
||||
await _run_stale(2, _stale_env(_order, bal=_bal_seq("064400", (4, 4))))
|
||||
assert len(calls) == 2, "잔고 감소 없는 주문내역 행을 접수로 오인해 재매도를 막았다"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user