주문콘솔 — 3창 병렬 발사 오케스트레이터
개요
크라우니AI 인스턴스 3창(9847·9848·9853)이 순차 curl로 발사되어 창간 수초 지연이 있던 문제를,
한
체계() 호출 안에서 3개 curl을 백그라운드(
&)로 동시 기동 후
wait 하는 방식으로 바꿔
발사 시각 편차를 밀리초 단위로 줄이는 도구를 만들었다. 포트 9869, 한선씨 TCP 서버.
무엇을 했는지
- 주문콘솔.한선 — hanseonc_high 고수준 한선씨 TCP 서버.
-
/진입 /청산 /상태 /로그 /분석 5개 API (한글 경로 + curl/fetch가 자동 percent-encode하는
함정을 우회하기 위해 ASCII 별칭
/enter /exit /status /log /analyze도 동시 지원)
- 병렬 발사 코어(
OC_동시발사): 3포트 각각
(gdate +%s%3N > 시작; curl -m 5 ...; gdate +%s%3N > 끝) &
를 한 줄에 이어붙이고
wait로 마무리. gdate 없으면
date +%s000으로 초단위 폴백.
- 발사 편차 실측: 3창 시작 타임스탬프의 (최대-최소)를 계산해 로그+응답에 남김.
- 미니차단 게이트(MNQ 시작 심볼만 허용, LIVE 무관 항상) — 브라우저어댑터.한선 로직 이식.
- 안전: 기본 드라이런(LIVE=1 없으면
/health만 호출, 실클릭 경로 미배선). 오늘 검증은
LIVE=1로 실행하지 않았다(요구사항 엄수).
- 로그:
/tmp/kps/주문타이밍.psv append-only, 스키마
사이클ID|밀리초|이벤트|포트|계좌|방향|수량|가격|결과|지연ms|비고.
- 장수서버 함정 대응: 계좌구성.psv 부팅 1회 로드, 문자열보호()+200요청마다 문자열GC(),
bind 실패 시 즉시 종료.
-
VM 정수 오버플로 함정 실측: 13자리 epoch-ms를 그대로 숫자변환하면 ±3^24
(141,214,768,240) 상한을 넘어 silent wrap됨 → 마지막 6자리만 취하는
OC_ms꼬리() 헬퍼로
상대 지연/편차 계산(절대시각 아님, 사이클 내부 상대차만 필요하므로 안전).
-
macOS BSD date 함정 실측:
date +%s%3N은 리터럴 "N"을 붙일 뿐 밀리초를 안 준다
(GNU date 전용 포맷) →
gdate(coreutils) 우선 사용, 없으면 초단위 폴백.
-
percent-encoding 함정 실측: curl/fetch가 URL의 한글 경로를 자동 %XX 인코딩해 전송
→ 한선씨에 raw-byte 재조립 API가 없는 함정(가드레일 §hanseonc_high) 때문에, 원문 한글
경로 + 알려진 percent-encode 리터럴(소문자 hex) + ASCII 별칭 3중 매칭으로 우회.
- public/주문콘솔.html — 다크 트레이딩 톤 UI. 크라우니디자인 중앙 CSS 링크 +
data-crowny
적용(
crowny-design.sh apply 실행 완료). 3창 상태 카드(2초 폴링), 롱/숏/청산 큰 버튼(발사 중
비활성화로 연타 방지), LIVE/드라이런 배지(실거래 시 빨간 pulse), 분석 요약 타일, 로그 테이블.
검증 결과 (전부 실측)
① 컴파일:
hanseonc_high 주문콘솔.한선 →
경고 0건, 정상 컴파일.
②
/상태 실호출로 9847/9848/9853 3창 정보(생존/URL/계좌) 수집 확인 — 조회만, 클릭/네비게이션 없음.
③
병렬 발사 편차 실측(핵심 산출물):
/진입 5회 연속 호출 → 창간 발사편차
0~1ms
(5회 중 최대 1ms, 평균 0ms).
/분석 누적 21회 기준 편차 평균 0ms/최대 1ms, 판정
티(우수)
(100ms 이하 기준 통과). 이는 macOS 프로세스 fork+exec 오버헤드 수준의 편차로, 순차 curl
대비(수초) 3자릿수 개선.
④ 로그 스키마 기록 확인 —
/tmp/kps/주문타이밍.psv에 발사요청/발사완료/발사편차/차단 이벤트
정상 append. 기존 인스턴스.psv·계좌구성.psv·주문타이밍.psv
삭제 없이 보존(tail 확인 완료).
⑤
/분석 출력 예시:
json {"창간발사편차_평균ms":0,"창간발사편차_최대ms":1,"편차샘플수":7,
"진입지연_최소ms":0,"진입지연_평균ms":11,"진입지연_최대ms":15,
"체결률_천분율":1000,"발사요청수":21,"발사완료수":21,
"사이클순손익":"NA(실계좌 실현손익 연동 미배선)","판정":"티(우수)"}
⑥ UI 렌더 확인:
크라우니AI검증.sh dump로 스크린샷 캡처 — 3창 카드/버튼/분석타일/배지 정상
렌더, 실시간
/status fetch 성공(9847/9848/9853 전부 생존 표시).
⑦ 서버는
nohup ... &로 백그라운드 유지 중(포트 9869, PID는
lsof -i :9869로 확인 가능),
LIVE=0(드라이런) 상태로 살려둠.
관련 파일 절대경로
/Users/ef/CrownyDoc/projects/kps-trading-tool/주문콘솔.한선 — 서버 소스
/Users/ef/CrownyDoc/projects/kps-trading-tool/public/주문콘솔.html — UI
/tmp/oc.toau — 컴파일 산출물(재기동 시 재컴파일 필요)
/tmp/kps/주문타이밍.psv — 진출입 타이밍 로그(append-only)
/tmp/kps/계좌구성.psv, /tmp/kps/인스턴스.psv — 기존 인스턴스 레지스트리(무변경)
/tmp/kps/oc/fire_<포트>.{start,end,out} — 발사별 임시 타임스탬프/응답 파일
잔여 이슈
- 사이클 순손익/계좌별 실현손익은 미배선(NA) — Tradovate 실계좌 잔고/손익 API 연동이
범위 밖(오늘은 드라이런·
/health 조회만 허용된 제약과 일치). 추후 KJ_포지션읽기류 패턴을
확장해 잔고 diff 계산을 붙일 수 있음.
- LIVE=1 경로는
/health만 호출하도록 안전판을 걸어뒀다(요구사항 "오늘은 LIVE=1 금지"를
코드 레벨에서도 이중 방어) — 추후 실거래 승인 시 브라우저어댑터.한선의
주문발행()/
청산()을
경유하도록 명시적으로 배선해야 한다(현재는 의도적으로 미배선).
- 체결률(현재 발사요청/발사완료 비율)은 curl 성공률 프록시다. 실제 브로커 체결 확인은
브라우저어댑터.한선의
체결확인()(POSITION 폴링)과 별도 통합이 필요.
- HTML의
<link> 크라우니디자인 CSS가 crowny-design.sh apply로 중복 삽입됨(원본 링크 +
data-cds 링크 2개) — 기능상 문제 없음(멱등 스크립트의 알려진 동작), 필요시 정리 가능.