업비트API 트레이딩
업비트API를 이용하여 가상화폐 트레이딩 프로그램을 만들어본다. 모든 예제는 node.js를 이용하였다.
API키 발급받기
업비트 [마이페이지->Open API 관리]에서 API키를 발급받는다.
혹시모르니 출금기능을 해제하고 IP설정을 꼭 하도록하자.
[발급받기]를 클릭하면 나오는 secret key
와 access key
를 따로 적어둔다.
API 모듈
업비트API문서 REST API 를 참고하여 만들었다.
upbit_lib.js
//https://docs.upbit.com/v1.0.3/
const rp = require("request-promise")
const sign = require("jsonwebtoken").sign
const queryEncode = require("querystring").encode
async function request(url, qs, token, method) {
if (!method) {
method = 'GET'
}
let options = {
method: method,
url: url,
json: true,
transform: function (body, response) {
let remain_min = 0
let remain_sec = 0
if (response.headers && response.headers['remaining-req']) {
let items = response.headers['remaining-req'].split(';')
for (let item of items) {
let [key, val] = item.split('=')
if (key.trim()=='min') {
remain_min = parseInt(val.trim())
} else if (key.trim()=='sec') {
remain_sec = parseInt(val.trim())
}
}
}
return {
'success': true,
'remain_min': remain_min,
'remain_sec': remain_sec,
'data': body
}
}
}
if (method=='POST') {
options.json = qs
} else {
options.qs = qs
}
if (token) {
options.headers = {Authorization: `Bearer ${token}`}
}
let result = {'success': false, 'message': null, 'name': null}
try {
result = await rp(options)
} catch(e) {
result.data = null
if (e.error.error) {
result.message = e.error.error.message
result.name = e.error.error.name
} else {
result.message = e.message
}
}
return result
}
//전체 계좌 조회
async function accounts() {
const url = 'https://api.upbit.com/v1/accounts'
const payload = {
access_key: this.accessKey,
nonce: (new Date).getTime(),
}
const token = sign(payload, this.secretKey)
let result = await request(url, {}, token)
return result
}
// 주문 리스트
async function order_list(market, state, uuids, page) {
//market: null KRW-BTC
//state: wait done
const url = 'https://api.upbit.com/v1/orders'
let qs = {state:state, page:page}
if (market) qs['market'] = market
if (uuids) qs['uuids'] = uuids
const query = queryEncode(qs)
const payload = {
access_key: this.accessKey,
nonce: (new Date).getTime(),
query: query
}
const token = sign(payload, this.secretKey)
let result = await request(url, qs, token)
return result
}
// 주문(매수)
async function order_bid(market, volume, price) {
//market: KRW-BTC
const url = 'https://api.upbit.com/v1/orders'
let qs = {market:market, side:'bid', volume:volume, price:price, ord_type:'limit'}
const query = queryEncode(qs)
const payload = {
access_key: this.accessKey,
nonce: (new Date).getTime(),
query: query
}
const token = sign(payload, this.secretKey)
let result = await request(url, qs, token, 'POST')
return result
}
// 주문(매도)
async function order_ask(market, volume, price) {
//market: KRW-BTC
const url = 'https://api.upbit.com/v1/orders'
let qs = {market:market, side:'ask', volume:volume, price:price, ord_type:'limit'}
const query = queryEncode(qs)
const payload = {
access_key: this.accessKey,
nonce: (new Date).getTime(),
query: query
}
const token = sign(payload, this.secretKey)
let result = await request(url, qs, token, 'POST')
return result
}
// 주문 상세
async function order_detail(uuid) {
const url = 'https://api.upbit.com/v1/order'
let qs = {uuid:uuid}
const query = queryEncode(qs)
const payload = {
access_key: this.accessKey,
nonce: (new Date).getTime(),
query: query
}
const token = sign(payload, this.secretKey)
let result = await request(url, qs, token)
return result
}
// 주문 취소
async function order_delete(uuid) {
const url = 'https://api.upbit.com/v1/order'
let qs = {uuid:uuid}
const query = queryEncode(qs)
const payload = {
access_key: this.accessKey,
nonce: (new Date).getTime(),
query: query
}
const token = sign(payload, this.secretKey)
let result = await request(url, qs, token, 'DELETE')
return result
}
// 주문 가능 정보
async function order_chance(market) {
const url = 'https://api.upbit.com/v1/orders/chance'
let qs = {market:market}
const query = queryEncode(qs)
const payload = {
access_key: this.accessKey,
nonce: (new Date).getTime(),
query: query
}
const token = sign(payload, this.secretKey)
let result = await request(url, qs, token)
return result
}
// 시세종목정보
async function market_all() {
const url = 'https://api.upbit.com/v1/market/all'
let result = await request(url)
return result
}
// 분 캔들
async function market_minute(market, unit, to, count) {
//unit: 1, 3, 5, 15, 10, 30, 60, 240
//to: yyyy-MM-dd'T'HH:mm:ssXXX
const url = 'https://api.upbit.com/v1/candles/minutes/'+unit
let qs = {market:market}
if (to) qs.to = to
if (count) qs.count = count
let result = await request(url, qs)
return result
}
// 일 캔들
async function market_day(market, to, count) {
//to: yyyy-MM-dd'T'HH:mm:ssXXX
const url = 'https://api.upbit.com/v1/candles/days'
let qs = {market:market}
if (to) qs.to = to
if (count) qs.count = count
let result = await request(url, qs)
return result
}
// 주 캔들
async function market_week(market, to, count) {
//to: yyyy-MM-dd'T'HH:mm:ssXXX
const url = 'https://api.upbit.com/v1/candles/weeks'
let qs = {market:market}
if (to) qs.to = to
if (count) qs.count = count
let result = await request(url, qs)
return result
}
// 월 캔들
async function market_month(market, to, count) {
//to: yyyy-MM-dd'T'HH:mm:ssXXX
const url = 'https://api.upbit.com/v1/candles/months'
let qs = {market:market}
if (to) qs.to = to
if (count) qs.count = count
let result = await request(url, qs)
return result
}
// 채결 정보
async function market_trade_tick(market, to, count) {
//to: yyyy-MM-dd'T'HH:mm:ssXXX
const url = 'https://api.upbit.com/v1/trades/ticks'
let qs = {market:market}
if (to) qs.to = to
if (count) qs.count = count
let result = await request(url, qs)
return result
}
// 시세 Ticker
async function market_ticker(markets) {
// markets: KRW-BTC,KRW-ETH
const url = 'https://api.upbit.com/v1/ticker'
let qs = {markets:markets}
let result = await request(url, qs)
return result
}
// 호가 정보
async function trade_orderbook(markets) {
// markets: KRW-BTC,KRW-ETH
const url = 'https://api.upbit.com/v1/orderbook'
let qs = {markets:markets}
let result = await request(url, qs)
return result
}
// class Upbit
function Upbit(s, a) {
this.secretKey = s
this.accessKey = a
}
Upbit.prototype.accounts = accounts
Upbit.prototype.order_list = order_list
Upbit.prototype.order_bid = order_bid
Upbit.prototype.order_ask = order_ask
Upbit.prototype.order_detail = order_detail
Upbit.prototype.order_delete = order_delete
Upbit.prototype.order_chance = order_chance
Upbit.prototype.market_all = market_all
Upbit.prototype.market_minute = market_minute
Upbit.prototype.market_day = market_day
Upbit.prototype.market_week = market_week
Upbit.prototype.market_month = market_month
Upbit.prototype.market_trade_tick = market_trade_tick
Upbit.prototype.market_ticker = market_ticker
Upbit.prototype.trade_orderbook = trade_orderbook
module.exports = Upbit
request(request-promise) 를 이용하여 rest api를 호출하였다. Upbit class를 반환한다. 모든 함수는 success, message, data, remain_min, remain_sec
를 반환한다.
success 성공여부
message 메세지
remain_min 남은호출횟수(1분당)
remain_sec 남은호출횟수(1초당)
data 결과값
const Upbit = require('./upbit_lib')
var upbit = new Upbit('secret key', 'access key')
이렇게 사용하면 된다.
테스트 프로그램
api 모듈을 이용해서 간단한 테스트 프로그램을 작성해보자.
test.js
const Upbit = require('./upbit_lib')
async function start() {
const upbit = new Upbit('secret-key', 'access-key')
console.log('-- market_all -------------------------------------------------')
let json = await upbit.market_all()
console.log(json.data)
{
console.log('-- market_minute -------------------------------------------------')
let {'success':success, 'message':message, 'data':data, 'remain_min':remain_min, 'remain_sec':remain_sec} = await upbit.market_minute('KRW-BTC', 1, '', 2)
console.log('remain_sec:',remain_sec)
console.log('remain_min:',remain_min)
console.log(data)
}
{
console.log('-- order_chance -------------------------------------------------')
let {'data':data} = await upbit.order_chance('KRW-BTC')
console.log(data)
}
}
start()
코인목록, 분봉값, 주문정보등의 api를 호출하였다. secret-key access-key에 본인이 발급받은 키를 입력하면 된다.
실행결과
ubuntu@ip-x:~/app/upbit$ node test.js
-- market_all -------------------------------------------------
{ success: true,
remain_min: 598,
remain_sec: 9,
data:
[ { market: 'KRW-BTC',
korean_name: '비트코인',
english_name: 'Bitcoin' },
{ market: 'KRW-DASH', korean_name: '대시', english_name: 'Dash' },
{ market: 'KRW-ETH',
korean_name: '이더리움',
english_name: 'Ethereum' },
{ market: 'BTC-ETH',
korean_name: '이더리움',
english_name: 'Ethereum' },
{ market: 'BTC-LTC',
korean_name: '라이트코인',
english_name: 'Litecoin' },
{ market: 'BTC-STRAT',
korean_name: '스트라티스',
...
다음에는 이를 이용한 간단한 자동 손절프로그램을 만들어 보도록 하겠다.
async await, axios 안쓰고 request-promise를 쓰신 이유가 잇나요?
async await, axios 안쓰고 request-promise를 쓰신 이유가 잇나요?