안녕하세요
현재 업비트에서 여태까지 수익률이 표현이 되지 않아서 한번 만들어 봤습니다.
나중에 코딩 실력이 늘게 되면 연도별, 혹은 월별 수익률을 만들어 보겠습니다.
만들었는데 사실 왜 이렇게 되는지 잘 모르고 만들었어요(특히 쿼리 부분..)
제가 이론적인 지식이 있는 게 아니라 맨땅에 헤딩하는 식으로 만든 거라 고수분이 보시기에는 허접할 수도..ㅎㅎ
일단 OPEN API키가 있어야 합니다.
기본적인 내용은 업비트 개발자 센터에서 입금 및 출금 내용을 이용하였습니다.
여러 번 제가 원하는 프로그램을 만들어본 결과 차례차례 만드는 것이 제일 중요하더라고요.
단계를 하나하나씩 설정하고 하면 조금씩 풀리는데 많은 것을 하려고 하면 절 때 안 되더라고요.
그래서 단계를 생각했습니다.
1. 출금한 돈 불러오기
2. 입금한 돈 불러오기
3. 위 두 가지로 수익률 구하기로 했습니다.
1. 출금한 돈 불러오기
위에 업비트 개발자 센터를 들어갑니다.
여기 보면 입금 리스트 조회에서 오른쪽에 검은 부분에 코딩이 나와있습니다.
기본적으로 여길 이용했고 이상하게 제가 query부분에 'currency' : krw 이런 쿼리를 넣으면 실행이 안 되더라고요ㅡㅡ(분명 홈페이지에는 되는데)
그래서 쿼리 부분을 비워두니 결과 값이 나왔고 위에 OS. environ 부분도 이걸 넣으니까 왜 안되는지 모르겠지만 안돼서 뺐습니다.(보안 문제 생기나??ㅠㅠ)
txid 부분도 안돼서 제거했고요.(맨 아래 최종 있어요.)
그렇게 결과가 나오면 [{'currnecy' : 'krw', 'state' = 'done'......}, {'currnecy' : 'krw', 'state' = 'done'...}, ] 이런 식으로 나옵니다.
제가 이리저리 블로그& 구글링을 해본 결과 dictinoary 구조인데 list안에 dictionary가 있는 구조였습니다.(딕셔너리 구조 위에 사진에서 첫 번째 type : withdraw처럼 type을 찾으면 withdraw가 출력되는 식의 key : value형태)
이러한 정보에서 내가 원하는 정보를 찾아야 합니다.
여기서 포기하고 만들지 않을 뻔했는데 아까 위에서 말한 대로 천천히 단계를 찾아서 하기로 했습니다.
1. list 0일 때 1일 때 2일 때 3일 때 각각의 딕션 어리가 나온다(거래 한 번에 하나씩 생성되는 것 같아 보임)
->그럼 0일 때 하나의 딕션어리에서 조건에 맞으면 넣고 아니면 제외해야 한다.
->조건 : 상태가 done인 것을 찾고, currency가 krw인 것의 정보가 필요.
2. 반복문을 모르니 반복문을 공부하고 만들어보자!ㅠㅠ
i = 0
w = 0
e = 0
while i < len(wid.json()) :
wid2 = wid.json()[i] #그래서 이게 0번이 들어간다고 치고 저장하면 이건 딕셔너리로 생각해야됨.
if wid2['state'] == 'DONE' :
if wid2['currency']=='KRW' :
w = float(wid2['amount'])
e = e + w
i = i +1
초기 i=0이고 i가 len(wid.json())이라는 리스트 숫자(개수) 보다 적다.
list 0을 넣고 만약에 state가 done이고 wid2 currency가 krw이면
w에 amount 값을 실수(수학에서 실수)로 저장해라 라는 뜻입니다.
e는 W 값을 저장하기 위해 새로 만들어 주었고요. i는 1씩 증가해야 하니까 i +1을 넣었습니다.
그럼 i가 0 , 1, 2.... 등등 리스트에 있는 숫자만큼 반복을 하게 됩니다.
만약에 state와 currency 조건에 맞지 않을 경우 값이 저장되지 않습니다.
이렇게 해서 입금된 값을 구했습니다.
-> 나중에 월별, 연도별로 보고 싶으면 조건에서 연도별로 자르면 될 것 같습니다.
2. 입금한 돈 불러오기
거의 마찬가지입니다.
여기서 두 개를 합쳐야 하는데 두 개가 코딩이 거의 똑같고
마지막에 요거만 다릅니다. 변수를 같은 것 넣는 것은 좀 그래서 res 대신 wid라고 이름을 붙였고요
출금 정보는 vi/withdraws에 있고 입금정보는 vi/deposits에 있습니다.
그래서 나머지는 공통이니까 한 줄만 추가해서 결과를 보는데 아래 있는 출금 정보가 안 나오더라고요.
뭐 에러 메시지도 조건에 걸러져서 출금 = 0 이렇게 나오더군요
중간에 어디서 잘못된 건지 찾아보니까 메시지에 뭔가 겹친다고 나와서 그냥 처음부터 끝까지 복사했습니다.
3. 현재 가지고 있는 돈은 간단히 pyupbit로 해결이 가능합니다.
현금 + 가지고 있는 비트코인 수량 * 현재 가격.... 요런식으로요.
그래서 입금한 돈에서 출금한 돈을 빼고 현재 가지고 있는 코인의 가치로 나눠서 구했습니다.
사실 생각해보니 이것도 내가 가지고 있는 코인의 정보를 받고 그 코인의 현재 시가를 받으면 될 것 같은데 일단은 수동으로 하겠습니다.
완성본(더 아래 수정본있음)
import pyupbit
import jwt # PyJWT
import uuid
import hashlib
from urllib.parse import urlencode
import requests
# query는 dict 타입입니다.
access_key = '개인 OPEN API 키'
secret_key = '개인 OPEN API 키'
server_url = 'https://api.upbit.com/'
upbit = pyupbit.Upbit(access_key, secret_key)
aa = upbit.get_balance("KRW")
bb = upbit.get_balance("KRW-BTC") * pyupbit.get_current_price("KRW-BTC")
cc = upbit.get_balance("KRW-XRP") * pyupbit.get_current_price("KRW-XRP")
dd = upbit.get_balance("KRW-DOGE") * pyupbit.get_current_price("KRW-DOGE")
f = upbit.get_balance("KRW-ETH") * pyupbit.get_current_price("KRW-ETH")
ee = aa + bb + cc+ dd + f
#--------------------------------------------------------------------
query ={
}
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_alg': 'SHA512',
}
jwt_token = jwt.encode(payload, secret_key)
authorize_token = 'Bearer {}'.format(jwt_token)
headers = {"Authorization": authorize_token}
res = requests.get(server_url + "/v1/deposits",params=query_string, headers=headers )
#print(res.json()[0])
#print(len(res.json()))
#딕셔너리가 리스트 안에 있다. 이게 내 결론.
k = 0
d = 0
a = 0
while k < len(res.json()) :
res2 = res.json()[k] #그래서 이게 0번이 들어간다고 치고 저장하면 이건 딕셔너리로 생각해야됨.
if res2['state'] == 'ACCEPTED' :
if res2['currency']=='KRW' :
a = float(res2['amount'])
d = d + a
k = k +1
#----------------------------------------------------------------------------------------------
query ={
}
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_alg': 'SHA512',
}
jwt_token = jwt.encode(payload, secret_key)
authorize_token = 'Bearer {}'.format(jwt_token)
headers = {"Authorization": authorize_token}
wid = requests.get(server_url + "/v1/withdraws",params=query_string, headers=headers )
i = 0
w = 0
e = 0
while i < len(wid.json()) :
wid2 = wid.json()[i] #그래서 이게 0번이 들어간다고 치고 저장하면 이건 딕셔너리로 생각해야됨.
if wid2['state'] == 'DONE' :
if wid2['currency']=='KRW' :
w = float(wid2['amount'])
e = e + w
i = i +1
print("입급한 돈 =",d)
print("출금한 돈 =", e)
print("net =",d-e )
print("업비트 =", ee)
kkk = round(ee/(d-e)*100-100, 1)
print(kkk, '%')
완성했습니다.
이걸 완성하는데 걸린시간은 약 6시간..ㅋㅋㅋㅋㅋ 으 두시간이면 만들 줄 알았는데..
이걸로 코딩실력이 늘었다고 생각해야겠네요.ㅎㅎ
요것도 메시지에 넣을까 생각중입니다.
+ 수정
추가했습니다. 위에 것은 수동적으로 자신이 가지고 있는 것으로 수정을 해야 한다면 지금은 아애 리스트를 뽑아서 그에 해당하는 가격을 곱하도록 만들었습니다.
수정본
# 입금 리스트 조회
# https://docs.upbit.com/reference/%EC%9E%85%EA%B8%88-%EB%A6%AC%EC%8A%A4%ED%8A%B8-%EC%A1%B0%ED%9A%8C
import pyupbit
import jwt # PyJWT
import uuid
import hashlib
from urllib.parse import urlencode
import requests
# query는 dict 타입입니다.
access_key = '' 본인 값
secret_key = '' 본인 값
server_url = 'https://api.upbit.com/'
upbit = pyupbit.Upbit(access_key, secret_key)
k="0"
kk = "KRW-"
qwe = 0
d=0
ddd = upbit.get_balances()
while qwe < len(ddd) :
a = ddd[qwe]['currency']
qer = ddd[qwe]['avg_buy_price']
ok = 0
if qer == k :
pass
else :
cc = kk + a
ok = upbit.get_balance(cc)*pyupbit.get_current_price(cc)
d = d + ok
qwe = qwe +1
total = d + upbit.get_balance()
#--------------------------------------------------------------------
query ={
}
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_alg': 'SHA512',
}
jwt_token = jwt.encode(payload, secret_key)
authorize_token = 'Bearer {}'.format(jwt_token)
headers = {"Authorization": authorize_token}
res = requests.get(server_url + "/v1/deposits",params=query_string, headers=headers )
#print(res.json()[0])
#print(len(res.json()))
#딕셔너리가 리스트 안에 있다. 이게 내 결론.
k = 0
d = 0
a = 0
while k < len(res.json()) :
res2 = res.json()[k] #그래서 이게 0번이 들어간다고 치고 저장하면 이건 딕셔너리로 생각해야됨.
if res2['state'] == 'ACCEPTED' :
if res2['currency']=='KRW' :
a = float(res2['amount'])
d = d + a
k = k +1
#----------------------------------------------------------------------------------------------
query ={
}
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_alg': 'SHA512',
}
jwt_token = jwt.encode(payload, secret_key)
authorize_token = 'Bearer {}'.format(jwt_token)
headers = {"Authorization": authorize_token}
wid = requests.get(server_url + "/v1/withdraws",params=query_string, headers=headers )
i = 0
w = 0
e = 0
while i < len(wid.json()) :
wid2 = wid.json()[i] #그래서 이게 0번이 들어간다고 치고 저장하면 이건 딕셔너리로 생각해야됨.
if wid2['state'] == 'DONE' :
if wid2['currency']=='KRW' :
w = float(wid2['amount'])
e = e + w
i = i +1
print("입급한 돈 =",d)
print("출금한 돈 =", e)
print("net =",d-e )
print("업비트 =", total)
kkk = round(total/(d-e)*100-100, 1)
print('수익률 =', kkk, '%')
#원하는 것
#일단 전체에서 value가 KRW인 것과, ACCEPTED 인것은 분류하고 그중에 key가 amount의 value를 출력한다.
#단 반복문 사용.
'코인자동매매 > 업비트' 카테고리의 다른 글
바이낸스 자동매매 (0) | 2022.05.19 |
---|---|
트래블룰에 따른 코인옮기기:( (0) | 2022.05.15 |
업비트 Authorization token 발급 방법 (0) | 2022.02.14 |
바이낸스 이용시 조심하세요(network busy) (0) | 2021.11.28 |
비트코인 및 김프 시세 메신저로 받기 (2) (1) | 2021.11.03 |
댓글