upbit에서는 거래를 위한 api를 제공하고있습니다. 

해당 api를 사용해서 python으로 가격 조회 부터 거래하는법 까지 알아보도록 하겠습니다.

 

사전 준비물

python3

 

python3가 설치 되어있으시다면, 리퀘스트를 보내기 위한 모듈인 requests모듈을 설치해야합니다.

pip3 install requests

 

KEY 발급받기

설치가 완료되면 업비트 api이용 신청을 해야합니다.

https://upbit.com/service_center/open_api_guide해당 주소로 접속합니다.

 

 

좌측 하단에 있는 Open API 사용하기를 클릭하시고 로그인을 진행해주세요.

 

 

로그인이 완료되면 이런 창이 뜨게 되는데, 여기서 계좌 조회, 주문 조회, 주문하기, 특정 IP에서만 실행을 선택해주세요.

본인의 ip를 적어야 하는데, 이를 아는 방법은 python 콘솔을 실행시키셔서 아래의 코드를 실행시켜주세요.

import requests
r = requests.get(r'http://jsonip.com')
ip= r.json()['ip']
print(ip)

 

 

아래 표시된 ip를 특정 IP에서만 실행에 옮겨 적어주세요. 그리고 API key 발급받기를 눌러주세요.

추후에 서버에서 구동을 하실분은 나중에 ip목록을 수정할 수 있으니 일단은 진행하셔도 좋습니다.

 

 

카카오페이 인증이 완료되면 Access key와 Secret key가 생성되는데 이때 Secret key는 현재 화면 이외에서는 다시 확인할 수 없기 때문에 복사를 해서 안전한곳에 저장해두시길 바랍니다.

 

현재 가격 정보 받아오기

이제 에디터를 켜서 py파일 하나를 생성하겠습니다.

upbit.py파일을 하나 생성하고 필요한 모듈들을 임포트 해주겠습니다. 그리고 아까 생성한 시크릿 키와 엑세스키를 선언해줍니다.

import hashlib
import time
from urllib.parse import urlencode
import jwt
import requests
import uuid

SECRET_KEY = '시크릿 키를 입력해주세요.'
ACCESS_KEY = '엑세스 키를 입력해주세요.'

이때 python3가 아니라면  urlencode에서 에러가 발생할 수도 있습니다.

만약 없는 모듈이 있는 경우 설치해주세요.

SECRET_KEY와 ACCESS_KEY에는 실제 발급된 키를 문자열로 적어주세요.

현재 가격을 알아오기 위해서 일봉 정보를 받아와서 알아보겠습니다.

getTradePrice라는 함수를 하나 만들겠습니다.

def getTradePrice(market):
    url = "https://api.upbit.com/v1/candles/days"

    querystring = {"market": market, "count": "1"}

    response = requests.request("GET", url, params=querystring)
    print(response.json())


getTradePrice("KRW-BTC")

https://api.upbit.com/v1/candles/days에 인자로 암호화폐의 마켓코드를 받고, querystring에 넣어서 리퀘스트를 보냈습니다.

여기서 querystring으로 전달되는 market에는 마켓코드가, count에는 받아올 캔들의 수입니다. 

(마켓코드는 KRW-암호화폐 코드입니다.)

비트코인의 마켓코드인 KRW-BTC를 인자로 주면 정상적으로 현재 일봉 정보를 받아올 수 있습니다.

[{'market': 'KRW-BTC', 'candle_date_time_utc': '2020-05-08T00:00:00', 'candle_date_time_kst': '2020-05-08T09:00:00', 'opening_price': 11988000.0, 'high_price': 12163000.0, 'low_price': 11810000.0, 'trade_price': 11893000.0, 'timestamp': 1588922333669, 'candle_acc_trade_price': 37852405300.72652, 'candle_acc_trade_volume': 3158.19842084, 'prev_closing_price': 11998000.0, 'change_price': -105000.0, 'change_rate': -0.0087514586}]

이중에서 trade_price정보가 현재 가격입니다. trade_price를 따로 빼서 return시켜주겠습니다.

def getTradePrice(market):
    url = "https://api.upbit.com/v1/candles/days"

    querystring = {"market": market, "count": "1"}

    response = requests.request("GET", url, params=querystring)
    return response.json()[0]['trade_price']


print(getTradePrice("KRW-BTC"))

이제 getTradePrice(market)를 호출하면 해당 마켓의 현재가격을 받아올 수 있습니다. 

 

암호화폐 매수하기

구매 리퀘스트를 보내보겠습니다.

buy라는 함수를 하나 만들어줍니다.

def buy(market,price,volume):
    query = {
        'market': market,
        'side': 'bid',
        'volume': volume,
        'price': price,
        'ord_type': 'limit',
    }
    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).decode('utf-8')
    authorize_token = 'Bearer {}'.format(jwt_token)
    headers = {"Authorization": authorize_token}

    res = requests.post("https://api.upbit.com/v1/orders", params=query, headers=headers)

buy("KRW-ETH",500,1)

인자로  마켓코드, 매수할 가격, 매수할 수량을 받습니다.

query에서 ord_type을 price로 지정하면, 시장가 매수도 가능합니다.

해당 함수를 실행하면 정상적으로 이더리움을 500원에 1개를 매수하는 주문이 들어가는 것을 확인할 수 있습니다.

해당 마켓의 최저 거래금액 이상이되어야 거래 주문이 들어가는점 주의하시길 바랍니다.

 

 

암호화폐 매도하기

sell함수를 하나 만들어주겠습니다.

def sell(market,price,volume):
    query = {
        'market': market,
        'side': 'ask',
        'volume': volume,
        'price': price,
        'ord_type': 'limit',
    }
    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).decode('utf-8')
    authorize_token = 'Bearer {}'.format(jwt_token)
    headers = {"Authorization": authorize_token}

    res = requests.post("https://api.upbit.com/v1/orders", params=query, headers=headers)

buy함수와 동일하지만 query에 side를 ask로만 변경하시면 됩니다.

 

개발자 센터

https://docs.upbit.com/reference#%EC%9E%90%EC%82%B0-%EC%A1%B0%ED%9A%8C

업비트 개발자 센터의 api reference를 참고하시면 제가 소개한 기능 외에도 여러 자산을 조회하는 등 할 수 있는것이 많으니 참고해서 개발하시면 될것같습니다.

 

복사했습니다!