장이 열리고 첫 46분의 고가와 저가를 확정한 뒤, 가격이 그 위인지 아래인지 사이인지로 구역을 나누고,
감시 구간에서 양봉→음봉 또는 음봉→양봉 두 봉이 완성되면 그 고저 돌파에 진입하는 전략입니다.
의뢰인이 손으로 몇 년 하던 방식을 주간·야간 세션 모두 자동으로 돌리고, 같은 규칙으로 과거를 돌려볼 백테스터까지 한 프로그램에 넣었습니다.
2026년 9월 초 납품, 테스트 527건.
플랫폼
한투 KIS OpenAPI 국내 선물옵션 REST + WS
대상
미니 코스피200 선물 주간 · 야간 세션
청산
R 기반 4단계 트레일링 세션 종료 강제 청산
제작 기간
약 5주 (백테스터 포함)
운영 탭. 구역 판정, 세션 고저, 포지션의 트레일링 단계가 카드로 보이고 아래에 로그가 쌓입니다 (값은 예시)
01전략을 한 장으로
주간은 08:45~09:31, 야간은 18:00~19:00에 세션 고가(H)와 저가(L)를 확정합니다. 이 시간은 화면에서 바꿀 수 있습니다.
그 뒤 현재가가 어디 있는지로 구역이 정해집니다.
1구역H 위. 양→음 패턴이면 매수 돌파, 반대는 규칙에 따라 제한.
2구역H와 L 사이(박스 안). 어느 쪽 패턴이든 가능하나 진입 경위(1구역발 / 3구역발 / 선점)별로 방향 규칙이 다릅니다.
3구역L 아래. 음→양 패턴이면 매도 돌파.
패턴이 완성되면 패턴 고가·저가에 버퍼를 더한 가격에 예약을 걸고, 가격이 닿는 순간 트리거 ±10틱 지정가로 진입합니다. 3초 안에 안 되면 시장가.
패턴 반대편(무효화선)에 먼저 닿으면 예약을 취소합니다. 종가가 구역을 벗어나도 취소합니다.
청산은 R 단위입니다. R = 패턴 폭 + 버퍼 × 2.
단계
동작
비고
+1R
손절을 본절로 올림
배수 조정 가능
+2R
절반 익절
같은 값 허용(예: +1R에서 두 단계 동시)
+3R
손절을 +1R로 올려 수익 확보
0.0이면 이 단계 미사용
+4R
전량 익절
세션 종료
강제 청산
오버나이트 금지
설정 탭. R 배수 네 개와 버퍼·주문 집행값이 전부 입력칸입니다. 납품 기본값 그대로 찍은 화면
021계약이 5계약 매도된 날
모의 운용 중에 청산 주문이 반복 발주돼 계좌에 반대 포지션이 열렸습니다. 원인은 청산 POST의 타임아웃이 10초였는데 실제 체결 응답이 17초 걸린 것.
프로그램은 타임아웃을 실패로 보고 다시 보냈고, 그게 다섯 번 쌓였습니다.
진입 경로에는 이미 있던 원칙이었다
"주문 POST 타임아웃은 결과 불명이다. 재전송하지 말고 체결조회로 실체를 판정하라." 이 원칙은 앞서 진입 쪽에서 유령 포지션 사고를 겪고 넣어 둔 것이었습니다.
그런데 청산 예외 경로에만 빠져 있었습니다. 청산도 타임아웃이면 체결조회로 실체를 인수하고 재발주를 보류하도록 고쳤고(3회 후 경보), 타임아웃은 30초로 늘렸습니다.
안전 원칙을 한 경로에 넣었으면 진입·청산·취소 전부에 들어갔는지 확인하는 걸 이 프로젝트 이후 체크리스트에 넣었습니다.
재시작하면 예약이 살아났다 — 무포지션에서 [중지] 후 다시 켰더니 시세 연결 24초 만에 진입. 장중 재시작 시 과거 봉을 재생해 상태를 복원하는 워밍업이 종료 전 예약까지 복원한 겁니다. 지금은 [중지] 시 종료 마커를 남겨 그 이전에 완성된 패턴의 예약은 취소하고, 크래시(마커 없음)면 전부 복원합니다. 살아남은 예약은 재시작 직후 "트리거 X에 닿으면 바로 진입"이라고 눈에 띄게 알립니다.
기본값이 네 번 어긋났다 — 시장분류 기본값에 주식선물 코드가 남아 있었고, 백테스터와 실매매의 본절 배수가 달랐습니다. 파라미터 조립을 팩토리 하나로 모으고, 코드 기본값과 배포 설정 파일을 전수 대조하는 테스트로 고정했습니다.
백테스트 연타 중 앱이 소리 없이 죽었다 — 재생 중 코어가 이벤트마다 로그를 찍어 1회 3만 7천 줄. 재생 중에는 전략 로거를 침묵시키고, 창 모드 exe에서도 사후 판정이 되도록 crash.log 비행기록장치를 붙였습니다.
03백테스터를 같은 프로그램에 넣은 이유
선물 전략은 파라미터를 바꿔 볼 일이 많은데, 실매매 코어와 백테스터가 다른 코드면 "백테스트에선 됐는데 실매매가 다르다"가 반드시 생깁니다.
그래서 백테스터가 실매매 코어를 그대로 재생하는 구조로 만들었습니다. 데이터 쪽에서 세 가지가 까다로웠습니다.
월물 이어붙이기 — 날짜별로 봉이 가장 많은 월물을 채택합니다. 종목코드 체계를 해석하지 않아 코드 형식이 바뀌어도 안전하고, 당일 완결 전략이라 롤 갭 보정이 필요 없습니다.
KRX 야간 CSV의 날짜는 체결일이 아니다 — 금요일 밤 거래가 월요일 파일에 월요일 날짜로 들어옵니다(귀속 거래일). 그대로 합치면 저녁 봉이 사흘 밀리고 서로 다른 두 밤이 한 세션에 붙습니다. 고객 MTS에는 토요일 새벽 봉이 있는데 파일엔 없다는 모순에서 잡았습니다. 임포트 시 18시 이후 행은 직전 영업일, 06시 이전 행은 직전 영업일+1로 환산합니다.
야간 분봉은 API가 안 준다 — 프로그램이 돌던 밤의 틱을 스스로 1분봉으로 저장합니다. 수집 API 봉과 같은 파일·같은 격자라 그대로 백테스트에 쓰입니다.
한산한 야간을 품질 게이트가 전멸시켰다 — 분당 봉 수만 보니 1년치 야간 266세션이 전부 "데이터 부족"으로 제외됐습니다. 야간은 분의 절반쯤만 체결되는 게 정상입니다. 밀도 또는 구간 관측(시작 10분 내 봉 + 끝 30분 이후 봉)으로 바꾸고, 제외된 날짜와 사유를 화면과 엑셀 시트에 보이게 했습니다.
결과는 일별·월별 손익과 평균 R, R 단계 도달률, 제외 세션 시트, 일별 고저점까지 엑셀로 나옵니다.
독립 재계산 검증기(tools/verify_backtest.py)로 백테스터 자체를 한 번 더 검사했습니다.
04납품물 · 기술
Windows 실행 파일(PyInstaller) — 3탭 GUI(운영 / 설정 / 백테스트), 다크 테마
KIS 국내 선물옵션 래퍼 — 토큰 캐시·62초 발급 가드, 유량 제한·5xx 재시도, 주간/야간/모의 TR 분기, WebSocket 재연결
안 됩니다. 한투 KIS는 모의투자 환경에서 주간만 허용합니다.
모의 주문 TR은 VTTO1101U 하나뿐이고 야간에 해당하는 모의 TR이 없으며,
야간 전용 조회인 CTFN6118R(잔고)·STTN5105R(주문가능)도 전부 실전 계열입니다.
그래서 이 프로그램도 모의 모드에서 야간을 고르면 시작 단계에서 막습니다.
야간 로직은 모의로 끝까지 검증할 수 없습니다. 주간까지는 모의로 맞춰 두고,
야간은 실계좌 최소 수량으로 확인하는 단계를 따로 잡습니다.
TR 대조는 KIS 국내 선물옵션 API — 주문 TR과 함정 정리에 있습니다.
※ 본 사례는 고객 요구사항을 익명 처리하여 재구성한 것이며, 화면의 가격·수량·손익은 예시값입니다. 수익률·수익금은 공개하지 않습니다.
알고랩은 매매 자동화 프로그램 제작 서비스이며, 종목 추천·투자 자문·수익 보장 서비스가 아닙니다.
선물·파생상품 투자는 원금을 초과하는 손실이 발생할 수 있습니다.
이런 자동매매, 바로 견적 받아보세요
손으로 몇 년 지킨 규칙이 있으면 그게 명세서입니다.
알고랩이 24시간 빠르게 답변드립니다.