첫 번째 커밋
This commit is contained in:
169
collectors/crypto/c_upbit.py
Normal file
169
collectors/crypto/c_upbit.py
Normal file
@@ -0,0 +1,169 @@
|
||||
# -*- 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)
|
||||
Reference in New Issue
Block a user