코인 자동매매 만들기는 파이썬으로 업비트 시세를 읽고, 규칙을 참·거짓으로 판단하고, JWT 인증을 붙여 주문한 뒤 결과를 기록하는 일이다. 키, 인증, 시세, 조건, 주문을 한꺼번에 쓰지 말고 순서대로 연결하면 각 단계의 입력과 출력을 확인하기 쉽다.
1단계: 키와 실행 위치를 정한다
업비트 PC 웹에서 로그인한 뒤 ‘마이페이지 > Open API 관리’에서 API 키를 발급한다. 계정당 메인포켓 기준 최대 10개, 서브포켓은 포켓당 최대 5개까지 발급할 수 있다(2026년 9월 확인 기준).
주문하기·출금하기 API를 이용하려면 허용 IP를 등록한다. 파이썬 프로그램을 계속 실행할 위치를 정하고 그곳의 IP를 등록한다. Access Key와 Secret Key는 프로그램 실행 환경에서 읽고, 소스 코드의 조건문이나 기록 파일에는 실제 값을 넣지 않는다.
처음에는 시세 조회와 조건 계산을 만드는 키 설정, 주문 요청을 만드는 키 설정을 코드 구조에서 나눠 볼 수 있다. 실행 함수가 어떤 권한을 쓰는지 이름으로 구분하면 주문 단계에 들어가는 시점을 알기 쉽다.
2단계: JWT 서명 함수를 만든다
업비트 Open API는 REST API와 웹소켓 연결 요청에서 JWT 인증을 쓴다. Access Key와 Secret Key로 토큰을 만들고 Authorization: Bearer {JWT 토큰} 헤더에 넣는다. 서명 알고리즘은 HS256을 권장한다.
JWT 페이로드에는 access_key와 매 요청마다 새 UUID로 만든 nonce가 들어간다. 요청 파라미터가 있으면 query_hash와 query_hash_alg도 넣는다. 같은 토큰을 계속 재사용하는 구조가 아니라 요청마다 페이로드를 새로 만드는 함수로 작성한다.
인증 함수의 입력은 요청 파라미터, 출력은 Authorization 헤더가 되게 구성할 수 있다. 완성된 JWT는 실행 중 요청에만 쓰고 기록에는 남기지 않는다.
3단계: 시세와 조건을 분리한다
시세 함수는 코인과 봉 간격을 받아 가격 데이터를 돌려준다. 조건 함수는 그 데이터를 받아 이동평균선이나 RSI를 계산하고 참·거짓을 돌려준다. 주문 함수는 조건이 참일 때만 호출한다.
골든크로스를 쓴다면 짧은 이동평균선과 긴 이동평균선의 현재 위치만 비교하지 않는다. 이전 봉에서는 짧은 선이 아래였고 현재 마감 봉에서는 위인지 비교해야 ‘교차한 순간’이라는 규칙이 된다. 판정 시점도 ‘봉 마감 뒤 한 번’처럼 정한다.
RSI는 최근 일정 기간의 오른 날과 내린 날을 비교해 0부터 100 사이의 값으로 나타낸다. 조건 문장은 ‘RSI가 설정값 아래이고 봉이 마감되면 참’처럼 작성한다. 기간, 기준값, 봉 간격은 설정 파일에서 읽도록 나누면 규칙을 한곳에서 확인할 수 있다.
4단계: 주문과 기록을 붙인다
업비트 주문 종류에 맞춰 입력값을 만든다. 지정가 limit는 price와 volume, 시장가 매수 price는 price, 시장가 매도 market은 volume을 입력한다. 최유리 지정가 best는 time_in_force에 ioc 또는 fok를 넣는다(2026년 9월 확인 기준).
짧은 의사코드는 다음처럼 나눌 수 있다.
키 = 실행환경에서_읽기()
시세 = 시세_조회(코인, 봉간격)
신호 = 조건_판단(시세, 설정값)
if 신호 and 아직_주문하지_않음:
JWT = 요청마다_서명(키, 주문값)
결과 = 주문_요청(JWT, 주문값)
기록(시각, 신호, 주문값, 결과)
아직_주문하지_않음은 같은 봉이나 같은 신호에서 주문을 되풀이하지 않도록 이전 기록을 확인하는 부분이다. 기록에는 판정 시각, 코인, 봉 간격, 지표 값, 참·거짓, 주문 종류, 금액이나 수량, 거래소 응답을 남긴다.
주문 테스트와 요청 수
실제 주문 함수를 연결하기 전 주문 테스트로 요청 형식을 확인한다. 업비트 주문 테스트 API는 초당 최대 8회다. 주문 API는 초당 최대 12회, 일반 API는 초당 최대 30회, 전체 주문 취소는 2초당 최대 1회다(2026년 9월 확인 기준).
파이썬 반복문에는 요청 종류별 간격을 둔다. 한 판정에서 일반 조회를 몇 번 하고 주문 테스트나 주문을 몇 번 하는지 센 뒤 한도 안에 배치한다. 응답을 받기 전에 같은 주문을 다시 보내지 않도록 주문 상태와 마지막 요청 시각을 기록한다.
테스트 단계에서는 조건을 참으로 고정해 주문값 생성까지만 확인한 뒤, 주문 테스트 응답을 기록할 수 있다. 그다음 실제 지표 조건을 연결해 시세, 판정, 주문 요청의 순서가 한 기록에 담기는지 본다.
처음 한다면 이 순서로
- ‘마이페이지 > Open API 관리’에서 키를 발급하고 주문에 쓸 허용 IP를 등록한다.
- 요청마다 새
nonce를 넣는 JWT 서명 함수를 만든다. - 시세 조회 함수와 조건 판단 함수를 분리해 출력값을 기록한다.
- 주문 종류에 맞는 금액·수량을 만들고 주문 테스트를 초당 최대 8회 안에서 실행한다(2026년 9월 확인 기준).
- 실제 주문과 중복 판정 확인을 붙인 뒤 모든 응답을 시각과 함께 기록한다.
책에서 이어지는 것
프로그램이 주문할 금액과 실행을 멈출 가격을 정하는 순서는 ‘제8장 그래서 차트를 어디에 씁니까’에서 이어진다. 차트 신호를 본 뒤 금액과 기준을 먼저 정하고 코드의 설정값으로 옮기는 방법을 다룬다.