diff --git a/Bithumb_minute.py b/Bithumb_minute.py index c02fe9a..02fd58b 100644 --- a/Bithumb_minute.py +++ b/Bithumb_minute.py @@ -443,26 +443,25 @@ class Bithumb_minute(HTS): return False return True - def checkWithEnvelope(self, data, analyzed_day=120, isRealTime=False): + def checkWithEnvelope(self, data1, data2=None, isRealTime=False): bsLine = {} - size = len(data["close"]) + size = len(data1["close"]) bsLine['buy'] = [-1 for i in range(size)] bsLine['buy_weight'] = [-1 for i in range(size)] bsLine['sell'] = [-1 for i in range(size)] bsLine['sell_weight'] = [-1 for i in range(size)] - gap_interval = analyzed_day - gap_state = False for i in range(size): if isRealTime: if i < size - 1: continue if i > 10: + """ # 만약 전일 저가와 오늘 종의 차이가 1만원이 넘으면 향후 60일은 분석하지 않는다. - if data['high'][i] < int(data['low'][i - 1] * 0.7): + if data1['high'][i] < int(data1['low'][i - 1] * 0.7): gap_state = True gap_interval -= 1 continue @@ -474,149 +473,150 @@ class Bithumb_minute(HTS): gap_interval -= 1 continue - if data['disparity'][i] < 2: + if data1['disparity'][i] < 2: check = True for l in range(i - 3, i): if ( - data['gradients_avg60'][l - 1] > data['gradients_avg60'][l] or - data['gradients_avg20'][l - 1] > data['gradients_avg20'][l] or - data['gradients_low'][l - 1] > data['gradients_low'][l] or - data['disparity_avg5'][l - 1] > data['disparity_avg5'][l] or - data['disparity'][l - 1] < data['disparity'][l] + data1['gradients_avg60'][l - 1] > data1['gradients_avg60'][l] or + data1['gradients_avg20'][l - 1] > data1['gradients_avg20'][l] or + data1['gradients_low'][l - 1] > data1['gradients_low'][l] or + data1['disparity_avg5'][l - 1] > data1['disparity_avg5'][l] or + data1['disparity'][l - 1] < data1['disparity'][l] ): check = False break - if check and 99 < sum(data['disparity_avg5'][i - 4:i + 1]) / 5 < 100 and 99 < sum( - data['disparity_avg60'][i - 4:i + 1]) / 5 < 100: - buy = data['low'][i] - data['buy'][i] = buy + if check and 99 < sum(data1['disparity_avg5'][i - 4:i + 1]) / 5 < 100 and 99 < sum( + data1['disparity_avg60'][i - 4:i + 1]) / 5 < 100: + buy = data1['low'][i] + data1['buy'][i] = buy bsLine['buy'][i] = buy bsLine['buy_weight'][i] = 0.1 check = True for l in range(i - 2, i): if ( - data['gradients_avg60'][l - 1] > data['gradients_avg60'][l] or - data['gradients_low'][l - 1] > data['gradients_low'][l] + data1['gradients_avg60'][l - 1] > data1['gradients_avg60'][l] or + data1['gradients_low'][l - 1] > data1['gradients_low'][l] ): check = False break if ( check and - -0.0011 < data['gradients_low'][i] < 0 and -0.007 < data['gradients_avg5'][i] < 0.001 and - -0.0012 < data['gradients_avg60'][i] < 0 and - 98.90 < data['disparity_avg5'][i] < 101 + -0.0011 < data1['gradients_low'][i] < 0 and -0.007 < data1['gradients_avg5'][i] < 0.001 and + -0.0012 < data1['gradients_avg60'][i] < 0 and + 98.90 < data1['disparity_avg5'][i] < 101 ): - buy = data['low'][i] - data['buy'][i] = buy + buy = data1['low'][i] + data1['buy'][i] = buy bsLine['buy'][i] = buy bsLine['buy_weight'][i] = 0.1 check = True for l in range(i - 6, i): if ( - data['gradients_avg60'][l - 1] < data['gradients_avg60'][l] or - data['gradients_avg20'][l - 1] < data['gradients_avg20'][l] or - data['gradients_low'][l - 1] < data['gradients_low'][l] or - -0.039 < data['gradients_low'][l - 1] < -0.35 or - -0.05 < data['gradients_avg20'][l - 1] < -0.30 or - -0.40 < data['gradients_avg60'][l - 1] < -0.30 + data1['gradients_avg60'][l - 1] < data1['gradients_avg60'][l] or + data1['gradients_avg20'][l - 1] < data1['gradients_avg20'][l] or + data1['gradients_low'][l - 1] < data1['gradients_low'][l] or + -0.039 < data1['gradients_low'][l - 1] < -0.35 or + -0.05 < data1['gradients_avg20'][l - 1] < -0.30 or + -0.40 < data1['gradients_avg60'][l - 1] < -0.30 ): check = False break - if check and 99 < min(data['disparity_avg5'][i - 6:i]) < max(data['disparity_avg5'][i - 6:i]) < 101: - buy = data['low'][i] - data['buy'][i] = buy + if check and 99 < min(data1['disparity_avg5'][i - 6:i]) < max(data1['disparity_avg5'][i - 6:i]) < 101: + buy = data1['low'][i] + data1['buy'][i] = buy bsLine['buy'][i] = buy bsLine['buy_weight'][i] = 0.1 check = True for l in range(i - 3, i): if ( - data['gradients_low'][l - 1] < data['gradients_low'][l] or - data['gradients_avg60'][l - 1] < data['gradients_avg60'][l] or - data['gradients_avg20'][l - 1] < data['gradients_avg20'][l] or - 0.01 < data['gradients_low'][l - 1] < 0.21 or - -0.09 < data['gradients_avg20'][l - 1] < -0.002 or - 0.01 < data['gradients_avg60'][l - 1] < 0.021 + data1['gradients_low'][l - 1] < data1['gradients_low'][l] or + data1['gradients_avg60'][l - 1] < data1['gradients_avg60'][l] or + data1['gradients_avg20'][l - 1] < data1['gradients_avg20'][l] or + 0.01 < data1['gradients_low'][l - 1] < 0.21 or + -0.09 < data1['gradients_avg20'][l - 1] < -0.002 or + 0.01 < data1['gradients_avg60'][l - 1] < 0.021 ): check = False break if check: - buy = data['low'][i] - data['buy'][i] = buy + buy = data1['low'][i] + data1['buy'][i] = buy bsLine['buy'][i] = buy bsLine['buy_weight'][i] = 0.1 - if (data['disparity'][i] < 5 and 99.0 < data['disparity_avg60'][i] < 99.1 and - -0.009 < data['gradients_avg60'][i] < -0.008 and 0.015 < data['gradients_avg20'][i] < 0.016 and - -0.006 < data['gradients_avg5'][i] < -0.005 and -0.009 < data['gradients_low'][i] < -0.008): + if (data1['disparity'][i] < 5 and 99.0 < data1['disparity_avg60'][i] < 99.1 and + -0.009 < data1['gradients_avg60'][i] < -0.008 and 0.015 < data1['gradients_avg20'][i] < 0.016 and + -0.006 < data1['gradients_avg5'][i] < -0.005 and -0.009 < data1['gradients_low'][i] < -0.008): check = True for l in range(i - 5, i): if ( - data['gradients_avg60'][l - 1] > data['gradients_avg60'][l] or - data['gradients_low'][l - 1] > data['gradients_low'][l] or - data['disparity'][l - 1] < data['disparity'][l] + data1['gradients_avg60'][l - 1] > data1['gradients_avg60'][l] or + data1['gradients_low'][l - 1] > data1['gradients_low'][l] or + data1['disparity'][l - 1] < data1['disparity'][l] ): check = False break if check: - buy = data['low'][i] - data['buy'][i] = buy + buy = data1['low'][i] + data1['buy'][i] = buy bsLine['buy'][i] = buy bsLine['buy_weight'][i] = 0.1 - if data['macd'][i] < -4000: - if data['macd'][i - 1] < data['macd'][i]: - if not self.notBuy(data, i) and data['slow_k'][i] < 30: - buy = data['low'][i] - data['buy'][i] = buy + if data1['macd'][i] < -4000: + if data1['macd'][i - 1] < data1['macd'][i]: + if not self.notBuy(data1, i) and data1['slow_k'][i] < 30: + buy = data1['low'][i] + data1['buy'][i] = buy bsLine['buy'][i] = buy bsLine['buy_weight'][i] = 0.1 # macd 이전에 없던 바닥인 경우 상승할 찰나 매수 - if data['macds'][i - 1] < min(data['macds'][:i - 1]): - if data['macds'][i - 1] < data['macds'][i]: - if not self.notBuy(data, i) and data['slow_k'][i] < 30: - buy = data['low'][i] - data['buy'][i] = buy + if data1['macds'][i - 1] < min(data1['macds'][:i - 1]): + if data1['macds'][i - 1] < data1['macds'][i]: + if not self.notBuy(data1, i) and data1['slow_k'][i] < 30: + buy = data1['low'][i] + data1['buy'][i] = buy bsLine['buy'][i] = buy bsLine['buy_weight'][i] = 0.1 if ( - 98 < data['disparity_avg5'][i] < 100 and data['disparity_avg20'][i] < 93.5 and - data['disparity_avg60'][i] < 89 and - -0.014 < data['gradients_avg60'][i] < -0.013 and -0.03 < data['gradients_avg20'][i] < -0.02 and -0.014 < data['gradients_low'][i] < -0.013 and - data['slow_k'][i] < 11 + 98 < data1['disparity_avg5'][i] < 100 and data1['disparity_avg20'][i] < 93.5 and + data1['disparity_avg60'][i] < 89 and + -0.014 < data1['gradients_avg60'][i] < -0.013 and -0.03 < data1['gradients_avg20'][i] < -0.02 and -0.014 < data1['gradients_low'][i] < -0.013 and + data1['slow_k'][i] < 11 ): - if not self.notBuy(data, i): - buy = data['low'][i] - data['buy'][i] = buy + if not self.notBuy(data1, i): + buy = data1['low'][i] + data1['buy'][i] = buy bsLine['buy'][i] = buy bsLine['buy_weight'][i] = 0.1 - if data['slow_k'][i] < 20 and data['slow_k'][i - 1] < data['slow_d'][i - 1] and data['slow_d'][i] < data['slow_k'][i]: - buy = data['low'][i] - data['buy'][i] = buy + if data1['slow_k'][i] < 20 and data1['slow_k'][i - 1] < data1['slow_d'][i - 1] and data1['slow_d'][i] < data1['slow_k'][i]: + buy = data1['low'][i] + data1['buy'][i] = buy bsLine['buy'][i] = buy bsLine['buy_weight'][i] = 0.3 + """ - if data['slow_k'][i] > 90: - sell = data['close'][i] - data['sell'][i] = sell + if data2['slow_k'][i] < 30: + if data1['slow_k'][i] < 30 and data1['avg5'][i] < data1['close'][i]: + buy = data1['close'][i] + data1['buy'][i] = buy + bsLine['buy'][i] = buy + bsLine['buy_weight'][i] = 1 + + if data1['slow_k'][i] > 80 and (data1['slow_d'][i-1] < data1['slow_k'][i-1] and data1['slow_k'][i] < data1['slow_d'][i]): + sell = data1['close'][i] + data1['sell'][i] = sell bsLine['sell'][i] = sell bsLine['sell_weight'][i] = 100 + return bsLine - if data['slow_k'][i] > 80 and data['slow_d'][i-1] < data['slow_k'][i-1] and data['slow_k'][i] < data['slow_d'][i]: - sell = data['low'][i] - data['sell'][i] = sell - bsLine['sell'][i] = sell - bsLine['sell_weight'][i] = 100 - - return bsLine, data - - def get_ohlcv(self, ticker): - url = "https://api.upbit.com/v1/candles/minutes/5" + def get_ohlcv(self, ticker, minute=5): + url = "https://api.upbit.com/v1/candles/minutes/"+str(minute) querystring = {"market": "KRW-"+ticker, "count": "300"} response = requests.request("GET", url, params=querystring) json_response = json.loads(response.text) @@ -656,24 +656,10 @@ class Bithumb_minute(HTS): return - def buyRealTime(self, ticker, analyzed_day=120, isRealTime=False): - + def getStock(self, ticker, analyzed_day, minute=5): stock = {"CODE": ticker, "NAME": ticker, "PRICE": []} - """ - # binance - btc_ohlcv = self.binance.fetch_ohlcv(ticker + "/BKRW") - df = pd.DataFrame(btc_ohlcv, columns=['datetime', 'open', 'high', 'low', 'close', 'volume']) - df['datetime'] = pd.to_datetime(df['datetime'], unit='ms') - df.set_index('datetime', inplace=True) - """ - - """ - # bithumb - df_ = pybithumb.get_ohlcv(ticker) - """ - - df = self.get_ohlcv(ticker) + df = self.get_ohlcv(ticker, minute) if df is None: return close = pybithumb.get_current_price(ticker) @@ -690,11 +676,31 @@ class Bithumb_minute(HTS): # 분석일 데이터만 활용한다 (이전 데이터는 제거) data.drop(data.index[:len(data) - analyzed_day], inplace=True) - bsLine, data = self.checkWithEnvelope(data, analyzed_day, isRealTime=isRealTime) - print(ticker, "/", datetime.now().strftime('%Y-%m-%d %H:%M:%S'), "/", data['close'][len(data['close'])-1], "/", data['slow_k'][len(data['slow_k'])-1]) + return data + + def buyRealTime(self, ticker, analyzed_day=120, isRealTime=False): + + """ + # binance + btc_ohlcv = self.binance.fetch_ohlcv(ticker + "/BKRW") + df = pd.DataFrame(btc_ohlcv, columns=['datetime', 'open', 'high', 'low', 'close', 'volume']) + df['datetime'] = pd.to_datetime(df['datetime'], unit='ms') + df.set_index('datetime', inplace=True) + """ + + """ + # bithumb + df_ = pybithumb.get_ohlcv(ticker) + """ + stock1 = self.getStock(ticker, analyzed_day, minute=5) + stock2 = self.getStock(ticker, analyzed_day, minute=30) + + # 매수 매도 체크 + bsLine = self.checkWithEnvelope(stock1, stock2, isRealTime=isRealTime) + print(ticker, "/", datetime.now().strftime('%Y-%m-%d %H:%M:%S'), "/", stock1['close'][len(stock1['close'])-1], "/", stock1['slow_k'][len(stock1['slow_k'])-1]) # 그래프를 그린다. - if len(data.index) > 10: + if len(stock1.index) > 10: today = datetime.today().strftime('%Y%m%d') log_filename = os.path.join(RESOURCE_PATH, 'order', "bithumb"+"_"+today + '.log') @@ -707,14 +713,14 @@ class Bithumb_minute(HTS): count = round((balance * (bsLine['buy_weight'][len(bsLine['buy_weight']) - 1] / 100)) / bsLine['buy'][len(bsLine['buy']) - 1], 2) order = self.bithumb.buy_limit_order(ticker, bsLine['buy'][len(bsLine['buy']) - 1], count) # order: ('bid', 'BTC', 'C0101000000322993432', 'KRW') - print(ticker, "/", datetime.now().strftime('%Y-%m-%d %H:%M:%S'), "/", data['close'][len(data['close']) - 1], "/ BUY / ", data['slow_k'][len(data['slow_k']) - 1], "/", bsLine['buy'][len(bsLine['buy']) - 1], "/", count) + print(ticker, "/", datetime.now().strftime('%Y-%m-%d %H:%M:%S'), "/", stock1['close'][len(stock1['close']) - 1], "/ BUY / ", stock1['slow_k'][len(stock1['slow_k']) - 1], "/", bsLine['buy'][len(bsLine['buy']) - 1], "/", count) with open(log_filename, 'a', newline='', encoding='utf-8') as log_file: wr = csv.writer(log_file) wr.writerow(["buy", datetime.now().strftime('%Y-%m-%d %H:%M:%S'), order[0], order[1], order[2], order[3]]) dirName = os.path.join(RESOURCE_PATH, 'analysis', 'bithumb') - self.writeFile(dirName, ticker, data, bsLine, datetime.now().strftime('%Y%m%d %H%M%S'), 'buy') + self.writeFile(dirName, ticker, stock1, bsLine, datetime.now().strftime('%Y%m%d %H%M%S'), 'buy') if max(bsLine['sell'][len(bsLine['sell']) - 2:]) > 100: tmp = self.bithumb.get_balance(ticker) @@ -722,13 +728,13 @@ class Bithumb_minute(HTS): return count = tmp[0] order = self.bithumb.sell_limit_order(ticker, bsLine['sell'][len(bsLine['sell'])-1], count) - print(ticker, "/", datetime.now().strftime('%Y-%m-%d %H:%M:%S'), "/", data['close'][len(data['close']) - 1], "/ BUY / ", data['slow_k'][len(data['slow_k']) - 1], "/", bsLine['sell'][len(bsLine['sell']) - 1], "/", count) + print(ticker, "/", datetime.now().strftime('%Y-%m-%d %H:%M:%S'), "/", stock1['close'][len(stock1['close']) - 1], "/ BUY / ", stock1['slow_k'][len(stock1['slow_k']) - 1], "/", bsLine['sell'][len(bsLine['sell']) - 1], "/", count) dirName = os.path.join(RESOURCE_PATH, 'analysis', 'bithumb') - self.writeFile(dirName, ticker, data, bsLine, datetime.now().strftime('%Y%m%d %H%M%S'), 'sell') + self.writeFile(dirName, ticker, stock1, bsLine, datetime.now().strftime('%Y%m%d %H%M%S'), 'sell') else: dirName = os.path.join(RESOURCE_PATH, 'analysis', 'bithumb') - self.writeFile(dirName, ticker, data, bsLine, datetime.now().strftime('%Y%m%d %H%M%S')) + self.writeFile(dirName, ticker, stock1, bsLine, datetime.now().strftime('%Y%m%d %H%M%S')) return