업비트 API에 대한 고찰
업비트 API 도 해외 거래소와 마찬가지로 websocket 을 지원한다.
다만 private websocket 을 지원하지 않는다.
즉 나의 거래에 관한 피드백을 주지 실시간으로 제공하지 않는다는 말이다.
그럼 어떻게 하냐고?
request 를 초단위로 호출할 수밖에...
다행히 1초에 한번 호출해도 될 정도로 호출카운트는 넉넉히 주는것 같다.
업비트 측에서 의도한 바인지는 모르겠으나, 하루빨리 조속히 매우 신속하게 웹소켓 private api 를 제공하기를 바란다.(공짜로 쓰는 주제에 매우 당당하게 어필하깅~)
그러나 이 request 가 문제인데,
업비트의 주문리스트는 상태값이 여러개이다.
그중에 체결완료 상태는 "done" "cancel" 이 두개이다.
done 하나만 호출하면 안된다. 시장가는 cancel 로 오는 경우가 허다하다... 왜 이런지는 모르겠다. 업비트 지 맘이지 모...
API 상으로는 상태값 하나만 호출하면 state 값만 주면 되는데, 복수값을 원할 경우, states 로 array 로 달라고 한다.
근대 그게 잘안된다.
state 는 잘되는데, states 가 안된다.
php 만 안되나??? 싶어서 업비트 메뉴얼에 들어가서 nodejs 샘플을 직접 만들어 보아서 실행해 보았다.
========================================================================================
const request = require('request')
const uuid = require("uuidv4")
const crypto = require('crypto')
const sign = require('jsonwebtoken').sign
const queryEncode = require("querystring").encode
const access_key = "엑세스키"
const secret_key = "시크릿키"
const server_url = "https://api.upbit.com"
const limit = 10
const states = [
'done','cancel'
//...
]
const non_array_body = {
limit: limit,
}
const array_body = {
states: states,
}
const body = {
...non_array_body,
...array_body
}
const uuid_query = states.map(state => `states[]=${state}`).join('&')
const query = queryEncode(non_array_body) + '&' + uuid_query
const hash = crypto.createHash('sha512')
const queryHash = hash.update(query, 'utf-8').digest('hex')
const payload = {
access_key: access_key,
nonce: "11bf5b37-e0b8-42e0-8dcf-dc8c4aefc000",
query_hash: queryHash,
query_hash_alg: 'SHA512',
}
const token = sign(payload, secret_key)
const options = {
method: "GET",
url: server_url + "/v1/orders?" + query,
headers: {Authorization: `Bearer ${token}`},
json: body
}
request(options, (error, response, body) => {
if (error) throw new Error(error)
console.log(body)
})
======================================================
솔직히 나는 안되길 바랬다...
안되면은 애초에 API 가 잘못된 거라고 우길수 있기 때문이다...
그치만 성공했다...
그럼 php 로 만든 소스가 문제란 말인데...
성공하게 되면 후기를 작성해 주겠다...