Example #1
0
 def do_check_buy_success(self, stock: Coin):
     """매수 예약 걸어놓은 stock이 매수가 성공했는지 확인"""
     order = self.connector.get_order(stock.buy_uuid)
     if order.get('state') == 'wait':
         created_at: datetime = datetime.strptime(order.get('created_at')[:-6], "%Y-%m-%dT%H:%M:%S")
         if (datetime.now() - created_at).seconds >= 3 * 60:
             stock.status = Status.PASS
             self.connector.cancel_order(stock.buy_uuid)
         return
     stock.status = Status.BOUGHT
     stock.bought_amount += float(order.get('price')) * float(order.get('volume'))
     stock.avg_buy_price = float(self.connector.get_balance_info(stock.name).get('avg_buy_price'))
     stock.buy_volume_cnt = float(self.connector.get_balance_info(stock.name).get('balance'))
     self.connector.hold_krw = float(self.connector.get_balance_info()['balance'])
     self.setup_target_sell_price(stock)
Example #2
0
    def sell(self, coin: Coin, count_amount, status=Status.WAIT) -> bool:
        order_log = self.upbit.sell_market_order(f"KRW-{coin.name}", count_amount)
        uuid = order_log.get('uuid')
        if not uuid:
            self.logger.warning(order_log)
            return False
        while uuid and self.upbit.get_order(uuid).get('state') == 'wait':
            time.sleep(1)
        time.sleep(2)
        order_log = self.upbit.get_order(uuid)
        self.logger.debug(f"sell {order_log=}")

        coin.avg_sell_price = calculate_avg_sell_price(order_log.get('trades'))
        coin.sold_amount = calculate_total_amount(order_log)
        self.logger.info(f'매수가: {coin.avg_buy_price}, 매도가: {coin.avg_sell_price}, '
                         f'수익률: {calculate_rate(coin.avg_sell_price, coin.avg_buy_price)}')
        self.discord_conn.post(self.discord_conn.sell_data(coin))
        coin.status = status
        coin.dca_buy_cnt = 0
        coin.bought_amount = 0
        coin.avg_buy_price = 0
        coin.buy_volume_cnt = 0
        coin.avg_sell_price = 0
        coin.sold_amount = 0
        self.hold_krw = float(self.get_balance_info()['balance'])
        return True
Example #3
0
 def buy_limit_order(self, coin: Coin, price, amount) -> bool:
     order_log = self.upbit.buy_limit_order(f"KRW-{coin.name}", price, amount)
     uuid = order_log.get('uuid')
     coin.buy_uuid = uuid
     if not uuid:
         self.logger.warning(order_log)
         return False
     coin.status = Status.TRY_BUY
     return True
Example #4
0
    def do_try_buy(self, stock: Coin):
        """구매 조건에 맞는 stock에 대해 매수 시도

        구매 조건
            1. stock의 현재가가 목표매수가보다 높아야함
            2. stock의 현재거래량이 목표거래량보다 높아야함
        매수 시도
        """
        if stock.current_price < stock.target_buy_price:
            return
        if stock.current_volume < stock.last_volume / 2:
            stock.status = Status.PASS
            return
        self.connector.buy_limit_order(stock,
                                       stock.target_buy_price,
                                       self.connector.svb_config['buy_amount'] / stock.current_price)
Example #5
0
 def buy(self, coin: Coin, price_amount) -> bool:
     order_log = self.upbit.buy_market_order(f"KRW-{coin.name}", price_amount)
     uuid = order_log.get('uuid')
     coin.buy_uuid = uuid
     if not uuid:
         self.logger.warning(order_log)
         return False
     while uuid and self.upbit.get_order(uuid).get('state') == 'wait':
         time.sleep(1)
     self.logger.debug(f"{coin.name} buy {order_log=}")
     coin.status = Status.BOUGHT
     coin.dca_buy_cnt += 1
     coin.bought_amount += price_amount
     coin.avg_buy_price = float(self.get_balance_info(coin.name).get('avg_buy_price'))
     coin.buy_volume_cnt = float(self.get_balance_info(coin.name).get('balance'))
     self.hold_krw = float(self.get_balance_info()['balance'])
     return True