암호통화 API2018. 1. 25. 16:00

 

 

"~API 다뤄보기" 시리즈를 작성하고 있다보니 이게 너무 간단한 구조이다보니 #2편으로 넘어가기 힘드네요.

 

 

그렇지만 API에 대해 잘 모르는 분들을 위해 쉽게 풀어 보도록 하겠습니다.

 

 

우선 업비트의 경우에는 공식적으로 API를 지원하지 않고 있으나 Web Request 를 통해 조회가 가능하고 국내의 다른 가상통화 거래소보다 업비트에 상장된 종목이 많은편이기에 JSon Parsing 을 조금만 안다면 업비트를 통해 시세 데이터를 받아오는것이 편리할 수 있을 것 같습니다.

 

 

우선 업비트에서 데이터를 받으려면 어떤 데이터를 전송 해달라고 할 것인지 업비트 서버에 요청을 해야 합니다.

 

 

요청문의 기본 프레임은 아래와 같습니다.

 

 

 

https://crix-api-endpoint.upbit.com/v1/crix/candles/minutes/1?code=CRIX.UPBIT.KRW-BTC&count=10&to

 

 

 

위 텍스트를 다시 풀어내면 아래와 같은 구조가 됩니다.

 

 

 

- 1. 조회를 위한 기본 주소

 

 

- 2. 조회 기준을 입력하는데 필요한 데이터에 맞게 minutes, days, weeks, months 등을 입력

 

 

- 3. 조회 단위를 되는데 만약 2번에서 minutes가 입력되고 3번에서 1이 입력되면 매 '1분' 마다의 데이터를 전송

      ( 주의사항 : 3번의 입력은 2번의 값이 minutes 일때만 하면 됩니다. )

 

 

https://crix-api-endpoint.upbit.com/v1/crix/candles/minutes/1?code=CRIX.UPBIT.KRW-BTC&count=10

 

 

      2번에서 minutes를 입력하고 3번에서 30을 입력하면 매 '30분' 마다의 데이터를 전송

 

 

https://crix-api-endpoint.upbit.com/v1/crix/candles/minutes/30?code=CRIX.UPBIT.KRW-BTC&count=10

 

 

      2번에서 days를 입력하고 3번에서 1을 입력하면 매 '1일' 단위의 데이터를 전송 요청 할 수 있음

      ( 주의사항 : 아래의 조회 요청문은 위의 것과 다르게 days 이므로 3번 입력 항목이 없음)

 

 

https://crix-api-endpoint.upbit.com/v1/crix/candles/days/?code=CRIX.UPBIT.KRW-BTC&count=10

 

 

 

- 4. 조회 요청할 종목코드를 입력할 수 있으며 필자가 업비트를 통해 수신받고 있는 종목코드 목록은 아래 별도 기입

 

 

- 5. 수신받을 데이터의 갯수를 입력

       2번 minutes, 3번 1, 5번에 10을 입력하면 업비트 서버에 "1분 단위의 데이터 10개를 보내주시오" 라는 조회 요청

 

 

https://crix-api-endpoint.upbit.com/v1/crix/candles/minutes/1?code=CRIX.UPBIT.KRW-BTC&count=10

 

 

       2번 days, 3번 1, 5번에 50을 입력하면 업비트 서버에 '1일 단위의 데이터 50개를 보내주시오"라는 조회 요청

 

 

https://crix-api-endpoint.upbit.com/v1/crix/candles/days/?code=CRIX.UPBIT.KRW-BTC&count=50

 

 

 

위 조회 요청문은 조회 요청 시점으로부터의 과거 데이터를 수신 받을 수 있으며 5번의 count값은 입력하기에 따라 수신 받을 수 있는 데이터의 갯수가 달라지며 최대값은 200입니다.

 

 

따라서 과거 데이터를 모두 받고 싶다면 별도의 조회 요청문이 필요한데 위에서 언급한 기본 프레임에서 살짝 살을 붙이기만 하면 되고 아래와 같습니다.

 

 

 

https://crix-api-endpoint.upbit.com/v1/crix/candles/minutes/1?code=CRIX.UPBIT.KRW-BTC&count=10&to=2017-12-27%2005:10:00

 

 

 

기본 요청문 뒤에 특정 날짜, 시간값을 넣고 요청하면 해당 시점을 기준으로 과거 데이터를 보내주게 되는데 위 조회 요청문의 경우에는 2017년 12월 27일 오전 5시 10분을 기점으로 1분 단위의 데이터 10개를 보내 달라는 뜻이 됩니다.

 

 

기본적인 날짜시간값은 DATETIME 형식이기 때문에 각자가 사용하는 프로그램에 따라서 AddMinutes(), AddDays() 등의 함수를 이용하여 날짜시간값을 변경하여 연속 조회 요청하면 필요한 만큼의 과거 데이터를 충분히 받을 수 있습니다.

 

 

조회 요청에 의해 수신 받을 수 있는 JSON 파일을 메모장으로 열어보면 아래와 같은 데이터가 들어 있음을 확인할 수 있습니다.

 

 


     [

        { 

           "code":"CRIX.UPBIT.KRW-BTC",

           "candleDateTime":"2017-12-27T05:00:00+00:00",

           "candleDateTimeKst":"2017-12-27T14:00:00+09:00",

           "openingPrice":22495000.00000000,

           "highPrice":22563000.00000000,

           "lowPrice":22360000.00000000,

           "tradePrice":22496000.00000000,

           "candleAccTradeVolume":488.99434602,

           "candleAccTradePrice":10985289927.57700000,

           "timestamp":1514351400138,

           "unit":10

        }

     ]

 

 

▲ code : 종목코드

 

▲ candleDateTime : 해당 캔들(봉) 생성 시각

 

▲ candleDateTimeKst : 해당 캔들(봉) 생성 시각 (한국시각 기준. 한국은 UTC +09:00:00 임)

 

▲ openingPrice : 해당 캔들(봉) 시가

 

▲ highPrice : 해당 캔들(봉) 고가

 

▲ lowPrice : 해당 캔들(봉) 저가

 

▲ tradePrice : 해당 캔들(봉) 종가

 

▲ candleAccTradeVolume : 해당 캔들(봉) 거래량

 

▲ candleAccTradePrice : 해당 캔들(봉) 거래대금

 

▲ timestamp : UNIX 기준의 타임 스탬프

 

▲ unit : 조회 기준 (본문의 조회 요청문중 3번에 해당하는 값과 일치)

 

 

개인적으로 사용하기 위한 용도로 업비트 시세 수신 프로그램을 만들어서 운영하고 있으며 종목코드 목록은 아래와 같습니다.

 

 

 

종목명 (한글)

 

종목명 (영문)

종목코드 

 

에이다

 

Ada

KRW-ADA

 

스테이터스 네트워크 토큰

 

Status Network Token

KRW-SNT

 

리플

 

Ripple

KRW-XRP

 

비트코인

 

Bitcoin

KRW-BTC

 

네오

 

Neo

KRW-NEO

 

이더리움

 

Ethereum

KRW-ETH

 

퀀텀

 

Qtum

KRW-QTUM

 

루멘

 

Lumen

KRW-XLM

 

비트코인 골드

 

Bitcoin Gold

KRW-BTG

 

비트코인 캐시

 

Bitcoin Cash

KRW-BCC

 

이더리움 클래식

 

Ethereum Classic

KRW-ETC

 

뉴 이코노미 무브먼트

 

New Economy Movement

KRW-XEM

 

스트라티스

 

Stratis

KRW-STRAT

 

파워렛저

 

Power ledger

KRW-POWR

 

블록틱스

 

Blocktix

KRW-TIX

 

아인스타이늄

 

Einsteininum

KRW-EMC2

 

스팀

 

Steem

KRW-STEEM

 

머큐리

 

Mercury

KRW-MER

 

오미세고

 

OmiseGo

KRW-OMG

 

스팀달러

 

SteemDollars

KRW-SBD

 

라이트코인

 

Litecoin

KRW-LTC

 

모네로

 

Monero

KRW-XMR

 

코모도

 

Komodo

KRW-KMD

 

피벡스

 

PIVX

KRW-PIVX

 

리스크

 

Lisk

KRW-LSK

 

어거

 

Augur

KRW-REP

 

아크

 

Ark

KRW-ARK

 

그로스톨코인

 

Groestlcoin

KRW-GRS

 

스토리지

 

Storj

KRW-STORJ

 

대시

 

Dash

KRW-DASH

 

웨이브

 

Waves

KRW-WAVES

 

메탈

 

Metal

KRW-MTL

 

지캐시

 

Zcash

KRW-ZEC

 

버트코인

 

Vertcoin

KRW-VTC

 

 

위 내용들은 프로그램을 통해 시세 데이터를 수신 받아서 저장해두고 그것을 기반으로 어떤 아이디어나 매매 로직을 적용할 분들에게만 필요하고 손매매를 하는분께는 전혀 쓸모 없는 내용입니다만 뭔지 궁금한 분들은 위 '조회 요청문'을 인터넷 창(Internet Explorer, Chrome, Safari 등)의 주소 입력란에 넣고 엔터를 눌러보면 파일을 다운받을 수 있으니 메모장 등으로 확인 해보시면 됩니다.

( 쉽게 하려면, 본문에서 사각 테이블 안에 주소가 적힌 부분을 클릭하면 시세 데이터 파일을 다운 받을 수 있습니다. )

 

 

업비트는 정식 API를 지원하지 않기 때문에 시세 데이터 조회 요청시 최소 단위가 분(minutes)이고 실시간 체결 데이터인 틱(Tick) 단위의 데이터는 제공하지 않고 주문이 불가능한 상태이기 때문에 정식 API가 공개되기를 기다리는 분들이 많은것으로 알고 있는데 개인적으로도 염원하는바이며 정식 API가 공개되면 개인적으로 개발해서 사용하고 있는 시세 수신용 프로그램을 조금 더 다듬어서 주문 기능까지 포함하여 공개 하겠습니다.

 

 

정식 API가 지원되지 않는 경우에는 '거래'는 할 수 없고 단순히 시세 조회만 가능합니다.

 

 

더불어 얼마전 한 독자분께서 거래용 전용 프로그램의 제작을 의뢰 하기도 했는데 필자가 직접적으로 거래를 하지 않고 있는 상황이다보니 필요성에 대해 알지 못했습니다만 전일 밤 9시부터 새벽 3시까지 가상통화 거래하는분 여러명과 시간을 가지다보니 웹 브라우저의 경우 메모리 릭(누수, Lick) 현상 때문이라고 생각이 들었기에 현재 바쁜 작업들이 끝나고 나면 제작해서 공개 하겠습니다.

( 프로그램의 완성도는 독자님들의 피드백에 따라 달라질 수 있습니다. )

 

 

거래 전용 프로그램의 경우 우선적으로 작업되었으면 가상통화 거래소가 있으면 관련해서 Comment 남겨 주시고 UI(User Interface, 쉽게 말해 디자인.)은 거래소에 구분없이 동일하게 할 예정입니다.

 

 

호가창에서 뵙겠습니다.

 

 

Posted by 투자의神
암호통화 API2018. 1. 17. 11:30

 

 

가상통화(가상화폐, 가상증표, 전자통화, 이하 가상통화로 통일) 를 대상으로 알고리즘 자동매매 시스템을 구축하기 위해 기존의 알고리즘과 별도의 알고리즘에 대한 검증 작업을 하려다보니 많은 종목의 많은 데이터를 확보하는 것이 중요하다고 판단하여 어쩌다보니 중국 상해(상하이)에 위치한 바이낸스(Binance)의 API를 다뤄보게 되었습니다.

 

 

국내의 가상통화 거래소도 있는데 굳이 해외 거래소의 API를 다뤄보게 된 조금 더 상세한 이유는 다음과 같습니다.

 

- 국내의 경우 서버 과부하를 이유로 조회 제한이 심한 상태이다.

 

- 국내의 경우 상장된 종목의 수가 대체로 적다.

 

- (추후 다뤄볼 예정인) 업비트의 경우 상장된 종목이 100여종목이 넘고 API 도메인은 있지만 현재까지는 공식적으로 지원하지 않고 있다.

 

- 바이낸스의 경우 API 조회제한이 분당 1200회로 빗썸과 동일하다 (빗썸은 초당 20회로 제한)지만 빗썸 서버는 트래픽 폭주로 다운되는 경우가 잦아 안정적인 시세의 확보가 불가능하다.

 

- 이른바 김치 프리미엄(김프)으로 인해 글로벌 시세와 이격이 상당하고 단기 조정권의 투매 흐름이 나타날시 글로벌 시세와의 이격이 더욱 현격하게 벌어진다.

 

 

현재 업비트, 고팍스, 빗썸 등에서 시세를 수신하여 데이터베이스에 저장하고 있기는 하지만 조회제한, 안정성 문제 등의 이유로 인해 바이낸스의 API를 다뤄보게 되었습니다.

 

 

바이낸스가 중국 업체이긴하나 한글 웹페이지를 서비스하고 있기 때문에 한국의 사이트와 비슷한 정도의 편의성으로 이용할 수 있다고 봅니다.

 

 

다만, 해외 업체이기 때문에 본인 확인시에는 국내의 주민등록증, 운전면허증으로는 되지 않고 오로지 여권(Passport)으로만 가능합니다.

 

 

필자는 여행을 좋아하기에 여권을 보유하고 있는덕에 쉽게 본인 인증을 받을 수 있었습니다.

 

 

이외 API 를 신청하고 API Key와 Secret Key를 발급 받는 과정을 국내와 대동소이 하므로 생략합니다.

 

 

빗썸의 경우에는 샘플 코드를 제공하지만 바이낸스는 자체적으로 제공하는 샘플 코드는 찾아볼 수 없고 대신 GitHub(깃)을 통해 다양한 샘플 코드들이 공개되고 있으니 참고하면 됩니다.

 

 

 

▲ 제공되는 여러 모듈들에 대한 정보입니다.

 

▲ 시세 조회는 rest-api 를 이용하게 될 것입니다.

 

 

시세 조회를 함에 있어서 바이낸스 서버에 부하를 가하면 안되기 때문에 바이낸스 측에서는 각 api 별로 조회제한을 설정 해두었는데 어느정도의 제한 설정이 되어 있는지는 아래의 링크를 클릭하여 exchangeinfo.json 파일을 다운로드 받아 확인할 수 있습니다.

 

 

JSON 파일이라고는 하지만 메모장 등의 텍스트 에디터로 확인할 수 있는 형식의 문서이니 시작부터 겁 먹을 이유는 없습니다.

 

 

 

▲ 필자는 기존에 다운로드 받아 별도로 저장해둔 exchangeinfo.json 파일이 있기 때문에 exchangeinfo2.json 으로 이름을 변경하여 저장하였습니다.

 

▲ 보시다시피 메모장에서 해당 파일을 열어볼 수 있습니다.

 

▲ 다만 줄바꿈이 되어 있지 않다보니 가독성이 좋지 않아 별도로 파싱(Parsing)과정이 필요합니다.

 

 

 

▲ 보기 쉽게 별도로 정렬 한 모습입니다.

 

▲ 분당 조회 요청 제한 횟수, 초당 주문 제한 횟수, 1일간 주문 제한 횟수 정보를 먼저 볼 수 있습니다.

 

▲ 위 이미지는 ETH to BTC의 거래로써 심볼은 ETHBTC입니다.

 

▲ baseAsset 는 ETH (이더리움)으로, 거래 종목 코드라고 보시면 됩니다.

 

▲ 이외에도 수신받을 수 있는 데이터의 자릿수, 주문 가능 유형, 최소 가격, 최대 가격, 최소 틱 크기, 최소 주문 수량, 최대 주문수량 등의 기본 정보가 상세하게 제공되고 있습니다.

 

 

위 내용중 제일 중요한것을 꼽자면 단연 rateLimitType 입니다.

 

 

앞서 각 API별로 조회 제한을 두고 있다고 말씀 드렸는데요.

 

 

만약 이 조회 제한을 어기고 서버에 부하를 주게 되면 최소 몇시간에서 최대 3일 동안 조회 요청에 대해 서버측에서 거부를 하기 때문에 이런 치명적인 상황을 만들지 않도록 잘 계산하여 반복 조회를 실행하기 바랍니다.

 

 

참고로 필자의 경우에는 바이낸스에 상장되어 있는 200개 이상의 전 종목의 데이터를 수신하기 위해 1분당 5회만 조회 하도록 해두었다가 현재는 바이낸스 API를 사용하지 않고 있는데 그 이유는 마지막에 적겠습니다.

 

 

아래의 링크를 클릭하면 24hr.json 파일을 다운로드 할 수 있으며 역시 메모장 등의 텍스트 편집기로 열어볼 수 있습니다.

https://api.binance.com/api/v1/ticker/24hr

 

 

 

▲ 24hr.json 파일을 메모장으로 열어본 모습입니다.

 

▲ 역시나 가독성 따위는 고려하지 않은 출력 화면을 볼 수 있는데 그 이유는 json 파일은 컴퓨터끼리의 통신을 위한 것이지 각 사용자가 편리하게 열람하라고 만들어 둔 것이 아니기 때문입니다.

 

 

 

▲ 어떤 내용인지 살펴보기 위해 가독성을 높이려고 정리 해봤습니다.

 

▲ 앞서 조회 해보았던과 동일한 종목인 ETHBTC의 체결 데이터입니다.

 

▲ 가격변화(대비), 등락율, 평균 체결가, 직전 체결가, 직전 체결 수량, 매수가격, 매수수량, 매도가격, 매도수량, 시가, 고가, 저가, 시가시각(Unix TimeStamp), 종가시각(Unix TimeStamp), 체결건수 등의 정보를 제공하고 있습니다.

 

 

체결 데이터에 대한 상세한 내용을 보여주고 있습니다.

 

 

결국 앞서 포스팅했던 빗썸, 고팍스 API와 크게 다르지 않고 사용하기 어렵지 않게 데이터를 제공하고 있습니다.

 

 

JSON 파일을 수신받아 필요한 데이터는 파일이나 데이터베이스에 저장 하거나 연산을 할 수도 있고 rest-api.md 이외의 다른 api를 이용하여 주문을 하는 등의 행위에 대해 처리할 수 있습니다.

 

 

이상으로 바이낸스 api를 다뤄보았으며 추가 내용은 뭔가 생각나거나 아니면 독자분들의 별도 요청이 있을때 진행할 예정입니다.

 

 

끝으로, 바이낸스 API를 다뤄보았지만 사용하지 않고 있는 이유를 말씀 드리겠습니다.

 

 

지금까지 다뤄본 많은 거래소의 API들이 필자에게 익숙한 증권사의 API와 기본 구조가 다른데 결정적으로 누락될 수 있는 데이터가 있기 때문에 정밀한 시뮬레이션을 통한 로직 검증에는 다소 무리가 있으며 이정도 규모의 데이터라면 이미 시세 데이터를 수신받고 있는 업비트와 크게 다르지 않기 때문에 중복으로 저장할 이유가 없다고 판단되었습니다.

 

 

증권사의 실시간 체결 데이터는 사용자가 별도로 요청하지 않아도 개장전 실시간 체결 데이터 요청을 해두면 장중 발생한 모든 체결 데이터를 사용자에게 전송 해주지만 가상통화 거래소의 실시간 체결 데이터는 매번 사용자가 요청해야 되고 조회 요청 제한을 두고 있기에 중간에 값이 누락될 여지가 존재합니다.

 

 

어느 시장에서 어떤 데이터를 받아 거래를 하는지는 사실 큰 의미는 없습니다.

 

 

일시적이지 않고 꾸준히 수익을 낼 수 있는 로직을 보유하여 알고리즘 자동매매 시스템을 구축할 수 있느냐가 최대 관건이지 누락없는 데이터를 아무리 잘 제공한다 하더라도 수익 로직을 가지지 못하면 의미가 없으니 말입니다.

 

 

이상으로 "바이낸스 API 다뤄보기 #1" 마칩니다.

 

 

향후 필자가 주로 사용하게 될 거래소가 어디일지 또 어떤 API를 사용하게 될지에 대한 것은 확정된 것이 없는 상황입니다.

 

 

새로운 거래소와 API를 찾을수도 있고 기존에 다뤄본 거래소와 API가 될수도 있습니다.

 

 

호가창에서 뵙겠습니다.

 

 

Posted by 투자의神
암호통화 API2018. 1. 12. 05:00

 

 

API 접속 주소 (URL)

 

: 고팍스의 REST API는 계정/주문 관리 및 공개 마켓 데이터에 대한 엔드포인트를 제공합니다.

 

https://api.gopax.co.kr

 

 

1. 요청/응답 형식

 

: 모든 요청 및 응답의 content-type 은 application/json 이며, 통상적인 HTTP 상태코드를 준수합니다.

 

: 예를 들어 성공적으로 접속한 경우에는 200의 상태코드가 반환됩니다.

 

 

2. 오류

 

: 접속 장애 등의 문제가 있을 경우 그에 준하는 HTTP 상태코드가 반환됩니다.

 

 

HTTP 오류코드

 

오류코드 

 

설명

 

400

 

잘못된 요청 - 요청 형식이 유효하지 않음

 

401

 

권한 없음 - 잘못된 API Key

 

403

 

금지됨 - 요청한 리소스에 대한 접근 권한이 없음

 

404

 

찾을 수 없음

 

500

 

내부 서버 오류 - 서버에 문제가 발생함

 

요청 처리 중 논리적인 오류가 발생했을 경우 HTTP 상태코드는 여전히 200으로 반환되지만, 응답 내용이 항상 다음의 형식으로 반환됩니다.

 

 

     {

           errormsg: '[오류 내용에 대한 설명]'

     }

 

 

 

3. 페이지 처리

 

: 고팍스는 REST 요청에 대한 응답이 배열(array)의 형태로 반환되는 경우 커서 페이지 처리가 적용됩니다.

 

: 대부분의 엔드포인트는 기본적으로 최신 항목을 반환하며, 추가적인 결과를 가져오려는 경우에는 이미 반환된 데이터를 기준으로 처리하고자 하는 페이지의 방향을 명시해야 합니다.

 

 

이름 

 

기본값

설명 

 

pastmax

 

 

본 페이지 ID 뒤의 (오래된) 페이지를 요청함

 

lastestmin

 

 

본 페이지 ID 앞의 (새로운) 페이지를 요청함

 

limit

 

100 

각 요청에 포함되는 결과의 갯수 (최대 100 / 기본 100)

 

 

4. 타임스탬프

 

 

2018-01-01T01:02:04.123456z 

 

 

: API의 모든 타임스탬프는 ISO 8601 형식에 따라 microsecond 단위로 반환됩니다.

 

: 대부분의 현대적 프로그래밍 언어 및 라이브러리에서 해당 형식이 지원됩니다.

 

 

5. API 호출 횟수 제한

 

: API 호출 횟수 제한을 초과하면 429 - 너무 많은 요청 상태코드가 반환됩니다.

 

: Public API 는 IP 당, Private API 는 API Key 당 호출 횟수가 제한됩니다.

 

: 각각 최근 10초의 구간 안에서 최대 60번의 API 호출이 가능합니다.

 

 

6. Private API 인증

 

: Private API에 인증하기 위해, REST 요청에 항상 다음의 HTTP 헤더가 포함되어야 합니다.

 

 

1. API-KEY : 발급받은 API KEY

 

2. SIGNATURE : 메시지 서명 값 (아래 별도 기술)

 

3. NONCE : 중복되지 않고 계속 증가하는 값 (통상적으로 TIMESTAMP)

 

같은 NONCE 값이 사용되면 서버에서 거부합니다.

 

HTTP 본문의 content-type은 application/json 으로 설정해야 합니다.

 

 

SIGNATURE 는 다음 과정에 따라 생성합니다.

 

1. 다음의 내용을 순서대로 문자열로 연결합니다.

    1. 헤더의 NONCE 값

 

    2. 2.HTTP Method(대문자로): 'GET', 'POST', 'DELETE' 등

 

    3. API 엔드포인트 경로 (예: '/orders', '/trading-pairs/ETH-KRW/book')

 

    4. SON 형식의 요청 변수 본문 (없을 경우 아무 문자열도 연결하지 마십시오)

 

2. 발급 받은 secret 을 base64 로 디코딩합니다.

 

3. 2번의 값을 secret key 로 사용하여 sha512 HMAC 으로 서명합니다

 

4. 3번의 값을 base64 로 인코딩합니다.

 

 

아래는 node.js 예제입니다.

 

 

     var crypto = require('crypto');


     var secret = 'PYPd1Hv4J6/7x...';


     var nonce = Date.now() / 1000;


     var method = 'POST';


     var requestPath = '/orders';


     var body = JSON.stringify({
       type: 'limit',
       price: '1.0',
       amount: '1.0',
       side: 'buy',
       tradingPairName: 'ETH-KRW'
     });


     // 필수 정보를 연결하여 prehash 문자열을 생성함
     var what = nonce + method + requestPath + body;


     // base64로 secret을 디코딩함
     var key = Buffer(secret, 'base64');


     // secret으로 sha512 hmac을 생성함
     var hmac = crypto.createHmac('sha512', key);


     // hmac으로 필수 메시지에 서명하고
     // 그 결과물을 base64로 인코딩함
     return hmac.update(what).digest('base64');

 

 

 

 

REST API 호출 목록

 

 

1. 인증이 필요한 호출

 

 

1. 잔액 조회하기

 

요청

 

 

     GET /balances 

 

 

응답

 

 

 [
       {
         asset: 'KRW',
         avail: 10000000000,
         hold: 5000000,
         pendingWithdrawal: 5000000
       },
       ...
     ]

 

 

 

2. 자산 이름에 따라 잔액 조회하기

 

요청

 

 

     GET /balances/<asset-name>

 

 

응답

 

 

     {
       asset: 'KRW',
       avail: 10000000000,
       hold: 5000000,
       pendingWithdrawal: 5000000
     } 

 

 

 

3. 주문 조회하기

 

요청

 

 

     GET /orders 

 

 

Query String Parameter

 

 

이름

 

설명

 

trading-pair-name

 

[선택] 유효한 거래쌍 이름(ETH-KRW, BTC-KRW, ... ) 

 

응답

 

 

     [
       {
         id: 98723,
         price: 2986,
         amount: 9,
         tradingPairName: 'ETH-KRW',
         side: 'buy',
         type: 'limit',
         createdAt: '2016-12-08T20:02:28.53864Z' // ISO 8601 타임스탬프
       },
       ...
     ]

 

 

 

4. 주문 ID로 주문 조회하기

 

요청

 

 

     GET /orders/<order-id>

 

 

응답

 

 

     {
       id: 98723,
       status: 'placed' // placed, cancelled, completed, updated
       side: 'buy' // buy 또는 sell
       type: 'limit' // limit 또는 market
       price: 2986,
       amount: 9,
       remaining: 10,
       tradingPairName: 'ETH-KRW',
       createdAt: '2016-12-08T20:02:28.53864Z', // ISO 8601 타임스탬프
       updatedAt: '2016-12-08T20:02:28.53864Z', // ISO 8601 타임스탬프
     }

 

 

 

5. 주문 등록하기

 

요청

 

 

     POST /orders

 

 

요청 본문

 

 

     {
       type: 'limit' // limit 또는 market
       side: 'buy' // buy 또는 sell
       price: 2986,
       amount: 9,
       tradingPairName: 'ETH-KRW'
     }

 

 

 

응답

 

 

     {
       id: 98723,
       price: 2986,
       amount: 9,
       tradingPairName: 'ETH-KRW',
       side: 'buy',
       type: 'limit',
       createdAt: '2016-12-08T20:02:28.53864Z' // ISO 8601 타임스탬프
     }

 

 

주문에는 지정가(limit)와 시장가(market) 두 종류가 있습니다.

 

계정에 충분한 잔액이 있는 경우에만 주문을 등록할 수 있습니다.

 

주문이 등록되면, 주문의 지속기간 동안 계정의 해당 잔액이 홀드됩니다.

 

홀드되는 잔액의 종류 및 금액은 오더 종류 및 명시된 매개변수에 따라 결정됩니다.

 

 

6. 주문 ID로 주문 취소하기

 

요청

 

 

     DELETE /orders/<order-id>

 

 

응답

 

 

     {

     }

 

 

 

7. 사용자 거래 기록 조회하기

 

요청

 

 

     GET /trades

 

 

Query String Parameter

 

 

이름

 

설명

 

trading-pair-name

 

[선택] 유효한 거래쌍 이름(ETH-KRW, BTC-KRW, ... ) 

 

응답

 

 

     [
       { id: 4154562,
         orderId: 5323195,
         amount: 0.5315267,
         fee: 0.00079729,
         price: 101385,
         timestamp: 1504610614,
         side: 'buy',
         tradingPairName: 'BTC-KRW'
       },
       ...
     ]

 

 

 

2. 인증이 필요하지 않은 호출

 

 

1. 자산 조회하기

 

요청

 

 

     GET /assets

 

 

응답

 

 

     [
       {
         id: 'KRW',
         name: 'Korean Won'
       },
       {
         id: 'ETH',
         name: 'Ethereum'
       },
       ...
     ]

 

 

 

2. 특정 종목 조회하기

 

요청

 

 

     GET /trading-pairs

 

 

응답

 

 

     [
       {
         name: 'ETH-KRW',
         baseAsset: 'ETH',
         quoteAsset: 'KRW'
       },
       ...
     ]

 

 

 

3. 특정 종목의 거래량 조회하기

 

요청

 

 

     GET /trading-pairs/<trading-pair-name>/ticker
 

 

응답

 

 

     {
       price: 979,
       ask: 1303,
       bid: 985,
       volume: 3966,
       time: '2016-12-08T20:02:28.53864Z' // ISO 8601 타임스탬프
     }

 

 

 

4. 특정 종목의 호가창 조회하기

 

요청

 

 

     GET /trading-pairs/<trading-pair-name>/book

 

 

Query String Parameter

 

 

이름

 

설명

 

level

 

 

호가창의 상세정보 수준

 

1 = 매수호가 및 매도호가

 

2 = 매수 및 매도 주문 각 50개

 

기타 = 호가창 전체

 

 

응답

 

 

     {
       bid: [
         [1, 2937, 2326], // id, 가격, 수량
         [2, 262, 2066],
         ...
       ],
       ask: [
         [1, 2937, 2326], // id, 가격, 수량
         [2, 262, 2066],
         ...
       ]
     }

 

 

 

5. 최근 체결 거래 조회하기

 

요청

 

 

     GET /trading-pairs/<trading-pair-name>/trades

 

 

Query String Parameter

 

 

이름

 

설명

 

limit 

 

반환되는 항목의 갯수 (최대 100)

 

pastmax 

 

이 ID보다 오래된 데이터를 제외함

 

latestmin 

 

이 ID보다 새로운 최신 데이터를 가져옴

 

after 

 

이 TIMESTAMP 이후의 데이터를 제외함 (밀리 세컨드 단위)

 

before 

 

이 TIMESTAMP 이전의 데이터를 제외함 (밀리 세컨드 단위) 

 

응답

 

 

     {
       id: 28374,
       price: 6234,
       amount: 22,
       side: 'buy' // buy 또는 sell
       time: '2016-12-08T20:02:28.53864Z' // ISO 8601 timestamp
       latestmin: 3092, // next cursor id to fetch newer data
       pastmax: 3022, // next cursor id to fetch older data
     }

 

 

 

6. 특정 종목의 최근 24시간 통계 조회하기

 

요청

 

 

     GET /trading-pairs/<trading-pair-name>/stats

 

 

응답

 

 

     {
       open: 34.19000000,
       high: 95.70000000,
       low: 7.06000000,
       volume: 2.41000000
     }

 

 

 

7. 특정 종목의 과거 기록 조회하기

 

요청

 

 

     GET /trading-pairs/<trading-pair-name>/candles

 

 

Query String Parameter

 

 

이름

 

설명

 

start

 

시작 시점 (밀리 세컨드 단위)

 

end

 

종료 시점 (밀리 세컨드 단위) 

 

interval

 

희망하는 시간 간격 (분 단위)

 

 

응답

 

 

     {
       // time, low, high, open, close, volume
       [ 1504681856031, 9588, 10500, 10234, 10355, 2833.85258576 ],
       ...
     }

 

 

 

GoPax_API_Guide_Korean.zip

GoPax_API_Guide_English.zip

 

 

reference by GoPAX

 

 

Posted by 투자의神
암호통화 API2018. 1. 10. 00:30

 

 

앞서 빗썸 API를 이용하는 방법에 대해 포스팅을 했었지만 한 독자분의 요청으로 "빗썸 API를 이용한 가상화폐 실시간 체결 데이터 수신 프로그램"을 만들게 되었고 나름대로 충분히 (그래봐야 몇시간) 테스트 해봤다고 생각하지만 오류가 있을 수도 있으니 각자 확인 해보시기 바랍니다.

( v.1.000 배포 글 : http://systemtraders.tistory.com/500 )

 

 

"빗썸 API를 이용한 가상화폐 실시간 체결 데이터 수신 프로그램 v.1.005" 배포합니다.

 

  

변경 사항 :

 

- 텍스트 파일이 비어 있더라도 키 입력 TextBox가 Enabled 처리되어 키 입력이 불가능한 오류 수정

 

- 서버가 점검중이더라도 프로그램을 재시작 할 필요 없이 계속 켜두면 자동으로 서버 ON 인식

 

 

본 프로그램을 이용하기 위해서는 가상화폐 거래소인 빗썸에 회원 가입을 한 후 API 사용 신청 등을 하여야 합니다.

( https://www.bithumb.com/ )

 

 

API 사용 신청 등의 부분에 대한 자세한 내용은 이전의 글을 참고 해주세요.

http://systemtraders.tistory.com/393 )

 

 

프로그램의 특성에 대한 내용은 아래 링크를 참고 해주세요.

( http://systemtraders.tistory.com/485 )

 

 

@ 주의 사항

 

빗썸 API 서버 내부적으로 동시 다발적인 request(리퀘스트) 발생시 접속을 차단하는 것으로 파악되니 동시에 여러개의 프로그램을 실행하시면 안되고 직접 테스트 해 본 결과 물리적인 컴퓨터가 구분 되더라도 데이터를 못 받는 것으로 보아 API KEY 등으로 일종의 '중복 접속' 등을 체크 하는 것 추정되기에 동시에 여러 데이터를 받으려면 데이터 수신 전용으로 사용할 다른 아이디를 만들어서 사용하는것이 좋을 것 같습니다.

 

 

첨부되어 있는 파일을 다운로드 후 압축해제 하면 쉽게 사용할 수 있게 되어 있으니 각자의 용도에 맞게 사용하시면 되겠습니다.

 

 

BiThumb_ReceiveRealData_v.1.005.zip

 

 

사용상 불편한점이 있거나 개선되었으면 하는 기능에 대해서는 Comment 남겨 주세요.

 

 

[추가]

 

수신받은 데이터의 각 필드명은 아래와 같습니다.

 

체결시각, 매수/매도체결 구분, 체결수량, 체결가격, 체결약정금액

 

 

체결시각은 DATETIME 형식으로 되어 있습니다.

 

매수/매도체결 구분은 ask는 매도, bid는 매수입니다.

 

체결약정금액은 체결수량 * 체결가격입니다.

 

 

Posted by 투자의神
암호통화 API2018. 1. 9. 14:30

 

 

앞서 빗썸 API를 이용하는 방법에 대해 포스팅을 했었지만 한 독자분의 요청으로 "빗썸 API를 이용한 가상화폐 실시간 체결 데이터 수신 프로그램"을 만들게 되었고 나름대로 충분히 (그래봐야 몇시간) 테스트 해봤다고 생각하지만 오류가 있을 수도 있으니 각자 확인 해보시기 바랍니다.

 

 

본 프로그램을 이용하기 위해서는 가상화폐 거래소인 빗썸에 회원 가입을 한 후 API 사용 신청 등을 하여야 합니다.

( https://www.bithumb.com/ )

 

 

API 사용 신청 등의 부분에 대한 자세한 내용은 이전의 글을 참고 해주세요.

http://systemtraders.tistory.com/393 )

 

 

프로그램의 특성에 대한 내용은 아래 링크를 참고 해주세요.

( http://systemtraders.tistory.com/485 )

 

 

첨부되어 있는 파일을 다운로드 후 압축해제 하면 쉽게 사용할 수 있게 되어 있으니 각자의 용도에 맞게 사용하시면 되겠습니다.

 

 

BiThumb_ReceiveRealData_v.1.000.zip

 

 

사용상 불편한점이 있거나 개선되었으면 하는 기능에 대해서는 Comment 남겨 주세요.

 

 

 

Posted by 투자의神
암호통화 API2017. 12. 25. 17:00

 

 

빗썸 API를 이용하여 정상 접속하는 부분까지 진행 해봤고 이번 시간에는 실시간으로 데이터를 조회 해보겠습니다.

 

 

사용한 프로그램 소스는 이전 포스트의 최하단을 참고 하세요.

( http://systemtraders.tistory.com/393 )

 

 

증권사 API의 경우 실시간TR를 등록하면 증권사 서버에서 데이터가 변경되면 자동으로 클라이언트에게 변경된 데이터를 강제로 내려주는 방식이라 상당히 편리하지만 빗썸 API의 경우 만들어진지 오래 된 탓인지 아니면 개발자 역량의 탓인지 증권사처럼 편리한 기능을 제공하지 않고 있고 마치 증권사의 조회TR을 사용하는 것과 같이 사용자가 데이터를 조회 요청 하면 조회 요청한 시점의 데이터를 내려주는 방식입니다.

 

 

조회 요청하면 빗썸 시세 데이터베이스 서버에 저장된 데이터를 내려주는 것이죠.

 

 

예제 코드를 이미 올려 드렸기 때문에 이미 데이터 조회까지 충분히 진행한 분도 계실텐데요.

 

 

기존의 코드를 연속 조회로 변경하게 되면 아래의 이미지와 같은 조회 결과가 출력됩니다.

 

 

 

▲ 노란색 박스를 보면 연속 조회를 했기 때문에 수신된 값이 조금씩 다름을 알 수 있습니다.

 

▲ (노란색 박스) 세번째와 네번째의 데이터는 동일한 데이터가 수신되었는데 세번째와 네번째 조회 요청 사이에 거래 체결이 없었기 때문에 서버에서 보관하고 있던 동일한 값이 수신된 것입니다.

 

▲ 이러한 부분은 Unique value 를 기준으로 갱신 여부를 판단하면 되므로 어려운 일이 아닙니다.

 

 

필자는 GUI 기반의 프로그래밍과 C#이 익숙하다보니 기존의 Text 기반의 Console 창이 아니라 GUI 로 일부 변경하였고 이 과정에서 timer_tick을 이용하여 0.05초에 1회씩 빗썸 서버에 데이터를 요청하도록 처리 하였습니다.

 

 

이 과정은 소스 코드의 Main 함수 내에 있는 코드를 timer_tick 함수안에 넣어주기만 하면 되는 쉬운것이니 생략하고 결과를 보여드리면 아래와 같습니다.

 

 

 

▲ C#의 DataGridView에 수신된 데이터를 출력해봤습니다.

 

▲ 현재시각은 Unix TimeStamp를 기준으로 하기 때문에 시차가 발생하는 부분이고 필요시 시차를 조정하는 함수를 사용하면 됩니다.

 

▲ 최근 시세에 관심을 가지고 있지 않아 잘 몰랐는데 비트코인의 현재가가 역대 최고가(2500만원) 대비 일부 조정세를 보이고 있는데 이것을 두고 폭락세라고 매스컴에서 난리를 친 것인가 싶을 정도로 필자 기준에는 미미한 조정으로 보여집니다.

 

 

빗썸 서버로부터 수신받은 데이터의 출력은 Console이든 DataGridView이든 혹은 Text Label 이든 독자분들의 기호에 맞게 출력하면 되겠고 필자의 경우에는 오래전 작업 한 내용이기는 한데 수신받은 데이터를 화면에 출력하지 않고 비트코인 시세 데이터의 수집을 위해 MySQL 데이터베이스 서버에 저장하기도 했습니다.

 

 

이 역시 각자의 기호에 따라 혹은 필요에 따라 처리하면 될 부분입니다.

 

 

빗썸 API 자체가 매우 단순하기 때문에 추가로 뭘 더 보여드리고 싶어도 보여드릴 수 있는것이 없습니다.

 

 

독자분들의 요청 사항이 있을때 별도의 글을 남기도록 하겠습니다.

 

 

 

Posted by 투자의神
암호통화 API2017. 12. 23. 15:30

 

 

프리랜서 DBA로 활동하면서 가상화폐 마이닝도 병행하고 계신 한 분과 통화를 하면서 가상화폐 시세 데이터를 받아오고 거래하는 프로그램의 얘기가 나온김에 쇠뿔도 단김에 빼랬다고 얼마나 걸릴지 모를 연재를 시작 해보겠습니다.

 

 

현재까지는 가상화폐 카테고리가 필자의 주력 아이템이 아니기 때문에 언제 업데이트 될 지 모릅니다.

 

 

우선 빗썸(biThumb)에 회원가입이 필요합니다.

https://www.bithumb.com/ )

 

 

회원가입 절차중 휴대전화 인증이나 이메일 인증이 필요한데 해당 과정은 어려운게 아니므로 생략합니다.

 

 

짜잔! 회원가입 하셨죠?

 

 

그 다음으로는 빗썸의 API를 사용하기 위한 승인 절차와 key 발급이 필요합니다.

 

 

 

 

 

▲ 마이페이지에서 API관리 메뉴를 클릭하면 위 이미지처럼 보일것입니다.

 

▲ 일련의 정보들을 입력하고 API KEY 생성 버튼을 클릭하면 이메일 인증 절차를 통해 KEY가 발급됩니다.

 

▲ 이미지 하단의 사용중 API 리스트에 있는 Connect Key (접속키)와 Secret Key (암호키)는 메모장 등에 별도로 저장 해두세요.

 

▲ Key 발급이 완료된 후 활성화 버튼을 누르면 발급받은 API Key를 사용할 수 있게 되고 Secret Key 는 ' - '로 출력됩니다.

 

▲ 필자의 경우에는 이미 신청되어 있는 상태이기 때문에 Secret Key가 ' - ' 로 출력되고 있으며 Connect Key는 개인정보 보호를 위해 삭제했습니다.

 

 

다음 단계로, 빗썸 API를 통해 무엇을 할 수 있는지 알아 보겠습니다.

 

 

 

 

▲ 빗썸 메인페이지 하단을 보면 API라고 써진 곳을 클릭합니다.

 

 

 

▲ 상당히 많은 정보들을 제공해주고 있는데 자세히 알아 보겠습니다.

 

▲ Public API 는 체결 정보를 수신 받을 수 있는 공개적인 부분이라고 이해하면 됩니다.

 

▲ Private API는 실제 거래 체결과 관련된 부분이라 정보 보호를 위해 private api로 분류되어 있습니다.

 

▲ 하나의 API로 Public API, Private API 모두를 사용할 수 있습니다.

 

 

 

▲ 빗썸 거래소 마지막 거래 정보를 제공하고 있습니다.

 

▲ 상세 정보로는 조회 요청에 대한 결과 상태 코드를 시작으로 시가, 고가, 저가, 종가(현재가)와 거래금액, 거래량 등의 정보가 자세히 소개되고 있습니다.

 

 

 

▲ 조회 요청에 대한 결과 상태 코드와 현재 진행중인 거래등에 대한 정보가 수신됩니다.

 

 

 

 

▲ 체결이 완료된 내역에 대한 정보가 수신됩니다.

 

 

이외 Private API 영역도 '더보기' 를 클릭하면 어떤 정보를 제공하며 각 기능들이 어떻게 동작하는지 상세하게 설명되어 있으며 ERROR CODE 는 모든 API 공통이며 정상일 경우에는 status 값으로 '0000' 을 수신받게 됩니다.

 

 

예제 코드는 PHP, JAVA, C++, Node.js, Python, C#, Go 등 다양한 언어별로 준비되어 있으니 필요에 따라 선택하여 다운로드 받으면 됩니다.

 

 

이제 아무 샘플 코드나 다운 받아서 실행 해보면 되는데 필자의 경우에는 주력이 C#이므로 해당 예제 코드를 다운로드 받았고 아까 API 사용 신청을 하면서 발급받은 Connect Key, Secret Key를 예제 코드에 입력한 후 실행 결과는 아래와 같습니다.

 

 

 

▲ status 코드가 '0000'으로 수신되면서 정상 조회 처리 되었음을 확인할 수 있습니다.

 

▲ 시가, 고가, 저가, 종가, 거래량, 등의 정보도 수신할 수 있습니다.

 

 

 

필자는 빗썸에서 데이터를 받고 있지 않습니다.

 

그 이유는 초당 20회까지의 데이터밖에 수신할 수 없고 이외의 데이터는 누락될 수 밖에 없는 빗썸 자체의 정책 때문이며 완전하지 않은 데이터는 분석에 불리할 수 밖에 없기 때문입니다.

 

 

다만 빗썸 API와 시세 프로그램 그리고 자동매매 프로그램에 대한 얘기가 전화상으로 오가면서 생각난김에 올려 봅니다.

 

 

위 과정을 보면 아시겠지만 생각보다 쉽고 간단하게 API를 통해 데이터를 조회 할 수 있었습니다.

 

 

"빗썸 (biThumb) API 다뤄보기 #1"은 여기까지 진행하고 다음번에는 실시간 데이터를 조회 요청하고 빗썸 서버로부터 수신 받는 과정을 다뤄 보겠습니다.

 

 

Bithumb_20170414_RESTFulAPI-C_s.zip

 

 

위 파일은 빗썸에서 제공하고 위 내용을 작성하기 위해 필자가 사용한 예제 파일입니다.

 

 

Posted by 투자의神