이번 글에서는 빗썸 자동매매 프로그램에 사용할 매수 주문 함수를 파이썬으로 구현해보겠습니다.
< 이번 목표는 아래의 빨강색 글입니다. 파랑색 글은 이전 포스팅 내용에서 찾아봐 주세요.>
- 일봉 불러오기 + 보조지표 선택 + 보조지표 파라미터 최적화
- 매수 주문
- 매도 주문
- 취소 주문
- 주문 갱신
- 현재 매수 주문 가능 원화 보유량 확인 & 매수 수량 계산
- 현재 매도 주문 가능한 코인 보유량 확인 (=매도 수량)
- 주문 가격 선택 (호가 1번째)
- 주문 가격 형식 보정 (정수인지 소수점 이하를 포함하는 실수인지 정확하지 않으면 에러 발생함)
- 주문 수량 보정 (소수점 이하에서 자칫 반올림이 적용되어 주문 가능수량이 초과되면 에러 발생함)
- 주문 내역 history 엑셀 저장
매수 주문은 매도 주문과 많이 유사하지만, 보유하고 있는 원화를 기준으로 주문할 코인의 수량을 계산해야 하는 부분이 크게 다릅니다. 상당부분이 매도 주문 내용과 같기 때문에, 중요 부분을 bold체로 강조해 두었습니다.
빗썸 Public API를 이용해 일봉을 불러오고, 최적화한 보조지표를 통해 시세 모니터링을 하던 중, '매수' 싸인을 받았다고 가정해 봅니다.
앞서 포스팅한 순서대로 자동매매 프로그램은 현재 원화 보유량을 확인합니다.
매수 가능한 수량이 최소기준을 만족하는지 확인하고, orderbook에서 매수 주문 가격을 받아옵니다.
매수 가능한 원화 최소량도 편의상 5천원 이상인 경우로 제한하고자 합니다. 이것은 어디까지나 임의로 설정한 것이니 바꾸셔도 좋습니다.
주문 가능한 원화 보유량은 빗썸의 모든 코인에 대해서 bithumb.get_balance(coin_name) 으로 거래 진행중인 원화를 확인해서 계산해야 하지만, 여기서는 "BTC" 하나만을 자동매매 중인 것으로 가정하겠습니다.
빗썸 거래소에 "매수 주문"이라는 정보는 명령어로 구분합니다. 명령어 이름의 접두어(prefix)가 buy~인지, sell~인지로 구분해 줍니다.
거래 형태는 시장가 거래와 지정가 거래 2가지가 있고, 이 또한 시장가 거래는 ~market_order, 지정가 거래는 ~limit_order 로 명령어의 접미어(suffix)가 구분됩니다.
시장가 거래의 경우, 주문 수량이 모두 체결될 때까지 첫 번째 매도 호가부터 자동으로 주문가를 높여가며 거래하는 방식입니다. 그래서 시장가 매도주문 실행문에는 주문가격이 생략되고, "주문할 코인이름", "주문 수량"만 입력됩니다.
만일, 매도 호가 첫 번째가 1000원에 1개가 있고, 두 번째가 10000원에 100개가 있는데, 시장가 매수 주문을 50개 한다면, 1000원에 1개, 10000원에 49개를 거래해버립니다. 주의해야할 거래 방식입니다.
order_result = bithumb.buy_market_order(coin_name, buy_coins) # 시장가 매수
지정가 거래에 대해서는 매도 주문을 설명할 때와 내용이 같습니다.
다시 요약하자면, 주문에 입력된 가격으로만 거래를 허용하는 방식입니다.
order_result = bithumb.buy_limit_order(coin_name, price, buy_coins) # 지정가 매수
지정가 거래 방식으로 자동매매 알고리즘을 이어가기 위해, 아래와 같이 매수 주문 함수를 파이썬으로 구현해 보았습니다.
def buy_order(balance):
price=target_price("매수") # 주문 가격
buy_coins=(balance[2]-balance[3])/price # 선행된 매수 주문으로 거래중인 금액을 빼줍니다.
######################### 매수주문 수량 보정 #########################
if (balance[2]-balance[3])/price<0.0001 or (balance[2]-balance[3])<5000 :
# 비트코인 최소주문수량 0.0001 또는 잔액이 5000원보다 작으면 함수를 중단합니다.
order_result==None
return order_result
else:
# 주문수량의 소수점 5자리 미만 숫자를 버립니다.
split_point=str(round(buy_coins,12)).split(".")
for i in range(len(split_point)):
if i==0: # 1보다 큰 정수 부분
buy_coins=float(split_point[i])
else: # 1보다 작은 실수 부분
buy_coins=buy_coins+float("0"+"."+split_point[i][:4])
#######################################################################
######################### 주문 가격 타입 보정 #########################
if price<1000:
price=float(price)
else:
price=int(price)
#######################################################################
order_result=bithumb.buy_limit_order(coin_name,price,buy_coins)
return order_result
이 매수 주문 함수(buy_order)는 private API 로부터 사용자 계정의 원화 보유량 정보(balance)를 입력받습니다.
balance에 담겨진 세 번째값(balance[2])에서 네 번째 값(balance[3])을 빼서 주문 가능한 원화 잔액을 계산합니다.
이후, 주문 가능한 잔액을 매수 가격(price)로 나누어 매수 주문 수량(buy_coins)를 계산합니다.
이전 글에서 상세 설명을 확인하세요.
# 5. bithumb.get_balance(coin_name)
이번 시간에는 빗썸 자동매매를 위해 현재 주문 가능한 원화 또는 코인의 보유량을 확인하는 코드를 파이썬으로 구현해보겠습니다. 만일 제가 선택한 보조지표로부터 매수 싸인을 받았는데 빗
nakyup.tistory.com
주문 가격(target_price)는 매수 호가로부터 받아옵니다. 이전 글에서 상세 설명을 확인하세요.
# 7. pybithumb.get_orderbook(coin_name)
앞서 주문 가격을 현재가로 설정하는 방법을 포스팅했었는데, 이번에는 파이썬을 이용한 비트코인 호가창 가격 선택하기를 해보겠습니다. <이번 글의 목표는 아래 빨강글씨 부분입니다. 파랑
nakyup.tistory.com
주문가능한 매수 잔액이 5천원 미만이거나, 매수주문 수량이 비트코인 주문 최소 수량인 0.0001 미만이면 실행을 중단하고 함수를 빠져 나옵니다.
매도 주문에서와 마찬가지로, 주문 가능 수량이 1 미만의 수량을 포함하면 유효자릿수만 남기고 소수점 5자리 이후의 값은 버려야 합니다.
이 때, 소숫점 숫자에서 반올림을 하는 경우가 많아서 오류를 일으키기 쉽습니다.
예를 들어 0.000095 를 소숫점 4자리만 남기려고 할 때, 0.0001로 반올림되면 주문량이 주문가능 수량을 초과하여 오류가 발생합니다.
이 때 발생하는 오류 메시지가 KeyError {'status': '5600', 'message': '매수금액이 사용가능 KRW 를 초과하였습니다'} 입니다.
위에 공개한 ###매수 수량 보정###은 숫자를 문자열로 바꾼 다음, 소숫점을 기준으로 분리하여 1이상의 숫자와 1 미만의 숫자 중 앞 4자리 숫자만을 다시 더해주는 방식으로 소숫점 5자리 이하를 버려 줍니다. (파이썬 기본 문법은 추후에 보강하도록 하겠습니다.)
끝으로, 주문 가격이 1000 이상이면 정수로, 1000 미만이면 소숫점을 포함하는 실수로 타입을 지정해 줍니다. 비트코인 이외의 알트 코인들을 거래하는 경우, 이 또한 많은 오류의 원인이 됩니다.
주문에 성공하게 되면 order_result에는 아래와 같은 반환된 튜플 값이 담깁니다.
('bid', 'BTC', 'C0101000000256308654')
'bid'는 매수 주문임을 의미하고, 세 번째 알파벳 하나와 긴 숫자의 조합은 주문가격과 주문수량 정보를 담고 있는 주문 번호입니다. 이 튜플 형식의 값은 추후 주문을 취소하기 위해 필요하기 때문에 로그 기록이 요구됩니다.
로그 기록에 대한 내용은 다음 글에서 이어가겠습니다.
'가상화폐 자동매매' 카테고리의 다른 글
유튜브 채널 - 코딩 아바타 (5) | 2021.02.03 |
---|---|
# 8. bithumb.sell_limit_order(coin_name,price,sell_coins) (0) | 2021.02.03 |
# 7. pybithumb.get_orderbook(coin_name) (0) | 2021.02.03 |
# 6. pybithumb.get_current_price(coin_name) (0) | 2021.02.03 |
# 5. bithumb.get_balance(coin_name) (2) | 2021.02.03 |