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)
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
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
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)
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