From b37566217d4677fb6238418869d913be230f6903 Mon Sep 17 00:00:00 2001 From: dsyoon Date: Sat, 21 Jan 2023 20:13:38 +0900 Subject: [PATCH] init --- Bithumb.py | 193 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 188 insertions(+), 5 deletions(-) diff --git a/Bithumb.py b/Bithumb.py index be55886..a03b356 100644 --- a/Bithumb.py +++ b/Bithumb.py @@ -422,6 +422,183 @@ class Bithumb(HTS): log_file.close() return False + def notBuy(self, data, i): + if i > 5: + check = True + for l in range(i-4, i+1): + 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] + ): + check = False + break + if not check: + return False + return True + + def checkWithEnvelope(self, data, analyzed_day=120, isRealTime=False): + + bsLine = {} + size = len(data["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): + gap_state = True + gap_interval -= 1 + continue + if gap_state: + if gap_interval <= 0: + gap_state = False + gap_interval = 60 + else: + gap_interval -= 1 + continue + + if data['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] + ): + 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 + bsLine['buy'][i] = buy + bsLine['buy_weight'][i] = 30 + + 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] + ): + 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 + ): + buy = data['low'][i] + data['buy'][i] = buy + bsLine['buy'][i] = buy + bsLine['buy_weight'][i] = 30 + + 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 + ): + 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 + bsLine['buy'][i] = buy + bsLine['buy_weight'][i] = 30 + + 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 + ): + check = False + break + if check: + buy = data['low'][i] + data['buy'][i] = buy + bsLine['buy'][i] = buy + bsLine['buy_weight'][i] = 30 + + 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): + 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] + ): + check = False + break + if check: + buy = data['low'][i] + data['buy'][i] = buy + bsLine['buy'][i] = buy + bsLine['buy_weight'][i] = 30 + + 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 + bsLine['buy'][i] = buy + bsLine['buy_weight'][i] = 30 + + # 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 + bsLine['buy'][i] = buy + bsLine['buy_weight'][i] = 30 + + 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 + ): + if not self.notBuy(data, i): + buy = data['low'][i] + data['buy'][i] = buy + bsLine['buy'][i] = buy + bsLine['buy_weight'][i] = 30 + + 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 + bsLine['buy'][i] = buy + bsLine['buy_weight'][i] = 30 + + return bsLine, data + def buyRealTime(self, ticker, isRealTime=False): stock = {"CODE": ticker, "NAME": ticker, "PRICE": []} @@ -441,16 +618,16 @@ class Bithumb(HTS): # 분석일 데이터만 활용한다 (이전 데이터는 제거) data.drop(data.index[:len(data) - analyzed_day], inplace=True) - bsLine, data = self.buySellChecker.checkWithEnvelope(data, analyzed_day, isRealTime=isRealTime) + bsLine, data = self.checkWithEnvelope(data, analyzed_day, isRealTime=isRealTime) # 그래프를 그린다. if len(data.index) > 10: today = datetime.today().strftime('%Y%m%d') log_filename = os.path.join(RESOURCE_PATH, 'analysis', 'bithumb', today + '.log') - if not isRealTime and not self.exist_buy(ticker, log_filename): + if isRealTime and not self.exist_buy(ticker, log_filename): if max(bsLine['buy'][len(bsLine['buy']) - 2:]) > 100: balance = self.getBalance(ticker) - count = int(balance * (bsLine['buy_weight'][len(bsLine['buy_weight'])-1]/100)) + 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') @@ -477,7 +654,13 @@ if __name__ == "__main__": bithumb = Bithumb(RESOURCE_PATH) tickers = ['XRP', 'BTC', 'SOL'] - while True: + isRealTime = False + if isRealTime: + while True: + for ticker in tickers: + print(ticker, datetime.now().strftime('%Y-%m-%d %H:%M:%S')) + bithumb.buyRealTime(ticker, isRealTime) + else: for ticker in tickers: print(ticker, datetime.now().strftime('%Y-%m-%d %H:%M:%S')) - bithumb.buyRealTime(ticker, isRealTime=False) + bithumb.buyRealTime(ticker, isRealTime)