해외선물, NH선물 REST API

NH선물 해외선물 WTI 원유 자동매매, 진입가는 텔레그램으로 보낸다

의뢰인은 원유 선물을 직접 매매해 오신 분입니다. 어느 가격에 들어갈지는 본인이 정하고, 그 가격에 주문을 넣고 익절과 손절을 지키는 일을 프로그램에 맡기고 싶어 하셨습니다. NH선물 REST API로 CME WTI 한 종목을 매매하는 Windows 프로그램을 만들어 2026년 10월 말에 처음 전달했고, 의뢰인이 모의 서버에서 점검하고 돌려 보는 동안 네 번 고쳤습니다. 11월 10일에는 돌파 진입을 넣은 v1.1.0을 만들었습니다. 이 버전의 실제 서버 확인은 아직 남아 있습니다.

플랫폼
NH선물 REST API
(해외선물, 실시간 시세 포함)
종목
CME WTI 원유 선물 1종목
마이크로 WTI도 설정으로 지원
구조
텔레그램으로 진입가 입력
지정가 진입, 익절과 손절 관리
실행 환경
Windows 10, 11
실행 파일, 설치 없음
NH선물 WTI 자동매매 프로그램 운영 화면. 위쪽에 현재가, 4시간 구간, 한국과 미국 중부 시각이 있고, 가운데에 포지션, 진입가, 이번 구간 손절 횟수, NH선물 연결 상태 카드가 있다. 아래에는 증권사에 걸린 익절과 손절 주문, 진입가 입력 칸, 진입과 주문 기록이 나온다
운영 화면. 진입가에 닿아 매수가 체결된 뒤 익절과 손절 주문이 걸린 상태 (가짜 데이터로 띄운 화면, 가격과 주문번호는 예시값)

01프로그램이 하는 일

단계내용
진입가 입력텔레그램 봇에 방향과 가격을 보내거나 프로그램 화면에서 넣는다. 보조지표 계산은 없다. 현재가와 많이 떨어진 가격은 오타일 수 있어 한 번 되묻는다
진입지정가로만 들어간다. 새 진입가를 보내지 않으면 기존 진입가를 계속 쓴다
청산진입이 체결되면 익절 지정가와 손절 STOP 주문을 함께 건다. 한쪽이 체결되면 다른 쪽을 취소한다. 익절과 손절 폭은 틱 수로 설정한다
재진입청산 뒤 같은 구간 안에서 가격이 진입가로 다시 오면 또 들어간다
구간 손절 한도하루를 4시간 구간으로 나누고, 한 구간에서 손절이 설정한 횟수만큼 나면 그 구간이 끝날 때까지 쉰다. 구간 시각은 미국 서머타임에 맞춰 자동으로 바뀐다
알림체결, 주문 거부, 연결 끊김과 복구를 텔레그램으로 보낸다. 구간이 바뀔 때마다 현재 상태를 보내므로 이 메시지가 끊기면 PC나 인터넷을 확인하면 된다

NH선물 API에는 익절과 손절을 한 묶음으로 거는 주문이 없습니다. 그래서 두 주문을 프로그램이 따로 걸고, 포지션이 있으면 익절 하나와 손절 하나가 살아 있는지 계속 대조합니다. 손절 주문을 일정 시간 동안 걸지 못하면 시장가로 청산하고 자동 진입을 멈춥니다. 주문을 보냈는데 응답을 받지 못한 경우에는 같은 주문을 다시 보내지 않고 주문내역을 조회해 접수 여부부터 확인합니다.

익절과 손절의 틱 수, 구간 손절 횟수는 의뢰인이 바꿔 가며 비교하는 값이어서 여기에는 적지 않았습니다. 화면의 숫자는 모두 예시입니다.

02주문보다 먼저 만든 연결 점검

API 키는 의뢰인 PC에만 넣도록 안내했습니다. 저희가 의뢰인의 키로 대신 접속해 볼 수 없으니, 문서대로 만든 코드가 실제 서버와 맞는지는 의뢰인 PC에서 확인해야 했습니다. 그래서 프로그램 안에 연결 점검을 넣었습니다. 토큰, 종목 정보, 현재가, 잔고, 주문내역, 실시간 시세를 차례로 조회한 다음 모의계좌로 1계약을 넣었다 뺍니다. 결과는 파일 하나로 저장되고 키와 토큰은 들어가지 않습니다. 의뢰인이 그 파일을 보내 주시면 저희가 읽고 고쳤습니다. 점검을 통과해야 자동매매 시작 버튼이 켜집니다.

연결 점검 창. 모의 1계약으로 익절과 손절 주문을 걸었다 취소하고 시장가로 청산해 잔고가 0이 되는 과정과, 토큰, 틱 크기, 현재가, 잔고, 주문 유효기간, 취소 반영 같은 항목별 통과 여부 요약이 나온다
연결 점검 창의 요약 부분. 테스트용 가짜 거래소로 돌린 출력이어서 실제 서버의 결과와는 값이 다릅니다

점검 결과가 오갈 때마다 문서와 실제 서버가 다른 곳이 나왔습니다.

03실행 파일에서만 멈춘 엔진

점검을 통과한 뒤 의뢰인이 처음 자동매매를 켰을 때, 진입가를 보내도 아무 일도 일어나지 않았습니다. 엔진이 매 주기 첫머리에서 오류로 멈추고 있었습니다. 주문은 한 건도 나가지 않았습니다.

원인은 4시간 구간을 표시하는 날짜 형식 문자열에 들어 있던 한글이었습니다. 개발 환경에서는 문제가 없고, 실행 파일로 묶으면 언어 설정이 달라져 그 줄에서 오류가 납니다. 어느 PC에서든 나는 저희 프로그램의 결함이었습니다. 자동 테스트는 전부 통과한 상태였습니다. 테스트는 일반 파이썬으로 돌았고, 실행 파일은 창이 뜨는지만 확인했기 때문에 납품 전에 잡지 못했습니다.

수정 전 실행 파일에서 같은 줄, 같은 오류가 나는 것을 먼저 재현한 뒤 고쳤습니다. 테스트 전체를 실행 파일과 같은 언어 설정으로 돌리게 했고, 빌드할 때마다 실행 파일 안에서 엔진과 창을 가짜 거래소로 처음부터 끝까지 돌려 보는 검사를 넣었습니다. 이 검사가 실패하면 빌드가 멈춥니다.

고친 버전으로 같은 날 의뢰인이 모의 서버에서 마이크로 WTI로 자동매매를 돌렸고, 로그로 매매 두 건을 확인했습니다. 진입 주문이 접수된 뒤 체결을 알아채고 손절과 익절 주문을 거는 데까지 각각 약 1.5초, 2.3초가 걸렸습니다. 손절이 체결되자 익절 주문을 취소하고, 기록을 남기고, 구간 손절 횟수를 올린 뒤 다음 진입을 기다리는 데까지 오류 없이 이어졌습니다.

04돌파 진입, 화면 칸, 접속 토큰

모의로 돌려 본 의뢰인이 새 요청을 주셨습니다. 추세를 따라 들어가는 매매라서 현재가보다 높은 가격에 매수를 미리 정해 두고, 가격이 거기 닿으면 진입하고 싶다는 것이었습니다. 처음 사양은 지정가 진입만이었고, 넣자마자 체결될 가격은 입력 실수로 보고 되묻게 돼 있었습니다. 범위 밖의 새 기능이어서 추가 의뢰로 진행했고, 진입 방식을 문답으로 확정한 뒤 사양을 고정했습니다.

돌파 진입을 기다리는 운영 화면. 포지션은 없고 진입가 카드에 매수 진입가와 함께 그 가격에 닿으면 매수 주문을 낸다는 안내와 현재가가 나온다. 증권사에 걸린 주문은 없다
현재가보다 높은 매수 진입가를 받아 둔 상태. 닿기 전에는 증권사에 주문을 걸지 않습니다 (가짜 데이터, 예시값)

의뢰인은 시장가 진입을 원하지 않으셨습니다. 그래서 가격이 진입가에 닿으면 그 가격에 지정가를 냅니다. 닿은 직후 가격이 조금 되돌아와 있어도 주문을 내고, 이때는 진입가와 같거나 더 유리한 가격에 체결됩니다. 거래소의 STOP 지정가 주문을 쓰는 방법도 있었지만 쓰지 않았습니다. 모의 서버에서 검증하지 못한 주문 유형이고, 프로그램이 꺼진 사이에 체결되면 익절과 손절이 없는 포지션이 생기기 때문입니다. 프로그램이 가격을 지켜보다 주문을 내는 방식이라 가격이 빠르게 지나가면 체결되지 않을 수 있습니다. 주문을 내고 10초가 지나도 체결되지 않고 가격이 지나가 있으면 텔레그램으로 한 번 알리고, 주문은 그대로 둡니다.

구현한 뒤 독립 검토를 한 번 거쳤습니다. 주문이 잘못 나가는 경우는 없었지만 알림이 빠지거나 틀리게 나가는 경우가 일곱 가지 재현돼서, 닿았다는 표시를 붙이는 자리를 다시 설계했습니다. 재현한 경우는 테스트로 남겼습니다.

전달 직전에 의뢰인이 화면 영상과 기록 창 캡처를 보내 주셔서 두 가지를 더 고쳤습니다. 하나는 화면 위쪽입니다. 현재가 아래 글씨가 "실시간"에서 "실시간 (마지막 체결 n초 전)"으로 바뀔 때마다 옆의 구간 상자가 좌우로 밀려 눈에 거슬린다고 하셨습니다. 위쪽 세 칸을 아래 카드와 같은 칸에 고정했습니다.

다른 하나는 접속 토큰입니다. 기록 창에 토큰 발급과 폐기가 몇 초마다 되풀이되고 있었습니다. 이전 버전은 토큰 오류가 날 때마다 토큰을 폐기하고 새로 받았습니다. 폐기는 같은 키로 받은 토큰을 다른 쪽에서도 못 쓰게 만들기 때문에, 같은 키를 두 곳에서 쓰고 있다면 서로 폐기하는 고리가 됩니다. 이제는 같은 토큰으로 한 번 더 시도하고, 그래도 안 되면 폐기 없이 다시 받고, 계속 안 될 때만 폐기합니다. 폐기는 1분에 한 번까지입니다. 오류가 잦으면 한 시간에 한 번 텔레그램으로 알립니다. 토큰 오류가 왜 났는지는 아직 확정하지 못했습니다. 이전 버전은 오류 내용을 남기지 않았습니다. 새 버전은 로그 파일에 남기므로 다음 로그에서 확인합니다.

05버전 기록과 남은 확인

버전날짜내용
v1.0.02026-10-29첫 전달. 지정가 진입, 익절과 손절 관리, 4시간 구간, 연결 점검, 텔레그램 명령 10종, 통계
v1.0.12026-11-04설명서의 IP 등록 안내 정정. 인터넷 IP가 바뀌어도 토큰을 새로 받아 이어 감
v1.0.22026-11-05현재가 요청 형식, 점검을 끝까지 진행, 시세 신청 안내 조건, 마이크로 WTI 통계 분리
v1.0.32026-11-05모의 서버 연결 점검을 처음으로 끝까지 통과한 결과 반영. 취소 처리, 결과 파일과 로그의 계좌번호 가림
v1.0.42026-11-06실행 파일에서 엔진이 멈추던 문제 수정, 빌드 검사 추가. 모의 서버 첫 자동매매 운용
v1.1.02026-11-10돌파 진입, 화면 위쪽 칸 고정, 토큰 오류 대응

v1.1.0은 자동 테스트 189개와 실행 파일 안 검사를 통과한 상태입니다. 다만 아래는 실제 서버에서 아직 확인하지 못했고, 의뢰인의 모의 운용 로그로 확인할 예정입니다.

06해외선물이라 미리 알려 드린 것

해외선물은 증거금으로 거래하는 레버리지 상품입니다. 가격이 조금만 움직여도 손익이 크게 바뀌고, 손실이 맡긴 증거금보다 커질 수 있습니다. 이 프로그램은 의뢰인이 정한 가격과 설정대로 주문을 대신 내는 도구입니다. 어느 가격에 들어갈지는 프로그램이 판단하지 않습니다.

07납품물과 기술

NH선물 REST API (해외선물) WebSocket 실시간 시세 Python, PyQt5 Telegram Bot API PyInstaller

납품 후 30일 동안 정해 둔 기능의 오류는 무상으로 고칩니다. 위 버전 기록의 v1.0.1부터 v1.0.4까지가 그 범위였고, 돌파 진입은 새 기능이라 추가 의뢰로 진행했습니다.

08관련 사례와 더 보기

해외선물 API의 시세 이용료가 궁금하시면 해외선물 API 시세료 글을 먼저 보시면 됩니다.

※ 본 사례는 고객 요구사항을 익명 처리하여 재구성한 것이며, 화면의 가격, 수량, 주문번호는 예시값입니다. 수익률과 수익금은 공개하지 않습니다. 해외선물은 레버리지가 큰 상품으로 원금을 초과하는 손실이 발생할 수 있습니다. 알고랩은 매매 자동화 프로그램 제작 서비스이며, 종목 추천, 투자 자문, 수익 보장 서비스가 아닙니다.

해외선물 자동매매를 만들고 싶으시면

쓰시는 증권사와 종목, 진입과 청산을 어떻게 하시는지 상담에서 말씀해 주세요.
API로 되는 것과 안 되는 것부터 확인해 드립니다.

무료 상담 시작하기 고객 후기 보기
← 제작 사례 전체 보기