이제 업비트 API를 사용해보도록 하겠습니다.
본 포스트를 비롯한 관련 포스트에서 작성한 코드를 사용하여 발생할 수 있는 API KEY 노출이나 AWS 원격조작으로 인한 현물 재산 피해 및 거래소 측에서 유저에게 조치하는 행위에 대해서는 책임을 져드리지 않습니다.

업비트 - 마이페이지 - Open API 관리 란으로 들어가면 새로운 Open API 키를 발급받을 수 있습니다.
주문하기, 출금하기 등의 기능은 특정 IP에서만 실행가능란을 채워야만 키가 발급됩니다. ip를 확인하는 방법은 여러가지 방법이 있겠습니다만, 네이버에 간단히 ip확인이라고 검색하면 자신의 ip를 알려주니 이를 입력하시면 됩니다.
그렇다고 24시간 동안 컴퓨터를 켜놓을 수는 없는 노릇이죠. AWS 와 같은 서버를 이용해서 파이썬 스크립트를 실행시켜놓을 경우 그 AWS 의 ip 주소가 필요하니 이 부분은 따로 추가를 해주어야합니다.

API 발급 당시에 알려주는 access key와 secret key를 혼자만 잘 간직합니다. 특히 시크릿키는 다시 안 알려주기때문에 어디다 잘 보관해두면 좋습니다.
이제 업비트 개발자센터 에서 필요한 기능을 가져다 쓰기만 하면 됩니다. 잘 정리되어 있으니 사용하기 어렵지 않습니다.
먼저 인증가능한 요청을 만들기 위해 토큰을 생성합니다.
import jwt # PyJWT
import uuid
ACCESS_KEY = 'access key 입력'
SECRET_KEY = 'secret_key 입력'
payload = {
'access_key': 'ACCESS_KEY',
'nonce': str(uuid.uuid4()),
'query_hash': query_hash,
'query_hash_alg': 'SHA512',
}
jwt_token = jwt.encode(payload, 'SECRET_KEY')
authorization_token = 'Bearer {}'.format(jwt_token)
여기서 파이썬 환경에서 라이브러리 설치시에 pip jwt 가 아니라 pip pyjwt 를 사용해야합니다. 그렇지 않을 경우 코드 실행단계에서 오류가 발생합니다. 업비트 rest api 를 불러올 때 사용하는 jwt는 json web token 약자로써 토큰 기반 인증 시스템 중의 하나입니다. 여기서는 PyJWT 라이브러리가 토큰 인코딩 및 해싱을 진행해주기 때문에 크게 신경쓸 부분은 없습니다.
이를 토큰 생성의 기본 틀로 하여 api를 사용하게 되는데, 저희가 필요한 부분인 주문하기 쪽을 보겠습니다.

보아하니 이 부분만 잘 채워보면 될 것 같습니다.
server_url 은 https://api.upbit.com/ 으로 작성해주시면 되고, 억세스 키와 시크릿 키는 자신의 것을 적어주세요.
우리는 앞에서 새로운 공시가 어떤 암호화폐에 관련된 공시인지 받아올 수 있었고, 이를 시장가로 일정량 매수하는 코드를 작성하기로 했습니다. 따라서 쿼리 부분을 손대줘야 하는데요, 쿼리의 파라미터들은 코드 아래에 써있는 것을 참조하면 손댈 수 있습니다.

따라서 위 기본 코드는 BTC-KRW 마켓에서 100원에 0.01개를 매수 주문을 거는 요청으로 볼 수 있습니다. 우리 입맛대로 손대보면 다음과 같습니다.
query = {
'market': market,
'side': 'bid',
'price': 5000,
'ord_type': 'price',
}
market의 값은 우리가 직접 변수에 넣기로하고, 매수 주문을 5000원 시장가로 넣는 요청입니다. 필요에 따라 price 의 값을 조정할 수 있겠습니다.
위 쿼리를 포함하는 새로운 함수 buy를 만들어보았습니다.
def buy(market):
query = {
'market': market,
'side': 'bid',
'price': 5000,
'ord_type': 'price',
}
query_string = urlencode(query).encode()
m = hashlib.sha512()
m.update(query_string)
query_hash = m.hexdigest()
payload = {
'access_key': ACCESS_KEY,
'nonce': str(uuid.uuid4()),
'query_hash': query_hash,
'query_hash_alg': 'SHA512',
}
jwt_token = jwt.encode(payload, SECRET_KEY)
authorize_token = 'Bearer {}'.format(jwt_token)
headers = {"Authorization": authorize_token}
res = requests.post("https://api.upbit.com/v1/orders", params=query, headers=headers)
market 을 파라미터로 받는 buy 함수입니다.
market 부분을 해결하기 위해 저번에 작성한 코드에서 oldassets != newassets 부분에 market 을 지정해주기로 합니다.
### 생략 ###
elif oldassets != newassets :
market = 'KRW-'+newassets
buy(market)
print('new 공시 !!')
break
### 생략 ###
이러면 만약 newassets 의 값이 BTC 라면 market 이라는 변수에 KRW-BTC 라는 문자열이 저장되고, buy 함수가 실행될 때 리퀘스트에 포함되어서 실행됩니다.
API를 이용해서 매수 이후에 자산을 조회하거나 전일대비 얼마나 올랐는지 등을 이용해서 매도하는 코드까지 구성할 수도 있겠습니다만, 저의 이번 목적은 API를 이용한 자동매매였기에 이정도에서 마무리했습니다.
'Python' 카테고리의 다른 글
[PyQt5] 버튼 눌러서 새 창 띄우기 (0) | 2021.08.18 |
---|---|
암호화폐 거래소 공시봇 만들기 - (4) 무지성 공시봇 후기 (0) | 2021.03.31 |
암호화폐 거래소 공시봇 만들기 - (2) 코드 작성 (2) | 2021.03.25 |
암호화폐 거래소 공시봇 만들기 - (1) 구조 파악 (0) | 2021.03.23 |
fastText를 이용한 상품 카테고리 분류 (0) | 2021.03.17 |