init
This commit is contained in:
193
Bithumb.py
193
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)
|
||||
|
||||
Reference in New Issue
Block a user