본문 바로가기

기록지/비트코인 자동 거래 시스템 만들기

[비트코인 자동 거래 시스템] 5주차 Trading Module을 구현하자! 🎫

반응형

1. 개요

 

 퇴사 후 시간이 생겨 비트코인 자동 거래 시스템에 많은 시간을 쓸 수 있었다. 조금은 지체되었던 개발속도를 빠르게 하기 위해 노력하고 있다. 배포와 웹에서 해당 시스템을 trigger할 수 있도록 하기 위해서는 시간이 그렇게 많지 않다. 따라서 친구들을 만나는 시간을 제외하고는 모든 시간을 시스템 개발에 사용하고 있다.

 

2. 본문

 

 Trading Module을 구현하였다. 해당 모듈의 알고리즘은 간단하다.


1. 현재 가격으로 코인을 산다.

2. 가격이 오르면 코인을 판다.


 핵심 알고리즘은 위와 같지만 세부적으로 보면 간단하진 않다.

 

 매수요청을 한 후 매수가 완료되었을 때 매도요청을 해야한다. 이 과정은 1초에 한번씩 계속 실행되어야한다. 그렇다면 조금 더 세부적으로 알고리즘을 작성해보자.


1. 해당 코인으로 매수신청을 한다.

 - 매수신청 상태: PURINPRO

2. 매수신청이 완료됨을 확인한다.

 - 매수완료 상태: BUYORDCOM

3. 매수신청이 완료된 주문들만을 대상으로 매도신청을 진행한다.

 - 매도신청 상태: SELORDSTA

4. 매수신청된 주문들을 대상으로 주문상태를 확인한다. 매도가 완료되었으면 history 데이터베이스에 데이터를 옮겨준다.

 - 매도완료 상태: SELORDCOM


거래소는 자신이 선택하기 나름이다. 필자의 경우에는 코빗거래소를 사용하였다.


korbit


- 매수 신청 모듈

 

 매수 신청 모듈은 간단하다. 사려고 하는 코인의 통화쌍을 적어 주문하면 된다. 문제는 어느수준의 양을 주문하냐는 것인데, 나같은 경우는 지금 가지고 있는 한화(krw)에 10% 양의 돈으로 주문하도록 하였다. 트레이딩 알고리즘을 훨씬 잘 알고있는 사람은 아마 더 좋은 전력을 세우겠지만 나는 아직 시작단계이니 간단한 수준으로 알고리즘을 작성하였다.

 

 참고로 내가 사는 코인은 '루나'라는 코인으로. 성장세와 코인의 크기(시중에 얼마나 많은 코인이 풀려있는지)를 참고하여 결정하였다. 물론 여러가지의 코인을 주문할 수 있지만 아직 해당 기능은 구현하지 않았다. 다음은 소스코드이다.

 

    def order_coin(self):
        ticker = self.machine.get_ticker("luna_krw")
        assert ticker
        wallet = self.machine.get_wallet_status()
        assert wallet

        coin_value = int(ticker["last"])
        avail_money = int(wallet["krw"]["avail"])
        print(coin_value + 200)

        target_money_value = avail_money / 10
        if(target_money_value >= 5000):
            target_coin_value = target_money_value / coin_value
            result = self.machine.buy_order("luna_krw", coin_value, target_coin_value)
            assert result

            if result["status"] == "success":
                result["order_state"] = "PURINPRO"
                result["target_price"] = int(round(coin_value + (coin_value / 50), 6) / 100) * 100
                self.database.insert_item(result, "trader", "trade_status")
                print( "result = ", result)
                print("END order_coin method")
        else:
            print("no more money")

 

 코드의 알고리즘은 간단하다. 최근의 코인가격을 그대로 주문하고, 가지고있는 돈의 10% 수준의 양으로 구입할 수 있는 코인의 양을 매수한다. 매수주문 후 리컨되는 json형식 그대로 내 데이터베이스에 넣어주어 저장한다.

 

 만약 10%의 가격이 5천원이 되지 않는다면 매수주문을 하지 않도록 하였다. 5000원 이하의 돈으로 매수주문을 하면 오류가 발생해 시스템이 다운되기 때문이다.

 

 매도주문에 필요한 정보는 어느 가격에 어느정도의 코인 양을 매도할지이다. 나같은 경우는 약 10%의 가격이 올랐을 때 내가 구입한 코인을 그대로 매도할 수 있도록 하였다.

 

- 매도주문

 

 매도주문은 매수가 완료된 주문들을 목표 가격과 코인 양을 입력하면 된다. 여기서 주의할점은 수수료 후의 실질적으로 구입된 코인의 양을 타겟으로 넣어주어야 한다는 것이다. 그렇지 않으면 가지고 있는 코인 양보다 더 많은 코인을 매도하기 때문에 에러가 발생한다.

 

    def sell_coin(self):
        count = 0
        all_states = self.database.find_items()
        assert all_states

        for item in all_states:
            if item["order_state"] == "BUYORDCOM":
                currencyPair = item["currencyPair"]
                target_price = int(item["target_price"])
                target_amount = item["target_amount"]
                result = self.machine.sell_order(currencyPair, target_price, target_amount, "limit")
                assert result

                if result["status"] == "success":
                    count += 1
                    orderId = item["orderId"]
                    self.database.update_items(condition={"orderId": orderId},
                                               update_value={"$set": {"order_state": "SELORDSTA",
                                                                      "sell_id": result["orderId"]}}
                                               )
        print("completed order number = ", count)
        print("END sell_coin method")

 

3. 결어

 

 개인적으로 정리하는 생각으로 블로그를 작성하고 있지만, 의외로 유입자가 많아 놀라고있다... 조금 더 신경써서 글을 작성해야겠다.

반응형