(해외선물, 실시간 시세 포함)
의뢰인은 원유 선물을 직접 매매해 오신 분입니다. 어느 가격에 들어갈지는 본인이 정하고, 그 가격에 주문을 넣고 익절과 손절을 지키는 일을 프로그램에 맡기고 싶어 하셨습니다. NH선물 REST API로 CME WTI 한 종목을 매매하는 Windows 프로그램을 만들어 2026년 10월 말에 처음 전달했고, 의뢰인이 모의 서버에서 점검하고 돌려 보는 동안 네 번 고쳤습니다. 11월 10일에는 돌파 진입을 넣은 v1.1.0을 만들었습니다. 이 버전의 실제 서버 확인은 아직 남아 있습니다.
| 단계 | 내용 |
|---|---|
| 진입가 입력 | 텔레그램 봇에 방향과 가격을 보내거나 프로그램 화면에서 넣는다. 보조지표 계산은 없다. 현재가와 많이 떨어진 가격은 오타일 수 있어 한 번 되묻는다 |
| 진입 | 지정가로만 들어간다. 새 진입가를 보내지 않으면 기존 진입가를 계속 쓴다 |
| 청산 | 진입이 체결되면 익절 지정가와 손절 STOP 주문을 함께 건다. 한쪽이 체결되면 다른 쪽을 취소한다. 익절과 손절 폭은 틱 수로 설정한다 |
| 재진입 | 청산 뒤 같은 구간 안에서 가격이 진입가로 다시 오면 또 들어간다 |
| 구간 손절 한도 | 하루를 4시간 구간으로 나누고, 한 구간에서 손절이 설정한 횟수만큼 나면 그 구간이 끝날 때까지 쉰다. 구간 시각은 미국 서머타임에 맞춰 자동으로 바뀐다 |
| 알림 | 체결, 주문 거부, 연결 끊김과 복구를 텔레그램으로 보낸다. 구간이 바뀔 때마다 현재 상태를 보내므로 이 메시지가 끊기면 PC나 인터넷을 확인하면 된다 |
NH선물 API에는 익절과 손절을 한 묶음으로 거는 주문이 없습니다. 그래서 두 주문을 프로그램이 따로 걸고, 포지션이 있으면 익절 하나와 손절 하나가 살아 있는지 계속 대조합니다. 손절 주문을 일정 시간 동안 걸지 못하면 시장가로 청산하고 자동 진입을 멈춥니다. 주문을 보냈는데 응답을 받지 못한 경우에는 같은 주문을 다시 보내지 않고 주문내역을 조회해 접수 여부부터 확인합니다.
익절과 손절의 틱 수, 구간 손절 횟수는 의뢰인이 바꿔 가며 비교하는 값이어서 여기에는 적지 않았습니다. 화면의 숫자는 모두 예시입니다.
API 키는 의뢰인 PC에만 넣도록 안내했습니다. 저희가 의뢰인의 키로 대신 접속해 볼 수 없으니, 문서대로 만든 코드가 실제 서버와 맞는지는 의뢰인 PC에서 확인해야 했습니다. 그래서 프로그램 안에 연결 점검을 넣었습니다. 토큰, 종목 정보, 현재가, 잔고, 주문내역, 실시간 시세를 차례로 조회한 다음 모의계좌로 1계약을 넣었다 뺍니다. 결과는 파일 하나로 저장되고 키와 토큰은 들어가지 않습니다. 의뢰인이 그 파일을 보내 주시면 저희가 읽고 고쳤습니다. 점검을 통과해야 자동매매 시작 버튼이 켜집니다.
점검 결과가 오갈 때마다 문서와 실제 서버가 다른 곳이 나왔습니다.
점검을 통과한 뒤 의뢰인이 처음 자동매매를 켰을 때, 진입가를 보내도 아무 일도 일어나지 않았습니다. 엔진이 매 주기 첫머리에서 오류로 멈추고 있었습니다. 주문은 한 건도 나가지 않았습니다.
원인은 4시간 구간을 표시하는 날짜 형식 문자열에 들어 있던 한글이었습니다. 개발 환경에서는 문제가 없고, 실행 파일로 묶으면 언어 설정이 달라져 그 줄에서 오류가 납니다. 어느 PC에서든 나는 저희 프로그램의 결함이었습니다. 자동 테스트는 전부 통과한 상태였습니다. 테스트는 일반 파이썬으로 돌았고, 실행 파일은 창이 뜨는지만 확인했기 때문에 납품 전에 잡지 못했습니다.
수정 전 실행 파일에서 같은 줄, 같은 오류가 나는 것을 먼저 재현한 뒤 고쳤습니다. 테스트 전체를 실행 파일과 같은 언어 설정으로 돌리게 했고, 빌드할 때마다 실행 파일 안에서 엔진과 창을 가짜 거래소로 처음부터 끝까지 돌려 보는 검사를 넣었습니다. 이 검사가 실패하면 빌드가 멈춥니다.
고친 버전으로 같은 날 의뢰인이 모의 서버에서 마이크로 WTI로 자동매매를 돌렸고, 로그로 매매 두 건을 확인했습니다. 진입 주문이 접수된 뒤 체결을 알아채고 손절과 익절 주문을 거는 데까지 각각 약 1.5초, 2.3초가 걸렸습니다. 손절이 체결되자 익절 주문을 취소하고, 기록을 남기고, 구간 손절 횟수를 올린 뒤 다음 진입을 기다리는 데까지 오류 없이 이어졌습니다.
모의로 돌려 본 의뢰인이 새 요청을 주셨습니다. 추세를 따라 들어가는 매매라서 현재가보다 높은 가격에 매수를 미리 정해 두고, 가격이 거기 닿으면 진입하고 싶다는 것이었습니다. 처음 사양은 지정가 진입만이었고, 넣자마자 체결될 가격은 입력 실수로 보고 되묻게 돼 있었습니다. 범위 밖의 새 기능이어서 추가 의뢰로 진행했고, 진입 방식을 문답으로 확정한 뒤 사양을 고정했습니다.
의뢰인은 시장가 진입을 원하지 않으셨습니다. 그래서 가격이 진입가에 닿으면 그 가격에 지정가를 냅니다. 닿은 직후 가격이 조금 되돌아와 있어도 주문을 내고, 이때는 진입가와 같거나 더 유리한 가격에 체결됩니다. 거래소의 STOP 지정가 주문을 쓰는 방법도 있었지만 쓰지 않았습니다. 모의 서버에서 검증하지 못한 주문 유형이고, 프로그램이 꺼진 사이에 체결되면 익절과 손절이 없는 포지션이 생기기 때문입니다. 프로그램이 가격을 지켜보다 주문을 내는 방식이라 가격이 빠르게 지나가면 체결되지 않을 수 있습니다. 주문을 내고 10초가 지나도 체결되지 않고 가격이 지나가 있으면 텔레그램으로 한 번 알리고, 주문은 그대로 둡니다.
구현한 뒤 독립 검토를 한 번 거쳤습니다. 주문이 잘못 나가는 경우는 없었지만 알림이 빠지거나 틀리게 나가는 경우가 일곱 가지 재현돼서, 닿았다는 표시를 붙이는 자리를 다시 설계했습니다. 재현한 경우는 테스트로 남겼습니다.
전달 직전에 의뢰인이 화면 영상과 기록 창 캡처를 보내 주셔서 두 가지를 더 고쳤습니다. 하나는 화면 위쪽입니다. 현재가 아래 글씨가 "실시간"에서 "실시간 (마지막 체결 n초 전)"으로 바뀔 때마다 옆의 구간 상자가 좌우로 밀려 눈에 거슬린다고 하셨습니다. 위쪽 세 칸을 아래 카드와 같은 칸에 고정했습니다.
다른 하나는 접속 토큰입니다. 기록 창에 토큰 발급과 폐기가 몇 초마다 되풀이되고 있었습니다. 이전 버전은 토큰 오류가 날 때마다 토큰을 폐기하고 새로 받았습니다. 폐기는 같은 키로 받은 토큰을 다른 쪽에서도 못 쓰게 만들기 때문에, 같은 키를 두 곳에서 쓰고 있다면 서로 폐기하는 고리가 됩니다. 이제는 같은 토큰으로 한 번 더 시도하고, 그래도 안 되면 폐기 없이 다시 받고, 계속 안 될 때만 폐기합니다. 폐기는 1분에 한 번까지입니다. 오류가 잦으면 한 시간에 한 번 텔레그램으로 알립니다. 토큰 오류가 왜 났는지는 아직 확정하지 못했습니다. 이전 버전은 오류 내용을 남기지 않았습니다. 새 버전은 로그 파일에 남기므로 다음 로그에서 확인합니다.
| 버전 | 날짜 | 내용 |
|---|---|---|
| v1.0.0 | 2026-10-29 | 첫 전달. 지정가 진입, 익절과 손절 관리, 4시간 구간, 연결 점검, 텔레그램 명령 10종, 통계 |
| v1.0.1 | 2026-11-04 | 설명서의 IP 등록 안내 정정. 인터넷 IP가 바뀌어도 토큰을 새로 받아 이어 감 |
| v1.0.2 | 2026-11-05 | 현재가 요청 형식, 점검을 끝까지 진행, 시세 신청 안내 조건, 마이크로 WTI 통계 분리 |
| v1.0.3 | 2026-11-05 | 모의 서버 연결 점검을 처음으로 끝까지 통과한 결과 반영. 취소 처리, 결과 파일과 로그의 계좌번호 가림 |
| v1.0.4 | 2026-11-06 | 실행 파일에서 엔진이 멈추던 문제 수정, 빌드 검사 추가. 모의 서버 첫 자동매매 운용 |
| v1.1.0 | 2026-11-10 | 돌파 진입, 화면 위쪽 칸 고정, 토큰 오류 대응 |
v1.1.0은 자동 테스트 189개와 실행 파일 안 검사를 통과한 상태입니다. 다만 아래는 실제 서버에서 아직 확인하지 못했고, 의뢰인의 모의 운용 로그로 확인할 예정입니다.
해외선물은 증거금으로 거래하는 레버리지 상품입니다. 가격이 조금만 움직여도 손익이 크게 바뀌고, 손실이 맡긴 증거금보다 커질 수 있습니다. 이 프로그램은 의뢰인이 정한 가격과 설정대로 주문을 대신 내는 도구입니다. 어느 가격에 들어갈지는 프로그램이 판단하지 않습니다.
납품 후 30일 동안 정해 둔 기능의 오류는 무상으로 고칩니다. 위 버전 기록의 v1.0.1부터 v1.0.4까지가 그 범위였고, 돌파 진입은 새 기능이라 추가 의뢰로 진행했습니다.
해외선물 API의 시세 이용료가 궁금하시면 해외선물 API 시세료 글을 먼저 보시면 됩니다.
쓰시는 증권사와 종목, 진입과 청산을 어떻게 하시는지 상담에서 말씀해 주세요.
API로 되는 것과 안 되는 것부터 확인해 드립니다.