# -*- coding: utf-8 -*- from collectors.collector import Collector # Logging import logging # Exchage API import pyupbit import sys # 거래금액 기준은 거래소 아이템 중 상위 3개에서 3번째의 종목 최소 거래금액 기준으로 정한다. # 종목 추가 기능을 추가한다. # 상위 3개 종목 기본 거래종목 후보로 추가(데이터 수집) => 조건 만족 시 거래 # 1. 거래량 # 2. 변동폭 # 3. 수익성(시뮬레이터 결과 기반) : 머신러닝, 인디케이터 등 포함된 결과 # 거래 종목에서 제외 => 거래량, 변동폭, 수익성 # 거래 후보 종목에서 제외 => 거래량 # 거래량 기준 => 거래소 추가 시 상위 3개 종목 중 3번째 데이터 기준 => 사용자가 변경 가능 및 종목 추가 가능 class Upbit(Collector): def __init__(self): self._auth = { 'access': 'IdO6IXpgC07 XB2KWoID37jxvFXgpLMkxZRTxHViI', 'secret': 'QteNfsNZly1kZ1t3MGAc9bOxMDiIouozuQCZVVJI', } self.remaining_req = {} self._heaeder = {} self._mathod = 'get' self._finance = 'crypto' # 금융 종목 self._name = 'upbit' # 거래소 이름 self.leverage = 1 self._standard_price = 0 self._temp_api_url = 'https://api.upbit.com/v1/' # 임시 api 주소 # get api url from db self._api_url = self._get_api_url() self._api = pyupbit self._secret_api = pyupbit.Upbit(self._auth['access'], self._auth['secret']) self._set_allow_items() # get filtered markets self.markets = self._load_markets() # 테스트때 주석 def set_key_data(self, access, secret): self._secret_api = pyupbit.Upbit(access, secret) # 업비트 거래 기준금액 정의 def _get_standard_trade_price(self, markets = None): if markets == None: markets = self._get_data_all_markets() p_list = [] for m in markets : c_type = self._get_currency_type(m['market']) # 원화 거래 if c_type is 1: p_list.append(int(m['acc_trade_price_24h'])) p_list.sort(reverse=True) return int(p_list[0] - p_list[0] * 0.01) # return int(p_list[2] - p_list[2] * 0.01) def _get_data_all_markets(self): market_all = self._get_market_all() if market_all is None: return markets = [] for market in market_all: markets.append(market['market']) URL = self._api_url + 'ticker?markets=%s' % str(','.join(markets)) return self._get(URL) def _return_list_filted_markets(self, markets): filtered_list = [] for m in markets: c_type = self._get_currency_type(m['market']) f_if = False # except ripple if 'XRP' in m['market']: continue # 허용 아이템 조건 for i in self.allow_items: if i == m['market'].replace('KRW-', ''): f_if = True # 24시간 거래금액 및 종목 가격 제한 조건 # f_if = int(m['acc_trade_price_24h']) > self._standard_price \ # and float(m['low_price']) > float(100) # 원화 거래 항목으로 제한 if c_type is 1 and f_if: filtered_list.append(m) return filtered_list def _save_market_list_to_db(self, markets): for m in markets : self._save_item_data_to_item_table(self._finance, # 금융 self._name, # 거래소 m['market'], # 종목 m['acc_trade_price_24h'], # 24시간 거래 금액 m['acc_trade_volume_24h'] # 24시간 거래량 ) def _load_markets(self): # DB에서 종목이 없을 경우 아래 로직 실행 try: markets = self._get_data_all_markets() # set exchange min price self._standard_price = self._get_standard_trade_price(markets) filtered_markets = self._return_list_filted_markets(markets) # 거래소 기본정보 DB 저장 (거래 기준가, api_url 등) self._add_exchange_info_to_db(self._finance, self._name, self._standard_price, self._api_url) # 종목 리스트 DB 저장 self._save_market_list_to_db(filtered_markets) return filtered_markets except Exception as e: logging.error(e) raise Exception(e) # for dev return markets def _get_market_all(self): ''' 마켓 코드 조회 업비트에서 거래 가능한 마켓 목록 https://docs.upbit.com/v1.0/reference#%EB%A7%88%EC%BC%93-%EC%BD%94%EB%93%9C-%EC%A1%B0%ED%9A%8C :return: json array ''' URL = self._api_url + 'market/all' return self._get(URL) def save_current_min_data(self, market): time_type = 'min' data = self._api.get_ohlcv(market, interval="minute1")[:-1] self._save_to_db_from_collectors_dataframe(self.finance, self._name, market, data, time_type) def save_current_hour_data(self, market): time_type = 'hour' data = self._api.get_ohlcv(market, interval="minute60")[:-1] self._save_to_db_from_collectors_dataframe(self.finance, self._name, market, data, time_type) def save_current_day_data(self, market): time_type = 'day' data = self._api.get_ohlcv(market, interval="day")[:-1] self._save_to_db_from_collectors_dataframe(self.finance, self._name, market, data, time_type)